E.26. Релиз 15.4#

E.26. Релиз 15.4

E.26. Релиз 15.4

Дата релиза:  2023-08-10

Этот релиз содержит ряд исправлений версии 15.3. Для информации о новых функциях в основном релизе 15, смотрите Раздел E.30.

E.26.1. Миграция на Версию 15.4

Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.

Однако, если вы используете индексы BRIN, может быть целесообразно их переиндексировать; см. третью запись в журнале изменений ниже.

Также, если вы обновляетесь с версии раньше, чем 15.1, смотрите Раздел E.29.

E.26.2. Изменения

  • Запрещена подстановка имени схемы или владельца в скрипт расширения, если имя содержит кавычку, обратную косую черту или знак доллара (Ноа Миш) §

    Это ограничение защищает от опасностей SQL-инъекций для доверенных расширений.

    Проект PostgreSQL благодарит Мика Гейтса (Micah Gates), Валери Вулард (Valerie Woolard), Тима Кэри-Смита (Tim Carey-Smith) и Кристофа Берга (Christoph Berg) за сообщение об этой проблеме. (CVE-2023-39417)

  • Исправлено MERGE для правильного применения политик безопасности строк (Дин Рашид) §

    Когда MERGE выполняет действие UPDATE, он должен применять любые политики RLS UPDATE или SELECT, определенные на целевой таблице, для согласованности с тем, как работает обычный UPDATE с предложением WHERE. Вместо этого он применял политики RLS INSERT для обоих действий INSERT и UPDATE.

    Кроме того, когда MERGE выполняет действие DO NOTHING, он применяет политики RLS DELETE целевой таблицы к существующим строкам, даже если эти строки не удаляются. Хотя это не проблема безопасности, это может привести к нежелательным ошибкам.

    Проект PostgreSQL благодарит Дина Рашида (Dean Rasheed) за сообщение об этой проблеме. (CVE-2023-39418)

  • Исправлено смешение пустых (без строк) диапазонов и диапазонов, содержащих только NULL, в BRIN-индексах, а также некорректное объединение сводок, содержащих только NULL (Tomas Vondra) § §

    Каждое из этих упущений могло привести к упущению того факта, что диапазон индекса BRIN содержит какие-либо значения NULL, потенциально позволяя последующим запросам, которые должны возвращать значения NULL, пропустить это.

    Этот исправление само по себе не исправит некорректные записи BRIN. Рекомендуется REINDEX для всех индексов BRIN, которые могут использоваться для поиска null-значений.

  • Избегайте оставления поврежденной базы данных, когда DROP DATABASE прерывается (Andres Freund) §

    Если DROP DATABASE была прервана после того, как уже начались необратимые шаги, целевая база данных оставалась доступной (потому что удаление строки pg_database откатывалось), но ее содержимое было бы повреждено. Исправьте, отметив базу данных как недоступную, прежде чем мы начнем выполнять необратимые операции. Сбой после этого оставит базу данных частично присутствующей, но с ней ничего нельзя сделать, кроме как выдать еще одну команду DROP DATABASE.

  • Убедиться, что индексам разделов правильно присвоен статус действительных или недействительных при создании (Майкл Пакье) §

    Если новый секционированный индекс соответствует существующему, но недействительному индексу на одной из секций, секционированный индекс может быть помечен как действительный преждевременно. Это может привести к неправильной работе или сбоям утверждения в последующих запросах к секционированной таблице.

  • Игнорирование недопустимых дочерних индексов при сопоставлении индексированных разделов с дочерними индексами во время ALTER TABLE ATTACH PARTITION (Майкл Пакье) §

    Такой индекс теперь будет игнорироваться, и вместо него будет создан новый дочерний индекс.

  • Исправлена возможная ошибка при пометке индексированного раздела как допустимого после присоединения всех его разделов (Майкл Пакье) §

    Обновление записи индекса pg_index может использовать устаревшие данные для других столбцов. Одним из зарегистрированных симптомов является ошибка попытка обновить невидимый кортеж.

  • Исправлено ALTER EXTENSION SET SCHEMA, чтобы выдавать жалобу, если расширение содержит какие-либо объекты вне схемы расширения (Майкл Пакье, Хейки Линкангас) §

    Ошибка, если расширение содержит объекты в нескольких схемах, всегда предполагалась; но проверка была неправильно закодирована, поэтому она могла не обнаруживать некоторые случаи, что приводило к неожиданному поведению.

  • Исправлено отслеживание зависимостей методов доступа таблиц (Майкл Пакье) §

    ALTER TABLE ... SET ACCESS METHOD не удалось обновить соответствующие записи в pg_depend при изменении метода доступа к таблице. При использовании не встроенных методов доступа, это создает риск, что метод доступа может быть удален, хотя таблицы все еще зависят от него. Этот исправление корректирует логику в ALTER TABLE, но оно не будет корректировать любые уже отсутствующие записи в pg_depend.

  • Не использовались частичные уникальные индексы для доказательства уникальности в планировщике (Дэвид Роули) §

    Это могло привести к неверным планам, поскольку предполагаемая уникальность строк, считанных из таблицы, может не соблюдаться, если индекс в вопросе не используется для сканирования таблицы.

  • Не кэшировать боковые соединения с изменчивыми условиями соединения (Ричард Гуо) §

    Применение Memoize к подплану, содержащему изменчивые условия фильтрации, вероятно, приведет к неверным ответам. Проверка, чтобы избежать этого, пропустила некоторые случаи, которые могут возникнуть при использовании LATERAL.

  • Избегалось создание некорректных планов для внешних соединений с псевдоконстантными условиями соединения (Etsuro Fujita) §

    В настоящее время планировщик не поддерживает присоединение псевдоконстантных предложений соединения к удаленному соединению, поэтому отключите создание удаленных соединений в таких случаях. (Более лучшее решение потребует изменений в структурах данных планировщика, нарушающих ABI, поэтому оно должно ждать будущего крупного релиза.)

  • Корректно обработаны подзапросы в выражениях RLS-политик и представлениях с барьером безопасности при расширении действий правил (Tom Lane) §

  • Исправлены состояния гонки в обнаружении конфликтов для режима изоляции SERIALIZABLE (Томас Манро) § § §

    Конфликты могут быть прне указаны при использовании сканирования кучи битовых карт, при использовании GIN-индексов, и при рассмотрении изначально пустого btree-индекса. Все эти случаи могут привести к сбоям сериализуемости из-за неправильного разрешения конфликтующих транзакций на фиксацию.

  • Исправлено неправильное поведение проверок EvalPlanQual с унаследованными или разделенными целевыми таблицами (Tom Lane) §

    Этот просмотр мог привести к выполнению действий обновления или удаления в режиме изоляции READ COMMITTED, когда они должны были быть прне указаны из-за конфликтующего параллельного обновления.

  • Исправлено хеш-соединение с хеш-ключом внутренней стороны, содержащим параметры, поступающие из внешнего вложенного цикла (Tom Lane) §

    При повторном сканировании соединения после изменения значений таких Params, мы должны перестроить хеш-таблицу, но забыли это сделать. Это может привести к пропуску строк вывода соединения.

  • Исправлены периодические сбои при попытке обновить поле составного столбца (Том Лейн) §

    Если общее значение составного столбца достаточно широкое, чтобы потребовать внешнего toasting, то неудачно запланированная очистка кэша может вызвать ошибки или сбои сервера.

  • Предотвращены утечки памяти на протяжении выполнения запроса в некоторых запросах UPDATE с триггерами (Tomas Vondra) § §

  • Предотвращены утечки памяти в течение времени выполнения запроса, когда узел плана Incremental Sort пересканирован (Джеймс Коулман, Лауренц Альбе, Том Лейн) §

  • Дробные секунды были приняты во входных данных для метода datetime() типа jsonpath (Tom Lane) §

  • Предотвращены сбои из-за переполнения стека с очень сложными шаблонами полнотекстового поиска (Tom Lane) §

  • Разрешены токены длиной до 10240 байт в pg_hba.conf и pg_ident.conf (Tom Lane) §

    Было обнаружено, что предыдущий лимит в 256 байт недостаточен для некоторых сценариев использования.

  • Убедиться, что все существующие заполнители проверены на соответствие, когда расширение объявляет свой префикс GUC зарезервированным (Карина Лицкевич, Екатерина Соколова) §

    Неправильная логика цикла может привести к пропуску некоторых записей.

  • Исправлено неправильное обращение с условиями нехватки памяти в C++ (Heikki Linnakangas) §

    Если используется JIT, исчерпание памяти при вызове C++ new приведет к фатальной ошибке PostgreSQL, вместо ожидаемого исключения C++.

  • Исправлен редкий сбой из-за нулевого указателя в plancache.c (Tom Lane) §

  • Избегать утечки записи статистики для подписки, когда она удалена (Масахико Савада) §

  • Избегать потери отслеживания потенциально полезных сегментов общей памяти, когда освобождение страницы приводит к объединению диапазонов свободного пространства (Dongming Liu) §

    Настроена проверка перемещения сегмента в соответствующий контейнер под новый объем свободного пространства, чтобы он был найден при последующих поисках.

  • Разрешено VACUUM продолжать после обнаружения определенных типов повреждений индекса b-tree (Питер Геогеган) § §

    Если обнаружена недействительная ссылка на страницу-брата, зарегистрируйте проблему и продолжайте, вместо выбрасывания ошибки, как раньше. Ничто, кроме REINDEX, не исправит сломанный индекс, но предотвращение завершения VACUUM до того, как это будет сделано, рискует сделать дела гораздо хуже.

  • Убедиться, что WrapLimitsVacuumLock был освобожден после того, как VACUUM обнаружил недопустимые данные в pg_database.datfrozenxid или pg_database.datminmxid (Andres Freund) §

    Неудача в освобождении этой блокировки впоследствии может привести к тупиковой ситуации, хотя блокировка будет очищена, если сессия завершится или столкнется с какой-либо другой ошибкой.

  • Избегалось двойное воспроизведение подготовленных транзакций во время восстановления после сбоя (suyu.cmj, Michael Paquier) § §

    После сбоя во время контрольной точки, когда некоторые данные состояния двухфазной транзакции уже были выгружены на диск этой контрольной точкой, восстановление после сбоя может попытаться повторно воспроизвести подготовленную(ые) транзакцию(ии) дважды, что приведет к фатальной ошибке, такой как блокировка уже установлена в процессе запуска.

  • Убедитесь, что вновь созданная, но все еще пустая таблица fsync на следующем контрольном пункте (Хейкки Линнакангас) §

    Без этого, если произойдет сбой операционной системы, вызвавший исчезновение пустого файла, последующие операции с таблицей могут завершиться с ошибками не удалось открыть файл.

  • Убедитесь, что создание начальной вилки незалогированного индекса записано в WAL (Хейкки Линнакангас) §

    Хотя основной данные не зарегистрированного индекса не регистрируются в WAL, его начальная ветвь должна быть зарегистрирована, чтобы гарантировать, что у нас есть согласованное состояние для восстановления индекса после сбоя. Этот шаг был прне указан, если начальная ветвь не содержит данных, что не используется ни одним стандартным индексом AM; но, возможно, некоторые расширения работают таким образом.

  • Устранены ложные ошибки отсутствует contrecord (Томас Мунро) §

    Обрабатывайте этот случай как обычный конец WAL, чтобы избежать регистрации неточных жалоб от pg_waldump и walsender.

  • Исправлено чрезмерно строгую проверку в коде jsonpath (Дэвид Роули) §

    Это утверждение не выполнялось, если запрос применял оператор .type() к результату like_regex. В сборках без проверки утверждений ошибок не было.

  • Избежано сбоя утверждения при обработке пустого оператора через расширенный протокол запроса в уже прерванной транзакции (Tom Lane) §

  • Избежано сбоя утверждения, когда настройка stats_fetch_consistency изменена внутри транзакции (Kyotaro Horiguchi) §

  • Исправлена функция Soundex contrib/fuzzystrmatch difference() для корректной обработки пустого ввода (Александр Лахин, Том Лейн) §

    Входная строка, не содержащая буквенных символов, приводила к непредсказуемому выводу.

  • Ужесточены проверки пробелов в вводе contrib/hstore (Эван Джонс) §

    В некоторых случаях, символы могут быть неверно распознаны как пробелы и, следовательно, отброшены.

  • Запрещены слишком большие входные массивы с contrib/intarray's gist__int_ops индексным классом операций (Ankit Kumar Pandey, Александр Лахин) §

    Ранее этот код выдавал NOTICE, но продолжал работу, создавая недействительную запись индекса, которая представляет риск сбоев при чтении индекса.

  • Избегалась бесполезная двойная декомпрессия записей индекса GiST в contrib/intarray (Константин Книжник, Маттиас ван де Меент, Том Лейн) §

  • Исправлена функция contrib/pageinspect gist_page_items() для работы, когда включены столбцы индекса (Александр Лахин, Майкл Пакье) §

    Ранее, если в индексе были включены столбцы, gist_page_items() не мог отобразить эти значения на листовых страницах индекса, или вовсе вылетал на нелистовых страницах.

  • В psql игнорировалась переменная окружения PSQL_WATCH_PAGER, когда stdin/stdout не являлись терминалом (Tom Lane) §

    Это соответствует обработке PSQL_PAGER в командах, отличных от \watch.

  • Исправлено pg_dump для корректной обработки функций на языке SQL нового стиля, чьи тела требуют зависимостей времени разбора на уникальные индексы (Tom Lane) §

    Такие случаи могут возникнуть из-за предложений GROUP BY и ON CONFLICT, например. Функция затем должна быть отложена до момента после уникального индекса в выгрузке данных, но pg_dump этого не делал, а вместо этого выводил предупреждение о не удалось разрешить цикл зависимостей.

  • Улучшено отображение деталей о проблемах с циклическими зависимостями в pg_dump (Tom Lane) §

  • Избежано сбоя в pgbench с пустым конвейером и подготовленным режимом (Álvaro Herrera) §

  • Убедитесь, что pg_index.indisreplident поддерживается в актуальном состоянии в записях кэша отношений (Shruthi Gowda) §

    Это значение может быть устаревшим в некоторых случаях. Нет основного кода, который полагается на копию кэша отношений, поэтому это только скрытый баг, насколько касается самого Postgres; но могут быть расширения, для которых это активный баг.

  • Исправлен скрипт make_etags для работы с не-Exuberant ctags (Masahiko Sawada) §