E.24. Выпуск 15.15#

E.24. Выпуск 15.15

E.24. Выпуск 15.15

Дата выпуска:  2025-11-13

В этот выпуск были включены различные исправления по сравнению с 15.14. Информация о новых возможностях в основном выпуске 15 была приведена в Раздел E.39.

E.24.1. Миграция на версию 15.15

Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.

Однако, если обновление выполнялось с версии ранее 15.14, см. Раздел E.25.

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

  • Права CREATE на схему были проверены в CREATE STATISTICS (Йелте Феннема-Нио) §

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

    Проект PostgreSQL признателен Йелте Феннема-Нио за сообщение об этой проблеме. (CVE-2025-12817)

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

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

    Проект PostgreSQL признателен Алексею Соловьёву из Positive Technologies за сообщение об этой проблеме. (CVE-2025-12818)

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

    Предыдущее исправление для преобразования выражений сопоставления с образцом SIMILAR TO в регулярные выражения в стиле POSIX нарушило необычный случай, который ранее работал: если после открывающей скобки сразу следует экранирующий символ, а затем сразу после escape-последовательности идет закрывающая скобка (например, [\w]), то закрывающая скобка больше не воспринималась как завершающая класс символов.

  • Была исправлена обработка агрегатных функций, аргументы которых содержали подзапрос с ссылкой FROM на CTE вне агрегатной функции (Том Лэйн) §

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

  • Исправлены ошибки no relation entry for relid в крайних случаях при оценке стоимости SubPlan (Ричард Го) §

  • Было предотвращено маловероятное использование уже освобождённой памяти (use-after-free) при расширении секционированных таблиц планировщиком (Bernd Reiß) §

    Опасность возникала только когда последний живой раздел был одновременно удалён.

  • Была удалена ошибочная проверка assert при очистке btree-индекса (Питер Геогеган) §

  • Была исправлена возможная бесконечная петля в сканированиях индекса GIN с несколькими условиями сканирования (Том Лэйн) §

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

  • Было обеспечено, чтобы сканирования индексов GIN могли быть отменены (Том Лэйн) §

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

  • Было обеспечено, чтобы автоматическое суммирование BRIN предоставляло снимок для выражений индекса, которым он необходим (Альваро Эррера) § §

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

  • Была исправлена опасность переполнения целого числа при сканировании BRIN-индексов, когда таблица содержала около 232 страниц (Sunil S) §

    Такое поведение могло приводить к зацикливанию процесса сканирования либо к обработке избыточного числа страниц таблицы.

  • Исправлено некорректное нулевое расширение сохранённых значений в JIT-сгенерированном коде деформирования кортежей (Дэвид Роули) §

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

  • Корректировка логики кэширования информации о результирующих отношениях при работе триггеров (David Rowley, Amit Langote) §

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

  • Были добавлены отсутствующие повторные проверки EvalPlanQual для плановых узлов TID Scan и TID Range Scan (Софи Алперт, Дэвид Роули) § §

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

  • Была исправлена обработка EvalPlanQual для внешних или пользовательских соединений, для которых не был подготовлен альтернативный локальный план соединения для EPQ (Масахико Савада, Эцуро Фуджита) §

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

  • Было избегнуто дублирование ограничений хеш-разделов во время DETACH CONCURRENTLY (Haiyang Li) §

    Ранее команда ALTER TABLE DETACH PARTITION CONCURRENTLY добавляла копию ограничения секционирования к уже отсоединённому разделу. Такое поведение являлось некорректным, поскольку обычный (неконкурентный) DETACH не создаёт подобных ограничений, а при хеш-секционировании выражение ограничения содержит ссылки на OID родительской таблицы. Это могло приводить к проблемам при выполнении операций дампа и восстановления, а также в случаях удаления родительской таблицы после DETACH. Начиная с версии 19 такие ограничения больше не создаются. В поддерживаемых ветках, для снижения риска побочных эффектов, добавление копии ограничения пропускается только для хеш-секционирования.

  • Запрещено использование сгенерированных столбцов в ключах секционирования (Цзянь Хи, Ашутош Бапат) §

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

  • Было запрещено использование сгенерированных столбцов в предложениях COPY ... FROM ... WHERE (Питер Айзенштраут, Джиан Хе) §

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

  • Была исправлена проверка видимости для статистических объектов в pg_temp (Ноа Миш) §

    Статистические объекты, размещённые во временной схеме, требуют явного указания схемы в имени. Однако функция pg_statistics_obj_is_visible() не учитывала это обстоятельство и могла возвращать значение true независимо от фактической видимости. В результате функции, такие как pg_describe_object(), не всегда добавляли имя схемы к имени объекта, как предполагалось.

  • Исправлена отчетность pg_event_trigger_dropped_objects() о временном статусе объектов (Antoine Violin, Том Лейн) § §

    Если значение по умолчанию удалённого столбца, триггер или политика RLS принадлежали временной таблице, это сообщалось с is_temporary true.

  • Была исправлена утечка памяти в хешированных под-планах (Haiyang Li) §

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

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

  • Была исправлена порча общей таблицы статистики после сбоев из-за нехватки памяти (Mikhail Kot) §

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

  • Проблема одновременного обновления в MERGE была исправлена (Юго Нагата) §

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

  • Были добавлены отсутствующие проверки идентичности реплики в MERGE и INSERT ... ON CONFLICT DO UPDATE (Zhijie Hou) § § §

    Если MERGE мог требовать действий обновления или удаления, и целевая таблица публиковала обновления или удаления, настаивалось на наличии определённого REPLICA IDENTITY. Отсутствие этого требования могло бы незаметно нарушить репликацию. Аналогично, INSERT с опцией UPDATE должен был требовать REPLICA IDENTITY, если целевая таблица публиковала либо вставки, либо обновления.

  • Была предотвращена взаимоблокировка во время DROP SUBSCRIPTION, когда публикация находилась на том же сервере, что и подписчик (Дилип Кумар) §

  • Было исправлено некорректное отображение задержки репликации в представлении pg_stat_replication (Fujii Masao) §

    В случаях, когда LSN реплея резервного сервера переставал продвигаться, значения в столбцах write_lag и flush_lag могли переставать обновляться.

  • Были устранены дублирующиеся сообщения журнала о недопустимых настройках primary_slot_name (Fujii Masao) §

  • Незавершённый файл состояния слота был удалён после неудачной попытки записи состояния слота репликации на диск (Michael Paquier) §

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

  • Было предотвращено нежелательное завершение работы получателя WAL при переключении с потокового источника WAL на архивный (Xuneng Zhou) §

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

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

    Эта маловероятная проблема проявлялась как временные ошибки, такие как unexpected duplicate for tablespace X, relfilenode Y. contrib/autoprewarm также подвергался влиянию. Побочным эффектом исправления стало то, что SQL-функция pg_filenode_relation() теперь будет игнорировать временные таблицы.

  • Была исправлена проблема использования после освобождения памяти (use-after-free) в кеше синхронизации отношений, который поддерживался логическим декодирующим плагином pgoutput (Вигнеш С, Масаихико Савада) §

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

  • Было предотвращено возникновение ошибки утверждения при попытке освободить слот репликации в однопользовательском режиме (Хайато Курода) §

  • Корректно была обработана конструкция GROUP BY DISTINCT в операторах присваивания PL/pgSQL (Том Лэйн) §

    Ранее парсер не распознавал применение опции DISTINCT в данном контексте, поэтому команда выполнялась так, как если бы использовался обычный GROUP BY.

  • Избегание утечки памяти при обработке ошибки SQL внутри PL/Python (Том Лэйн) §

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

  • Была исправлена трассировка символов с установленным старшим битом в libpq (Ran Benita) §

    На платформах, где char считался знаковым, вывод включал неэстетичное оформление \xffffff.

  • В pg_dump были выгружены метки безопасности для подписок и событийных триггеров (Цзянь Хи, Fujii Masao) §

    Метки на этих типах объектов ранее были пропущены.

  • Исправление сортировки pg_dump для стандартных ACL (список управления доступом) и ограничений внешнего ключа (Kirill Reshke, Álvaro Herrera) § § §

    Было обеспечено единообразное упорядочивание этих типов объектов базы данных, как уже было сделано для других типов объектов.

  • В pg_dump комментарии для отдельно выгруженных ограничений домена были помечены с правильной зависимостью (Ной Миш) §

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

  • В pg_restore были пропущены комментарии и метки безопасности для публикаций и подписок, которые не восстанавливались (Цзянь Хи, Fujii Masao) § §

    Не следует вводить команды COMMENT или SECURITY LABEL для этих объектов, когда указаны --no-publications или --no-subscriptions.

  • Исправление различных ошибок в логике сжатия данных в pg_dump и pg_restore (Daniel Gustafsson, Tom Lane) §

    В отдельных участках отсутствовала либо некорректно выполнялась проверка ошибок, а также выявлялись проблемы переносимости, проявляющиеся на системах с архитектурой big-endian. Эти недостатки оставались незамеченными, поскольку соответствующий код используется исключительно для чтения сжатых TOC-файлов в дампах формата каталога. Утилита pg_dump не создаёт такие дампы; подобная ситуация возможна только при ручном сжатии TOC-файла после создания дампа, что поддерживается, но встречается крайне редко.

  • pgbench был исправлен для корректного завершения с ошибкой, если была запущена операция COPY (Антонин Боннефой) §

    Утилита pgbench не предназначена для обработки данного сценария. Ранее его возникновение могло приводить к зацикливанию выполнения.

  • Было исправлено сообщение pgbench о нескольких ошибках (Юго Нагата) §

    При последовательном завершении с ошибкой двух вызовов PQgetResult pgbench мог формировать некорректное диагностическое сообщение.

  • В pgbench была исправлена некорректная проверка утверждения об ошибках в конвейерном режиме (Юго Нагата) §

  • Было обеспечено, чтобы функции contrib/pg_buffercache могли быть отменены (Satyanarayana Narlapuram, Yuhang Qiu) §

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

  • Исправлены проверки привилегий в contrib/pg_prewarm для индексов (Ayush Vatsa, Натан Боссарт) §

    Ранее функция pg_prewarm() требовала наличия привилегии SELECT на отношение для выполнения предварительной загрузки. Поскольку индексы не имеют собственных SQL-привилегий, это приводило к тому, что несуперпользователи не могли выполнять предварительную загрузку индексов. В актуальной логике проверка привилегии SELECT выполняется для таблицы, к которой относится индекс.

  • Сделано contrib/pgstattuple более устойчивым к пустым или недопустимым страницам индекса (Nitin Motiani) §

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

  • Ужесточены наши макросы барьеров чтения и записи для соответствия требованиям Clang (Томас Монро) §

    Использование __atomic_thread_fence() рассматривалось как достаточный барьер для предотвращения переупорядочивания обращений к памяти компилятором C, однако для Clang этого оказалось недостаточно. В ряде архитектур, включая RISC-V, MIPS и LoongArch, такое поведение могло приводить к генерации некорректного кода. Для устранения проблемы применены явные барьеры компилятора.

  • Была исправлена сборка с LLVM версии 21 и новее (Holger Hoffstätte) §

  • Была исправлена инфраструктура сборки PGXS для поддержки сборки NLS po файлов для расширений (Ryo Matsumura) §