E.20. Выпуск 16.15 #

Дата выпуска: 2026-08-13

В этот выпуск вошли различные исправления, внесённые после версии 16.14. За информацией о нововведениях версии 16 обратитесь к Разделу E.35.

E.20.1. Миграция на версию 16.15 #

Если используется версия 16.X, выгрузка/восстановление базы не требуется.

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

При использовании contrib/btree_gist или contrib/ltree может потребоваться перестроение индексов, созданных этими расширениями; обратитесь к соответствующим записям ниже.

Если вы обновляете сервер с более ранней версии, чем 16.10, см. также Раздел E.25.

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

  • Ограничение списка разрешённых модулей вывода логического декодирования с помощью нового параметра конфигурации output_plugin_libraries (Джейкоб Чемпион) §

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

    По умолчанию в параметре конфигурации указываются только модули вывода, входящие в состав PostgreSQL (pgoutput и test_decoding). Если требуются другие модули, их необходимо добавить после обновления сервера. Например:

    output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder'

    Кроме того, теперь при миграции с версий 17 и выше команда pg_upgrade --check будет завершаться ошибкой, если параметр output_plugin_libraries в новом кластере не допускает модули вывода слотов логической репликации, используемые в старом кластере. Перед выполнением pg_upgrade внесите необходимые изменения в параметр конфигурации нового кластера.

    Проект PostgreSQL благодарит Владимира Токарева и Юй Куньпэна за сообщение об этой проблеме. (CVE-2026-6471)

  • Исправление защитного преобразования PGP в модуле contrib/pgcrypto для обнаружения неподдерживаемых шифров (Даниэль Густафссон) § §

    Ранее, если библиотека OpenSSL отклоняла запрашиваемый шифр (например из-за работы в режиме FIPS или если провайдер устаревших алгоритмов не был загружен), модуль pgcrypto не распознавал ошибку и просто применял операцию исключающего «или» (XOR) над незашифрованным блоком и открытым текстом, делая такое «защитное преобразование» тривиально взламываемым. Как правило, это происходило с устаревшими алгоритмами или алгоритмами, несовместимыми с FIPS (cipher-algo=blowfish/bf, twofish, cast5 или 3des).

    Теперь по умолчанию модуль pgcrypto будет возвращать ошибку при попытке расшифровать любые сообщения, которые были затронуты этой проблемой. Для извлечения таких данных в функции pgp_pub_decrypt() и pgp_sym_decrypt() добавлен новый параметр ignore-cipher-failure. Установка ignore-cipher-failure=1 восстановит прежнее поведение, позволяя снять некорректную обёртку шифрования:

    pgp_sym_decrypt(encrypted_column, любой_ключ, 'ignore-cipher-failure=1')

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

    Проект PostgreSQL благодарит Шишира Шарму за сообщение об этой проблеме. (CVE-2026-14663)

  • Исправление работы psql для пропуска внутренних данных, следующих в скрипте за командой COPY ... FROM STDIN, даже если команда COPY завершается ошибкой до отправки PGRES_COPY_IN (Том Лейн) § §

    Ранее, если команда COPY завершалась ошибкой при запуске (например, если целевая таблица не существовала), psql не распознавал эту ошибку и читал внутренние данные COPY как SQL-команды. В лучшем случае это приводило к некорректному поведению, а в худшем — создавало риск атаки с SQL-инъекцией. Теперь psql распознаёт синтаксически корректные команды COPY ... FROM STDIN и самостоятельно пропускает данные, если сервер не отвечает статусом PGRES_COPY_IN.

    Хотя это исправление вряд ли затронет производственные SQL-скрипты, тестовые скрипты могут намеренно использовать команды COPY ... FROM STDIN, завершающиеся ошибкой. В таких скриптах потребуется добавить завершающую строку \. после каждой такой команды.

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

  • Добавление перекрёстной проверки типа строки выходных данных портала при выполнении команды EXECUTE или FETCH (Роберт Хаас) §

    Команды EXECUTE и FETCH используют два портала: внешний для самого оператора и внутренний — для выполнения запроса от имени оператора. Ранее можно было добиться расхождения объявленных типов строк этих двух порталов, что приводило к раскрытию содержимого памяти сервера и выполнению произвольного кода.

    Проект PostgreSQL благодарит Бена Морриса (при сотрудничестве с Claude и Anthropic Research) и Питера Гейгана за сообщение об этой проблеме. (CVE-2026-16239)

  • Устранение переполнения буфера при работе с длинными аббревиатурами часовых поясов в to_char() (Том Лейн) §

    Переполнение могло привести к сбою сервера. Также фиксировались уязвимости, вызывающие выполнение произвольного кода.

    Проект PostgreSQL благодарит пользователя Hcamael, Амжада Шахзада, Тань Чжэнь из AntAISecurityLab, Томера Фишмана, Чжэн Юй, Эми Бернетт (при помощи Codex Security компании OpenAI), Рика де Ягера, Хивон Сона, Сильвию Майер, Александра Алексеева и Хиллай Бен-Сассона за сообщение об этой проблеме. (CVE-2026-14669)

  • Устранение риска переполения буфера в функциях match/split с регулярными выражениями (Масахико Савада) §

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

    Проект PostgreSQL благодарит Франческо Верарди за сообщение об этой проблеме. (CVE-2026-14664)

  • Ужесточение проверки корректности входных данных в функции ascii() (Микаэль Пакье) §

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

    Проект PostgreSQL благодарит пользователя Hcamael за сообщение об этой проблеме. (CVE-2026-18024)

  • Исправление обработки мультидиапазонных типов в функции pg_restore_attribute_stats() (OpenAI Security Research Team, команда исследований вопросов безопасности OpenAI)

    Ранее функция pg_restore_attribute_stats() обрабатывала мультидиапазонные типы так же, как и базовые диапазонные типы. Такая логика корректно применялась к гистограмме границ, но не подходила для других статистических данных.

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

  • Добавление в функцию scalarineqsel() проверки того, что константа имеет ожидаемый тип tid (Том Лейн) §

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

    Проект PostgreSQL благодарит пользователя Hcamael за сообщение об этой проблеме. (CVE-2026-14668)

  • Усиление защиты кода для типов tsvector и tsquery от слишком длинных значений (как отдельных лексем, так и общей длины вектора/запроса) (Том Лейн) § §

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

    Проект PostgreSQL благодарит Юйхан У, Чжэньпэн Лина, Чжэнь Юй и пользователя Hcamael за сообщение об этих проблемах. (CVE-2026-14662)

  • Исправление мест кода, где ошибочно предполагалось, что количество аргументов функции не превышает FUNC_MAX_ARGS (Том Лейн) § §

    Фактическое ограничение сервера на количество аргументов агрегатной функции составляет FUNC_MAX_ARGS - 1, однако анализатор запросов не применял это ограничение, что создавало угрозу для последующих уровней.

    Проект PostgreSQL благодарит Чжэн Юй, пользователя ylwangtju и Масахико Савада за сообщение об этих проблемах. (CVE-2026-14679)

  • Запрет на вызов функций, которые принимают или возвращают тип internal, из SQL (Том Лейн) § §

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

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

  • Сохранение владельца объектов расширенной статистики при перестройке с помощью команды ALTER TABLE (Масахико Савада) §

    Ранее роль, выполнявшая команду ALTER TABLE, становилась владельцем таких объектов, но это было некорректно.

    Проект PostgreSQL благодарит Ноя Миша за сообщение об этой проблеме. (CVE-2026-6469)

  • Заключение имени поля в кавычки при необходимости во время разбора вызова функции EXTRACT() (Натан Боссарт) §

    В качестве имени поля в EXTRACT() анализатор принимает любые строковые литералы, причём проверки пока не происходит. Если вызов хранится и разбирается, например при выгрузке с pg_dump, тело строки использовалось без изменений, что могло привести к SQL-инъекции.

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

  • Добавление проверок права USAGE для типов данных, где такие проверки ранее отсутствовали (Натан Боссарт) § § §

    Проверка не проводилась ни командой CREATE TYPE AS RANGE, ни ALTER TABLE OF, ни командами, которые создают хранимые выражения. Эти недоработки позволяли ролям без права USAGE всё же создавать объекты, зависящие от типа, что впоследствии могло помешать владельцу типа изменить его.

    Проект PostgreSQL благодарит Цзинчжоу Фу за сообщение об этой проблеме. (CVE-2026-6470)

  • Аннулирование кешируемых планов, зависящих от роли, после её изменения (Илья Староверов, Синъя Като, Натан Боссарт) §

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

    Проект PostgreSQL благодарит Илью Староверова и Синъю Като за сообщение об этой проблеме. (CVE-2026-14666)

  • Отклонение запроса GSSEncRequest после прямого подключения по SSL (Микаэль Пакье)

    После установления подключения с TLS-шифрованием сервер всё ещё мог принять запрос для шифрования GSSAPI. Если оно оказывалось успешным, подключение продолжалось с использованием TLS-шифрования, но выглядело как подключение GSS для правил pg_hba. Таким образом, политика pg_hba, предназначенная для запрета TLS, не применялась корректно.

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

  • Реализация более праводподобных имитационных секретов для аутентификации SCRAM (Натан Боссарт) §

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

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

  • Исправление записей за пределами выделенной памяти в приложениях ecpg, которые вызывались некорректными данными типа bytea, полученными от сервера (Микаэль Пакье) §

    В ecpg без проверки предполагалось, что любое значение типа bytea должно начинаться с \x. Повреждённый или вредоносный сервер мог отправить строку короче 2 байт, что приводило к повреждению памяти в приложении.

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

  • Запрет раскрытия обратных кавычек в аргументе psql-команды \unrestrict (Натан Боссарт) §

    Из-за этого упущения в исправлении CVE-2025-8714 злоумышленник мог внеднять команды оболочки в текстовый вывод дампа, который применяется во время восстановления на компьютере с psql. Именно этот сценарий и предполагалось предотвратить при исправлении CVE-2025-8714.

    Проект PostgreSQL благодарит Лукаса Вельгуса, Филипа Януша и Даниэля Беккера за сообщение об этой проблеме. (CVE-2026-18408)

  • Удаление допущения pg_dump, что столбец pg_proc.protrftypes не может иметь более FUNC_MAX_ARGS вхождений (Том Лейн) §

    Поскольку в столбце могут быть вхождения как для входных, так и для выходных аргументов, целесообразно, чтобы длина этого массива могла превышать значение FUNC_MAX_ARGS (которое ограничивает только входные аргументы). Даже в противном случае pg_dump не может допускать, что сервер был собран с таким же значением FUNC_MAX_ARGS, которое уже установлено. Переполнение памяти приведёт к её повреждению в pg_dump.

    Проект PostgreSQL благодарит Масахико Савада за сообщение об этой проблеме. (CVE-2026-19385)

  • Усиление PL/Perl для защиты от «связанных» массивов и хешей Perl (Том Лейн) §

    Связанный объект, поведение которого отличается от поведения обычного объекта, может приводить к перезаписи памяти или некорректному массиву результатов, что может вызывать проблемы в будущем.

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

  • Устранение случаев целочисленного переполнения при вычислении объёма выделяемой памяти в PL/Perl и PL/Tcl (Хейкки Линнакангас) §

    Проблема аналогична CVE-2026-6473, но обнаружена в другой части кода. Исправление также аналогичное.

    Проект PostgreSQL благодарит Tulya Project (Team Dhiutsa, Bitecope Technologies Private Ltd) за сообщение об этой проблеме. (CVE-2026-14677)

  • Обеспечение в функциях contrib/amcheck ограничения search_path до выполнения выражений индексов (Ной Миш) §

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

    Проект PostgreSQL благодарит Юэлинь Ван и Джейкоба Брейзила за сообщение об этой проблеме. (CVE-2026-14673)

  • Устранение случаев целочисленного переполнения в функциях levenshtein() и levenshtein_less_equal() модуля contrib/fuzzystrmatch (Натан Боссарт) §

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

    Проект PostgreSQL благодарит Бена Морриса (при сотрудничестве с Claude и Anthropic Research) за сообщение об этой проблеме. (CVE-2026-15742)

  • Устранение переполнения буфера в модуле contrib/pg_stat_statements (Альваро Эррера)

    Ранее в ходе нормализации запроса некорректно определялся объём пространства, который потребуется нормализованной строке.

    Проект PostgreSQL благодарит Саджиба Лохани (при помощи TrendAI Zero Day Initiative) и Юэлинь Ван за сообщение об этой проблеме. (CVE-2026-14676)

  • Исправление ошибки с типами данных в функции picksplit для индексов GiST модуля contrib/pg_trgm (Хейкки Линнакангас) §

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

    Проект PostgreSQL благодарит Мехмета Д. Инса за сообщение об этой проблеме. (CVE-2026-14678)

  • Удаление кеша планов в contrib/refint (Аюш Тивари) §

    Такое поведение кеширования содержит несколько серьёзных ошибок, в частности, функция check_foreign_key() встраивает новые значения ключа в свои каскадные UPDATE-запросы, из-за чего кешированный план повторно использует изначально заданные значения, а не те значения ключа, которые должны использоваться. Простейшее решение — удалить этот механизм.

    Проект PostgreSQL благодарит пользователя Hcamael за сообщение об этой проблеме. (CVE-2026-14671)

  • Устранение самоблокировки при воспроизведении WAL с более старой корректирующей версии (Андрей Бородин) §

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

  • Корректировка обработки операций асинхронного чтения при повторном сканировании асинхронного узла плана Append (Александр Коротков, Глеб Кашкин, Эцуро Фудзита) §

    Когда верхний узел плана повторно сканирует Append до того, как будет прочитан весь вывод Append, необходимо отменить все незавершённые запросы к внешним серверам (например, через postgres_fdw). В случаях, когда параметры подплана изменялись или он удалялся в ходе отсечения секций при следующем сканировании, эта логика работала некорректно. Это могло приводить к некорректным результатам запроса, зацикливанию или сбою проверочных утверждений.

  • Исправление ошибки при отсечении секций для таблиц с диапазонным секционированием (Дэвид Роули) §

    В некоторых случаях секция по умолчанию (DEFAULT) пропускалась, когда не должна была, что приводило к отсутствию строк в результатах запроса.

  • Исправление проверок планировщика на допустимость NULL и строгость для выражений значение IN (массив) (Аюш Тивари) §

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

  • Исправление некорректной логики удаления соединений (Матеус Алькантара, Ричард Гуо) § §

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

  • Добавление недостающих проверок хешируемости данных типа-контейнера (массивов, составных типов и диапазонов) в сравнениях на равенство (Андрей Лепихов, Том Лейн) §

    Перед принятием решения об использовании хешированного плана запроса планировщик должен проверять хешируемость данных типа-контейнера. В некоторых случаях этот шаг пропускался, что приводило к ошибкам «could not identify a hash function» (не удалось найти функцию хеширования).

  • Исправление некорректной оптимизации оконных функций COUNT с предложением EXCLUDE или без ORDER BY (Ченпэн Ян, Дэвид Роули) §

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

  • Исправление поведения команды ALTER COLUMN ... DROP EXPRESSION, чтобы она выполнялась при наличии нескольких уровней секционирования (Альберто Пиай) §

  • Запрет на переименование правил в _RETURN (Том Лейн) §

    Это имя закреплено за правилами ON SELECT для представлений, однако ранее команда ALTER RULE позволяла переименовывать другие правила в _RETURN, что впоследствии приводило к проблемам.

  • Добавление недостающего снятия блокировки при назначении членства в роли в команде DROP OWNED BY (Джефф Девис) §

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

  • Устранение сбоя EXPLAIN при обратном разборе (deparsing) агрегатных функций SQL/JSON (Ричард Гуо) §

    Некоторые структуры планов приводили к ошибкам «invalid JsonConstructorExpr underlying node type» (некорретный тип нижележащего узла в JsonConstructorExpr ).

  • Исправление использования REINDEX CONCURRENTLY с отложенным ограничением уникальности (Нитин Мотиани) §

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

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

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

  • Исправление некорректной рекомпозиции в NFC для хангыля U+11A7 (TBASE) в корейском языке (Диего Фриас, Микаэль Пакье) §

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

  • Устранение возможного усечения выходных лексем в словарях synonym, нечувствительных к регистрам (Джефф Девис) §

    Ранее, если приведение к нижнему регистру увеличивало длину лексемы в байтах, при выводе она некорректно усекалась до исходной длины.

  • Исправление опечатки в коде функции hash_record_extended() (Ман Цзэн) §

    Из-за ошибки в коде функции не удавалось инициализировать второй аргумент isnull, передаваемый FunctionCallInvoke(). Это никак не влияло на существующие встроенные функции расширенного хеширования, которые не проверяют это значение. Однако могла нарушиться работа хеш-функций, поставляемых расширениями, если они проверяют PG_ARGISNULL(1).

  • Устранение сбоя функции pg_get_publication_tables() при параллельном удалении публикуемой таблицы (Бхарат Рупиредди) §

  • Предотвращение сбоя функции satisfies_hash_partition() с VARIADIC NULL (Роберт Хаас) §

  • Более чёткий и согласованный вывод ошибок при некорректных значениях веса в функции tsvector_filter() и родственных функциях (Юан Янг) §

    В частности, теперь символы веса не из набора ASCII выводятся в восьмеричном формате (\nnn) так же, как их бы вывела функция charout(). Это устраняет риск возникновения ошибки из-за некорректной кодировки.

  • Исправление некорректной обработки узлов простраства имён в функции xpath() (Микаэль Пакье) § §

    Это исправление позволяет избежать неожиданного вывода ошибки «could not copy node» (не удалось скопировать узел).

  • Выведение ошибки при неопределённой переменной jsonpath, даже если она не была передана (Андрей Рачицкий) §

    Операторы типа jsonb @? и @@ не могут передавать переменные в выражениях jsonpath. Ранее этот путь кода некорректно обрабатывал неизвестную переменную jsonpath как JSON NULL вместо того, чтобы выводить ошибку. Помимо отклонения от ожидаемого поведения это также означало риск неограниченного потребления памяти.

  • Устранение сбоя NULL-указателя, когда у IS JSON или подобных конструкций аргумент относится к строковой категории, но не имеет приведения к типу text (Аюш Тивари) §

    В ядре PostgreSQL таких типов данных нет, но проблема встречается в некоторых расширениях.

  • Предотвращение зависимого от устройства поведения при делении минимально возможного значения money на -1 (Андрей Рачицкий) §

  • Устранение сбоя из-за нехватки памяти при добавлении новой записи в кеш для словаря текстового поиска (Том Лейн) §

  • Исправление ошибок, связанных с безопасным доступом к памяти, при обработке некорректных файлов словарей Ispell и Hunspell (Андрей Рачицкий) §

  • Предотвращение доступа к временным таблицам других сеансов (Джим Джонс, Даниил Давыдов, Александр Коротков) §

    В некоторых случаях доступ не блокировался, что приводило к некорректным (несогласованным) результатам без вывода ошибок.

  • Учёт отмены запросов и задержки очистки при очистке дерева идентификаторов индексов GIN (Пол Ким, Александр Коротков) §

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

  • Устранение риска некорректного декодирования индексных кортежей в ходе сканирований только по индексу GiST и SP-GiST (Питер Гейган (Peter Geoghegan) §

    Эта ошибка могла приводить к выдаче повреждённых данных из плана сканирования только по индексу. Единственный затронутый базовый класс операторов — GiST range_ops. Ошибка могла произойти только, если диапазонный столбец не был первым столбцом индекса.

  • Обеспечение своевременного добавления последнего нового блока таблицы при её массовом расширении в карту свободного пространства (Цзинтан Чжан) §

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

  • Возможность создания одного каталога несколькими параллельными процессами (Эндрю Дунстан, Том Лейн) §

  • Предотвращение возникновения недействительных зависимостей за счёт разделяемой блокировки объектов, от которых зависят другие объекты (Бертран Друво) § §

    Если установлена разделяемая блокировка, при любой попытке удалить объект с зависимостями будет возникать конфликт, что позволяет устранить условие гонки, которое раньше возникало. Например, в одном сеансе удаляется схема (которая для этого сеанса пустая), а параллельно в другом сеансе происходит создание функции в этой схеме. Ранее обе транзакции могли зафиксировать изменения, после чего оставалось некорректное определение функции. Теперь одна из транзакций прервётся ошибкой.

  • Устранение условия гонки при обнаружении конфликтов в режиме изоляции SERIALIZABLE (Питер Гейган) §

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

  • Устранение условия гонки в коде ProcSignalBarrier (Масахико Савада) §

    Ошибка могла привести к зависанию процессов, как правило, после вывода «still waiting for backend with PID nnnn to accept ProcSignalBarrier» (продолжается ожидание получения сигнала ProcSignalBarrier обслуживающим процессом с PID nnnn).

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

    Ранее мог произойти аварийный сбой сервера с ошибками, такими как «latch already owned» (блокировка уже занята). Эта проблема не была характерна для обычных параллельных запросов, поскольку лидер не выходил до тех пор, пока не завершатся все рабочие процессы, однако встречалась в некоторых расширениях.

  • Устранение условия гонки при выборе линии времени в ходе логического декодирования при повышении резервного узла (Бертран Друво) § § §

    Ранее мог происходить сбой логического декодирования на резервном узле с ошибкой «requested WAL segment has already been removed» (запрошенный сегмент WAL уже удалён). Повторная попытка завершалась успехом. Проблема не была постоянной, но создавала риски для устойчивости.

  • Предотвращение вывода полной строки подключения приёмником WAL при перемещениях по линии времени (Чао Ли) §

    Представление pg_stat_wal_receiver должно выводить обработанную строку подключения без чувствительной информации. Однако при повторном использовании существующего процесса-приёмника WAL временно выводилась строка целиком.

  • Применение проверок времени выполнения, а не только проверочных утверждений, для подтверждения корректного количества столбцов в кортежах, полученных в ходе логической репликации (Варик Матевосян) §

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

  • Исправление экранирования строковых параметров в конструируемых командах репликации (Том Лейн) §

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

  • Исправление логического декодирования пустых подготовленных транзакций (Масахико Савада) §

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

  • Исправление повреждения нежурналируемых последовательностей после повышения резервного узла (Фудзии Масао) §

    Ранее, если нежурналируемая последовательность создавалась на главном сервере и реплицировалась на резерный сервер, при обращении к этой последовательности после повышения резервного сервера могла возникать ошибка «bad magic number in sequence» (некорректное «магическое» число в последовательности) или подобные ошибки.

  • Устранение ошибки переподключения каскадного резервного сервера после переключения на восстановление из архива (Марко Ненчарини) §

    Каскадный резервный сервер мог не подключиться к вышестоящему серверу с ошибкой «requested starting point ... is ahead of the WAL flush position» («запрошенная начальная точка ... впереди позиции сброшенных данных журнала») после переключения на восстановление из архива.

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

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

  • Устранение проблемы неактуальных записей о прогрессе во время синхронизации таблиц в логической репликации (Синъя Като) §

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

  • Очистка прогресса базового копирования при ошибке резервного копирования (Чао Ли) § §

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

  • Исправление потенциальной ошибки PANIC, возникающей при конкурентном удалении записей pgstats при включённом track_functions (Сами Имсейх, Микаэль Пакье) § § §

  • Очистка повреждённой локальной записи pgstats после неудачной попытки выделить место для соответствующей записи в разделяемой хеш-таблице (Ниалл Ньюман) §

    Без такой очистки возникало обращение по нулевому указателю при следующем использовании локальной записи.

  • Устранение сбоя обращения по нулевому указателю в PL/Perl при работе с некорректным объектом типа PostgreSQL::InServer::ARRAY (Син Го) §

  • Добавление в PL/Python корректной проверки ошибок при работе с объектами последовательностей и сопоставлений (Ричард Гуо) §

    Ранее повреждённый объект или необработанное исключение могли вызвать сбой обращения по нулевому указателю.

  • Обеспечение в libpq полной выгрузки всех ожидающих байтов из буфера расшифровки SSL или GSS во время выполнения функции pqReadData() (Джейкоб Чемпион) § § § §

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

  • Обеспечение возможности для libpq принимать сообщения ParameterDescription, превышающие 30000 байт (Нин Сун) §

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

  • Введение запрета на использование нескольких элементов заголовка в операторах GET/SET DESCRIPTOR в ecpg (Масаси Камура) §

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

  • Синхронизация ширины строк в расширенном выровненном формате вывода psql (Павел Стехуле) §

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

  • Исправление проверки прав клиентом psql для показа размеров баз данных при вызове \l+ (Кристоф Берг) §

    Базовая функция сервера разрешает пользователям с правом pg_read_all_stats видеть размеры всех баз данных, даже если у них нет права CONNECT. Однако psql не учитывал это и не вызывал функцию, если у пользователя отсутствовало право CONNECT.

  • Исправление дополнения табуляцией psql для \df с учётом процедур (Эрик Виндхольд) §

  • Исправление ошибки безопасности потоков pgbench (Фудзии Масао) §

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

  • Использование групповых прав на чтение исходного кластера для файлов вывода pg_recvlogical (Фудзии Масао) §

    В документации было описано такое поведение pg_recvlogical, но в действительности утилита никогда не включала групповой доступ на чтение.

  • Исправление обработки данных типа varlena с короткими заголовками в расширении contrib/amcheck (Андрей Бородин) §

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

  • Исправление обработки значений NaN в классах операторов для типов float4 и float8 в расширении contrib/btree_gist (Билл Ким, Том Лейн) §

    Сравнения, а также функции penalty и distance в GiST, не учитывали значения NaN и выдавали неверный результат при их обработке. После установки этого обновления рекомендуется выполнить переиндексацию btree_gist на столбцах с плавающей точкой, если существует вероятность наличия в них значений NaN.

  • Исправление поиска с использованием оператора неравенства в расширении contrib/btree_gist (Аюш Тивари) §

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

  • Исправление неконтролируемой рекурсии и циклов в расширениях contrib/hstore_plperl, contrib/jsonb_plperl и contrib/jsonb_plpython (Александр Алексеев) § §

    Предотвращение переполнения стека при работе с глубоко вложенными значениями типа jsonb, а также обеспечение возможности прерывания бесконечного цикла, возникающего при попытке разыменования циклических цепочек ссылок на объекты Perl.

  • Исправление утечки статистики catcache в расширении contrib/intarray (Ман Цзэн) §

    Это упущение приводило к предупреждениям вида «resource was not closed: cache pg_statistic».

  • Исправление целочисленного переполнения при сравнениях в contrib/ltree (Аюш Тивари) §

    Значения типа ltree, содержащие более 14 653 меток, приводили к неверным результатам сравнения из-за целочисленного переполнения. Если в индексе btree присутствуют такие значения, он, вероятно, повреждён и должен быть переиндексирован после установки этого обновления.

  • Устранение переполнения массива при вызове функций heap_force_kill и heap_force_freeze расширения contrib/pg_surgery (Микаэль Пакье) §

    Попытка изменить TID, номер смещения которого равен MaxHeapTuplesPerPage, приводила к записи на один байт за пределы выделенного массива, что могло вызвать аварийное завершение работы сервера.

  • Устранение бесконечного цикла при передаче массивов TID, содержащих более 64 тысяч элементов, в contrib/pg_surgery (Андрей Рачицкий )§

  • Исключение обращений по нулевому указателю функции check_foreign_key() расширения contrib/refint (Аюш Тивари) §

    При каскадном обновлении использование NULL в значении целевого столбца вызывало сбой. Эта проблема возникла как недочёт при исправлении уязвимости CVE-2026-6637, однако и предыдущая реализация не была полностью корректной.

  • Исправление вывода сегментов с индикатором достоверности ~ в модуле contrib/seg (Эван Янг) §

    Из-за опечатки функция seg_out() не выводила индикатор достоверности ~, прикреплённый к верхней границе сегмента. Более того, если у нижней границы был индикатор ~, а у верхней — нет, верхняя граница вообще не выводилась, что некорректно преобразовывало значение в открытый интервал.

  • Устранение сбоя при работе с узлами пространств имён в функции xpath_nodeset() модуля contrib/xml2 (Андрей Чёрный, Микаэль Пакье) §

  • Обеспечение поддержки сборки PostgreSQL с использованием Visual Studio 2026 (Эндрю Дунстан) §

  • Поддержка сборки PostgreSQL с OpenSSL 4 (Даниэль Густафссон) §

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

    С ноября 2026 года в Альберте (Америка/Эдмонтон) время весь год будет определяться часовым поясом UTC-06 (постоянный переход на летнее время). В этом выпуске предполагается, что для обозначения часового пояса будет использоваться аббревиатура CST. Есть вероятность, что сокращение изменится, но пока неясно, как будет выглядеть новая аббревиатура.

    Марокко (Африка/Касабланка) перейдёт на постоянное время UTC+00 без перехода на летнее время с 20 сентября 2026 года.

E.20. Release 16.15 #

Release date: 2026-08-13

This release contains a variety of fixes from 16.14. For information about new features in major release 16, see Section E.35.

E.20.1. Migration to Version 16.15 #

A dump/restore is not required for those running 16.X.

However, the first three security entries below describe configuration adjustments and data cleanups that you may need to make after updating.

Also, if you use contrib/btree_gist or contrib/ltree, you may need to reindex indexes made with those extensions; see the relevant entries below.

Also, if you are upgrading from a version earlier than 16.10, see Section E.25.

E.20.2. Changes #

  • Restrict logical decoding output plugins to the set specified by a new server parameter output_plugin_libraries (Jacob Champion) §

    Previously, a replication user could select any loadable library for logical decoding, allowing exploits of various sorts. To allow locking this down without breaking setups that worked before, introduce a whitelist of allowed output plugins.

    By default, only the output plugins shipped as part of PostgreSQL (pgoutput and test_decoding) are included in output_plugin_libraries. Installations that rely on other output plugins must add them after updating the server, for example

    output_plugin_libraries = 'pgoutput, test_decoding, my_trusted_decoder'
    

    Additionally, pg_upgrade --check will fail if the output_plugin_libraries parameter on the new cluster does not permit the plugins of logical replication slots on the old cluster, when migrating from versions 17 and later. Make necessary additions to the new cluster's setting before performing pg_upgrade.

    The PostgreSQL Project thanks Vladimir Tokarev and Yu Kunpeng for reporting this problem. (CVE-2026-6471)

  • Fix contrib/pgcrypto's PGP encryption to detect unsupported ciphers (Daniel Gustafsson) § §

    Previously, if OpenSSL rejected the requested cipher (for example, because it is running in FIPS mode, or the legacy provider hasn't been loaded), pgcrypto failed to notice the failure and simply XOR'd the non-encrypted block with the plaintext, rendering the encryption trivially breakable. This will typically occur with deprecated or non-FIPS cipher algorithms (cipher-algo=blowfish/bf, twofish, cast5, or 3des).

    By default, pgcrypto will now fail to decrypt any messages that were affected in this way. To allow retrieval of such data, a new option ignore-cipher-failure has been added to pgp_pub_decrypt() and pgp_sym_decrypt(). Setting ignore-cipher-failure=1 will restore their previous behavior, allowing the faulty encryption wrapper to be stripped off:

    pgp_sym_decrypt(encrypted_column, any key, 'ignore-cipher-failure=1')
    

    Once the affected messages are identified and stripped of their wrappers, they can then be re-encrypted with a modern algorithm. It is important however that the behavior of OpenSSL be the same as it was when the faulty messages were created: if the set of unsupported algorithms is not the same, this approach will not work. See the documentation for ignore-cipher-failure.

    The PostgreSQL Project thanks Shishir Sharma for reporting this problem. (CVE-2026-14663)

  • Fix psql to skip in-line data following a scripted COPY ... FROM STDIN command, even if the COPY fails before sending PGRES_COPY_IN (Tom Lane) § §

    Previously, if a COPY command failed at startup (for instance, because the target table doesn't exist) psql would not realize that and would proceed to read the following in-line data as SQL commands. In the best case that's wrong and in the worst case it's a SQL-injection hazard. Teach psql to recognize syntactically-valid COPY ... FROM STDIN commands and to skip data on its own authority if the server doesn't respond with PGRES_COPY_IN.

    While this fix is unlikely to affect any production SQL scripts, test scripts might intentionally exercise failing COPY ... FROM STDIN commands. Those will need to gain a \. data terminator line after each such command.

    The PostgreSQL Project thanks Alexander Lakhin for reporting this problem. (CVE-2026-6464)

  • Cross-check the output row type of a portal running EXECUTE or FETCH (Robert Haas) §

    EXECUTE and FETCH use two portals: an outer one for the statement itself, and an inner one running the query being executed on its behalf. It was previously possible to make the declared row types of the two portals diverge, leading to server memory disclosure and arbitrary code execution.

    The PostgreSQL Project thanks Ben Morris (in collaboration with Claude and Anthropic Research) and Peter Geoghegan for reporting this problem. (CVE-2026-16239)

  • Fix buffer overrun with long time zone abbreviation in to_char() (Tom Lane) §

    This can easily crash the server, and exploits leading to arbitrary code execution have been reported.

    The PostgreSQL Project thanks Hcamael, Amjad Shahzad, Tan Zhen of AntAISecurityLab, Tomer Fichman, Zheng Yu, Amy Burnett (OpenAI Codex Security), Rick de Jager, Heewon Song, Sylvie Mayer, Aleksander Alekseev, and Hillai Ben Sasson for reporting this problem. (CVE-2026-14669)

  • Fix buffer overrun in regexp match/split functions (Masahiko Sawada) §

    If passed invalidly-encoded data, these functions could write past the end of their conversion buffer.

    The PostgreSQL Project thanks Francesco Verardi for reporting this problem. (CVE-2026-14664)

  • Harden the ascii() function against invalid input (Michael Paquier) §

    By supplying invalidly-encoded input, this function could be coaxed to read and return a few bytes of data that it shouldn't. In assert-enabled builds, its assertions could be triggered too.

    The PostgreSQL Project thanks Hcamael for reporting this problem. (CVE-2026-18024)

  • Fix multirange type handling in pg_restore_attribute_stats() (OpenAI Security Research Team)

    pg_restore_attribute_stats() treated multirange types just like their underlying range type. This works correctly for the bounds histogram, but it was wrong for all the other statistics kinds.

    The PostgreSQL Project thanks Amy Burnett (OpenAI Codex Security) for reporting this problem. (CVE-2026-16238)

  • Make scalarineqsel() check that a constant it expects to be of type tid actually is (Tom Lane) §

    This expectation will hold for all the built-in operators that use this estimator, but a maliciously-constructed operator could violate it, leading to a crash or server memory disclosure.

    The PostgreSQL Project thanks Hcamael for reporting this problem. (CVE-2026-14668)

  • Harden tsvector and tsquery code against overly long values (both individual lexemes and total vector/query length) (Tom Lane) § §

    The documented limits were not enforced in all code paths.

    The PostgreSQL Project thanks Yuhang Wu, Zhenpeng Lin, Zheng Yu, and Hcamael for reporting these problems. (CVE-2026-14662)

  • Fix various places that mistakenly assumed they would not have to deal with more than FUNC_MAX_ARGS function arguments (Tom Lane) § §

    Notably, the server's actual limit on the number of arguments to an aggregate function is FUNC_MAX_ARGS - 1, but the parser failed to enforce that, creating hazards downstream.

    The PostgreSQL Project thanks Zheng Yu, ylwangtju, and Masahiko Sawada for reporting these problems. (CVE-2026-14679)

  • Reject calls from SQL to functions that take or return type internal (Tom Lane) § §

    The existing defenses against doing this have been shown to be insufficient, so add more explicit checks.

    The PostgreSQL Project thanks Amy Burnett (OpenAI Codex Security) for reporting this problem. (CVE-2026-14680)

  • Preserve the ownership of extended statistics objects when they are rebuilt by ALTER TABLE (Masahiko Sawada) §

    Previously, the role running ALTER TABLE gained ownership of such objects, but that seems inappropriate.

    The PostgreSQL Project thanks Noah Misch for reporting this problem. (CVE-2026-6469)

  • When deparsing an EXTRACT() function call, quote the field name if needed (Nathan Bossart) §

    The parser accepts any string literal as a field name in EXTRACT(), deferring validation to execution. If the call is stored and deparsed (for example during pg_dump), the string body was regurgitated verbatim, allowing SQL injection.

    The PostgreSQL Project thanks Ben Morris (in collaboration with Claude and Anthropic Research) for reporting this problem. (CVE-2026-15741)

  • Check for USAGE privilege on data types in places that formerly failed to check that (Nathan Bossart) § § §

    CREATE TYPE AS RANGE did not check, nor did ALTER TABLE OF, nor did commands that create stored expressions. These omissions allowed roles without USAGE privilege to nonetheless create objects depending on the type, possibly blocking the type's owner from changing the type later.

    The PostgreSQL Project thanks Jingzhou Fu for reporting this problem. (CVE-2026-6470)

  • Invalidate role-dependent cached plans after role changes (Ilya Staroverov, Shinya Kato, Nathan Bossart) §

    Role membership, role attribute, and database ownership changes may impact the expected behavior of row-level security policies, but previously we'd continue to use cached plans that were made according to the old state of affairs.

    The PostgreSQL Project thanks Ilya Staroverov and Shinya Kato for reporting this problem. (CVE-2026-14666)

  • Reject GSSEncRequest after direct SSL connection (Michael Paquier)

    After establishing a TLS-encrypted connection, the server would still accept a request for GSSAPI encryption. If that succeeded, the connection would proceed using TLS encryption, but it would look like a GSS connection to the pg_hba rules. Thus, a pg_hba policy intending to disallow TLS would not be enforced correctly.

    The PostgreSQL Project thanks p4p3r for reporting this problem. (CVE-2026-14681)

  • Make mock SCRAM authentication secrets more plausible (Nathan Bossart) §

    If a SCRAM login is attempted against a role that doesn't exist or doesn't have a SCRAM secret, we generate a mock secret and carry out the authentication handshake anyway, to avoid revealing these facts to an attacker. But the mock secret was made with a fixed iteration count, which in itself can be an observable response discrepancy. Use the configuration setting scram_iterations instead, to make the mock secret look more like the installation's real secrets.

    The PostgreSQL Project thanks Radim Marek for reporting this problem. (CVE-2026-14672)

  • Fix out-of-bounds writes in ecpg applications caused by invalid bytea data received from the server (Michael Paquier) §

    ecpg assumed without checking that any bytea value must begin with \x. A broken or malicious server might send a string shorter than 2 bytes, resulting in memory clobber in the application.

    The PostgreSQL Project thanks ylwangtju for reporting this problem. (CVE-2026-16241)

  • Do not do backquote expansion on the argument of psql's \unrestrict command (Nathan Bossart) §

    This oversight in the fix for CVE-2025-8714 allows a malicious server to inject shell commands into plain-text dump output that will be run at restore time on the machine running psql, the exact scenario that CVE-2025-8714 intended to prevent.

    The PostgreSQL Project thanks Lucas Velgus, Filip Janus, and Daniel Bakker for reporting this problem. (CVE-2026-18408)

  • Remove pg_dump's assumption that pg_proc.protrftypes cannot have more than FUNC_MAX_ARGS entries (Tom Lane) §

    Since there could be entries for both input and output arguments, it's feasible for this array's length to exceed FUNC_MAX_ARGS (which constrains only input arguments). Even if that were not so, pg_dump cannot assume that the server was built with the same value of FUNC_MAX_ARGS that it has. An overrun would lead to a memory clobber inside pg_dump.

    The PostgreSQL Project thanks Masahiko Sawada for reporting this problem. (CVE-2026-19385)

  • Harden PL/Perl against tied Perl arrays and hashes (Tom Lane) §

    A tied object that doesn't behave like a regular one could lead to memory overwrite, or to constructing a corrupt result array (which would likely cause problems later).

    The PostgreSQL Project thanks Hcamael for reporting this problem. (CVE-2026-14670)

  • Fix integer overflows in memory-allocation calculations in PL/Perl and PL/Tcl (Heikki Linnakangas) §

    This is the same type of problem as CVE-2026-6473, just in a different part of the code, and is fixed in the same way.

    The PostgreSQL Project thanks the Tulya Project (Team Dhiutsa, Bitecope Technologies Private Ltd) for reporting this problem. (CVE-2026-14677)

  • Ensure that contrib/amcheck functions restrict search_path before executing index expressions (Noah Misch) §

    Because amcheck will run such index expressions as the owner of their tables, a caller could potentially hijack search_path-dependent functions to run arbitrary code as the table owner. By default this is not a vulnerability because only superusers are allowed to call amcheck functions; but if that privilege was granted out, it created a larger hazard than the documentation suggests.

    The PostgreSQL Project thanks Yuelin Wang and Jacob Brazeal for reporting this problem. (CVE-2026-14673)

  • Fix integer overflows in contrib/fuzzystrmatch's levenshtein() and levenshtein_less_equal() functions (Nathan Bossart) §

    Passing large cost values to these functions could cause integer overflows, thereby producing nonsensical results, and even causing out-of-bounds writes in some cases.

    The PostgreSQL Project thanks Ben Morris (in collaboration with Claude and Anthropic Research) for reporting this problem. (CVE-2026-15742)

  • Fix buffer overrun in contrib/pg_stat_statements (Álvaro Herrera)

    Query normalization didn't accurately account for the amount of space the normalized string would require.

    The PostgreSQL Project thanks Sajeeb Lohani (with TrendAI Zero Day Initiative) and Yuelin Wang for reporting this problem. (CVE-2026-14676)

  • Fix datatype error in contrib/pg_trgm's GiST picksplit function (Heikki Linnakangas) §

    This mistake resulted in reading past the end of the buffer, typically causing bad split decisions; but a crash could ensue if you're very unlucky.

    The PostgreSQL Project thanks Mehmet D. Ince for reporting this problem. (CVE-2026-14678)

  • Remove the plan cache in contrib/refint (Ayush Tiwari) §

    This caching behavior has several serious bugs, notably that check_foreign_key() embeds the new key values in its cascade-UPDATE queries, so a cached plan reuses the originally-needed values rather than the key values that should be used. The simplest solution is to remove it.

    The PostgreSQL Project thanks Hcamael for reporting this problem. (CVE-2026-14671)

  • Fix self-deadlock when replaying WAL generated by an older minor version (Andrey Borodin) §

    This error was introduced in the previous set of minor releases. It caused standby servers that were following a primary of an older minor release version to get stuck in some scenarios.

  • Fix mis-handling of asynchronous reads when rescanning an asynchronous Append plan node (Alexander Korotkov, Gleb Kashkin, Etsuro Fujita) §

    When an upper plan node rescans an Append before having read the entire Append output, we need to discard any in-flight requests sent to external servers (by postgres_fdw for example). This was not done correctly in cases where a subplan has parameter changes or is discarded by partition pruning in the next scan. The outcome could be incorrect query results, an infinite loop, or an assertion failure.

  • Fix error in partition pruning for RANGE-partitioned tables (David Rowley) §

    In some cases the DEFAULT partition would be skipped when it should not be, which could lead to rows missing from query results.

  • Fix planner's nullability and strictness checks for value IN (array) expressions (Ayush Tiwari) §

    These checks should only succeed if the array operand is known to be non-empty, but that consideration was missed, allowing optimizations to be applied that should not be. This could result in wrong query answers if the array actually was empty.

  • Fix incorrect join removal logic (Matheus Alcantara, Richard Guo) § §

    In edge cases, it was possible for a constant output value coming from within the nullable side of an outer join to not be replaced by NULL when it should be.

  • Add missed checks for hashability of equality comparisons on container datatypes (arrays, composites, ranges) (Andrei Lepikhov, Tom Lane) §

    The planner must verify hashability of the container's component type(s) before deciding it can use a hash-based plan type. This step was missed in some places, leading to could not identify a hash function failures at execution.

  • Fix mis-optimization of COUNT window functions that have an EXCLUDE clause or lack ORDER BY (Chengpeng Yan, David Rowley) §

    These window functions were treated as monotonic when they should not be, allowing wrong answers to be computed.

  • Fix ALTER COLUMN ... DROP EXPRESSION to work when there are multiple levels of partitions (Alberto Piai) §

  • Disallow renaming a rule to _RETURN (Tom Lane) §

    That name is reserved for a view's ON SELECT rule, but ALTER RULE allowed renaming other rules to _RETURN, causing trouble later.

  • Fix missing lock release for role membership grants in DROP OWNED BY (Jeff Davis) §

    This oversight resulted in a warning message, followed by retaining a lock on the membership grant until the end of the transaction.

  • Fix failure of EXPLAIN when deparsing SQL/JSON aggregates (Richard Guo) §

    Some plan structures resulted in invalid JsonConstructorExpr underlying node type errors.

  • Fix use of REINDEX CONCURRENTLY with a deferred uniqueness constraint (Nitin Motiani) §

    The transient index copy created during REINDEX CONCURRENTLY was incorrectly marked as enforcing immediate uniqueness, causing spurious reports of constraint violation.

  • Fix matching of localized month/day names in to_date() (Heikki Linnakangas) §

    The matching logic misbehaved in cases where case-folding changes the byte length of the string.

  • Fix incorrect NFC recomposition for Hangul U+11A7 (TBASE) (Diego Frias, Michael Paquier) §

    This character was treated as a valid T syllable, which it is not, and hence silently swallowed during normalization.

  • Avoid possible truncation of output lexemes in case-insensitive synonym dictionaries (Jeff Davis) §

    If folding to lower case increased the byte length of a lexeme, it was incorrectly truncated to its original byte length when emitted.

  • Fix typo in hash_record_extended() (Man Zeng) §

    The code failed to initialize the second isnull argument passed to FunctionCallInvoke(). This is harmless for existing in-core extended hash support functions, which will not examine that value. However, extension-provided hash functions could be affected if they inspect PG_ARGISNULL(1).

  • Fix pg_get_publication_tables() to not fail if a publishable table is dropped concurrently (Bharath Rupireddy) §

  • Prevent satisfies_hash_partition() from crashing with VARIADIC NULL (Robert Haas) §

  • Report invalid-weight errors more cleanly and consistently in tsvector_filter() and allied functions (Ewan Young) §

    In particular, report weight characters that are not printable ASCII in octal form (\nnn), as charout() would render them. This avoids possibly producing an invalidly-encoded error message.

  • Fix mishandling of namespace nodes in xpath() (Michael Paquier) § §

    This fix avoids an unexpected could not copy node error.

  • Treat an undefined jsonpath variable as an error even when no variables are supplied (Andrey Rachitskiy) §

    The jsonb @? and @@ operators cannot supply any variables to be used in their jsonpath expressions. This code path erroneously treated an unknown jsonpath variable as a JSON null, rather than raising an error as expected. Aside from not being the expected behavior, this mistake could result in unbounded memory consumption.

  • Fix NULL-pointer crash when IS JSON or similar constructs have an argument that is of string category but lacks a cast to type text (Ayush Tiwari) §

    There are no such data types in core PostgreSQL, but the problem is reachable with some extension types.

  • Avoid machine-dependent behavior when dividing the smallest possible money value by -1 (Andrey Rachitskiy) §

  • Fix crash after out-of-memory failure partway through creation of a cache entry for a text search dictionary (Tom Lane) §

  • Fix memory-safety bugs in processing of incorrect ispell/hunspell dictionary files (Andrey Rachitskiy) §

  • Prevent access to other sessions' temporary tables (Jim Jones, Daniil Davydov, Alexander Korotkov) §

    Some code paths failed to prevent this, leading to silently wrong (inconsistent) results.

  • Honor query cancel and vacuum delay during GIN index posting-tree cleanup (Paul Kim, Alexander Korotkov) §

    The posting tree for a common value can be large, so that this missed check could allow vacuum to run for a long time before noticing an interrupt.

  • Fix possible mis-decoding of index tuples during GiST and SP-GiST index-only scans (Peter Geoghegan) §

    This error could lead to emitting corrupted data from an index-only scan plan. The only affected core opclass is GiST's range_ops, and it could only fail if the range column were not the first index column.

  • Ensure that the new last block of a bulk-extended table is added to its free space map promptly (Jingtang Zhang) §

    An off-by-one error caused the last block of a multi-block table extension to not be marked as free in the map. This would eventually get corrected by vacuum, but meanwhile the space wouldn't be used.

  • When creating directories, tolerate concurrent creation of the same directory (Andrew Dunstan, Tom Lane) §

  • Prevent creation of dangling object dependencies by acquiring a shared lock on any object being depended on (Bertrand Drouvot) § §

    The shared lock will conflict with any attempt to drop the depended-on object, eliminating the race condition that formerly existed. For example, if one session drops a schema (that appears empty to it) concurrently with some other session creating a function in that schema, previously both transactions could commit, leaving an invalid function definition behind. Now, one transaction or the other will fail.

  • Fix race condition in conflict detection for SERIALIZABLE isolation mode (Peter Geoghegan) §

    A conflict could be missed when examining an initially-empty btree index, allowing failure of serializability due to improperly allowing conflicting transactions to commit.

  • Fix race condition in ProcSignalBarrier code (Masahiko Sawada) §

    This error could result in processes getting stuck, typically after reporting still waiting for backend with PID nnnn to accept ProcSignalBarrier.

  • Fix race conditions when a set of processes that belong to the same lock group exit at the same time (Vlad Lesin) § §

    These errors could lead to PANIC aborts, with messages such as latch already owned. The issue does not normally arise in regular parallel query, since the leader won't exit before seeing its workers finish; but some extensions reach the problem.

  • Fix race with timeline selection in logical decoding during standby promotion (Bertrand Drouvot) § § §

    Logical decoding being performed on the standby could fail with a requested WAL segment has already been removed error. A repeat attempt would succeed, so there was no permanent problem but there was an availability hazard.

  • Avoid exposing a WAL receiver's full connection string during timeline jumps (Chao Li) §

    The pg_stat_wal_receiver view should show a sanitized version of the connection string, without sensitive data. But it transiently showed the full string when we re-use an existing WAL receiver.

  • Use run-time checks, not just Asserts, to verify the correct number of columns in tuples received during logical replication (Varik Matevosyan) §

    A malicious or buggy publisher could send inconsistent numbers of columns. While we could not find a scenario in which this would have serious ill effects, extra caution seems warranted.

  • Clean up quoting of string parameters within constructed replication commands (Tom Lane) §

    Various places that generate replication commands were not being adequately careful about quoting replication slot names and other parameters that need to be inserted into those commands. This could result in unexpected syntax errors in those commands. In principle, a crafted replication slot name could result in SQL injection; but such a scenario seems very unlikely to occur in practice, since replication operations can only be invoked by highly-privileged users and there is no reason for them to use a slot name coming from an untrustworthy source.

  • Fix logical decoding of empty prepared transactions (Masahiko Sawada) §

    A prepared transaction that did not cause any decodable updates could result in sending COMMIT/ROLLBACK PREPARED to the output plugin with no preceding PREPARE. For the built-in subscriber this breaks replication, and other plugins will probably not like it either.

  • Fix corruption of unlogged sequences after standby promotion (Fujii Masao) §

    Previously, if an unlogged sequence was created on the primary and replicated to a standby, accessing the sequence after promoting the standby could fail with bad magic number in sequence or related errors.

  • Fix cascading standby reconnect failure after archive fallback (Marco Nenciarini) §

    A cascading standby could fail to reconnect to its upstream standby with requested starting point ... is ahead of the WAL flush position after falling back to archive recovery.

  • Avoid race condition while dropping ephemeral replication slots (Zhijie Hou) §

    The slot-releasing code performed some additional updates to the replication slot's shared-memory entry after releasing the slot. This is unsafe since another session could immediately re-use the dropped slot's shared-memory entry. Skip those updates in the case of an ephemeral slot.

  • Fix stale progress reports during logical replication table synchronization (Shinya Kato) §

    Previously, the pg_stat_progress_copy view in the subscriber would continue to show the initial COPY operation as active even after the data copy had finished. The stale entry remained visible until synchronization caught up with the publisher.

  • Clear base backup progress on backup failure (Chao Li) § §

    Previously the pg_stat_progress_basebackup view would continue to show a stale progress entry after a failure, until the replication client disconnected. pg_basebackup normally disconnects immediately, but other clients might not.

  • Fix possible PANIC due to concurrent drop of pgstats entries when track_functions is enabled (Sami Imseih, Michael Paquier) § § §

  • Clean up broken local pgstats entry after failing to obtain space for the corresponding shared hashtable entry (Niall Newman) §

    Failure to do this led to a null-pointer dereference the next time the local entry was used.

  • In PL/Perl, avoid NULL pointer dereference crash when working with an invalid PostgreSQL::InServer::ARRAY object (Xing Guo) §

  • In PL/Python, properly check for errors when working with sequence and mapping objects (Richard Guo) §

    Previously, a broken object or an unhandled exception could result in a NULL pointer dereference crash.

  • In libpq, always drain all pending bytes from the SSL or GSS decryption buffer during pqReadData() (Jacob Champion) § § § §

    This avoids edge cases where libpq or its calling application waits for more data to arrive on the socket, but actually all the data has already arrived.

  • Allow libpq to accept ParameterDescription messages exceeding 30000 bytes (Ning Sun) §

    Previously, this message type was not among those that libpq's validity heuristics believed could be long. The limit resulted in failure for prepared queries having more than 7498 parameters, which is unlikely but supported.

  • Reject multiple descriptor header items in ecpg's GET/SET DESCRIPTOR statements (Masashi Kamura) §

    Previously the grammar allowed this syntax, but broken C code was generated. Adjust the grammar and the documentation to allow only one header item.

  • Make line widths match in psql's expanded aligned output format (Pavel Stehule) §

    When the table's data rows are narrower than the record header lines, widen the data rows to match the headers, avoiding unsightly output.

  • Fix psql's privilege check for showing database size in \l+ (Christoph Berg) §

    The underlying server function permits users who have pg_read_all_stats privileges to see the sizes of all databases, even if they lack CONNECT privilege. But psql was unaware of that provision and would not call the function unless the user has CONNECT privilege.

  • Fix psql's tab completion for \df to consider procedures too (Erik Wienhold) §

  • Fix thread-safety bug in pgbench (Fujii Masao) §

    When pgbench runs with multiple threads and the --verbose-errors option, different threads could attempt to use the same buffer to construct error messages, leading to corrupted log output.

  • Use the source cluster's group-read file permissions for pg_recvlogical output files (Fujii Masao) §

    pg_recvlogical was documented to behave this way, but it never actually enabled group-read.

  • In contrib/amcheck, handle short-header varlena datums correctly (Andrey Borodin) §

    This error could result in doing excess work while verifying a btree index, but seems not to have had any worse consequences.

  • In contrib/btree_gist, fix NaN handling in the float4 and float8 opclasses (Bill Kim, Tom Lane) §

    Comparisons, as well as the GiST penalty and distance functions, did not account for NaN and would give the wrong answer when handed one. It is recommended to reindex btree_gist indexes on float columns after installing this update, if there is any possibility that there are NaN entries in those columns.

  • In contrib/btree_gist, fix searches using a not-equal operator (Ayush Tiwari) §

    For variable-length data types, the code for scanning non-leaf index pages applied the wrong comparison function, leading to wrong results and potentially crashes.

  • Fix unguarded recursion and loops in contrib/hstore_plperl, contrib/jsonb_plperl, and contrib/jsonb_plpython (Aleksander Alekseev) § §

    Prevent stack overflow when dealing with deeply nested jsonb values, and allow interruption of the infinite loop caused when attempting to dereference circular chains of Perl object references.

  • Fix missed release of statistics catcache entry in contrib/intarray (Man Zeng) §

    This oversight led to warnings like resource was not closed: cache pg_statistic.

  • In contrib/ltree, fix integer overflow in comparisons (Ayush Tiwari) §

    ltree values containing more than about 14,653 labels resulted in wrong comparison answers due to overflow. If a btree index contains such values, it is probably corrupt and should be reindexed after installing this update.

  • Fix array overrun in contrib/pg_surgery's heap_force_kill and heap_force_freeze functions (Michael Paquier) §

    Attempting to change a TID whose offset number equals MaxHeapTuplesPerPage wrote one byte past the end of the allocated array, potentially crashing the server.

  • In contrib/pg_surgery, avoid infinite loop with TID arrays having more than 64K elements (Andrey Rachitskiy) §

  • Avoid NULL-pointer dereference in contrib/refint's check_foreign_key() (Ayush Tiwari) §

    In the on-update-cascade case, a null value of a referenced column led to a crash. This is an oversight in the fix for CVE-2026-6637, but the code that was there before that wasn't really right either.

  • Fix contrib/seg to print segments with ~ certainty indicators correctly (Ewan Young) §

    Due to a typo, seg_out() did not print a ~ certainty indicator attached to a segment's upper boundary. Worse, if the lower boundary had ~ while the upper boundary had no indicator, the upper boundary was not printed at all, incorrectly converting the value into an open interval.

  • Fix crash with namespace nodes in contrib/xml2's xpath_nodeset() function (Andrey Chernyy, Michael Paquier) §

  • Support building PostgreSQL with Visual Studio 2026 (Andrew Dunstan) §

  • Support building PostgreSQL with OpenSSL 4 (Daniel Gustafsson) §

  • Update time zone data files to tzdata release 2026c (Tom Lane) §

    Alberta (America/Edmonton) will be on year-round UTC-06 (effectively, permanent DST) beginning in November 2026. This release assumes that their TZ abbreviation will be CST from that time forward. That seems likely to change, but it's unclear what new abbreviation will be used.

    Morocco (Africa/Casablanca) will move to permanent UTC+00, without daylight saving time transitions, on 2026-09-20.

FAQ