E.14. Выпуск 16.11#

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_temporary true.

  • Была исправлена утечка памяти в хешированных под-планах (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, relfilenode Y. 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 отображение нескольких ошибок (Юго Нагата) §

    При последовательном завершении с ошибкой двух вызовов PQgetResult pgbench мог формировать некорректное диагностическое сообщение.

  • В 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) §