E.1. Выпуск 17.6 #
Дата выпуска: 2025-08-14
В этот выпуск вошли различные исправления, внесённые после версии 17.5. За информацией о нововведениях версии 17 обратитесь к Разделу E.7.
E.1.1. Миграция на версию 17.6 #
Если используется версия 17.X, выгрузка/восстановление базы не требуется.
Однако если вы используете классы операторов numeric_minmax_multi_ops
BRIN, после обновления рекомендуется выполнить переиндексацию. Обратитесь к четвёртому пункту в списке изменений ниже.
Если вы обновляете сервер с более ранней версии, чем 17.5, см. также Раздел E.2.
E.1.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
при параллельных изменениях (Дин Рашид) §Если
MERGE
в общем табличном выражении пытается изменить или удалить таблицу с триггерамиBEFORE ROW
, и параллельная операцияUPDATE
илиDELETE
меняет целевую строку,MERGE
завершится ошибкой (сбой при изменении и возможное некорректное поведение при удалении).Исправление ошибок прямого наследования родительской таблицы при команде
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 будет ждать, пока данные запишутся на следующую страницу журнала. Это может произойти даже если сервер уже бездействует.
Приведение к единообразию написания имён LWLock для
MultiXactOffsetSLRU
иMultiXactMemberSLRU
(Бертран Друво) §Ранее это приводило к отображению разных имён событий ожидания в
pg_wait_events
иpg_stat_activity
, что в теории могло нарушить запросы мониторинга, ассоциирующиеся с этими представлениями.Исправление разночтений в использовании кавычек с именами ролей в списке управления доступом (Том Лейн) §
Предыдущее правило зависело от локали, что могло привести к проблемам портирования при переносе значений
aclitem
между инсталляциями. (pg_dump этого не делает, но другие утилиты могут с этим столкнуться.) Для обеспечения единообразия всегда берите в кавычки символы, не относящиеся к ASCII, в выводеaclitem
. Однако для обратной совместимости кавычки не должны быть обязательными дляaclitem
ввода.Запрещение знака равенства (
=
) в названиях параметров отношения и параметров сторонних данных (Том Лейн) §Нет явного доказательства использования подобных названий параметров, а допущение использования этого знака приводит к неоднозначности в уже существующих.
Исправление потенциально неправильной распаковки данных, сжатых с помощью LZ4 (Михаил Грибков) §
Данная ошибка появляется только с плохо сжимаемыми входными данными, поэтому её было сложно отследить.
Исправление редкого сценария, при котором сканирование индекса методом
btree
ошибочно отмечало записи индексов как нерабочие (Питер Гейган) §Исправление перераспределения сообщений аннулирования кеша от других транзакций во время логической репликации (Вигнеш Си) §
В ходе исправления ошибки предыдущих релизов был обеспечен ответ приёмника репликации на сообщения аннулирования кеша перекрёстных процессов, предотвращая таким образом использование неактуальных каталогов при обновлении репликации. Однако это исправление также повлияло на то, что эти сообщения перераспределялись, и это приводило к экспоненциальному росту числа сообщений аннулирования, а впоследствии к исчерпанию памяти. Теперь полученные сообщения не перераспределяются.
Исправление неожиданной остановки сервера при неправильной конфигурации синхронизации слота репликации (Фудзии Масао) §
Управляющий процесс postmaster ранее выводил ошибку (и останавливался), если для
sync_replication_slots
было задано значениеtrue
, а дляwal_level
значение было нижеlogical
. При обновлённом поведении синхронизация слотов отключается, понижается уровень таких сообщений, что предотвращает остановки postmaster.Исправление раннего удаления старых журналов предзаписи в контрольных точках (Виталий Давыдов)
Если точка перезапуска слота репликации смещается вправо в процессе контрольной точки, уже не используемые сегменты журнала предзаписи могут быть преждевременно удалены, что приведёт к ошибке при восстановлении в случае сбоя базы данных сразу по завершении этого процесса. Теперь они хранятся ещё один цикл контрольной точки.
Запрет на смещение влево подтверждённого слота репликации (Швета Малик) §
В некоторых случаях клиент репликации может обратиться к более раннему LSN, а потому, возможно, отправить после перезапуска более старый LSN. Это не считается ошибкой, пока клиенту не нужно обращаться к журналу предзаписи, находящемуся между двумя этими точками. Однако этот журнал нельзя переотправлять, поскольку это может привести к дублированию данных, поэтому всегда проверяйте, что слот работает с последним подтверждённым LSN.
Сокращение излишнего времени ожидания перед запуском новых рабочих процессов логической репликации (Том Лейн) §
В некоторых случаях запуск логической репликации мог занимать гораздо больше времени, чем указанно в
wal_retrieve_retry_interval
, перед запуском нового рабочего процесса.Исправлена проблема использования освобождённой памяти во время логической репликации команды
INSERT ... ON CONFLICT
(Итан Мерц, Микаэль Пакье) §Ранее это приводило к неправильному выводу отчётов по отслеживанию выполнения и, в крайних случаях, сбое процесса отправки WAL.
Возможность прервать ожидание транзакции на резервном сервере (Кевин Кей Бицзюй) §
Создание слота репликации на резервном сервере может потребовать завершения некоторых активных транзакций на основном сервере, после чего они скопируются на резервном. Поскольку время ожидания в данном случае неопределённое, рекомендуется давать возможность отменять такие операции, но в цикле не было проверки на отмену запроса.
Запрет на отправку со стороны процессов-передатчиков WAL каскадной логической репликации данных, которые не воспроизведены на резервном сервере (Алексей Махмутов) §
Это позволяет избежать сценариев, при которых передатчики WAL застревают при остановке резервного сервера в ожидании воспроизведения, которого не будет, поскольку процесс запуска сервера уже остановлен.
Исправление утечки памяти по отношениям во время автоочистки (Том Лейн) §
Исправлены утечки памяти, сохранявшиеся в течение всего сеанса при выполнении
XMLSERIALIZE(... INDENT)
(Дмитрий Коваленко, Том Лейн) § §Устранение возможного сбоя из-за нехватки памяти при выделении места для большой порции через механизм выделения места «bump» (Том Лейн) §
Исправление некоторых сценариев, при которых происходит попытка включения в выборку полей, упакованных в TOAST, из системного каталога без какого-либо снимка (Натан Боссарт) §
Раньше могли возникать сбой проверочного утверждения или ошибки вида «cannot fetch toast data without an active snapshot» (прочитать данные TOAST без активного снимка нельзя).
Исправлена ошибка проверочного утверждения во время межтабличных обновлений ограничений (Том Лейн, Цзянь Хи) § §
Устранение ошибочного утверждения, что тег команды был определён в конце
PortalRunMulti()
(Альваро Эррера) §Ошибка воспроизводилась в крайних случаях, например при пустом значении подготовленного оператора.
Исправление ошибок проверочных утверждений при разборе
XMLTABLE
(Ричард Гуо)Восстановление возможности запускать выражения PL/pgSQL параллельно (Дипеш Дхамелия) §
Понятие «выражение» в PL/pgSQL трактуется очень широко. Оно включает любые SQL-запросы
SELECT
, возвращающие один столбец и не более одной строки. Поэтому в некоторых случаях, например при оценке агрегатной функции, обрабатывается большой объём данных и было бы полезно делать это параллельными рабочими процессами. Раньше это было возможно, однако из-за предыдущего исправления ошибки это стало невозможно.Исправление в особых случаях утечек ресурсов при работе механизма сообщения об ошибках PL/Python (Том Лейн) §
Исчерпание памяти при работе механизма сообщения об ошибках Python может привести к ошибке при попытке удалить счётчики ссылок на объекты Python, что приведёт исчерпанию памяти во всём сеансе.
Исправление функции libpq
PQcancelCreate()
для случаев, когда адрес сервера указан при помощиhostaddr
(Сергей Корнилов) §Ранее происходил сбой libpq, если использовался полученный объект отмены.
Исправлено поведение функции 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_createsubscriber (Шлок Кьял) §
Ранее последняя транзакция, обработанная в процессе восстановления подписчика, могла отправляться повторно после начала обычной репликации.
Обеспечение выгрузки комментариев о ненулевых ограничениях типов доменов в pg_dump (Цзянь Хи, Альваро Эррера) §
Обеспечение выгрузки pg_dump комментариев об ограничениях домена в правильном порядке (Цзянь Хи) §
В некоторых случаях команда комментирования может появиться до создания ограничения.
Обеспечения стабильного порядка сортировки в приложении pg_dump для всех типов объектов БД (Ной Миш, Андреас Карлссон) § § §
pg_dump сортирует объекты по их логическим именам перед тем, как пересортировать по зависимостям. Этот вид сортировки не принимал во внимание полный уникальный ключ, а потом воспринимал некоторые типы объектов как правила и ограничения, что могло приводить к разному порядку сортировки для логически одинаковых БД. Из-за этого сложно было сравнивать базы данных по
diff
файлам вывода pg_dump, поэтому была улучшена логика для стабильной сортировки во всех случаях.Исправление неправильного разбора типов объектов в файлах фильтров pg_dump (Фудзии Масао) §
Ключевые слова теперь воспринимаются как комбинация с пробельным символом, а не обрезаются на первом же небуквенно-цифровом символе. Это изменение не влияет на корректные ключевые слова, но позволят правильно распознавать некоторые ошибки. Например,
table-data
будет отклонено, хотя ранее оно воспринималось какtable
.Исправлена ошибка восстановления больших объектов расширением pg_restore из выгрузок каталогов, сделанных расширением pg_dump ранее 12 версии PostgreSQL (Павел Стехуле) §
Проверка наличия непоследовательных унаследованных ограничений
NOT NULL
в pg_upgrade (Али Акбар) § § §Версии ранее PostgreSQL 18 позволяют удалять унаследованное ограничение
NOT NULL
для столбца. Однако это приводит к невозможности восстановить схему и последующей ошибке pg_upgrade. Теперь такие случаи выявляются во время проверок перед запуском pg_upgrade, что позволяет пользователям вносить исправления до инициализация обновления.Убрано требование наличия у целевой установки значения по умолчанию для
max_slot_wal_keep_size
во время выполнения 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_prewarm
(Масахиро Икеда) §Вызов функции
pg_prewarm()
для отношений без физического хранилища (например, для представлений) приводил к сбою проверочного утверждения, хотя негативно на сборки без проверочных утверждений это не влияло. Теперь для таких случаев добавлена проверка ошибок.Устранение пропусков в наборе номеров параметров, используемых в нормализованном запросе
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 (Том Лейн) §Это предотвращает сбой компиляции на некоторых платформах.
Отключение предупреждений совместимости при использовании Meson для сборки с MSVC (Питер Эйзентраут) §
Предотвращение предупреждений компилятора неинициализированных значений в коде сравнения 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
.