E.26. Выпуск 15.14

Дата выпуска: 2025-08-14

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

E.26.1. Миграция на версию 15.14

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

Однако если вы используете классы операторов numeric_minmax_multi_ops BRIN, после обновления рекомендуется выполнить переиндексацию. Обратитесь к четвёртому пункту в списке изменений ниже.

Однако если вы обновляете сервер с более ранней версии, чем 15.13, см. Раздел E.27.

E.26.2. Изменения

  • Усиление проверок безопасности в функциях оценки планировщика (Дин Рашид) §

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

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

    Проект PostgreSQL благодарит Дина Рашида за сообщение об этой проблеме. (CVE-2025-8713)

  • Предотвращение использования скриптов pg_dump для атак на пользователя, выполняющего восстановление (Натан Боссарт) §

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

    Чтобы гарантировать, что этого не случится, в psql добавлена команда \restrict, которая предотвращает выполнение дальнейших метакоманд, и pg_dump выполняет её до того, как будут получены данные от исходного сервера.

    Проект PostgreSQL благодарит Мартина Рахманова, Матье Денэ и РётаК за сообщение об этой проблеме. (CVE-2025-8714)

  • Преобразование символов новой строки в пробелы в именах, указанных в комментариях вывода pg_dump (Ной Миш) §

    Имена объектов, содержащие символы новой строки, позволяли внедрять произвольные команды SQL в скрипт вывода. (Без предыдущего исправления таким образом могли внедряться и метакоманды psql.) Этот класс проблем был устранён в рамках исправления CVE-2012-0868, однако последующая работа выявила некоторые повторные случаи.

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

  • Исправление неправильного расчёта расстояния в опорной функции BRIN numeric_minmax_multi_ops (Питер Эйзентраут, Том Лейн) §

    На 64-битных платформах результаты были ошибочны иногда, в то время как на 32-битных — крайне часто. Это не приводило к очевидным сбоям, поскольку такая логика используется только для того, чтобы выбрать способ слияния значений в диапазоны. В худшем случае индекс раздувался и становился неэффективным. Однако всё равно рекомендуется переиндексировать любой индекс BRIN, который использует класс оператора numeric_minmax_multi_ops.

  • Запрет снижения размера принимаемого XML ввода (Микаэль Пакье, Эрик Винхольд) § §

    В нашем обходном решении для ошибки в ранних выпусках libxml2 2.13.x использовалось место в коде, которое не принимало фрагменты текста, превышающие 10 МБ. У предыдущей версии кода такой проблемы не было. Ранние выпуски предположительно уже не поддерживаются, поэтому возвращаемся к использованию предыдущей версии кода.

  • Исправление ошибок прямого наследования родительской таблицы при команде MERGE (Дин Рашид) §

    Вставки в такую целевую таблицу могли приводить к сбою или некорректным результатам запроса из-за неправильной обработки действий WITH CHECK OPTION и RETURNING.

  • Таблицы с триггерами уровня оператора теперь могут становиться секциями или потомками в иерархии наследования (Эцуро Фудзита) §

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

  • Недопущение сбора переходных кортежей для сторонних дочерних таблиц (Эцуро Фудзита) §

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

  • Возможность сброса неизвестных пользовательских параметров с зарезервированным префиксами (Натан Боссарт) §

    Ранее, если значение параметра сохранялось с помощью команды ALTER DATABASE/ROLE/SYSTEM, то его нельзя было сбросить, если параметр был неизвестен, но у него был зарезервированный префикс. Это может произойти, если раньше этот параметр был в расширении, но после был удалён или обновлён.

  • Устранение возможной взаимоблокировки при использовании команды ALTER SUBSCRIPTION ... DROP PUBLICATION (Аджин Чериан) §

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

  • Сокращение окна условий гонки для создания индексов с конфликтующими именами (Том Лейн) §

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

  • Предотвращение использования неверных параметров VACUUM в случаях очистки нескольких таблиц в рамках одной команды (Натан Боссарт, Микаэль Пакье) §

    Параметры TRUNCATE и INDEX_CLEANUP одной таблицы могут применяться к другим таблицам.

  • Доработка исправления обработки классов символов в регулярных выражениях SIMILAR TO (Лауренц Альбе) §

    Код, переводящий выражения, соответствующие шаблону SIMILAR TO, в регулярные выражения POSIX, не воспринимал квадратные скобки как вложенный объект. Например, в шаблоне [[:alpha:]%_] символы % и _ были восприняты кодом как метасимволы, а не константы.

  • Добавление скобок вокруг выражения в предложениях FETCH FIRST выражение ROWS WITH TIES во всех случаях разбора запросов (Хейкки Линнакангас) §

    Это позволяет избежать ошибок, если разобранные результаты были синтаксически неверными.

  • Ограничение размера очереди запроса fsync процесса контрольной точки (Александр Коротков, Сюнэн Чжоу) § §

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

  • Устранение бесконечного ожидания в логическом декодировании при чтении частично добавленных записей WAL (Вигнеш Си) §

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

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

    Предыдущее правило зависело от локали, что могло привести к проблемам портирования при переносе значений aclitem между инсталляциями. (pg_dump этого не делает, но другие утилиты могут с этим столкнуться.) Для обеспечения единообразия всегда берите в кавычки символы, не относящиеся к ASCII, в выводе aclitem. Однако для обратной совместимости кавычки не должны быть обязательными для aclitem ввода.

  • Запрещение знака равенства (=) в названиях параметров отношения и параметров сторонних данных (Том Лейн) §

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

  • Исправление потенциально неправильной распаковки данных, сжатых с помощью LZ4 (Михаил Грибков) §

    Данная ошибка появляется только с плохо сжимаемыми входными данными, поэтому её было сложно отследить.

  • Исправление редкого сценария, при котором сканирование индекса методом btree ошибочно отмечало записи индексов как нерабочие (Питер Гейган) §

  • Исправление перераспределения сообщений аннулирования кеша от других транзакций во время логической репликации (Вигнеш Си) §

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

  • Исправление раннего удаления старых журналов предзаписи в контрольных точках (Виталий Давыдов) §

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

  • Запрет на смещение влево подтверждённого слота репликации (Швета Малик) §

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

  • Возможность прервать ожидание транзакции на резервном сервере (Кевин Кей Бицзюй) §

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

  • Исправление утечки памяти по отношениям во время автоочистки (Том Лейн) §

  • Исправление некоторых сценариев, при которых происходит попытка включения в выборку полей, упакованных в TOAST, из системного каталога без какого-либо снимка (Натан Боссарт) §

    Раньше могли возникать сбой проверочного утверждения или ошибки вида «cannot fetch toast data without an active snapshot» (прочитать данные TOAST без активного снимка нельзя).

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

  • Устранение ошибочного утверждения, что тег команды был определён в конце PortalRunMulti() (Альваро Эррера) §

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

  • Исправление ошибок проверочных утверждений при разборе XMLTABLE (Ричард Гуо) §

  • Восстановление возможности запускать выражения PL/pgSQL параллельно (Дипеш Дхамелия) §

    Понятие «выражение» в PL/pgSQL трактуется очень широко. Оно включает любые SQL-запросы SELECT, возвращающие один столбец и не более одной строки. Поэтому в некоторых случаях, например при оценке агрегатной функции, обрабатывается большой объём данных и было бы полезно делать это параллельными рабочими процессами. Раньше это было возможно, однако из-за предыдущего исправления ошибки это стало невозможно.

  • Исправление в особых случаях утечек ресурсов при работе механизма сообщения об ошибках PL/Python (Том Лейн) §

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

  • Исправлено поведение функции libpq PQport(), при котором значение NULL возвращалось, только если прошедшее соединение также было NULL (Даниэле Вараццо) §

    Хотя это и задокументированное поведение, в последних версиях libpq значение NULL иногда возвращается, если пользователь не указал порт. Пришлось вернуться к историческому поведению PostgreSQL, при котором в таких случая возвращалась пустая строка. (в версиях 18 и будет возвращаться порт по умолчанию, обычно "5432".)

  • Исправление ошибки в случаях, когда аутентификация GSSAPI требует пакеты размером более 16 КБ (Джейкоб Чемпион, Том Лейн) §

    Такие большие пакеты для аутентификации требуются пользователям Active Directory, которые состоят во многих её группах. Это ограничение вызывает ошибки соединения с неясными сообщениями об ошибках, например «GSSAPI context establishment error: The routine must be called again to complete its function: Unknown error» (Ошибка установления контекста GSSAPI: Операцию необходимо повторить для завершения её работы: Неизвестная ошибка) .

  • Устранение сбоя с зависимостью от времени при передаче данных SSL или GSSAPI (Том Лейн) §

    При использовании шифрования SSL и GSSAPI в неблокирующем режиме библиотека libpq иногда выдавала ошибку «SSL error: bad length» (Ошибка SSL: неправильная длина) или «GSSAPI caller failed to retransmit all data needing to be retried» (вызывающей стороне GSSAPI не удалось повторно передать все необходимые данные).

  • Исправление обращения по нулевому указателю во время поиска подключения в приложениях ecpg (Александр Алексеев) §

    Это может произойти только если некоторые соединения приложения названы, а некоторые — нет.

  • Улучшение в psql добавления табуляцией параметров команд COPY и \copy (Атсуши Торикоши) §

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

  • Исправление ошибок проверочных утверждений для pgbench при получении нескольких сообщений о синхронизации конвейера (Фудзии Масао) §

  • Обеспечение выгрузки pg_dump комментариев об ограничениях домена в правильном порядке (Цзянь Хи) §

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

  • Обеспечения стабильного порядка сортировки в приложении pg_dump для всех типов объектов БД (Ной Миш, Андреас Карлссон) § § §

    pg_dump сортирует объекты по их логическим именам перед тем, как пересортировать по зависимостям. Этот вид сортировки не принимал во внимание полный уникальный ключ, а потом воспринимал некоторые типы объектов как правила и ограничения, что могло приводить к разному порядку сортировки для логически одинаковых БД. Из-за этого сложно было сравнивать базы данных по diff файлам вывода pg_dump, поэтому была улучшена логика для стабильной сортировки во всех случаях.

  • Проверка наличия непоследовательных унаследованных ограничений NOT NULL в pg_upgrade (Али Акбар) § § § § § §

    Версии ранее PostgreSQL 18 позволяют удалять унаследованное ограничение NOT NULL для столбца. Однако это приводит к невозможности восстановить схему и последующей ошибке pg_upgrade. Теперь такие случаи выявляются во время проверок перед запуском pg_upgrade, что позволяет пользователям вносить исправления до инициализация обновления.

  • Исправление ошибки проверочного утверждения, если track_commit_timestamp включён во время работы initdb (Хайато Курода, Энди Фан) §

  • Добавление вывода информации о потере данных статистики в записях WAL PREPARE TRANSACTION в pg_waldump (Даниил Давыдов) §

  • Исправление возможных утечек открытых соединений во время установки соединения contrib/dblink (Том Лейн) §

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

  • Обеспечение способности contrib/pg_prewarm обрабатывать очень большие значения параметра конфигурации shared_buffers (Дарья Шанина) §

    Рабочий процесс авторазогрева завершался ошибкой выделения памяти, если для параметра shared_buffers было задано значение больше примерно 50 миллионов буферов (400 ГБ).

  • Устранение пропусков в наборе номеров параметров, используемых в нормализованном запросе contrib/pg_stat_statements (Сами Имсейх) §

  • Устранение утечки памяти в методах DirectModify модуля contrib/postgres_fdw (Том Лейн) §

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

  • Обеспечение поиска каталогов, указанных в параметрах --with-includes и --with-libraries скрипта configure, до системных каталогов (Том Лейн) §

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

  • Исправление проверок скрипта configure для функций __cpuid() и __cpuidex() (Лукас Фиттл, Микаэль Пакье) §

    Скрипту configure не удавалось выявить эти предназначенные для Windows функции, поэтому они не использовались. Это приводило к снижению скорости расчётов CRC ниже необходимого уровня, поскольку доступность инструкций для аппаратного обеспечения нельзя было проверить. На практике влияние этой ошибки было ограничено, так как для производственных сборок под Windows инструментарий Autoconf обычно не используется.

  • Устранение ошибки сборки с параметром --with-pam на платформах на базе Solaris (Том Лейн) §

    Solaris не соответствует другим платформам Unix с точки зрения API для аутентификации PAM. Это несоответствие проявляется в предупреждении компилятора «inconsistent pointer» (непоследовательный указатель), которое пока не было исправлено. Однако в наборе компиляторов GCC 14 это ошибка, а не предупреждение, поэтому добавляем исправление кода.

  • Обеспечение возможности переноса кода на GNU Hurd (Михаэль Банк, Кристоф Берг, Самуэль Тибо) §

    Исправление предположений о IOV_MAX и O_RDONLY, которые не работают на GNU Hurd.

  • Обеспечение полного соответствия использования функции memset_s() стандарту C11 (Том Лейн) §

    Это предотвращает сбой компиляции на некоторых платформах.

  • Предотвращение предупреждений компилятора неинициализированных значений в коде сравнения JSONB (Том Лейн) §

  • Исключение предупреждений об устаревании при сборке с использованием libxml2 2.14 и позднее (Микаэль Пакье) §

  • Устранение проблем компиляции pg_locale.h на C++ (Джон Нейлор) §

    Заголовочные файлы PostgreSQL обычно должны заворачиваться в extern "C" { ... } для включения в расширения, написанные на C++. Это не работало для файла pg_locale.h, так как он использует заголовки libicu. Тем не менее это можно обойти за счёт подавления объявлений только на C++ в таких заголовках. Расширения на C++, которым необходимо использовать API libicu на C++, могут делать это, добавляя заголовки libicu перед pg_locale.h.

