E.14. Выпуск 16.11#
E.14. Выпуск 16.11 #
Дата выпуска: 2025-11-13
В этот выпуск были включены различные исправления из 16.10. Информация о новых возможностях в мажорном выпуске 16 была приведена в Раздел E.25.
E.14.1. Миграция на версию 16.11 #
Снятие дампа/восстановление не требуется для тех, кто использует 16.X.
Однако, если обновление выполнялось с версии ранее 16.10, см. Раздел E.15.
E.14.2. Изменения #
Были проверены привилегии
CREATEна схему вCREATE STATISTICS(Йелте Феннема-Нио) §Ранее отсутствие такой проверки позволяло владельцам таблиц создавать объекты статистики в любой схеме, что могло приводить к неожиданным конфликтам имён.
Проект PostgreSQL признателен Йелте Феннема-Нио за сообщение об этой проблеме. (CVE-2025-12817)
Было предотвращено переполнение целого числа при вычислениях размера выделения памяти внутри libpq (Джейкоб Чемпион) §
Ранее при вычислении объёма памяти, подлежащего выделению, отдельные функции libpq не учитывали все необходимые условия. При передаче значительных объёмов входных данных это могло приводить к целочисленному переполнению, в результате чего выделялся буфер недостаточного размера и запись выполнялась за его пределы.
Проект PostgreSQL признателен Алексею Соловьёву из Positive Technologies за сообщение об этой проблеме. (CVE-2025-12818)
JSON-конструкторные выражения, такие как
JSON_OBJECT(), были корректно обработаны как нестрогие (Tender Wang, Ричард Гуо) §В некоторых случаях эти выражения могли возвращать ненулевой результат, несмотря на наличие одного или нескольких входных значений NULL, что делало их нестрогими. Планировщиком они были ошибочно классифицированы как строгие, и в результате могли быть выполнены некорректные преобразования запроса.
Была дополнительно исправлена обработка символьных классов внутри регулярных выражений
SIMILAR TO(Лауренц Альбе) §Предыдущее исправление для преобразования выражений сопоставления с образцом
SIMILAR TOв регулярные выражения в стиле POSIX нарушило необычный случай, который ранее работал: если после открывающей скобки сразу следует экранирующий символ, а затем сразу после escape-последовательности идет закрывающая скобка (например,[\w]), то закрывающая скобка больше не воспринималась как завершающая класс символов.Была исправлена обработка агрегатных функций, аргументы которых содержали подзапрос с ссылкой
FROMна CTE вне агрегатной функции (Том Лэйн) §Такая ссылка на CTE должна была вести себя как ссылка на столбец внешнего уровня при определении семантического уровня агрегатной функции; однако это не учитывалось, что приводило к неочевидным ошибкам планировщика или исполнителя.
Исправлены ошибки “no relation entry for relid” в крайних случаях при оценке стоимости SubPlan (Ричард Го) §
Было предотвращено маловероятное использование уже освобождённой памяти при расширении секционированных таблиц планировщиком (Bernd Reiß) §
Опасность возникала только когда последний живой раздел был одновременно удалён.
Была удалена ошибочная проверка assert при очистке btree-индекса (Питер Геогеган) §
Была исправлена возможная бесконечная петля в сканировании индекса GIN с несколькими условиями сканирования (Том Лэйн) §
GIN может обрабатывать условия сканирования, которые позволяют отклонять несовпадающие записи, но не полезны для поиска релевантных записей, например, условие
tsqueryвида!term. Однако такое условие не должно быть первым в массиве условий сканирования. Код не обеспечивал это во всех случаях, в результате чего запрос с сочетанием таких условий и обычных условий мог работать или не работать в зависимости от порядка, в котором условия были указаны в запросе.Было обеспечено, что сканирования индексов GIN могут быть отменены (Том Лэйн) §
Ранее отдельные участки кода могли выполняться продолжительное время без проверки запросов на прерывание.
Было обеспечено, чтобы автоматическое суммирование BRIN предоставляло снимок для выражений индекса, которым он необходим (Альваро Эррера) § §
Ранее автоматическое суммирование для таких индексов не выполнялось, вследствие чего сохранялись заполнительные кортежи, что со временем приводило к разрастанию индекса.
Была исправлена опасность переполнения целого числа при сканировании BRIN-индексов, когда таблица содержала около 232 страниц (Sunil S) §
Такое поведение могло приводить к зацикливанию процесса сканирования либо к обработке избыточного числа страниц таблицы.
Была исправлена некорректная нулевая расширяемость сохранённых значений в JIT-сгенерированном коде деформирования кортежей (Дэвид Роули) §
При выполнении аналогичного кода без использования JIT применялось знаковое расширение вместо нулевого, что приводило к различиям в представлении значений Datum для целочисленных типов малого размера. В большинстве случаев это несоответствие не проявлялось, однако в отдельных ситуациях могло вызывать ошибки с сообщением “не удалось найти запись в таблице мемоизации” при использовании узлов планирования Memoize, а также приводить к другим побочным эффектам.
Была исправлена некорректная логика кэширования информации о результирующих отношениях для триггеров (Дэвид Роули, Амит Ланготе) §
При расхождении физических наборов столбцов секций и соответствующих наборов столбцов родительских секционированных таблиц такое поведение могло приводить к сбоям.
Были добавлены отсутствующие повторные проверки EvalPlanQual для плановых узлов TID Scan и TID Range Scan (Софи Алперт, Дэвид Роули) § §
Этот пропуск мог привести к возможному неповторному проверению условия на
ctidв ситуациях одновременного обновления, из-за чего поведение обновления могло различаться в зависимости от выбранного типа плана.Была исправлена обработка EvalPlanQual для внешних или пользовательских соединений, для которых не был подготовлен альтернативный локальный план соединения для EPQ (Масахико Савада, Эцуро Фуджита) §
В подобных ситуациях внешний или пользовательский метод доступа вызывался некорректно, что, как правило, приводило к сбоям.
Было избегнуто дублирование ограничений хеш-разделов во время
DETACH CONCURRENTLY(Haiyang Li) §Ранее команда
ALTER TABLE DETACH PARTITION CONCURRENTLYдобавляла копию ограничения секционирования к уже отсоединённому разделу. Такое поведение являлось некорректным, поскольку обычный (неконкурентный)DETACHне создаёт подобных ограничений, а при хеш-секционировании выражение ограничения содержит ссылки на OID родительской таблицы. Это могло приводить к проблемам при выполнении операций дампа и восстановления, а также в случаях удаления родительской таблицы послеDETACH. Начиная с версии 19 такие ограничения больше не создаются. В поддерживаемых ветках, для снижения риска побочных эффектов, добавление копии ограничения пропускается только для хеш-секционирования.Запрещено использование сгенерированных столбцов в ключах секционирования (Цзянь Хи, Ашутош Бапат) §
Ранее соответствующее ограничение уже действовало, однако проверка не охватывала отдельные случаи, в том числе ситуации с неявной ссылкой на столбец через ссылку на всю строку.
Сгенерированные столбцы были запрещены в предложениях
COPY ... FROM ... WHERE(Питер Айзенштраут, Джиан Хе) §Обращение к таким столбцам на этапе фильтрации
WHEREмогло приводить к некорректному поведению или выводу неинформативных сообщений об ошибках, поскольку вычисляемые значения ещё не были сформированы к моменту выполнения фильтрации.Была исправлена проверка видимости для статистических объектов в
pg_temp(Ноа Миш) §Статистические объекты, размещённые во временной схеме, требуют явного указания схемы в имени. Однако функция
pg_statistics_obj_is_visible()не учитывала это обстоятельство и могла возвращать значение “true” независимо от фактической видимости. В результате функции, такие какpg_describe_object(), не всегда добавляли имя схемы к имени объекта, как предполагалось.Исправлена отчетность
pg_event_trigger_dropped_objects()о временном статусе (Antoine Violin, Том Лейн) § §Если значение по умолчанию удалённого столбца, триггер или политика RLS принадлежали временной таблице, это сообщалось с
is_temporarytrue.Была исправлена утечка памяти в хешированных под-планах (Haiyang Li) §
Любая память, потреблённая хеш-функциями, использованными для хеширования кортежей, составляла утечку памяти на время выполнения запроса. Одним из способов, как это могло произойти, было то, что значения, подвергавшиеся хешированию, требовали де-тоастирования.
Была исправлена небольшая утечка памяти во время воспроизведения WAL при создании базы данных (Натан Боссарт) §
Была исправлена порча общей таблицы статистики после сбоев из-за нехватки памяти (Mikhail Kot) §
Ранее, сбой из-за нехватки памяти в процессе создания новой записи хеш-таблицы приводил к тому, что оставлялась повреждённая запись, что потенциально вызывало ошибки в других сессиях позже.
Была исправлена проблема с одновременным обновлением в
MERGE(Юго Нагата) §При выполнении действия
MERGE UPDATE, если имелось более одного одновременного обновления целевой строки, код блокировки и повторной попытки иногда некорректно определял последнюю версию целевого кортежа, что приводило к неправильным результатам.Были добавлены отсутствующие проверки идентичности реплики в
MERGEиINSERT ... ON CONFLICT DO UPDATE(Zhijie Hou) § § §Если
MERGEмог требовать действий обновления или удаления, и целевая таблица публиковала обновления или удаления, настаивалось на наличии определённогоREPLICA IDENTITY. Отсутствие этого требования могло бы незаметно нарушить репликацию. Аналогично,INSERTс опциейUPDATEдолжен был требоватьREPLICA IDENTITY, если целевая таблица публиковала либо вставки, либо обновления.Была предотвращена взаимоблокировка во время
DROP SUBSCRIPTION, когда издатель находился на том же сервере, что и подписчик (Дилип Кумар) §Было исправлено некорректное отображение задержки репликации в представлении
pg_stat_replication(Fujii Masao) §В случаях, когда LSN реплея резервного сервера переставал продвигаться, значения в столбцах
write_lagиflush_lagмогли переставать обновляться.Были предотвращены дублирующиеся сообщения в журнале о недопустимых настройках
primary_slot_name(Fujii Masao) §Незавершённый файл состояния слота был удалён после неудачной попытки записи состояния слота репликации на диск (Michael Paquier) §
При возникновении ошибок, например нехватки дискового пространства, временный файл состояния
state.tmpмог сохраняться. Это препятствовало выполнению последующих операций записи состояния и требовало ручной очистки.Было исправлено неправильное обработка сигналов тайм-аута блокировки в параллельных рабочих процессах применения для логической репликации (Хайато Курода) §
Ранее один и тот же номер сигнала использовался как для завершения работы воркера, так и для обработки тайм-аута блокировки, что приводило к неоднозначному поведению.
Было предотвращено нежелательное завершение работы получателя WAL при переключении с потокового источника WAL на архивный (Xuneng Zhou) §
При смене временной шкалы получатель WAL на резервном сервере должен оставаться активным в ожидании новой точки начала потоковой передачи WAL. Ранее он мог неоднократно завершать работу и сразу перезапускаться, что вводило в заблуждение механизмы мониторинга состояния.
Были предотвращены сбои в логической репликации из-за случайных совпадений номеров файлов между обычными и временными таблицами (Вигнеш Си) §
Эта маловероятная проблема проявлялась как временные ошибки, такие как “unexpected duplicate for tablespace
X, relfilenodeY”.contrib/autoprewarmтакже подвергался влиянию. Побочным эффектом исправления стало то, что SQL-функцияpg_filenode_relation()теперь будет игнорировать временные таблицы.Была исправлена проблема использования после освобождения памяти (use-after-free) в кеше синхронизации отношений, который поддерживался логическим декодирующим плагином pgoutput (Вигнеш С, Масаихико Савада) §
При возникновении ошибки во время логического декодирования последующие попытки декодирования в той же сессии могли завершаться сбоем. Такой сценарий был возможен только при вызове pgoutput через SQL-функции.
Было избегнуто ненужное аннулирование слотов логической репликации (Бертран Друво) §
Было предотвращено возникновение ошибки утверждения при попытке освободить слот репликации в однопользовательском режиме (Хайато Курода) §
Была предотвращена аварийная остановка при попытке тестирования PostgreSQL с определёнными опциями libsanitizer (Эммануэль Сиби, Джейкоб Чемпион) §
Корректно обработан
GROUP BY DISTINCTв операторах присваивания PL/pgSQL (Том Лэйн) §Ранее парсер не распознавал применение опции
DISTINCTв данном контексте, поэтому команда выполнялась так, как если бы использовался обычныйGROUP BY.Была предотвращена утечка памяти при обработке ошибки SQL внутри PL/Python (Том Лэйн) §
Ранее при возникновении ошибок SQL могла наблюдаться утечка памяти на протяжении сессии, появившаяся в предыдущих корректирующих выпусках.
Исправлен вывод трассировки libpq для символов с установленным старшим битом (Ran Benita) §
На платформах, где
charсчитался знаковым, вывод включал неэстетичное оформление\xffffff.В pg_dump были выгружены метки безопасности на подписках и триггерах событий (Цзянь Хи, Fujii Masao) §
Метки на этих типах объектов ранее были пропущены.
Исправлена сортировка pg_dump для стандартных ACL и ограничений внешнего ключа (Кирилл Решке, Альваро Эррера) § § §
Было обеспечено единообразное упорядочивание этих типов объектов базы данных, как уже было сделано для других типов объектов.
В pg_dump комментарии для отдельно выгруженных ограничений домена были помечены с правильной зависимостью (Ной Миш) §
Эта ошибка могла привести к тому, что параллельным pg_restore предпринималась попытка создать комментарий до того, как само ограничение было восстановлено.
В pg_restore были пропущены комментарии и метки безопасности для публикаций и подписок, которые не восстанавливались (Цзянь Хи, Fujii Masao) § §
Не следует вводить команды
COMMENTилиSECURITY LABELдля этих объектов, когда указаны--no-publicationsили--no-subscriptions.Были исправлены различные ошибки в логике сжатия данных в pg_dump и pg_restore (Даниэль Густафссон, Том Лэйн) § § §
В отдельных участках отсутствовала либо некорректно выполнялась проверка ошибок, а также выявлялись проблемы переносимости, проявляющиеся на системах с архитектурой
big-endian. Эти недостатки оставались незамеченными, поскольку соответствующий код используется исключительно для чтения сжатых TOC-файлов в дампах формата каталога. Утилита pg_dump не создаёт такие дампы; подобная ситуация возможна только при ручном сжатии TOC-файла после создания дампа, что поддерживается, но встречается крайне редко.pgbench был исправлен для корректного завершения с ошибкой, если была запущена операция
COPY(Антонин Боннефой) §Утилита pgbench не предназначена для обработки данного сценария. Ранее его возникновение могло приводить к зацикливанию выполнения.
Было исправлено pgbench’s отображение нескольких ошибок (Юго Нагата) §
При последовательном завершении с ошибкой двух вызовов
PQgetResultpgbench мог формировать некорректное диагностическое сообщение.В pgbench была исправлена некорректная проверка утверждения об ошибках в режиме конвейера (Юго Нагата) §
Было обеспечено, чтобы функции
contrib/pg_buffercacheмогли быть отменены (Satyanarayana Narlapuram, Yuhang Qiu) §Ранее отдельные участки кода могли выполняться продолжительное время без проверки запросов на прерывание.
Исправлены проверки привилегий в
contrib/pg_prewarmдля индексов (Ayush Vatsa, Натан Боссарт) § §Ранее функция
pg_prewarm()требовала наличия привилегииSELECTна отношение для выполнения предварительной загрузки. Поскольку индексы не имеют собственных SQL-привилегий, это приводило к тому, что несуперпользователи не могли выполнять предварительную загрузку индексов. В актуальной логике проверка привилегииSELECTвыполняется для таблицы, к которой относится индекс.Была повышена устойчивость
contrib/pgstattupleк пустым или недопустимым страницам индекса (Nitin Motiani) §Страницы, полностью заполненные нулями, рассматриваются как свободное пространство, а страницы, признанные недопустимыми при проверке размера специальной области, исключаются из обработки. Для btree-индексов такая логика применялась ранее, тогда как для индексов типов hash и gist подобные ситуации приводили к ошибкам. Во всех случаях реализовано игнорирование повреждённых страниц вместо генерации ошибок.
Ужесточены наши макросы барьеров чтения и записи для соответствия требованиям Clang (Томас Монро) §
Использование
__atomic_thread_fence()рассматривалось как достаточный барьер для предотвращения переупорядочивания обращений к памяти компилятором C, однако для Clang этого оказалось недостаточно. В ряде архитектур, включая RISC-V, MIPS и LoongArch, такое поведение могло приводить к генерации некорректного кода. Для устранения проблемы применены явные барьеры компилятора.Была исправлена сборка с LLVM версии 21 и новее (Holger Hoffstätte) §
При сборке с помощью meson те же специальные флаги оптимизации были применены для
numeric.cиchecksum.c, что и при сборке с помощью makefile (Натан Боссарт, Джефф Дэвис) § §Были использованы
-ftree-vectorizeдля обоих файлов, а также-funroll-loopsдляchecksum.c, чтобы соответствовать тому, что долгое время выполнялось make-файлами.Была исправлена инфраструктура сборки PGXS для поддержки сборки NLS
poфайлов для расширений (Ryo Matsumura) §