E.1. Выпуск 16.11 #

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

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

E.1.1. Миграция на версию 16.11 #

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

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

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

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

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

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

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

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

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

  • Корректная обработка выражений-конструкторов JSON, таких как JSON_OBJECT(), как нестрогих (Тендер Ван, Ричард Гуо) §

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

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

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

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

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

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

  • Предотвращение редких случаев использования освобождённой памяти при развёртывании секционированных таблиц планировщиком (Бернд Райс) §

    Риск возникал, только когда удалялась последняя секция.

  • Удаление ошибочного проверочного утверждения при очистке индексов btree (Питер Гейган) §

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

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

  • Обеспечение возможности отменять сканирования индексов GIN (Том Лейн) §

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

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

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

  • Устранение угрозы целочисленного переполнения при сканировании индексов BRIN, если количество страниц в таблице приближается к 232 (Сунил С) §

    Эта ошибка могла привести к бесконечному циклу сканирования или сканированию ненужных страниц таблицы.

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

    Когда JIT-обработка не использовалась, корректно применялось расширение знака, что приводило к разному представлению небольших целочисленных типов данных. В большинстве случаев это несоответствие не проявлялось, но при использовании узлов плана Memoize фиксировались ошибки «could not find memoization table entry» (не удалось найти записи в таблице с мемоизацией). Были возможны и другие проявления.

  • Исправление неправильной логики кеширования информации о результирующем отношении для триггеров (Дэвид Роули, Амит Ланготе) §

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

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

    Раньше при параллельных изменениях могло не перепроверяться условие для ctid. Из-за этого поведение запроса могло меняться в зависимости от выбранного типа плана.

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

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

  • Пропуск копирования ограничений при выполнении DETACH CONCURRENTLY для секционирования по хешу (Хайян Ли) §

    Раньше в рамках 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() (Антуан Виолин, Том Лейн) § §

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

  • Устранение утечки памяти в подпланах с хешированием (Хайян Ли) §

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

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

  • Устранение повреждения таблицы общей статистики после сбоев из-за нехватки памяти (Михаил Кот) §

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

  • Устранение проблемы параллельных изменений при выполнении команды MERGE (Юго Нагата)

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

  • Добавление недостающих проверок идентификации реплики в командах MERGE и INSERT ... ON CONFLICT DO UPDATE (Чжицзе Хоу) § § §

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

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

  • Исправление вывода информации о задержке репликации в представлении pg_stat_replication (Фудзии Масао) §

    Если при воспроизведении WAL на любом резервном сервере LSN переставал увеличиваться, обновление столбцов write_lag и flush_lag прекращалось.

  • Устранение дублирования сообщений о некорректных значениях параметра primary_slot_name в журнале (Фудзии Масао) §

  • Удаление незаконченного файла состояния слота после сбоя записи состояния слота репликации на диск (Микаэль Пакье) §

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

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

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

  • Предотвращение нежелательного выключения приёмника WAL при переключении с потоковой передачи на архивацию источника WAL (Сюнэн Чжоу) §

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

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

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

  • Исправлена проблема использования освобождённой памяти при кешировании информации о синхронизации отношений модулем логического декодирования pgoutput (Вигнеш Си, Масахико Савада) §

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

  • Предотвращение ненужного аннулирования слотов логической репликации (Бертран Друво) §

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

  • Исправление ошибочного вывода сообщений об ошибках при проверке наличия у пользователя прав администратора Windows (Брайан Грин) §

    Сообщение об ошибке или не выводилось совсем, или содержало мусор. Жалоб на эту проблему не поступало, что указывает на то, что ошибка этих системных вызовов происходила крайне редко.

  • Устранение сбоя при запуске на платформах macOS и BSD, вызванного коллизией с существующим набором семафоров (Том Лейн) §

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

  • Устранение сбоя при попытке протестировать PostgreSQL, используя некоторые параметры libsanitizer (Эммануэль Сиби, Джейкоб Чемпион) §

  • Устранение ложных предупреждений при проверке контекстов памяти в отладочных сборках 64-битной Windows (Дэвид Роули) §

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

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

  • Устранение утечки памяти при обработке ошибки SQL в PL/Python (Том Лейн)

    Устранена утечка памяти в течение всего сеанса, появившаяся в предыдущих корректирующих выпусках.

  • Исправление вывода символов с установленным старшим битом для трассировки в libpq (Ран Бенита) §

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

  • Исправление поведения libpq в отношении обработки ошибок в Windows, связанных с сокетами, в логике GSSAPI (Нин У, Том Лейн) §

    Код для шифрования/дешифрования передаваемых данных при использовании GSSAPI не распознавал условия ошибок в сокете соединения, поскольку Windows сообщает о таких ошибках не так, как другие ОС. Это приводило к невозможности установить такие соединения в Windows.

  • Реализация выгрузки меток безопасности для подписок и триггеров событий в pg_dump (Цзянь Хи, Фудзии Масао) §

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

  • Исправление сортировки списков прав по умолчанию и ограничений внешних ключей утилитой pg_dump (Кирилл Решке, Альваро Эррера) § § §

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

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

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

  • Пропуск создания комментариев и меток безопасности для публикаций и подписок, которые не восстанавливаются в данный момент, в pg_restore (Цзянь Хи, Фудзии Масао) § §

    Теперь, если используются флаги --no-publications или --no-subscriptions, команды COMMENT и SECURITY LABEL для публикаций и подписок выполняться не будут.

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

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

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

    Изначально не планировалось, что pgbench будет поддерживать такое поведение, но без него происходило зацикливание.

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

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

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

  • Обеспечение возможности отменить функции contrib/pg_buffercache (Сатьянараяна Нарлапурам, Юйхан Цю) §

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

  • Исправление проверки прав contrib/pg_prewarm для индексов (Аюш Ватса, Натан Боссарт) § §

    pg_prewarm() проверяет наличие права SELECT для отношений, которые необходимо разогреть. Однако, поскольку для индексов нет отдельных прав SQL, разогреть их могли только суперпользователи. Теперь будет проверяться право SELECT для таблицы индекса.

  • Повышение устойчивости contrib/pgstattuple при обработке пустых или нерабочих страниц индекса (Нитин Мотиани) §

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

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

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

  • Исправление сборки с LLVM версии 21 и новее (Холгер Хофштеттер) §

  • Применение тех же специальных флагов оптимизации для файлов numeric.c и checksum.c при сборке с использованием Meson, что и при сборке с использованием Makefile (Натан Боссарт, Джефф Девис) § §

    Теперь используется флаг -ftree-vectorize для обоих файлов, а также флаг -funroll-loops для файла checksum.c так же, как при сборке с Makefile.

  • Исправлена инфраструктура сборки PGXS, чтобы поддержать сборку файлов po для расширений с помощью NLS (Рё Мацумура) §