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

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

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

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

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