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

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

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

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

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

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

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

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

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

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

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

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

  • Предотвращение ошибок «unrecognized node type» (нераспознанный тип узла), возникавших при наличии предложения DEFAULT с выражением COLLATE в функции SQL/JSON, например JSON_VALUE (Цзянь Хи) § §

  • Недопущение некорректных оптимизаций предложений HAVING без переменных при применении наборов группирования (Ричард Гуо) § §

  • Избегание параллелизма в правых неполных соединениях по хешу (Ричард Гуо) §

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

  • Устранение возможности деления на ноль при создании упорядоченных планов Append (Ричард Гуо) §

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

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

    В результате этого сбоя возникали ошибки типа «no data returned for index-only scan» (нет данных для сканирования только индекса). Проблема не возникала со встроенными типами индексов, но она коснулась некоторых расширений.

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

  • Предупреждение возможных сбоев из-за нехватки памяти или «invalid memory alloc request size» (недопустимый запрошенный размер памяти) при параллельном построении индексов GIN (Томаш Вондра) §

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

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

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

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

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

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

  • Устранение редкого случая сбоя при обработке хешированных запросов с GROUPING SETS (Дэвид Роули) §

  • Исправление неправильной логики выбора размера хеш-таблиц в соединениях по хешу (Томаш Вондра)

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

  • Улучшение логики поиска с помощью функций управления статистикой для отношений (Натан Боссарт) § §

    Теперь функции pg_restore_relation_stats(), pg_clear_relation_stats(), pg_restore_attribute_stats() и pg_clear_attribute_stats() проверяют права до получения блокировки целевого отношения, а не после.

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

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

  • Устранение сбоя при перепроверках EvalPlanQual для секционированных таблиц (Дэвид Роули, Амит Ланготе) §

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

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

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

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

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

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

  • Запрет на использование генерируемых столбцов в предложениях COPY ... FROM ... WHERE (Питер Эйзентраут, Цзянь Хи) §

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

  • Недопущение столбца идентификации с ограничением NOT NULL, помеченным как нерабочее (Цзянь Хи) §

    Столбцы идентификации должны быть NOT NULL, но проверка пропускала этот особый случай.

  • Предотвращение потенциального использования освобождённой памяти при параллельной очистке (Кевин Омен Аниш)

    Такое поведение не наблюдалось в стандартных сборках, но теоретически представляло опасность.

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

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

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

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

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

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

  • Устранение сбоев при указании в synchronized_standby_slots несуществующих слотов репликации (Шлок Кьял) §

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

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

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

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

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

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

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

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

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

  • Возвращение исключения в правило сортировки C при установке локали (Джефф Девис) §

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

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

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

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

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

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

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

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

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

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

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

  • Исправление выгрузки ненаследуемых ограничений NOT NULL, установленных для наследуемых столбцов таблицы (Дилип Кумар) §

    Утилита pg_dump не сохраняла такие ограничения при выгрузке с сервера до версии 18.

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

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

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

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

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

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

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

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

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

  • Устранение утечки памяти в pg_combinebackup при обработке отдельных файлов(Том Лейн) §

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

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

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

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

  • Устранение сбоя contrib/pg_stat_statements, когда две или более константы помечались как занимающие одну и ту же позицию в тексте оператора SQL (Сами Имсейх, Дмитрий Долгов) §

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

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

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

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

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