E.16. Выпуск 16.9 #
Дата выпуска: 2025-05-08
В этот выпуск вошли различные исправления, внесённые после версии 16.8. За информацией о нововведениях версии 16 обратитесь к Разделу E.25.
E.16.1. Миграция на версию 16.9 #
Если используется версия 16.X, выгрузка/восстановление базы не требуется.
Однако если вы используете ограничения ссылающихся на себя внешних ключей в секционированных таблицах, может потребоваться пересоздать такие ограничения, чтобы удостовериться в их корректном применении. Обратитесь ко второму пункту в списке изменений ниже.
Кроме того, если вы используете фильтры Блума в индексах BRIN, после обновления рекомендуется выполнить переиндексацию. Обратитесь к третьему пункту в списке изменений ниже.
Если вы обновляете сервер с более ранней версии, чем 16.5, см. Раздел E.20.
E.16.2. Изменения #
- Устранение выхода за границы буфера на один байт при проверке некорректно закодированных строк, которые якобы приведены в кодировке GB18030 (Ной Миш, Андрес Фройнд) § - Если неполный многобайтовый символ появлялся за пределами памяти, на сервере и в использующих libpq приложениях с невысокой вероятностью мог возникать сбой из-за ошибки сегментации SIGSEGV. (CVE-2025-4207) 
- Исправление обработки ссылающихся на себя внешних ключей в секционированных таблицах (Альваро Эррера) § - При создании или присоединении секций для ограничения внешнего ключа не создавались необходимые записи каталога, если это ограничение ссылалось на ту же секционированную таблицу. По этой причине ограничение не применялось в полной мере. - Чтобы устранить проблему, удалите и пересоздайте ссылающиеся на себя внешние ключи в секционированных таблицах, если секции были созданы или присоединены после создания ограничения. Обратите внимание, что строки, нарушающие ограничение, уже могут содержаться в таблицах, поэтому пересоздать ограничение в этом случае не получится и придётся исправить эти строки, чтобы попробовать устранить проблему ещё раз. 
- Предотвращение потери данных во время слияния сжатых сводок индекса BRIN при помощи функции - brin_bloom_union()(Томаш Вондра) §- В коде не учитывались результаты распаковки из-за их неидентичности входным данным. По этой причине некоторые данные не попадали в объединённую сводку, что приводило к потере строк при поиске по индексу. - Эта ошибка присутствовала ещё с PostgreSQL 14, где появилась возможность использовать фильтры Блума в индексах BRIN. Однако это место кода тогда практически не задействовалось. Теперь в PostgreSQL 17 вероятность натолкнуться на эту ошибку существенно возросла, поскольку код используется при параллельном построении индексов. 
- Устранение непредвиденных ошибок «attribute has wrong type» (атрибут имеет неверный тип) в запросах - UPDATE,- DELETEи- MERGE, при которых переменные «вся строка» таблицы ссылаются на представления или функции в предложении- FROM(Том Лейн) §
- Исправление слияния с секционированной таблицей при помощи команды - MERGEс действиями- DO NOTHING(Тендер Ван) §- В некоторых случаях возникала ошибка «unknown action in MERGE WHEN clause» (неизвестное действие в предложении MERGE WHEN). 
- Устранение сбоя команды - INSERT, который мог возникать, если у таблицы был столбец, определённый со свойством- GENERATED, с типом данных домена и ограничения домена запрещали значения- NULL(Цзянь Хи) §- Ошибка ограничения возникала даже при нормальных результатах генерирующего выражения. 
- Исправление обработки ссылок на имена внешних CTE внутри предложения - WITH, присоединённого к команде- INSERT/- UPDATE/- DELETE/- MERGE, которая сама находится внутри предложения- WITH(Том Лейн) §- Анализатор запросов не выявлял недопустимые случаи рекурсивных запросов и не учитывал такие ссылки при сортировке CTE в корректном порядке выполнения. 
- Запрет параллельных вызовов функции - array_agg(), если типом её аргумента является анонимная запись (Ричард Гуо, Том Лейн) §- Протокол взаимодействия параллельных рабочих процессов не поддерживает определение конкретного типа записи, возвращаемой рабочим процессом. 
- Исправление вывода некорректных результатов конструкциями - ARRAY(и- подзапрос)- ARRAY[при передаче данных типа- выражение, ...]- int2vectorили- oidvector(Том Лейн) §- Это исправление восстанавливает поведение, которое демонстрировалось до версии PostgreSQL 9.5. Результат теперь снова выводится с типом - int2vector[]или- oidvector[].
- Исправление возможных некорректных выводов ошибок о недействительных аффиксах во время разбора словарей Ispell (Джейкоб Брейзил) § 
- Исправление команды - ALTER TABLE ADD COLUMNдля корректной обработки типа данных домена со значением по умолчанию (Цзянь Хи, Том Лейн, Тендер Ван) §- Если у доменного типа было значение по умолчанию, при добавлении столбца этого типа (без явного указания предложения - DEFAULT) значение домена по умолчанию к существующим строкам не применялось. Вместо этого в новом столбце подставлялось значение- NULL.
- Исправление некорректного поведения при дублировании имён столбцов в действии - ON DELETE SET DEFAULTили- SET NULLограничения внешнего ключа (Том Лейн) §
- Улучшение текста сообщения об ошибке, которое выводится при попытках недопустимого изменения свойств ограничения внешнего ключа (Альваро Эррера) § 
- Исправление ошибки, возникавшей при сбросе флага - relhassubclassвременной таблицы, для которой указано предложение- ON COMMIT DELETE ROWS(Ной Миш) §
- Добавление недостающего разбора аргумента - INDENTфункции- XMLSERIALIZE()(Джим Джонс) § §- Ранее представления или правила, использующие - XMLSERIALIZE(... INDENT), выгружались без предложения- INDENT, что приводило к некорректным результатам после восстановления.
- Предотвращение преждевременного вычисления аргументов агрегатной функции, которой одновременно переданы аргументы - FILTERи- ORDER BY(или- DISTINCT) (Дэвид Роули) §- При передаче - ORDER BYили- DISTINCTвозможна предварительная сортировка входных значений агрегатной функции вместо сортировки внутри узла- Aggплана. Однако это может быть проблемой, если на вход агрегатной функции передаются данные, которые могут привести к ошибке вычисления (например, операция деления с одним из делителей равным нулю), и указано предложение- FILTER, призванное исключить такие ошибки. Ранее при предварительной сортировке выражения вычислялись до выполнения- FILTER, и ошибки не исключались. Теперь предварительная сортировка не используется, если указано предложение- FILTERи входные данные сложнее, чем простые переменные или константы.
- Исправление ошибки планировщика при определении более одного хешируемого подвыражения - ScalarArrayOpExprвнутри выражения верхнего уровня (Давид Гайер) §- Это приводило к неэффективному выполнению дополнительных подвыражений, которые могли быть обработаны через хеш-таблицу (а именно предложений - IN,- NOT INили- = ANY, которым передавались только константы).
- Отключение оптимизации «пропуск выборки» в сканировании кучи по битовой карте (Маттиас ван де Меент) § - Оказалось, что из-за этой оптимизации могли возвращаться мёртвые кортежи, когда параллельные операции очистки помечали страницу как полностью видимую. 
- Устранение проблем производительности при запуске поиска по индексу GIN с большим числом поисковых ключей (Том Лейн, Винод Шридхаран) § § - Поиск по индексируемым предложениям с большим числом поисковых ключей (например, - jsonbcol ?| array[...]с десятками тысяч элементов массива) запускался через O(N2) времени. В течение этого временного промежутка его также нельзя было отменить.
- Выявление недостающих опорных процедур в классе операторов индекса BRIN и вывод ошибки вместо сбоя (Альваро Эррера) § 
- Реагирование на прерывания (например, отмену запроса) во время ожидания асинхронных подпланов узла плана - Append(Хейкки Линнакангас) §- Ранее ничего не происходило, пока один из подпланов не был готов. 
- Более частая передача статистики ввода-вывода от активных передатчиков WAL (Бертран Друво) § - Ранее для процесса-передатчика WAL в представлении - pg_stat_ioстатистика ввода-вывода отображалась только после его завершения. Теперь статистика обновляется максимум с секундной задержкой.
- Устранение условий гонки при обработке параметра конфигурации - synchronous_standby_namesсразу после запуска сервера (Максим Мельников, Микаэль Пакье)- В течение короткого промежутка времени после запуска системы обслуживающие процессы могли не дожидаться синхронного подтверждения транзакций, несмотря на установленный параметр - synchronous_standby_names.
- Устранение бесконечного цикла при значении INT_MAX для - scram_iterations(Кевин К. Биджу) §
- Предотвращение возможных сбоев из-за двойного преобразования подзапроса функции - json_array()(Том Лейн) §
- Устранение сбоя функции - pg_strtof()при передаче- NULLв- endptr(Александр Лахин, Том Лейн) §
- Устранение сбоя из-за нехватки памяти при установлении значений для некоторых GUC (Даниэль Густафссон) § 
- Устранение сбоя при нехватке памяти в стеммере Snowball (Максим Коротков) § 
- Запрет копирования аннулированных слотов репликации (Шлок Кьял) § - Это позволяет избежать проблем, когда аннулированный слот указывает на уже удалённый WAL. 
- Запрет восстановления слотов логической репликации на резервных серверах, не находящихся в режиме горячего резерва (Масахико Савада) § - Это позволяет предотвратить сценарий, при котором слот может оставаться действительным после повышения резервного сервера до ведущего даже при слишком низком значении параметра конфигурации - wal_level.
- Предотвращение слишком сильного продвижения значения - catalog_xminв «ускоренном» режиме логического декодирования (Хоу Чжицзе) §- Ранее это могло приводить к очистке удалённых записей каталога, несмотря на то, что они потенциально могли быть необходимы процессу чтения WAL. 
- Предотвращение потери данных при выполнении DDL-операций без сильной блокировки для таблиц, участвующих в логической репликации (Шлок Кьял, Хайато Курода) § - Изменения каталога, вызванные командами DDL, не отражались в процессах декодирования WAL, из-за чего последующие изменения декодировались с использованием устаревших данных каталога. Это потенциально могло приводить к повреждению данных. 
- Предотвращение некорректного сброса источника репликации при ошибке рабочего процесса применения изменений, когда ошибка перехватывается и рабочий процесс не завершается (Хайато Курода) § - В результате этой ошибки могли применяться дублирующиеся данные. 
- Запрет создания дубликата снимка при поиске по индексу во время логической репликации (Хейкки Линнакангас) § § 
- Улучшение выявления подписок, принимающих изменения от разных источников (Хоу Чжицзе, Шлок Кьял) - Если для таблицы, на которую создаётся подписка, уже существуют подписки в рамках других публикаций, при создании подписки выводится предупреждение, поскольку в таком случае могут поступать дублирующие данные. Изменение улучшает эту логику и позволяет выявлять случаи, когда в рамках другой публикации создана подписка для родительской секции или дочерней таблицы. 
- Исправление некорректной информации о контрольной точке в сообщении об ошибке, выводимом в случае неверного выбора линии времени для восстановления (Дэвид Стил) § - Если запрошенная линия времени недостижима, значения выводимых в сообщении контрольной точки и линии времени должны считываться из файла - backup_label, если он создан. Ранее в сообщение попадали значения из управляющего файла, что корректно при восстановлении из управляющего файла без файла- backup_label, но некорректно при наличии файла- backup_label.
- Удаление некорректного проверочного утверждения в функции - pgstat_report_stat()(Микаэль Пакье) §
- Исправление слишком строгого проверочного утверждения в функции - gistFindCorrectParent()(Хейкки Линнакангас) §
- Устранение сбоя проверочного утверждения, возникавшего в редких случаях на резервных серверах при перезапуске ведущего (Хейкки Линнакангас) § 
- Исправление ошибки «unexpected plan node type» (неожиданный тип узла плана) в PL/pgSQL при определении прокручиваемого курсора для простого запроса - SELECT(Андрей Лепихов)- выражение
- Запрет удаления отдельных секций индекса в режиме - --cleanутилиты pg_dump (Цзянь Хи) §- Сервер не принимает такие команды - DROP. Однако реальных последствий это не вызывает, поскольку секции всё равно удалятся при последующем удалении их родительских таблиц или секционированного индекса. Тем не менее выводимая ошибка о попытке удаления мешала во время восстановления в режиме- --single-transaction.
- Запрет генерирования недействительных команд - GRANTдля ролей утилитой pg_dumpall, если в каталоге- pg_auth_membersсодержатся недействительные OID ролей (Том Лейн) §- Вместо этого теперь выводится предупреждение, и вхождение каталога пропускается. Такое решение позволяет лучше справляться с повреждением каталога, которое могло возникать в ветвях старых версий в результате условий гонки между командами - GRANTи- DROP ROLE.
- Использование корректной функции для высвобождения памяти, выделенной libpq, для утилит pg_amcheck и pg_upgrade (Микаэль Пакье, Ранье Вилела) § § § - Эти недоработки могли приводить к сбоям в некоторых конфигурациях сборок для Windows, например в отладочной сборке libpq, используемой неотладочной сборкой вызывающего приложения. 
- Возможность прерывать запросы - contrib/dblinkоперацией отмены запроса (Ной Миш) §- Это изменение также переносит правки кода из PostgreSQL 17. Оно предотвращает возможные зависания команд - CREATE DATABASEи- DROP DATABASEиз-за ошибок при определении взаимоблокировок.
- Устранение сбоя при передаче повреждённых входных данных функции - heap_page_items()модуля- contrib/pageinspect(Дмитрий Коваленко)
- Устранение сбоя проверочного утверждения в функции - pg_freespace()модуля- contrib/pg_freespacemap(Тендер Ван) §- Вызов функции - pg_freespace()для отношений без физического хранилища (например, для представлений) приводил к сбою проверочного утверждения, хотя негативно на сборки без проверочных утверждений это не влияло. Теперь для таких случаев добавлена проверка ошибок.
- Исправление ошибки сборки в macOS 15.4 (Том Лейн, Питер Эйзентраут) § - Обновление macOS повредило проверку конфигурации для функции - strchrnul().
- Обновление данных часовых поясов до версии tzdata 2025b, включающее изменение правил перехода на летнее время в Чили, а также корректировку исторических данных для Ирана (Том Лейн) § - Появился новый часовой пояс America/Coyhaique для области Айсен в Чили, который позволяет учитывать для неё часовой пояс UTC-03 без перехода на летнее время и соответствующее расхождение с поясом America/Santiago.