E.22. Выпуск 15.14#
E.22. Выпуск 15.14
Дата релиза: 2025-08-14
Этот релиз содержит различные исправления из версии 15.13. Для получения информации о новых функциях в основном релизе 15, см. Раздел E.36.
E.22.1. Миграция на версию 15.14
Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.
Однако, если у вас есть какие-либо
BRIN numeric_minmax_multi_ops индексы, рекомендуется
перестроить их после обновления. См. четвертую запись в журнале изменений ниже.
Также, если выполняется обновление с версии ранее 15.13, см. Раздел E.23.
E.22.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-входных данных, которые будут приняты (Майкл Пакье, Эрик Винхольд) § §
Наше обходное решение для ошибки в ранних выпусках 2.13.x libxml2 использовало путь кода, который отклонял текстовые фрагменты, превышающие 10 МБ, тогда как предыдущий код этого не делал. Предположительно, эти ранние выпуски уже исчезли в дикой природе, поэтому было возвращено предыдущее кодирование.
Исправлено
MERGEв таблицу-родитель с простым наследованием (Дин Рашид) §Вставки в такую целевую таблицу могли привести к сбою или неправильным результатам запроса из-за некорректной обработки действий
WITH CHECK OPTIONиRETURNING.Разрешено таблицам с триггерами на уровне операторов становиться разделами или наследуемыми дочерними элементами (Эцуро Фудзита) §
Не разрешено, чтобы разделы или дочерние таблицы наследования имели триггеры на уровне строк с переходными таблицами, потому что операция на всем дереве наследования потребовала бы поддержания отдельной переходной таблицы для каждой такой дочерней таблицы. Но эта проблема не применима к триггерам на уровне операторов, потому что только триггеры на уровне операторов родительской таблицы будут срабатывать. Код, который проверяет, может ли существующая таблица стать разделом или дочерней таблицей наследования, тем не менее отклонял оба вида триггеров.
Запрещено собирать переходные кортежи из дочерних внешних таблиц (Эцуро Фудзита) §
Мы не поддерживаем триггеры с переходными таблицами на внешних таблицах. Однако случай раздела или дочернего элемента наследования, который является внешней таблицей, был упущен из виду. Если у родителя был такой триггер, некорректные переходные кортежи собирались из внешнего дочернего элемента. Вместо этого выбрасывалась ошибка, сообщающая, что этот случай не поддерживается.
Разрешено сбрасывать неизвестные пользовательские параметры с зарезервированными префиксами (Натан Боссарт) §
Ранее, если настройка параметра была сохранена с использованием
ALTER DATABASE/ROLE/SYSTEM, сохраненная настройка не могла быть удалена, если параметр был неизвестен, но имел зарезервированный префикс. Этот случай мог возникнуть, если расширение ранее имело параметр, но этот параметр был удален при обновлении.Исправлена потенциальная взаимоблокировка во время
ALTER SUBSCRIPTION ... DROP PUBLICATION(Аджин Чериан) §Убедиться, что серверные процессы приобретали блокировки каталога в согласованном порядке во время удаления источников репликации.
Укорочено окно состояния гонки для создания индексов с конфликтующими именами (Том Лейн) §
При выборе автоматически сгенерированного имени для индекса избегалось конфликтов с еще не зафиксированными строками
pg_class, а также с полностью валидными. Это позволяло избежать возможного выбора того же имени, что и у некоторой параллельной командыCREATE INDEX, когда эта команда все еще находилась в процессе заполнения своего индекса или завершена, но является частью еще не зафиксированной транзакции. Все еще оставалось окно для проблем, но оно было только на время, необходимое для проверки параметров нового индекса и вставки его строкиpg_class.Предотвращено использование некорректных опций
VACUUMв некоторых случаях, когда несколько таблиц вакуумировались в одной команде (Натан Боссарт, Майкл Пакье) §Опции
TRUNCATEиINDEX_CLEANUPодной таблицы могли быть применены к другим.Исправлена обработка классов символов в регулярных выражениях
SIMILAR TO(Лауренц Альбе) § §Код, который переводил выражения сопоставления с образцом
SIMILAR TOв регулярные выражения в стиле POSIX, не учитывал, что квадратные скобки могут быть вложенными. Например, в образце, таком как[[:alpha:]%_], код обрабатывал символы%и_как метасимволы, когда они должны были быть литералами.При обратной генерации запросов всегда добавлялись скобки вокруг выражения в
FETCH FIRSTконструкциях (Хейкки Линкангас) §expressionROWS WITH TIESЭто избегает некоторых случаев, когда результат декомпиляции не был синтаксически корректным.
Ограничен размер очереди запросов fsync процесса контрольной точки (Александр Коротков, Сюнэн Чжоу) § §
С очень большими настройками
shared_buffersбыло возможно, что контрольная точка пыталась выделить более 1 ГБ для запросов fsync, что приводило к сбою и бесконечному циклу. Размер очереди был ограничен, чтобы предотвратить этот сценарий.Избегалось бесконечное ожидание в логическом декодировании при чтении частично записанной записи WAL (Виньеш С) §
Если сервер завершился аварийно после записи первой части записи WAL, которая охватывала бы несколько страниц, последующая логическая декодировка потока WAL ожидала бы поступления данных на следующую страницу WAL. Это могло бы никогда не произойти, если сервер теперь бездействует.
Исправлено несоответствие в кавычках имен ролей в строках ACL (Том Лейн) §
Предыдущее правило экранирования зависело от локали, что могло привести к проблемам с переносимостью при передаче значений
aclitemмежду установками. (pg_dump этого не делает, но другие инструменты могут.) Чтобы обеспечить согласованность, всегда экранируйте не-ASCII символы в выводеaclitem; но для сохранения обратной совместимости, никогда не требуйте их экранирования при вводеaclitem.Отклонены знаки равенства (
=) в именах опций отношений и опций внешних данных (Том Лейн) §Нет очевидного случая использования для таких имен опций, и их разрешение создает двусмысленность в сохраненном представлении.
Исправлена потенциально некорректная декомпрессия архивных данных, сжатых с помощью LZ4 (Михаил Грибков) §
Эта ошибка, кажется, проявлялась только с данными, которые не очень хорошо сжимаются, что может объяснить, почему она ускользнула от обнаружения.
Избегалась редкая ситуация, когда сканирование индекса btree могло пометить неправильные записи индекса как удаленные (Питер Геогеган) §
Избегалось повторное распространение сообщений об аннулировании кэша из других транзакций во время логической репликации (vignesh C) §
Наш предыдущий раунд минорных выпусков включал исправление ошибки, чтобы гарантировать, что процессы приемника репликации будут отвечать на сообщения об аннулировании кэша между процессами, предотвращая использование устаревших данных каталога при выполнении обновлений репликации. Однако исправление непреднамеренно заставило их также повторно распространять эти сообщения, что привело к экспоненциальному увеличению количества сообщений об аннулировании, что часто заканчивалось сбоем выделения памяти. Исправлено путем отказа от повторного распространения полученных сообщений.
Избегалось преждевременное удаление старого WAL во время контрольных точек (Виталий Давыдов) §
Если точка перезапуска слота репликации была продвинута, пока контрольная точка выполнялась, больше не нужные сегменты WAL могли быть удалены слишком рано, что приводило к сбою восстановления, если база данных аварийно завершалась сразу после этого. Исправлено путем сохранения их на один дополнительный цикл контрольной точки.
Никогда не перемещалась позиция подтвержденной записи репликационного слота назад (Швета Малик) §
В некоторых случаях клиент репликации мог подтвердить LSN, который превышал то, что было сохранено постоянно, а затем, возможно, отправить более старый LSN после перезапуска. Мы считаем это не ошибкой, если клиенту не нужно было ничего делать с WAL между двумя точками. Однако, не следует повторно отправлять этот WAL из-за опасения дублирования данных, поэтому убедитесь, что всегда учитывается последний подтвержденный LSN для данного слота.
Разрешено прерывание ожидания транзакции на резервном сервере (Кевин К. Биджу) §
Создание слота репликации на резервном сервере может потребовать ожидания завершения некоторых активных транзакций на основном сервере и их последующего воспроизведения на резервном. Поскольку это ожидание может быть неопределенным, желательно, чтобы операция могла быть отменена, но в цикле не было проверки на отмену запроса.
Исправлена утечка памяти на уровне отдельной таблицы в autovacuum (Том Лейн) §
Исправлены некоторые места, которые могли пытаться извлечь toasted поля системных каталогов без какого-либо снимка (Натан Боссарт) §
Это могло привести к сбою утверждения или ошибке “невозможно получить данные toast без активного снимка”.
Избежано сбоя утверждения при обновлениях ограничений между таблицами (Том Лейн, Джиан Хе) § §
Удалено ошибочное утверждение, что тег команды должен был быть определён к концу
PortalRunMulti()(Альваро Эррера) §Это не удалось в крайних случаях, таких как пустое подготовленное выражение.
Исправлена ошибка утверждения при разборе
XMLTABLE(Ричард Гуо) §Восстановлена возможность выполнения выражений PL/pgSQL в параллельном режиме (Dipesh Dhameliya) §
Понятие PL/pgSQL об “выражении” очень широкое, охватывающее любой SQL-запрос
SELECT, который возвращает один столбец и не более одной строки. Таким образом, существуют случаи, например, оценка агрегатной функции, когда запрос включает значительную работу, и было бы полезно выполнить его с параллельными рабочими. Это было возможно, но предыдущая исправленная ошибка непреднамеренно отключила это.Исправлены утечки ресурсов в крайних случаях в отчетах об ошибках PL/Python (Том Лейн) § §
Отказ из-за нехватки памяти при сообщении об ошибке из Python мог привести к сбою при сбросе счетчиков ссылок на объекты Python, что приводило к утечке памяти на протяжении сессии.
Исправлена функция libpq
PQport(), чтобы она никогда не возвращала NULL, если только переданное соединение не является NULL (Даниэле Вараззо) §Это задокументированное поведение, но в последних версиях libpq возвращалось NULL в некоторых случаях, когда пользователь не предоставлял спецификацию порта. Возвращено наше историческое поведение возврата пустой строки в таких случаях. (v18 и более поздние версии будут возвращать встроенный по умолчанию номер порта, обычно
"5432", вместо этого.)Избегалась ошибка, когда аутентификация GSSAPI требовала пакетов больше чем 16кБ (Джейкоб Чемпион, Том Лейн) §
Более крупные пакеты аутентификации были необходимы для пользователей Active Directory, которые принадлежат многим группам AD. Это ограничение проявлялось в сбоях подключения с непонятными сообщениями об ошибках, обычно “ошибка установления контекста GSSAPI: процедуру необходимо вызвать снова для завершения ее функции: Неизвестная ошибка”.
Исправлены зависящие от времени сбои в передаче данных SSL и GSSAPI (Том Лейн) §
При использовании шифрования SSL или GSSAPI в неблокирующем режиме, libpq иногда завершался с ошибкой “Ошибка SSL: неверная длина” или “Вызов GSSAPI не смог повторно передать все данные, требующие повторной отправки”.
Избежано разыменования нулевого указателя при поиске соединения в приложениях ecpg (Александр Алексеев) §
Этот случай мог возникнуть только в том случае, если у приложения были некоторые соединения, которые были именованы, и некоторые, которые не были.
Улучшено автодополнение в psql для опций
COPYи\copy(Ацуши Торикоши) §Те же самые дополнения предлагались как для
COPY FROM, так и дляCOPY TO, хотя некоторые опции допустимы только для одного из этих случаев. Эти случаи были различены для предоставления более точных предложений.Избежано сбоя утверждения в pgbench, когда получено несколько сообщений синхронизации конвейера (Fujii Masao) §
Убедитесь, что pg_dump сохраняет комментарии к ограничениям домена в правильном порядке (Цзянь Хи) §
В некоторых случаях команда комментария могла появиться до создания ограничения.
Обеспечен стабильный порядок сортировки в pg_dump для всех типов объектов базы данных (Ноа Миш, Андреас Карлссон) § § §
pg_dump сортировал объекты по их логическим именам перед выполнением упорядочивания, основанного на зависимостях. Этот сортировка не учитывала полный уникальный ключ, идентифицирующий определенные типы объектов, такие как правила и ограничения, и, таким образом, могла производить различные порядки сортировки для логически идентичных баз данных. Это затрудняло сравнение баз данных путем сравнения вывода pg_dump, поэтому логика была улучшена для обеспечения стабильного порядка сортировки во всех случаях.
В pg_upgrade проверены несоответствующие унаследованные ограничения not-null (Али Акбар) § § § § § §
PostgreSQL версии до 18 позволяли унаследованному столбцу ограничение not-null быть удаленным. Однако это приводило к схеме, которая не могла быть восстановлена, что приводило к сбою в pg_upgrade. Такие случаи обнаруживались во время предварительных проверок pg_upgrade, чтобы пользователи могли их исправить до начала обновления.
Избежано сбоя утверждения, если
track_commit_timestampвключен во время initdb (Хаято Курода, Энди Фан) §Исправлено pg_waldump для отображения информации о удалённой статистике в записях WAL
PREPARE TRANSACTION(Даниил Давыдов) §Избегалась возможная утечка открытого соединения во время установления соединения
contrib/dblink(Том Лейн) §В редком случае, когда возникала нехватка памяти при вставке нового объекта соединения в хеш-таблицу dblink, открытое соединение утекало бы до конца сессии, оставляя неактивную сессию на удаленном сервере.
Сделан
contrib/pg_prewarmсовместимым с очень большими настройкамиshared_buffers(Дарья Шанина) §Автоподогрев завершился с ошибкой выделения памяти, если
shared_buffersбыл больше примерно 50 миллионов буферов (400 ГБ).В
contrib/pg_stat_statementsизбегали оставления пробелов в наборе номеров параметров, используемых в нормализованном запросе (Сами Имсейх) §Исправлена утечка памяти в методах DirectModify
contrib/postgres_fdw(Том Лейн) §PGresult, содержащий результаты удаленной команды изменения, мог бы утекать на оставшуюся часть сессии, если запрос завершился неудачей между вызовами методов DirectModify, что могло произойти, когда есть данныеRETURNINGдля обработки.Убедитесь, что каталоги, перечисленные в configure в параметрах
--with-includesи--with-libraries, были проверены перед системными каталогами (Том Лейн) §Общей причиной использования этих опций является разрешение пользовательской версии некоторой библиотеки переопределять версию, предоставленную системой. Однако это не удалось в некоторых средах из-за небрежного порядка переключателей в командах, выдаваемых makefiles.
Наш код был адаптирован для портирования на GNU Hurd (Майкл Банк, Кристоф Берг, Самуэль Тибо) §
Исправлены предположения о
IOV_MAXиO_RDONLY, которые не выполняются на Hurd.Приведение использования
memset_s()в строгое соответствие со стандартом C11 (Том Лейн) §Это позволяет избежать ошибок компиляции на некоторых платформах.
Предотвращены предупреждения компилятора о неинициализированных значениях в коде сравнения JSONB (Том Лейн) §
Избегались предупреждения об устаревании при сборке с libxml2 2.14 и позже (Michael Paquier) §
Избегались проблемы при компиляции
pg_locale.hпод C++ (Джон Нейлор) §PostgreSQL заголовочные файлы обычно необходимо оборачивать в
extern "C" { ... }для включения в расширения, написанные на C++. Это не удалось дляpg_locale.hиз-за использования заголовков libicu, но это можно обойти, подавляя объявления, специфичные для C++, в этих заголовках. C++ расширения, которые хотят использовать C++ API libicu, могут сделать это, включая заголовки libicu передpg_locale.h.