E.26. Release 15.14

Release date: 2025-08-14

This release contains a variety of fixes from 15.13. For information about new features in major release 15, see Section E.40.

E.26.1. Migration to Version 15.14

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

However, if you have any BRIN numeric_minmax_multi_ops indexes, it is advisable to reindex them after updating. See the fourth changelog entry below.

Also, if you are upgrading from a version earlier than 15.13, see Section E.27.

E.26.2. Changes

  • Tighten security checks in planner estimation functions (Dean Rasheed) §

    The fix for CVE-2017-7484, plus followup fixes, intended to prevent leaky functions from being applied to statistics data for columns that the calling user does not have permission to read. Two gaps in that protection have been found. One gap applies to partitioning and inheritance hierarchies where RLS policies on the tables should restrict access to statistics data, but did not.

    The other gap applies to cases where the query accesses a table via a view, and the view owner has permissions to read the underlying table but the calling user does not have permissions on the view. The view owner's permissions satisfied the security checks, and the leaky function would get applied to the underlying table's statistics before we check the calling user's permissions on the view. This has been fixed by making security checks on views occur at the start of planning. That might cause permissions failures to occur earlier than before.

    The PostgreSQL Project thanks Dean Rasheed for reporting this problem. (CVE-2025-8713)

  • Prevent pg_dump scripts from being used to attack the user running the restore (Nathan Bossart) §

    Since dump/restore operations typically involve running SQL commands as superuser, the target database installation must trust the source server. However, it does not follow that the operating system user who executes psql to perform the restore should have to trust the source server. The risk here is that an attacker who has gained superuser-level control over the source server might be able to cause it to emit text that would be interpreted as psql meta-commands. That would provide shell-level access to the restoring user's own account, independently of access to the target database.

    To provide a positive guarantee that this can't happen, extend psql with a \restrict command that prevents execution of further meta-commands, and teach pg_dump to issue that before any data coming from the source server.

    The PostgreSQL Project thanks Martin Rakhmanov, Matthieu Denais, and RyotaK for reporting this problem. (CVE-2025-8714)

  • Convert newlines to spaces in names included in comments in pg_dump output (Noah Misch) §

    Object names containing newlines offered the ability to inject arbitrary SQL commands into the output script. (Without the preceding fix, injection of psql meta-commands would also be possible this way.) CVE-2012-0868 fixed this class of problem at the time, but later work reintroduced several cases.

    The PostgreSQL Project thanks Noah Misch for reporting this problem. (CVE-2025-8715)

  • Fix incorrect distance calculation in BRIN numeric_minmax_multi_ops support function (Peter Eisentraut, Tom Lane) §

    The results were sometimes wrong on 64-bit platforms, and wildly wrong on 32-bit platforms. This did not produce obvious failures because the logic is only used to choose how to merge values into ranges; at worst the index would become inefficient and bloated. Nonetheless it's recommended to reindex any BRIN indexes that use the numeric_minmax_multi_ops operator class.

  • Avoid regression in the size of XML input that we will accept (Michael Paquier, Erik Wienhold) § §

    Our workaround for a bug in early 2.13.x releases of libxml2 made use of a code path that rejects text chunks exceeding 10MB, whereas the previous coding did not. Those early releases are presumably extinct in the wild by now, so revert to the previous coding.

  • Fix MERGE into a plain-inheritance parent table (Dean Rasheed) §

    Insertions into such a target table could crash or produce incorrect query results due to failing to handle WITH CHECK OPTION and RETURNING actions.

  • Allow tables with statement-level triggers to become partitions or inheritance children (Etsuro Fujita) §

    We do not allow partitions or inheritance child tables to have row-level triggers with transition tables, because an operation on the whole inheritance tree would need to maintain a separate transition table for each such child table. But that problem does not apply for statement-level triggers, because only the parent's statement-level triggers will be fired. The code that checks whether an existing table can become a partition or inheritance child nonetheless rejected both kinds of trigger.

  • Disallow collecting transition tuples from child foreign tables (Etsuro Fujita) §

    We do not support triggers with transition tables on foreign tables. However, the case of a partition or inheritance child that is a foreign table was overlooked. If the parent has such a trigger, incorrect transition tuples were collected from the foreign child. Instead throw an error, reporting that the case is not supported.

  • Allow resetting unknown custom parameters with reserved prefixes (Nathan Bossart) §

    Previously, if a parameter setting had been stored using ALTER DATABASE/ROLE/SYSTEM, the stored setting could not be removed if the parameter was unknown but had a reserved prefix. This case could arise if an extension used to have a parameter, but that parameter had been removed in an upgrade.

  • Fix a potential deadlock during ALTER SUBSCRIPTION ... DROP PUBLICATION (Ajin Cherian) §

    Ensure that server processes acquire catalog locks in a consistent order during replication origin drops.

  • Shorten the race condition window for creating indexes with conflicting names (Tom Lane) §

    When choosing an auto-generated name for an index, avoid conflicting with not-yet-committed pg_class rows as well as fully-valid ones. This avoids possibly choosing the same name as some concurrent CREATE INDEX did, when that command is still in process of filling its index, or is done but is part of a not-yet-committed transaction. There's still a window for trouble, but it's only as long as the time needed to validate a new index's parameters and insert its pg_class row.

  • Prevent usage of incorrect VACUUM options in some cases where multiple tables are vacuumed in a single command (Nathan Bossart, Michael Paquier) §

    The TRUNCATE and INDEX_CLEANUP options of one table could be applied to others.

  • Fix processing of character classes within SIMILAR TO regular expressions (Laurenz Albe) § §

    The code that translates SIMILAR TO pattern matching expressions to POSIX-style regular expressions did not consider that square brackets can be nested. For example, in a pattern like [[:alpha:]%_], the code treated the % and _ characters as metacharacters when they should be literals.

  • When deparsing queries, always add parentheses around the expression in FETCH FIRST expression ROWS WITH TIES clauses (Heikki Linnakangas) §

    This avoids some cases where the deparsed result wasn't syntactically valid.

  • Limit the checkpointer process's fsync request queue size (Alexander Korotkov, Xuneng Zhou) § §

    With very large shared_buffers settings, it was possible for the checkpointer to attempt to allocate more than 1GB for fsync requests, leading to failure and an infinite loop. Clamp the queue size to prevent this scenario.

  • Avoid infinite wait in logical decoding when reading a partially-written WAL record (Vignesh C) §

    If the server crashes after writing the first part of a WAL record that would span multiple pages, subsequent logical decoding of the WAL stream would wait for data to arrive on the next WAL page. That might never happen if the server is now idle.

  • Fix inconsistent quoting of role names in ACL strings (Tom Lane) §

    The previous quoting rule was locale-sensitive, which could lead to portability problems when transferring aclitem values across installations. (pg_dump does not do that, but other tools might.) To ensure consistency, always quote non-ASCII characters in aclitem output; but to preserve backward compatibility, never require that they be quoted during aclitem input.

  • Reject equal signs (=) in the names of relation options and foreign-data options (Tom Lane) §

    There's no evident use-case for option names like this, and allowing them creates ambiguity in the stored representation.

  • Fix potentially-incorrect decompression of LZ4-compressed archive data (Mikhail Gribkov) §

    This error seems to manifest only with not-very-compressible input data, which may explain why it escaped detection.

  • Avoid a rare scenario where a btree index scan could mark the wrong index entries as dead (Peter Geoghegan) §

  • Avoid re-distributing cache invalidation messages from other transactions during logical replication (vignesh C) §

    Our previous round of minor releases included a bug fix to ensure that replication receiver processes would respond to cross-process cache invalidation messages, preventing them from using stale catalog data while performing replication updates. However, the fix unintentionally made them also redistribute those messages again, leading to an exponential increase in the number of invalidation messages, which would often end in a memory allocation failure. Fix by not redistributing received messages.

  • Avoid premature removal of old WAL during checkpoints (Vitaly Davydov) §

    If a replication slot's restart point is advanced while a checkpoint is in progress, no-longer-needed WAL segments could get removed too soon, leading to recovery failure if the database crashes immediately afterwards. Fix by keeping them for one additional checkpoint cycle.

  • Never move a replication slot's confirmed-flush position backwards (Shveta Malik) §

    In some cases a replication client could acknowledge an LSN that's past what it has stored persistently, and then perhaps send an older LSN after a restart. We consider this not-a-bug so long as the client did not have anything it needed to do for the WAL between the two points. However, we should not re-send that WAL for fear of data duplication, so make sure we always believe the latest confirmed LSN for a given slot.

  • Allow waiting for a transaction on a standby server to be interrupted (Kevin K Biju) §

    Creation of a replication slot on a standby server may require waiting for some active transaction(s) to finish on the primary and then be replayed on the standby. Since that could be an indefinite wait, it's desirable to allow the operation to be cancelled, but there was no check for query cancel in the loop.

  • Fix per-relation memory leakage in autovacuum (Tom Lane) §

  • Fix some places that might try to fetch toasted fields of system catalogs without any snapshot (Nathan Bossart) §

    This could result in an assertion failure or cannot fetch toast data without an active snapshot error.

  • Avoid assertion failure during cross-table constraint updates (Tom Lane, Jian He) § §

  • Remove faulty assertion that a command tag must have been determined by the end of PortalRunMulti() (Álvaro Herrera) §

    This failed in edge cases such as an empty prepared statement.

  • Fix assertion failure in XMLTABLE parsing (Richard Guo) §

  • Restore the ability to run PL/pgSQL expressions in parallel (Dipesh Dhameliya) §

    PL/pgSQL's notion of an expression is very broad, encompassing any SQL SELECT query that returns a single column and no more than one row. So there are cases, for example evaluation of an aggregate function, where the query involves significant work and it'd be useful to run it with parallel workers. This used to be possible, but a previous bug fix unintentionally disabled it.

  • Fix edge-case resource leaks in PL/Python error reporting (Tom Lane) § §

    An out-of-memory failure while reporting an error from Python could result in failure to drop reference counts on Python objects, leading to session-lifespan memory leakage.

  • Fix libpq's PQport() function to never return NULL unless the passed connection is NULL (Daniele Varrazzo) §

    This is the documented behavior, but recent libpq versions would return NULL in some cases where the user had not provided a port specification. Revert to our historical behavior of returning an empty string in such cases. (v18 and later will return the compiled-in default port number, typically "5432", instead.)

  • Avoid failure when GSSAPI authentication requires packets larger than 16kB (Jacob Champion, Tom Lane) §

    Larger authentication packets are needed for Active Directory users who belong to many AD groups. This limitation manifested in connection failures with unintelligible error messages, typically GSSAPI context establishment error: The routine must be called again to complete its function: Unknown error.

  • Fix timing-dependent failures in SSL and GSSAPI data transmission (Tom Lane) §

    When using SSL or GSSAPI encryption in non-blocking mode, libpq sometimes failed with SSL error: bad length or GSSAPI caller failed to retransmit all data needing to be retried.

  • Avoid null-pointer dereference during connection lookup in ecpg applications (Aleksander Alekseev) §

    The case could occur only if the application has some connections that are named and some that are not.

  • Improve psql's tab completion for COPY and \copy options (Atsushi Torikoshi) §

    The same completions were offered for both COPY FROM and COPY TO, although some options are only valid for one case or the other. Distinguish these cases to provide more accurate suggestions.

  • Avoid assertion failure in pgbench when multiple pipeline sync messages are received (Fujii Masao) §

  • Ensure that pg_dump dumps comments on domain constraints in a valid order (Jian He) §

    In some cases the comment command could appear before creation of the constraint.

  • Ensure stable sort ordering in pg_dump for all types of database objects (Noah Misch, Andreas Karlsson) § § §

    pg_dump sorts objects by their logical names before performing dependency-driven reordering. This sort did not account for the full unique key identifying certain object types such as rules and constraints, and thus it could produce dissimilar sort orders for logically-identical databases. That made it difficult to compare databases by diff'ing pg_dump output, so improve the logic to ensure stable sort ordering in all cases.

  • In pg_upgrade, check for inconsistent inherited not-null constraints (Ali Akbar) § § § § § §

    PostgreSQL versions before 18 allow an inherited column not-null constraint to be dropped. However, this results in a schema that cannot be restored, leading to failure in pg_upgrade. Detect such cases during pg_upgrade's preflight checks to allow users to fix them before initiating the upgrade.

  • Avoid assertion failure if track_commit_timestamp is enabled during initdb (Hayato Kuroda, Andy Fan) §

  • Fix pg_waldump to show information about dropped statistics in PREPARE TRANSACTION WAL records (Daniil Davydov) §

  • Avoid possible leak of the open connection during contrib/dblink connection establishment (Tom Lane) §

    In the rare scenario where we hit out-of-memory while inserting the new connection object into dblink's hashtable, the open connection would be leaked until end of session, leaving an idle session sitting on the remote server.

  • Make contrib/pg_prewarm cope with very large shared_buffers settings (Daria Shanina) §

    Autoprewarm failed with a memory allocation error if shared_buffers was larger than about 50 million buffers (400GB).

  • In contrib/pg_stat_statements, avoid leaving gaps in the set of parameter numbers used in a normalized query (Sami Imseih) §

  • Fix memory leakage in contrib/postgres_fdw's DirectModify methods (Tom Lane) §

    The PGresult holding the results of the remote modify command would be leaked for the rest of the session if the query fails between invocations of the DirectModify methods, which could happen when there's RETURNING data to process.

  • Ensure that directories listed in configure's --with-includes and --with-libraries options are searched before system-supplied directories (Tom Lane) §

    A common reason for using these options is to allow a user-built version of some library to override the system-supplied version. However, that failed to work in some environments because of careless ordering of switches in the commands issued by the makefiles.

  • Fix configure's checks for __cpuid() and __cpuidex() (Lukas Fittl, Michael Paquier) §

    configure failed to detect these Windows-specific functions, so that they would not be used, leading to slower-than-necessary CRC computations since the availability of hardware instructions could not be verified. The practical impact of this error was limited, because production builds for Windows typically do not use the Autoconf toolchain.

  • Fix build failure with --with-pam option on Solaris-based platforms (Tom Lane) §

    Solaris is inconsistent with other Unix platforms about the API for PAM authentication. This manifested as an inconsistent pointer compiler warning, which we never did anything about. But as of GCC 14 it's an error not warning by default, so fix it.

  • Make our code portable to GNU Hurd (Michael Banck, Christoph Berg, Samuel Thibault) §

    Fix assumptions about IOV_MAX and O_RDONLY that don't hold on Hurd.

  • Make our usage of memset_s() conform strictly to the C11 standard (Tom Lane) §

    This avoids compile failures on some platforms.

  • Prevent uninitialized-value compiler warnings in JSONB comparison code (Tom Lane) §

  • Avoid deprecation warnings when building with libxml2 2.14 and later (Michael Paquier) §

  • Avoid problems when compiling pg_locale.h under C++ (John Naylor) §

    PostgreSQL header files generally need to be wrapped in extern "C" { ... } in order to be included in extensions written in C++. This failed for pg_locale.h because of its use of libicu headers, but we can work around that by suppressing C++-only declarations in those headers. C++ extensions that want to use libicu's C++ APIs can do so by including the libicu headers ahead of pg_locale.h.

FAQ