E.2. Выпуск 14.21
Дата выпуска: 2026-02-12
В этот выпуск вошли различные исправления, внесённые после версии 14.20. За информацией о нововведениях версии 14 обратитесь к Разделу E.23.
Сообщество PostgreSQL прекратит выпуск обновлений серии 14.X в ноябре 2026 г. Поэтому пользователям не следует медлить с переходом на более новую основную версию.
E.2.1. Миграция на версию 14.21
Если используется версия 14.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 14.19, см. также Раздел E.4.
E.2.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)
Запрет на определение семантического уровня агрегатных функций вложенными подзапросами
SELECTс CTE (Том Лейн) §Это изменение отменяет изменение, внесённое два корректирующих выпуска назад. Теперь выводится ошибка, если вложенный подзапрос
SELECTссылается на общее табличное выражение (CTE), семантический уровень которого ниже уровня, назначаемого агрегатной функции по стандартным правилам SQL на основе содержащихся в ней узлов агрегирования и ссылок на столбцы. Внесённое ранее изменение привело к новым ошибкам, что затруднило поиск оптимального решения проблемы. Поскольку в агрегатных функциях вложенные подзапросыSELECTне допускаются по стандарту SQL, теперь в таких случаях выводится ошибка.Устранение сбоя при отсечении всех потомков секционированной таблицы, для которой выполняется изменение или удаление (Амит Ланготе) §
Ранее в таких случаях исполнитель мог выводить ошибки «could not find junk ctid column» (не удалось обнаружить отбросовый столбец ctid), даже когда никакие действия не требовались.
Обеспечение сканирования частичных хешированных индексов, даже когда в предикате индекса подразумевается истинность условия 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 от позиции наката изменений, соответствующей записи контрольной точки (Нитин Ядав) §
Перед началом восстановления добавлена явная проверка наличия REDO LSN во избежание негативных последствий с выводом сообщения об ошибке. Ранее в ходе восстановления мог произойти сбой или повреждение базы данных.
Предотвращение изменений в исходном дереве запроса при
ALTER PUBLICATION(Сунил С) §Ошибка проявлялась в том, что триггер событий, срабатывающий для запроса, видел только первый параметр
publish, даже если было определено несколько. Если такой запрос был настроен как подготовленный оператор, повторно он также выполнялся некорректно.Предотвращение аннулирования слотов репликации, которые были только что созданы или синхронизированы (Хоу Чжицзе) §
Условие гонки с параллельно выполняемой контрольной точкой могло приводить к тому, что запись WAL, которая требовалась для слота репликации, удалялась. В результате слот репликации сразу помечался как аннулированный.
Устранение условия гонки при вычислении необходимого значения xmin для слота репликации (Хоу Чжицзе) §
При этом могла возникать ошибка «cannot build an initial slot snapshot as oldest safe xid follows snapshot's xmin» (не удаётся создать изначальный снимок слота, поскольку самый старый безопасный xid следует за xmin снимка).
Фиксирование добавления записи
pg_replication_originв ходе первоначальной синхронизации подписки логической репликации перед началом копирования данных (Хоу Чжицзе) §Ранее если копирование завершалось ошибкой, новая запись
pg_replication_originтерялась в результате отката транзакции. Это приводило к несогласованному состоянию в разделяемой памяти.Устранение риска ошибки «unexpected data beyond EOF» (неожиданные данные после EOF) при перезапуске сервера с потоковой репликацией (Антонин Боннефой) §
Исправление неверного определения положения столбца при разборе границ диапазонных секций (Чжэньмин Ян) §
Ранее, например, в сообщения об ошибке при приведении значений границ секций к типу данных столбца могло быть добавлено неверное имя столбца.
Исправление разнообразных незначительных несоответствий в сообщениях об ошибках (Ман Цзэн, Тяньчэнь Чжан) § §
Например, ранее в отчёте об ошибке при несоответствии номера линии времени в манифесте копии отображался номер начальной линии времени вместо конечной.
Исправление ошибки встраивания функций при JIT-компиляции с использованием LLVM версии 17 или выше (Антонин Боннефой) §
Модификация JIT-кода для работы с LLVM версии 21 (Холгер Хофштеттер) §
Ранее код не компилировался на устройствах с архитектурой AArch64.
Поддержка изменений заголовков процессов в GNU/Hurd (Михаэль Банк) §
Добавление в утилиту pg_resetwal вывода нового значения при изменении OldestXID (Хейкки Линнакангас) §
Изменяемые значения других переменных утилита уже выводила.
Использование правильного снимка в модуле
contrib/amcheckпри проверках индексов btree в родительских страницах (Михаил Николаев) §Ранее при проверке индексов, созданных с помощью команды
CREATE INDEX CONCURRENTLY, возникали ложные ошибки.Исправление поведения модуля
contrib/amcheckдля корректной обработки «наполовину неактуальных» страниц индекса 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 года в Нижней Калифорнии.