E.15. Выпуск 16.12#

E.15. Выпуск 16.12

E.15. Выпуск 16.12 #

Дата выпуска:  2026-02-12

Этот выпуск содержит различные исправления, внесённые после версии 16.11. Информация о новых возможностях в основном выпуске 16 приведена в Раздел E.27.

E.15.1. Миграция на версию 16.12 #

Снятие дампа/восстановление не требуется для тех, кто использует 16.X.

Однако при обновлении с версии ниже 16.10 см. Раздел E.17.

E.15.2. Изменения #

  • Обеспечена защита от неожиданных размеров oidvector/int2vector (Том Лейн) §

    Предполагалось, что эти типы данных будут представлять собой одномерные массивы, не содержащими NULL-значений, но существуют способы приведения типов, которые позволяют нарушать эти ожидания. Поэтому в некоторые функции, которые зависели от этих ожиданий, добавлены дополнительные проверки: при передаче несоответствующего массива они больше не работают некорректно.

    Проект PostgreSQL благодарит Алтана Бирлера за сообщение об этой проблеме. (CVE-2026-2003)

  • Усилены меры защиты при добавлении функций оценки избирательности в операторы, которые принимают неожиданные типы данных (Том Лейн) § § §

    Ранее модуль contrib/intarray содержал функцию оценки избирательности, которая могла быть использована для выполнения произвольного кода, поскольку не проверялось, что её входные данные соответствуют ожидаемому типу данных. Следовало бы, чтобы сторонние расширения проверялись на наличие подобных уязвимостей и добавлялись защиты с использованием метода, который теперь применяется в модуле intarray. Поскольку исправления таких расширений займут время, теперь для присоединения нестандартной функции оценки избирательности в операторы требуются права суперпользователя.

    Проект PostgreSQL благодарит Даниэля Фирера, участника zeroday.cloud, за сообщение об этой проблеме. (CVE-2026-2004)

  • Исправлено переполнение буфера в функциях обратного защитного преобразования на базе PGP модуля contrib/pgcrypto (Микаэль Пакье) §

    Расшифровка специально созданного сообщения с чрезмерно длинным сеансовым ключом приводила к переполнению буфера, что могло привести к последствиям вплоть до выполнения произвольного кода.

    Проект PostgreSQL благодарит команду Xint Code, участников zeroday.cloud, за сообщение об этой проблеме. (CVE-2026-2005)

  • Исправлена недостаточная проверка длин многобайтных последовательностей (Томан Манро, Ной Миш) § § § § § §

    Ранее различные ошибки позволяли злоумышленникам выполнять специально сформированные SQL-запросы, тем самым переполнять строковые буферы, что могло привести к таким серьёзным последствиям, как выполнение произвольного кода. После внесения этих исправлений приложения при обработке строковыми функциями некорректного текста, который был сохранён в базе данных, могут столкнуться с ошибками invalid byte sequence for encoding.

    Проект PostgreSQL благодарит Пауля Гесте и Морица Занфта, участников zeroday.cloud, за сообщение об этой проблеме. (CVE-2026-2006)

  • Запрещены ссылки на общие табличные выражения (CTE) во вложенных подзапросах SELECT для определения семантических уровней агрегатных функций (Том Лейн) §

    Это изменение отменяет изменение, внесённое двумя корректирующими выпусками ранее. Теперь выводится ошибка, если вложенный подзапрос SELECT ссылается на CTE, который находится ниже семантического уровня, который стандартные правила SQL назначили бы агрегатной функции на основе содержащихся в ней узлов агрегирования и ссылок на столбцы. Попытка исправления вызвала новые проблемы, и неясно, что делать вместо этого. Поскольку вложенные подзапросы SELECT внутри агрегатных функций запрещены стандартом SQL, обработка таких случаев как ошибок считается достаточной.

  • Исправлен механизм перехвата переходной таблицы триггером для запросов с CTE, содержащих команду MERGE (Дин Рашид) §

    Ранее при изменении данных с помощью запросов с CTE, содержащего как MERGE, так и другую DML-операцию для таблицы с триггерами AFTER на уровне оператора, переходные таблицы, перехватываемые триггерам, включали только строки, затронутые другими операциями, но не строки, затронутые MERGE.

  • Исправлена ошибка при отсечении всех дочерних таблиц секционированной целевой таблицы, для которой выполняются операции обновления или удаления (Амит Ланготе) §

    Ранее в таких случаях исполнитель мог выводить ошибки could not find junk ctid column, хотя никаких действий не требовалось.

  • Предотвращена возможная ошибка планировщика при наличии в запросе дублирующихся вызовов оконных функций (Мэн Чжан, Дэвид Роули) §

    Путаница при исключении дубликатов таких вызовов могла приводить к ошибкам вида WindowFunc with winref 2 assigned to WindowAgg with winref 1.

  • Гарантировано сканирование частичных хешированных индексов даже в случаях, когда предикат индекса подразумевал истинность условия WHERE (Том Лейн) §

    Обычно предложение WHERE, подразумеваемое предикатом, игнорировалось, поскольку его проверка бессмысленна — оно должно выполняться для каждой записи индекса. Однако, это могло препятствовать созданию плана сканирования, если индекс требовал наличия предложения WHERE по ведущему ключу индекса, как это делают хеш-индексы. Теперь подразумеваемые предложения не игнорируются при сканировании таких индексов.

  • Запрещена выдача записей WAL для незалогированных BRIN-индексов (Кирилл Решке) §

    В редких случаях для индекса BRIN некорректно выдавалась запись WAL, даже если индекс был помечен как незалогированный. А при попытке восстановления записи после сбоя выдавалась ошибка, что восстанавливаемый файл уже существует.

  • Предотвращено опустошение буфера CLOG, который необходим для обработки непрочитанных сообщений NOTIFY (Джоэл Джейкобсон, Хейкки Линнакангас) § § §

    Это исправление позволяет избежать ошибок could not access status of transaction, когда серверный процесс с задержкой обрабатывал сообщения NOTIFY.

  • Ошибки, возникающие при обработке сообщений NOTIFY, повышены до уровня важности FATAL, то есть с требованием закрытия соединения (Хейкки Линнакангас) §

    Ранее, если серверный процесс получал ошибку при обработке сообщения NOTIFY, он игнорировал отсутствие уведомления, сообщал об ошибке клиенту и продолжал работу, переходя к следующему сообщению. Однако такое поведение было сопряжено с проблемами. Одной из основных проблем являлось то, что клиент не мог узнать о потере уведомления, и уж тем более не мог узнать его содержимое. В зависимости от логики работы, пропущенное уведомление могло привести к тому, что приложение, например, зависало в ожидании. Кроме того, оставшиеся сообщения не обрабатывались до тех пор, пока не было отправлено новое сообщение NOTIFY.

    Кроме того, если соединение простаивает в момент получения NOTIFY, любая ошибка уровня ERROR всё равно была бы повышена до уровня FATAL по причинам, не связанным с данной проблемой. Поэтому для согласованности и чёткого информирования приложения о том, что некоторые уведомления могли быть пропущены, было принято решение делать это во всех случаях.

  • Исправлена ошибка в отслеживании цепочки обновлений при блокировке версий кортежа (Джаспер Смит) §

    При построении цепочки обновлений xmin первого нового кортежа не проверялся, что могло привести к блокировке кортежа, не связанного с обновлениями, если исходный процесс обновления был прерван, а дисковое пространство немедленно возвращено с помощью команды VACUUM и повторно использовано. Это могло приводить к неожиданным задержкам транзакций или взаимоблокировкам. Также фиксировались ошибки, связанные с некорректным определением кортежа.

  • Исправлены проблемы, связанные с обновлениями каталога на месте (Ной Миш) § § §

    Теперь при обновлении на месте отправляется сообщение о нетранзакционном аннулировании, поскольку такое обновление сохраняется в случае отката транзакции. Также гарантировано, что обновление записывается в WAL до того, как его смогут увидеть другие сессии. Эти исправления в первую очередь предотвращали сценарии, при которых атрибуты замороженных XID для отношений становились несогласованными, что могло привести к опустошению буфера CLOG и последующим ошибкам could not access status of transaction.

  • Исправлена потенциальная аварийная остановка серверного процесса при завершении работы из-за попытки снять блокировку с уже освобождённого сегмента разделяемой памяти (Рахила Сьед) §

  • Обеспечена защита от некорректного усечения журнала мультитранзакций после сбоя (Хейкки Линнакангас) §

  • Исправлена возможная ошибка с некорректной обработкой результата функции pg_stat_get_backend_activity() (Чао Ли) §

    Ранее буфер разделяемой памяти, содержащий строку активности сеанса, мог завершаться неполным многобайтовым символом. Ожидалось, что функции-обработчики будут отсекать такие неполные символы, но этого не происходило.

  • Защита от рекурсивного записи в журнал контекстов памяти (Фудзии Масао) §

    Постоянный поток сигналов, запрашивающих запись контекстов памяти, мог приводить к рекурсивному выполнению кода записи в журнал, что теоретически могло привести к переполнению стека.

  • Исправлено использование контекста памяти при повторной инициализации контекста параллельного выполнения (Якуб Вартак, Дживан Чок) §

    Этот сценарий мог приводить к сбою из-за того, что подчинёная структура данных имела более короткий срок жизни, чем параллельный контекст. В ядре PostgreSQL проблема не наблюдалась, но возникала при работе с расширениями.

  • Реализовано смещение следующей мультитранзакции при создании новой мультитранзакции во избежание цикла ожидания в особых случаях (Андрей Бородин) § §

    Ранее могло произойти зависание в ожидании обновления, которое никогда бы не было выполнено.

  • Предотвращение многократной перезаписи CTE, изменяющих данные (Бернис Саути, Дин Рашид) §

    Ранее при обновлении автоматически обновляемого представления или отношения с правилами, если исходный запрос содержал изменяющие данные CTE, они могли перезаписываться несколько раз из-за рекурсии. Это было неэффективно и могло приводить к ложным ошибкам, если CTE включали обновление генерируемого столбца.

  • Запрещено восстановление после сбоя при отсутствии записей WAL от позиции наката изменений, указанных в записи контрольной точки (Нитин Ядав) §

    Перед началом восстановления добавлена явная проверка, для тог чтобы избежать негативных последствий и получить полезное сообщение об ошибке. Ранее в этой ситуации восстановление могло привести к сбою или повреждению базы данных.

  • Предотвращено изменение исходного дерева запроса во время ALTER PUBLICATION (Сунил С) §

    Ошибка проявлялась в том, что триггер событий, срабатывающий для запроса, видел только первый параметр publish, даже если было указано несколько. Если такой запрос был настроен как подготовленный оператор, повторные выполнения также работали некорректно.

  • Гарантирована передача параметров подключения, указанных в команде CREATE SUBSCRIPTION ... CONNECTION процессу walsender публикующего сервера (Фудзии Масао) §

    Ранее параметр подключения options (если был указан) игнорировался, что, например, препятствовало установке пользовательских значений параметров сервера в сеансе walsender. Предполагалось, что это должно работать, и это действительно работало до рефакторинга в версии PostgreSQL 15, который нарушил эту возможность, поэтому было восстановлено прежнее поведение.

  • Предотвращено аннулирование только что созданных или только что синхронизированных слотов репликации (Хоу Чжицзе) §

    Условие гонки с параллельно выполняемой контрольной могло приводить к удалению записи WAL, необходимой слоту репликации, что немедленно помечало слот как аннулированный.

  • Устранено условие гонки при вычислении необходимого xmin для слота репликации (Хоу Чжицзе) §

    Это могло приводить к ошибке cannot build an initial slot snapshot as oldest safe xid follows snapshot's xmin.

  • Зафиксировано добавление записи pg_replication_origin во время начальной синхронизации подписки логической репликации до начала копирования данных (Чжицзе Хоу) §

    Ранее если копирование завершалось неудачно, новая запись pg_replication_origin терялась из-за отката транзакции. Это приводило к несогласованному состоянию в разделяемой памяти.

  • Остановка логической репликации после сбоя применения параллельного рабочего процесса (Чжицзе Хоу) §

    Ранее подписчик мог потерять транзакции.

  • Исправлена возможная ошибка unexpected data beyond EOF во время перезапуска сервера с потоковой репликацией (Антонин Боннефой) §

  • Исправлено ошибочное отслеживание положения столбца при разборе границ диапазонных секций (myzhen) §

    Ранее это могло, например, привести к тому, что в сообщениях об ошибках при приведении значений границ секций к типу данных столбца могло быть указано неверное имя столбца.

  • Исправлены различные незначительные несоответствия в сообщениях об ошибках (Ман Цзэн, Тяньчэнь Чжан) § § §

    Например, в отчёте об ошибке несоответствия номера линии времени в манифесте резервной копии отображался номер начальный линии времени вместо конечный.

  • Исправлена ошибка встраивания функций при JIT-компиляции с использованием LLVM версии 17 или выше (Антонин Боннефой) §

  • Корректировка JIT-кода для работы с LLVM 21 (Холгер Хофштеттер) §

    Предыдущий код не компилировался на устройствах с архитектурой aarch64.

  • Добавлен новый параметр сервера file_extend_method для управления использованием функции posix_fallocate() (Томас Манро) §

    В PostgreSQL версии 16 и выше для расширения файлов отношений используется функция posix_fallocate(), если она поддерживается. Однако оказалось, что она плохо взаимодействует с некоторыми файловыми системами: не работало сжатие BTRFS, а в старых версиях ядра Linux система XFS могла выводить ложные ошибки ENOSPC. Для обхода этой проблемы был введён новый параметр сервера. Установка file_extend_method в значение write_zeros приведёт к возврату сервера к старому методу расширения файлов путём добавления блоков нулей.

  • Исправлена ошибка разбора длинных параметров командной строки сервера в исполняемых файлах Solaris, собранных с помощью meson (Том Лейн) §

  • Добавлена поддержка изменений заголовков процессов в GNU/Hurd (Михаэль Банк) §

  • В утилиту pg_resetwal добавлен вывод нового значения при изменении OldestXID (Хейкки Линнакангас) §

    Все другие изменяемые переменные утилита уже выводила.

  • Для утилиты pg_resetwal добавлена возможность указать значение 0 для xid следующей мультитранзакции или значения UINT32_MAX для следующего смещения мультитранзакций (Максим Орлов) §

    Это были допустимые значения, поэтому их отклонение было некорректным. В худшем случае, обновление с использованием pg_upgrade в момент зацикливания идентификаторов мультитранзакций прервётся с ошибкой.

  • В модуле contrib/amcheck теперь используется корректный снимок при проверках btree-индексов в родительских страницах (Михаил Николаев) §

    Ранее при проверке индексов, созданных с помощью команды CREATE INDEX CONCURRENTLY, возникали ложные ошибки.

  • Исправлено поведение модуля contrib/amcheck для корректной обработки half-dead страниц btree-индекса (Хейкки Линнакангас) §

    Модуль amcheck ожидал, что такие страницы будет иметь родительские нисходящие ссылки, но они отсутствовали, что приводило к ложному сообщению об ошибке о mismatch between parent key and child high key.

  • Исправлено поведение модуля contrib/amcheck для корректной обработки неполного разделения корневых страниц btree (Хейкки Линнакангас) §

    Модуль amcheck мог выводить ложную ошибку о block is not true root.

  • Исправлен редкий случай целочисленного переполнения при оценке избирательности для оператора @@ модулем contrib/intarray (Чао Ли) §

    Это могло приводить к получению неточных оценок селективности при использовании максимального целочисленного значения.

  • Исправлена проблема с многобайтным защитным преобразованием в модуле contrib/ltree (Джефф Дэвис) §

    Ранее в функцию lower() могла передаваться неполная многобайтная последовательность, что могло приводить к некорректному поведению.

  • Обновлены данных часовых поясов были до tzdata версии 2025c (Том Лейн) §

    Изменения коснулись только исторических данных для меток времени до 1976 года в Нижней Калифорнии.