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
, он должен применять любые политики RLSUPDATE
илиSELECT
, определенные на целевой таблице, для согласованности с тем, как работает обычныйUPDATE
с предложениемWHERE
. Вместо этого он применял политики RLSINSERT
для обоих действийINSERT
иUPDATE
.Кроме того, когда
MERGE
выполняет действиеDO NOTHING
, он применяет политики RLSDELETE
целевой таблицы к существующим строкам, даже если эти строки не удаляются. Хотя это не проблема безопасности, это может привести к нежелательным ошибкам.Проект 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
'sgist__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) §