E.6. Выпуск 18.1#
E.6. Выпуск 18.1 #
Дата выпуска: 2025-11-13
В данный выпуск вошли различные исправления по сравнению с версией 18.0. Сведения о нововведениях мажорного выпуска 18 приведены в Раздел E.7.
E.6.1. Миграция на версию 18.1 #
При использовании версии 18.X выгрузка и восстановление базы данных не требуются.
E.6.2. Изменения #
Контроль наличия прав
CREATEна схему при выполнении командыCREATE STATISTICS(Йелте Феннема-Нио) §Ранее отсутствие такой проверки позволяло владельцам таблиц создавать объекты статистики в любой схеме, что могло приводить к неожиданным конфликтам имён.
Проект Tantor SE признателен Йелте Феннема-Нио за сообщение об этой проблеме. (CVE-2025-12817)
Предотвращение целочисленного переполнения при расчёте размеров выделяемой памяти в libpq (Джейкоб Чемпион) §
Ранее при вычислении объёма памяти, подлежащего выделению, отдельные функции libpq не учитывали все необходимые условия. При передаче значительных объёмов входных данных это могло приводить к целочисленному переполнению, в результате чего выделялся буфер недостаточного размера и запись выполнялась за его пределы.
Проект Tantor SE признателен Алексею Соловьёву из Positive Technologies за сообщение об этой проблеме. (CVE-2025-12818)
Предотвращение ошибок “unrecognized node type” при обработке выражений
COLLATEв предложенииDEFAULTв рамках функций SQL/JSON, таких какJSON_VALUE(Цзянь Хи) § §Исключение некорректных оптимизаций предложений
HAVING, не содержащих переменных, при использовании наборов группирования (Ричард Гуо) § §Исключение параллелизма в правых полу-соединениях по хешу (Ричард Гуо) §
Такой вариант работы был ненадёжным из-за состояния гонки при обновлении общей хеш-таблицы соединения.
Исключение деления на ноль при формировании планов с упорядоченным добавлением (Ричард Гуо) §
Эта ошибка могла приводить к некорректному выбору наиболее дешёвого пути либо к сбою проверки утверждений в отладочных сборках.
Корректировка работы планировщика для типов индексов с упорядоченным доступом без поддержки сканирования только по индексу (Максим Схуманс) §
Указанное поведение могло приводить к ошибкам с сообщением “нет данных, возвращённых при сканировании только по индексу”. При работе со встроенными типами индексов такие ситуации не возникали, тогда как в ряде расширений они могли наблюдаться.
Исключение некорректной проверки assert в процессе очистки индексов btree (Питер Геогеган) §
Исключение ошибок, связанных с нехваткой памяти и сообщением “некорректный размер запроса на выделение памяти”, при параллельной сборке GIN-индекса (Томаш Вондра) §
Обеспечение предоставления снимка для выражений индекса при автоматическом суммировании BRIN (Альваро Эррера) § §
Ранее автоматическое суммирование для таких индексов не выполнялось, вследствие чего сохранялись заполнительные кортежи, что со временем приводило к разрастанию индекса.
Исключение целочисленного переполнения при сканировании BRIN-индексов для таблиц с количеством страниц, близким к 232 (Сунил С) §
Такое поведение могло приводить к зацикливанию процесса сканирования либо к обработке избыточного числа страниц таблицы.
Корректная обработка нулевого расширения сохранённых значений в JIT-сгенерированном коде деформации кортежей (Дэвид Роули) §
При выполнении аналогичного кода без использования JIT применялось знаковое расширение вместо нулевого, что приводило к различиям в представлении значений Datum для целочисленных типов малого размера. В большинстве случаев это несоответствие не проявлялось, однако в отдельных ситуациях могло вызывать ошибки с сообщением “не удалось найти запись в таблице мемоизации” при использовании узлов планирования Memoize, а также приводить к другим побочным эффектам.
Устранение редких сбоев при обработке хешированных запросов с использованием
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(Фудзии Масао) §В случаях, когда LSN реплея резервного сервера переставал продвигаться, значения в столбцах
write_lagиflush_lagмогли переставать обновляться.Исключение дублирования сообщений в журнале при недопустимых настройках параметра
primary_slot_name(Фудзии Масао) §Предотвращение сбоев при указании несуществующих слотов репликации в параметре
synchronized_standby_slots(Шлок Кьял) §Корректная обработка временных файлов состояния репликационного слота при ошибках записи на диск (Микаэль Пакье) §
При возникновении ошибок, например нехватки дискового пространства, временный файл состояния
state.tmpмог сохраняться. Это препятствовало выполнению последующих операций записи состояния и требовало ручной очистки.Корректная обработка сигналов тайм-аута блокировки в параллельных рабочих процессах применения логической репликации (Хайато Курода) §
Ранее один и тот же номер сигнала использовался как для завершения работы воркера, так и для обработки тайм-аута блокировки, что приводило к неоднозначному поведению.
Корректная работа получателя WAL при переключении с потокового источника на архивный (Сюнэн Чжоу) §
При смене временной шкалы получатель WAL на резервном сервере должен оставаться активным в ожидании новой точки начала потоковой передачи WAL. Ранее он мог неоднократно завершать работу и сразу перезапускаться, что вводило в заблуждение механизмы мониторинга состояния.
Исключение ошибки
use-after-freeв кеше синхронизации отношений плагина логического декодирования pgoutput (Вигнеш С, Масаихико Савада) §Исправлена ошибка, из-за которой сбой при логическом декодировании мог приводить к сбоям при последующих попытках логического декодирования в той же сессии. Данная ситуация возможна только при вызове pgoutput через SQL-функции.
Исключение ненужного аннулирования слотов логической репликации (Бертран Друво) §
Восстановление особого случая для сортировки
Cпри настройке локали (Джефф Дэвис) §Указанное изменение устраняет регрессию в доступе к общим каталогам на раннем этапе запуска серверного процесса, до выбора базы данных. Для основного кода Tantor SE данная ситуация не являлась проблемой, однако могла приводить к некорректной работе отдельных расширений.
Исключение сбоев при тестировании Tantor SE с использованием отдельных опций
libsanitizer(Эммануэль Сиби, Джейкоб Чемпион) §Корректная обработка использования
GROUP BY DISTINCTв операторах присваивания PL/pgSQL (Том Лейн) §Ранее парсер не распознавал применение опции
DISTINCTв данном контексте, поэтому команда выполнялась так, как если бы использовался обычныйGROUP BY.Исключение утечки памяти при обработке ошибок SQL в PL/Python (Том Лейн) §
Ранее при возникновении ошибок SQL могла наблюдаться утечка памяти на протяжении сессии, появившаяся в предыдущих корректирующих выпусках.
Корректное сохранение неунаследованных ограничений NOT NULL для столбцов унаследованных таблиц (Дилип Кумар) §
При выгрузке с серверов версий до v18 утилита pg_dump не сохраняла такие ограничения.
Единообразная сортировка внешних ключей в pg_dump (Альваро Эррера) §
Для внешних ключей обеспечивается согласованный порядок следования, аналогичный применяемому для других типов объектов базы данных.
Корректировка логики сжатия данных в утилитах pg_dump и pg_restore (Даниэль Густафссон, Том Лейн) § § §
В отдельных участках отсутствовала либо некорректно выполнялась проверка ошибок, а также выявлялись проблемы переносимости, проявляющиеся на системах с архитектурой
big-endian. Эти недостатки оставались незамеченными, поскольку соответствующий код используется исключительно для чтения сжатых TOC-файлов в дампах формата каталога. Утилита pg_dump не создаёт такие дампы; подобная ситуация возможна только при ручном сжатии TOC-файла после создания дампа, что поддерживается, но встречается крайне редко.Корректное завершение утилиты pgbench с ошибкой при выполнении операции
COPY(Антонин Боннефой) §Утилита pgbench не предназначена для обработки данного сценария. Ранее его возникновение могло приводить к зацикливанию выполнения.
Корректная обработка сообщений об ошибках в pgbench при повторных сбоях (Юго Нагата) §
При последовательном завершении с ошибкой двух вызовов
PQgetResultpgbench мог формировать некорректное диагностическое сообщение.Корректная проверка утверждений об ошибках в конвейерном режиме в pgbench (Юго Нагата) §
Устранение утечки памяти при работе с файлами в pg_combinebackup (Том Лейн) §
Обеспечение возможности отмены выполнения функций расширения
contrib/pg_buffercache(Сатьянараяна Нарлапурам, Юйхан Цю) § §Ранее отдельные участки кода могли выполняться продолжительное время без проверки запросов на прерывание.
Корректировка проверок привилегий при предварительной загрузке индексов в расширении
contrib/pg_prewarm(Аюш Ватса, Натан Боссарт) § §Ранее функция
pg_prewarm()требовала наличия привилегииSELECTна отношение для выполнения предварительной загрузки. Поскольку индексы не имеют собственных SQL-привилегий, это приводило к тому, что несуперпользователи не могли выполнять предварительную загрузку индексов. В актуальной логике проверка привилегииSELECTвыполняется для таблицы, к которой относится индекс.Исключение аварийного завершения работы расширения
contrib/pg_stat_statementsпри совпадении позиций нескольких констант в тексте SQL-запроса (Сами Имсейх, Дмитрий Долгов) §Повышение устойчивости расширения
contrib/pgstattupleпри обработке пустых и недопустимых страниц индекса (Нитин Мотиани) §Страницы, полностью заполненные нулями, рассматриваются как свободное пространство, а страницы, признанные недопустимыми при проверке размера специальной области, исключаются из обработки. Для btree-индексов такая логика применялась ранее, тогда как для индексов типов hash и gist подобные ситуации приводили к ошибкам. Во всех случаях реализовано игнорирование повреждённых страниц вместо генерации ошибок.
Ужесточение макросов барьеров чтения и записи для соответствия требованиям компилятора Clang (Томас Манро) §
Использование
__atomic_thread_fence()рассматривалось как достаточный барьер для предотвращения переупорядочивания обращений к памяти компилятором C, однако для Clang этого оказалось недостаточно. В ряде архитектур, включая RISC-V, MIPS и LoongArch, такое поведение могло приводить к генерации некорректного кода. Для устранения проблемы применены явные барьеры компилятора.Расширение инфраструктуры сборки PGXS для поддержки сборки NLS
poфайлов для расширений (Рё Мацумура) §