E.16. Выпуск 16.11#
E.16. Выпуск 16.11 #
Дата выпуска: 2025-11-13
Этот выпуск содержит ряд исправлений из версии 16.10. Информацию о новых возможностях основного выпуска 16 см. Раздел E.27.
E.16.1. Миграция на версию 16.11 #
Снятие дампа/восстановление не требуется для тех, кто использует 16.X.
Однако при обновлении с версии ниже 16.10 см. Раздел E.17.
E.16.2. Изменения #
В команде
CREATE STATISTICSдобавлена проверка наличия правCREATEна схему (Jelte Fennema-Nio) §Ранее отсутствие такой проверки позволяло владельцам таблиц создавать объекты статистики в любой схеме, что могло приводить к неожиданным конфликтам имён.
Проект PostgreSQL признателен Йелте Феннема-Нио за сообщение об этой проблеме. (CVE-2025-12817)
Предотвращено целочисленное переполнение в libpq при вычислении требуемого объёма памяти (Jacob Champion) §
Ранее при вычислении объёма памяти, подлежащего выделению, отдельные функции libpq не учитывали все необходимые условия. При передаче значительных объёмов входных данных это могло приводить к целочисленному переполнению, в результате чего выделялся буфер недостаточного размера и запись выполнялась за его пределы.
Проект PostgreSQL признателен Алексею Соловьёву из Positive Technologies за сообщение об этой проблеме. (CVE-2025-12818)
Настроена корректная обработка выражений-конструкторов JSON типа
JSON_OBJECT()как нестрогих (Tender Wang, Richard Guo) §В некоторых случаях эти выражения могли возвращать ненулевой результат, несмотря на наличие одного или нескольких входных значений NULL, что делало их нестрогими. Планировщиком они были ошибочно классифицированы как строгие, и в результате могли быть выполнены некорректные преобразования запроса.
Дополнительно исправлена обработка классов символов в регулярных выражениях
SIMILAR TO(Laurenz Albe) §Предыдущее исправление для преобразования выражений сопоставления с образцом
SIMILAR TOв регулярные выражения в стиле POSIX нарушило необычный случай, который ранее работал: если после открывающей скобки сразу следует экранирующий символ, а затем сразу после escape-последовательности идет закрывающая скобка (например,[\w]), то закрывающая скобка больше не воспринималась как завершающая класс символов.Исправлен парсинг агрегатных функций, аргументы которых содержат подзапрос со ссылкой в предложении
FROMна обобщенное табличное выражение (CTE), находящееся за пределами агрегатной функции (Tom Lane) §Такая ссылка на CTE должна была вести себя как ссылка на столбец внешнего уровня при определении семантического уровня агрегатной функции; однако это не учитывалось, что приводило к неочевидным ошибкам планировщика или исполнителя.
Исправлены ошибки “no relation entry for relid”, возникавшие в редких случаях при оценке стоимости подпланов (Richard Guo §
Устранена маловероятная ошибка использования освобожденной памяти при раскрытии секционированных таблиц планировщиком (Bernd Reiß) §
Риск возникал только при параллельном удалении последней активной секции.
Удалена ошибочная проверка при очистке индекса B-дерева (Peter Geoghegan) §
Исправлено возможное зацикливание при сканировании индексов GIN с несколькими условиями (Tom Lane) §
GIN может обрабатывать условия сканирования, которые позволяют отклонять несовпадающие записи, но не полезны для поиска релевантных записей, например, условие
tsqueryвида!term. Однако такое условие не должно быть первым в массиве условий сканирования. Код не обеспечивал это во всех случаях, в результате чего запрос с сочетанием таких условий и обычных условий мог работать или не работать в зависимости от порядка, в котором условия были указаны в запросе.Обеспечена возможность отмены сканирования индексов GIN (Tom Lane) §
Ранее отдельные участки кода могли выполняться продолжительное время без проверки запросов на прерывание.
Настроено предоставление снимка для выражений индексов в ходе автоматического расчёта сводки для индексов BRIN, при необходимости (Álvaro Herrera) § §
Ранее автоматическое суммирование для таких индексов не выполнялось, вследствие чего сохранялись заполнительные кортежи, что со временем приводило к разрастанию индекса.
Устранена угроза целочисленного переполнения при сканировании индексов BRIN, если количество страниц в таблице приближается к 232 (Sunil S) §
Такое поведение могло приводить к зацикливанию процесса сканирования либо к обработке избыточного числа страниц таблицы.
Исправлено некорректное добавление нулей к хранимым значениям в коде кортежей, обработанных JIT (David Rowley) §
При выполнении аналогичного кода без использования JIT применялось знаковое расширение вместо нулевого, что приводило к различиям в представлении значений Datum для целочисленных типов малого размера. В большинстве случаев это несоответствие не проявлялось, однако в отдельных ситуациях могло вызывать ошибки с сообщением “не удалось найти запись в таблице мемоизации” при использовании узлов планирования Memoize, а также приводить к другим побочным эффектам.
Исправлена некорректная логика кэширования информации о результирующем отношении для триггеров (David Rowley, Amit Langote) §
Эта недоработка могла приводить к сбоям в случаях, когда наборы столбцов секций физически не совпадали с наборами столбцов их родительских секционированных таблиц.
Добавлены отсутствующие перепроверки EvalPlanQual для узлов плана сканирования по TID и сканирования диапазона TID (Sophie Alpert, David Rowley) § §
Этот пропуск мог привести к возможному неповторному проверению условия на
ctidв ситуациях одновременного обновления, из-за чего поведение обновления могло различаться в зависимости от выбранного типа плана.Исправлена обработка EvalPlanQual для сторонних или нестандартных соединений, для которых не подготовлен альтернативный план локального соединения (Masahiko Sawada, Etsuro Fujita) §
В подобных ситуациях внешний или пользовательский метод доступа вызывался некорректно, что, как правило, приводило к сбоям.
Предотвращено дублирование ограничений для секционирования по хешу при выполнении
DETACH CONCURRENTLY(Haiyang Li) §Ранее команда
ALTER TABLE DETACH PARTITION CONCURRENTLYдобавляла копию ограничения секционирования к уже отсоединённому разделу. Такое поведение являлось некорректным, поскольку обычный (неконкурентный)DETACHне создаёт подобных ограничений, а при хеш-секционировании выражение ограничения содержит ссылки на OID родительской таблицы. Это могло приводить к проблемам при выполнении операций дампа и восстановления, а также в случаях удаления родительской таблицы послеDETACH. Начиная с версии 19 такие ограничения больше не создаются. В поддерживаемых ветках, для снижения риска побочных эффектов, добавление копии ограничения пропускается только для хеш-секционирования.Аннулирована возможность использования генерируемых столбцов в ключах секционирования (Jian He, Ashutosh Bapat) §
Ранее соответствующее ограничение уже действовало, однако проверка не охватывала отдельные случаи, в том числе ситуации с неявной ссылкой на столбец через ссылку на всю строку.
Аннулирована возможность использования генерируемых столбцов в предложениях
COPY ... FROM ... WHERE(Peter Eisentraut, Jian He) §Обращение к таким столбцам на этапе фильтрации
WHEREмогло приводить к некорректному поведению или выводу неинформативных сообщений об ошибках, поскольку вычисляемые значения ещё не были сформированы к моменту выполнения фильтрации.Исправлена проверка видимости объектов статистики в
pg_temp(Noah Misch) §Статистические объекты, размещённые во временной схеме, требуют явного указания схемы в имени. Однако функция
pg_statistics_obj_is_visible()не учитывала это обстоятельство и могла возвращать значение “true” независимо от фактической видимости. В результате функции, такие какpg_describe_object(), не всегда добавляли имя схемы к имени объекта, как предполагалось.Исправлена отчетность
pg_event_trigger_dropped_objects()о временном статусе объектов (Antoine Violin, Tom Lane) § §Если удаленное значение по умолчанию столбца, триггер или политика защиты на уровне строк принадлежат временной таблице, они отмечаются значением
is_temporarytrue.Устранена утечка памяти в хешированных под-планах (Haiyang Li) §
Любая память, потреблённая хеш-функциями, использованными для хеширования кортежей, составляла утечку памяти на время выполнения запроса. Одним из способов, как это могло произойти, было то, что значения, подвергавшиеся хешированию, требовали де-тоастирования.
Устранена незначительная утечка памяти при воспроизведении WAL во время создания базы данных (Nathan Bossart) §
Исправлено повреждение разделяемой таблицы статистики после сбоев из-за нехватки памяти (Mikhail Kot) §
Устранена ситуация, когда сбой из-за нехватки памяти в процессе создания новой записи хеш-таблицы оставлял поврежденную запись, что впоследствии могло вызывать ошибки в других сессиях.
Исправлена проблема параллельного обновления в команде
MERGE(Yugo Nagata) §Исправлена ошибка, из-за которой при выполнении
MERGE UPDATEмеханизм блокировки и повтора мог некорректно определить последнюю версию целевого кортежа при наличии нескольких параллельных обновлений целевой строки, что приводило к неверным результатам.Добавлены отсутствующие проверки репликационных идентификаторов для команд
MERGEиINSERT ... ON CONFLICT DO UPDATE(Zhijie Hou) § § §Если
MERGEмог требовать действий обновления или удаления, и целевая таблица публиковала обновления или удаления, настаивалось на наличии определённогоREPLICA IDENTITY. Отсутствие этого требования могло бы незаметно нарушить репликацию. Аналогично,INSERTс опциейUPDATEдолжен был требоватьREPLICA IDENTITY, если целевая таблица публиковала либо вставки, либо обновления.Устранена взаимная блокировка при выполнении
DROP SUBSCRIPTION, когда публикующий сервер и подписчик находятся на одном сервере (Dilip Kumar) §Исправлено некорректное отображение отставания репликации в представлении
pg_stat_replication(Fujii Masao) §В случаях, когда LSN реплея резервного сервера переставал продвигаться, значения в столбцах
write_lagиflush_lagмогли переставать обновляться.Устранено дублирование сообщений в журнале о некорректных значениях параметра
primary_slot_name(Fujii Masao) §Обеспечено удаление незаконченного файла состояния слота при сбое записи состояния на диск (Michael Paquier) §
При возникновении ошибок, например нехватки дискового пространства, временный файл состояния
state.tmpмог сохраняться. Это препятствовало выполнению последующих операций записи состояния и требовало ручной очистки.Исправлена неправильная обработка сигналов об истечении времени ожидания блокировки параллельными рабочими процессами во время логической репликации (Hayato Kuroda) §
Ранее один и тот же номер сигнала использовался как для завершения работы воркера, так и для обработки тайм-аута блокировки, что приводило к неоднозначному поведению.
Устранена нежелательная остановка процесса-приёмника WAL при переключении с потоковой передачи на архивацию источника WAL (Xuneng Zhou) §
При смене временной шкалы получатель WAL на резервном сервере должен оставаться активным в ожидании новой точки начала потоковой передачи WAL. Ранее он мог неоднократно завершать работу и сразу перезапускаться, что вводило в заблуждение механизмы мониторинга состояния.
Устранены сбои в логической репликации из-за случайного совпадения номеров файлов обычных и временных таблиц (Vignesh C) §
Эта маловероятная проблема проявлялась как временные ошибки, такие как “unexpected duplicate for tablespace
X, relfilenodeY”.contrib/autoprewarmтакже подвергался влиянию. Побочным эффектом исправления стало то, что SQL-функцияpg_filenode_relation()теперь будет игнорировать временные таблицы.Устранена ошибка использования освобожденной памяти при кешировании информации о синхронизации отношений модулем логического декодирования pgoutput (Vignesh C, Masahiko Sawada) §
Исправлена ошибка, из-за которой сбой при логическом декодировании мог приводить к сбоям при последующих попытках логического декодирования в той же сессии. Данная ситуация возможна только при вызове pgoutput через SQL-функции.
Исключение ненужного аннулирования слотов логической репликации (Bertrand Drouvot) §
Устранен сбой проверки при попытке освободить слот репликации в однопользовательском режиме (Hayato Kuroda) §
Устранены сбои при тестировании PostgreSQL с использованием некоторых опций
libsanitizer(Emmanuel Sibi, Jacob Champion) §Обеспечена корректная обработка
GROUP BY DISTINCTв операторах присваивания PL/pgSQL (Tom Lane) §Ранее парсер не распознавал применение опции
DISTINCTв данном контексте, поэтому команда выполнялась так, как если бы использовался обычныйGROUP BY.Устранена утечка памяти при обработке ошибок SQL в PL/Python (Tom Lane) §
Ранее при возникновении ошибок SQL могла наблюдаться утечка памяти на протяжении сессии, появившаяся в предыдущих корректирующих выпусках.
В libpq исправлен вывод трассировки для символов с установленным старшим битом (Ran Benita) §
На платформах, где
charсчитался знаковым, вывод включал неэстетичное оформление\xffffff.В pg_dump добавлена выгрузка меток безопасности для подписок и событийных триггеров (Jian He, Fujii Masao) §
Метки на этих типах объектов ранее были пропущены.
Исправлена сортировка списков управления доступом (ACL) по умолчанию и ограничений внешних ключей в pg_dump (Kirill Reshke, Álvaro Herrera) § § §
Было обеспечено единообразное упорядочивание этих типов объектов базы данных, как уже было сделано для других типов объектов.
В pg_dump комментарии для отдельно выгружаемых ограничений домена помечаются с правильной зависимостью (Noah Misch) §
Эта ошибка могла привести к тому, что параллельным pg_restore предпринималась попытка создать комментарий до того, как само ограничение было восстановлено.
В pg_restore реализован пропуск комментариев и меток безопасности для публикаций и подписок, которые не восстанавливаются (Jian He, Fujii Masao) § §
Не следует вводить команды
COMMENTилиSECURITY LABELдля этих объектов, когда указаны--no-publicationsили--no-subscriptions.Исправлены различные ошибки в логике сжатия данных в pg_dump и pg_restore (Daniel Gustafsson, Tom Lane) § § §
В отдельных участках отсутствовала либо некорректно выполнялась проверка ошибок, а также выявлялись проблемы переносимости, проявляющиеся на системах с архитектурой
big-endian. Эти недостатки оставались незамеченными, поскольку соответствующий код используется исключительно для чтения сжатых TOC-файлов в дампах формата каталога. Утилита pg_dump не создаёт такие дампы; подобная ситуация возможна только при ручном сжатии TOC-файла после создания дампа, что поддерживается, но встречается крайне редко.Обеспечено корректное завершение работы в pgbench, если инициирована операция
COPY(Anthonin Bonnefoy) §Утилита pgbench не предназначена для обработки данного сценария. Ранее его возникновение могло приводить к зацикливанию выполнения.
Исправлено формирование отчетов о множественных ошибках в pgbench (Yugo Nagata) §
При последовательном завершении с ошибкой двух вызовов
PQgetResultpgbench мог формировать некорректное диагностическое сообщение.В pgbench исправлено ошибочное утверждение об ошибках в конвейерном режиме (Yugo Nagata) §
Обеспечена возможность отмены выполнения функций расширения
contrib/pg_buffercache(Satyanarayana Narlapuram, Yuhang Qiu) §Ранее отдельные участки кода могли выполняться продолжительное время без проверки запросов на прерывание.
Исправлены проверки привилегий в
contrib/pg_prewarmдля индексов (Ayush Vatsa, Nathan Bossart) § §Ранее функция
pg_prewarm()требовала наличия привилегииSELECTна отношение для выполнения предварительной загрузки. Поскольку индексы не имеют собственных SQL-привилегий, это приводило к тому, что несуперпользователи не могли выполнять предварительную загрузку индексов. В актуальной логике проверка привилегииSELECTвыполняется для таблицы, к которой относится индекс.Повышена устойчивость модуля
contrib/pgstattupleпри обработке пустых или некорректных страниц индексов (Nitin Motiani) §Страницы, полностью заполненные нулями, рассматриваются как свободное пространство, а страницы, признанные недопустимыми при проверке размера специальной области, исключаются из обработки. Для btree-индексов такая логика применялась ранее, тогда как для индексов типов hash и gist подобные ситуации приводили к ошибкам. Во всех случаях реализовано игнорирование повреждённых страниц вместо генерации ошибок.
Усилены макросы барьеров для чтения и записи в целях соответствия строгим требованиям компилятора Clang (Thomas Munro) §
Использование
__atomic_thread_fence()рассматривалось как достаточный барьер для предотвращения переупорядочивания обращений к памяти компилятором C, однако для Clang этого оказалось недостаточно. В ряде архитектур, включая RISC-V, MIPS и LoongArch, такое поведение могло приводить к генерации некорректного кода. Для устранения проблемы применены явные барьеры компилятора.Была исправлена сборка с LLVM версии 21 и новее (Holger Hoffstätte) §
При сборке с помощью meson применяются те же специальные флаги оптимизации для
numeric.cиchecksum.c, что и при сборке с помощью makefile (Nathan Bossart, Jeff Davis) § §Были использованы
-ftree-vectorizeдля обоих файлов, а также-funroll-loopsдляchecksum.c, чтобы соответствовать тому, что долгое время выполнялось make-файлами.Исправлена инфраструктура сборки PGXS сборку файлов
poдля расширений с помощью NLS (Ryo Matsumura) §