E.2. Выпуск 17.5 #
Дата выпуска: 2025-05-08
В этот выпуск вошли различные исправления, внесённые после версии 17.4. За информацией о нововведениях версии 17 обратитесь к Разделу E.7.
E.2.1. Миграция на версию 17.5 #
Если используется версия 17.X, выгрузка/восстановление базы не требуется.
Однако если вы используете ограничения ссылающихся на себя внешних ключей в секционированных таблицах, может потребоваться пересоздать такие ограничения, чтобы удостовериться в их корректном применении. Обратитесь ко второму пункту в списке изменений ниже.
Кроме того, если вы используете фильтры Блума в индексах BRIN, после обновления рекомендуется выполнить переиндексацию. Обратитесь к третьему пункту в списке изменений ниже.
Если вы обновляете сервер с более ранней версии, чем 17.1, см. также Раздел E.6.
E.2.2. Изменения #
- Устранение выхода за границы буфера на один байт при проверке некорректно закодированных строк, которые якобы приведены в кодировке GB18030 (Ной Миш, Андрес Фройнд) § - Если неполный многобайтовый символ появлялся за пределами памяти, на сервере и в использующих libpq приложениях с невысокой вероятностью мог возникать сбой из-за ошибки сегментации SIGSEGV. (CVE-2025-4207) 
- Исправление обработки ссылающихся на себя внешних ключей в секционированных таблицах (Альваро Эррера) § - При создании или присоединении секций для ограничения внешнего ключа не создавались необходимые записи каталога, если это ограничение ссылалось на ту же секционированную таблицу. По этой причине ограничение не применялось в полной мере. - Чтобы устранить проблему, удалите и пересоздайте ссылающиеся на себя внешние ключи в секционированных таблицах, если секции были созданы или присоединены после создания ограничения. Обратите внимание, что строки, нарушающие ограничение, уже могут содержаться в таблицах, поэтому пересоздать ограничение в этом случае не получится и придётся исправить эти строки, чтобы попробовать устранить проблему ещё раз. 
- Предотвращение потери данных во время слияния сжатых сводок индекса BRIN при помощи функции - brin_bloom_union()(Томаш Вондра) §- В коде не учитывались результаты распаковки из-за их неидентичности входным данным. По этой причине некоторые данные не попадали в объединённую сводку, что приводило к потере строк при поиске по индексу. - Эта ошибка присутствовала ещё с PostgreSQL 14, где появилась возможность использовать фильтры Блума в индексах BRIN. Однако это место кода тогда практически не задействовалось. Теперь в PostgreSQL 17 вероятность натолкнуться на эту ошибку существенно возросла, поскольку код используется при параллельном построении индексов. 
- Устранение непредвиденных ошибок «attribute has wrong type» (атрибут имеет неверный тип) в запросах - UPDATE,- DELETEи- MERGE, при которых переменные «вся строка» таблицы ссылаются на представления или функции в предложении- FROM(Том Лейн) §
- Исправление слияния с секционированной таблицей при помощи команды - MERGEс действиями- DO NOTHING(Тендер Ван) §- В некоторых случаях возникала ошибка «unknown action in MERGE WHEN clause» (неизвестное действие в предложении MERGE WHEN). 
- Устранение сбоя команды - INSERT, который мог возникать, если у таблицы был столбец, определённый со свойством- GENERATED, с типом данных домена и ограничения домена запрещали значения- NULL(Цзянь Хи) §- Ошибка ограничения возникала даже при нормальных результатах генерирующего выражения. 
- Исправление обработки ссылок на имена внешних CTE внутри предложения - WITH, присоединённого к команде- INSERT/- UPDATE/- DELETE/- MERGE, которая сама находится внутри предложения- WITH(Том Лейн) §- Анализатор запросов не выявлял недопустимые случаи рекурсивных запросов и не учитывал такие ссылки при сортировке CTE в корректном порядке выполнения. 
- Исправление некорректной обработки приведений типов в ключах выражений конструкторов JSON (Амит Ланготе) § 
- Запрет параллельных вызовов функции - array_agg(), если типом её аргумента является анонимная запись (Ричард Гуо, Том Лейн) §- Протокол взаимодействия параллельных рабочих процессов не поддерживает определение конкретного типа записи, возвращаемой рабочим процессом. 
- Исправление вывода некорректных результатов конструкциями - ARRAY(и- подзапрос)- ARRAY[при передаче данных типа- выражение, ...]- int2vectorили- oidvector(Том Лейн) §- Это исправление восстанавливает поведение, которое демонстрировалось до версии PostgreSQL 9.5. Результат теперь снова выводится с типом - int2vector[]или- oidvector[].
- Исправление возможных некорректных выводов ошибок о недействительных аффиксах во время разбора словарей Ispell (Джейкоб Брейзил) § 
- Исправление команды - ALTER TABLE ADD COLUMNдля корректной обработки типа данных домена со значением по умолчанию (Цзянь Хи, Том Лейн, Тендер Ван) §- Если у доменного типа было значение по умолчанию, при добавлении столбца этого типа (без явного указания предложения - DEFAULT) значение домена по умолчанию к существующим строкам не применялось. Вместо этого в новом столбце подставлялось значение- NULL.
- Исправление некорректного поведения при дублировании имён столбцов в действии - ON DELETE SET DEFAULTили- SET NULLограничения внешнего ключа (Том Лейн) §
- Улучшение текста сообщения об ошибке, которое выводится при попытках недопустимого изменения свойств ограничения внешнего ключа (Альваро Эррера) § 
- Исправление ошибки, возникавшей при сбросе флага - relhassubclassвременной таблицы, для которой указано предложение- ON COMMIT DELETE ROWS(Ной Миш) §
- Добавление недостающего разбора аргумента - INDENTфункции- XMLSERIALIZE()(Джим Джонс) § §- Ранее представления или правила, использующие - XMLSERIALIZE(... INDENT), выгружались без предложения- INDENT, что приводило к некорректным результатам после восстановления.
- Предотвращение преждевременного вычисления аргументов агрегатной функции, которой одновременно переданы аргументы - FILTERи- ORDER BY(или- DISTINCT) (Дэвид Роули) §- При передаче - ORDER BYили- DISTINCTвозможна предварительная сортировка входных значений агрегатной функции вместо сортировки внутри узла- Aggплана. Однако это может быть проблемой, если на вход агрегатной функции передаются данные, которые могут привести к ошибке вычисления (например, операция деления с одним из делителей равным нулю), и указано предложение- FILTER, призванное исключить такие ошибки. Ранее при предварительной сортировке выражения вычислялись до выполнения- FILTER, и ошибки не исключались. Теперь предварительная сортировка не используется, если указано предложение- FILTERи входные данные сложнее, чем простые переменные или константы.
- Исправление ошибочных выводов об ограничениях столбцов - NOT NULLпри внешних соединениях (Ричард Гуо) §- В некоторых случаях планировщик отбрасывал условие запроса - IS NOT NULL, хотя оно применялось после внешнего соединения и поэтому не являлось избыточным.
- Недопущение некорректных оптимизаций на основе проверок - IS [NOT] NULL, применяющихся к составным значениям (Брюс Момджян) §
- Исправление ошибки планировщика при определении более одного хешируемого подвыражения - ScalarArrayOpExprвнутри выражения верхнего уровня (Давид Гайер) §- Это приводило к неэффективному выполнению дополнительных подвыражений, которые могли быть обработаны через хеш-таблицу (а именно предложений - IN,- NOT INили- = ANY, которым передавались только константы).
- Исправление некорректной оценки размера таблицы с низким фактором заполнения (Томаш Вондра) - Когда планировщик оценивал количество строк в таблице, которая ещё никогда не анализировалась, он учитывал значение фактора заполнения, но не гарантировал как минимум одну строку на страницу. Поэтому низкое значение фактора заполнения могло приводить к необоснованно низкой оценке. 
- Отключение оптимизации «пропуск выборки» в сканировании кучи по битовой карте (Маттиас ван де Меент) § - Оказалось, что из-за этой оптимизации могли возвращаться мёртвые кортежи, когда параллельные операции очистки помечали страницу как полностью видимую. 
- Устранение проблем производительности при запуске поиска по индексу GIN с большим числом поисковых ключей (Том Лейн, Винод Шридхаран) § § - Поиск по индексируемым предложениям с большим числом поисковых ключей (например, - jsonbcol ?| array[...]с десятками тысяч элементов массива) запускался через O(N2) времени. В течение этого временного промежутка его также нельзя было отменить.
- Выявление недостающих опорных процедур в классе операторов индекса BRIN и вывод ошибки вместо сбоя (Альваро Эррера) § 
- Реагирование на прерывания (например, отмену запроса) во время ожидания асинхронных подпланов узла плана - Append(Хейкки Линнакангас) §- Ранее ничего не происходило, пока один из подпланов не был готов. 
- Более частая передача статистики ввода-вывода от активных передатчиков WAL (Бертран Друво) § - Ранее для процесса-передатчика WAL в представлении - pg_stat_ioстатистика ввода-вывода отображалась только после его завершения. Теперь статистика обновляется максимум с секундной задержкой.
- Устранение условий гонки при обработке параметра конфигурации - synchronous_standby_namesсразу после запуска сервера (Максим Мельников, Микаэль Пакье)- В течение короткого промежутка времени после запуска системы обслуживающие процессы могли не дожидаться синхронного подтверждения транзакций, несмотря на установленный параметр - synchronous_standby_names.
- Исправление обработки возможных изменений параметра - io_combine_limitвнутри запроса (Томас Манро) §
- Устранение бесконечного цикла при значении INT_MAX для - scram_iterations(Кевин К. Биджу) §
- Предотвращение возможных сбоев из-за двойного преобразования подзапроса функции - json_array()(Том Лейн) §
- Устранение сбоя функции - pg_strtof()при передаче- NULLв- endptr(Александр Лахин, Том Лейн) §
- Устранение сбоя из-за нехватки памяти при установлении значений для некоторых GUC (Даниэль Густафссон) § 
- Устранение сбоя при нехватке памяти в стеммере Snowball (Максим Коротков) § 
- Исправление чрезмерного выделения памяти для структур - SpecialJoinInfoна этапе планирования запроса (Ричард Гуо) §- Это приводило к сбоям во время планирования запроса при включённой возможности соединения таблиц с учетом секционирования. 
- Запрет копирования аннулированных слотов репликации (Шлок Кьял) § - Это позволяет избежать проблем, когда аннулированный слот указывает на уже удалённый WAL. 
- Запрет восстановления слотов логической репликации на резервных серверах, не находящихся в режиме горячего резерва (Масахико Савада) § - Это позволяет предотвратить сценарий, при котором слот может оставаться действительным после повышения резервного сервера до ведущего даже при слишком низком значении параметра конфигурации - wal_level.
- Предотвращение слишком сильного продвижения значения - catalog_xminв «ускоренном» режиме логического декодирования (Хоу Чжицзе) §- Ранее это могло приводить к очистке удалённых записей каталога, несмотря на то, что они потенциально могли быть необходимы процессу чтения WAL. 
- Предотвращение потери данных при выполнении DDL-операций без сильной блокировки для таблиц, участвующих в логической репликации (Шлок Кьял, Хайато Курода) § - Изменения каталога, вызванные командами DDL, не отражались в процессах декодирования WAL, из-за чего последующие изменения декодировались с использованием устаревших данных каталога. Это потенциально могло приводить к повреждению данных. 
- Предотвращение некорректного сброса источника репликации при ошибке рабочего процесса применения изменений, когда ошибка перехватывается и рабочий процесс не завершается (Хайато Курода) § - В результате этой ошибки могли применяться дублирующиеся данные. 
- Устранение сбоя при логической репликации, если для секционированной таблицы подписчика создан индекс BRIN (Том Лейн) § 
- Запрет создания дубликата снимка при поиске по индексу во время логической репликации (Хейкки Линнакангас) § § 
- Улучшение выявления подписок, принимающих изменения от разных источников (Хоу Чжицзе, Шлок Кьял) - Если для таблицы, на которую создаётся подписка, уже существуют подписки в рамках других публикаций, при создании подписки выводится предупреждение, поскольку в таком случае могут поступать дублирующие данные. Изменение улучшает эту логику и позволяет выявлять случаи, когда в рамках другой публикации создана подписка для родительской секции или дочерней таблицы. 
- Исправление некорректной информации о контрольной точке в сообщении об ошибке, выводимом в случае неверного выбора линии времени для восстановления (Дэвид Стил) § - Если запрошенная линия времени недостижима, значения выводимых в сообщении контрольной точки и линии времени должны считываться из файла - backup_label, если он создан. Ранее в сообщение попадали значения из управляющего файла, что корректно при восстановлении из управляющего файла без файла- backup_label, но некорректно при наличии файла- backup_label.
- Исправление порядка операций в функции - smgropen()(Андрес Фройнд)- Теперь гарантируется, что перед вызовом обработчика - smgr_openобъект- SMgrRelationполностью инициализирован. Так он может быть корректно очищен, если при вызове обработчика возникнет сбой.
- Удаление некорректного проверочного утверждения в функции - pgstat_report_stat()(Микаэль Пакье) §
- Исправление слишком строгого проверочного утверждения в функции - gistFindCorrectParent()(Хейкки Линнакангас) §
- Предотвращение сбоя проверочного утверждения во время параллельной очистки, если для параметра конфигурации - maintenance_work_memустановлено очень небольшое значение (Масахико Савада) §
- Устранение сбоя проверочного утверждения, возникавшего в редких случаях на резервных серверах при перезапуске ведущего (Хейкки Линнакангас) § 
- Исправление ошибки «unexpected plan node type» (неожиданный тип узла плана) в PL/pgSQL при определении прокручиваемого курсора для простого запроса - SELECT(Андрей Лепихов)- выражение
- Запрет удаления отдельных секций индекса в режиме - --cleanутилиты pg_dump (Цзянь Хи) §- Сервер не принимает такие команды - DROP. Однако реальных последствий это не вызывает, поскольку секции всё равно удалятся при последующем удалении их родительских таблиц или секционированного индекса. Тем не менее выводимая ошибка о попытке удаления мешала во время восстановления в режиме- --single-transaction.
- Запрет генерирования недействительных команд - GRANTдля ролей утилитой pg_dumpall, если в каталоге- pg_auth_membersсодержатся недействительные OID ролей (Том Лейн) §- Вместо этого теперь выводится предупреждение, и вхождение каталога пропускается. Такое решение позволяет лучше справляться с повреждением каталога, которое могло возникать в ветвях старых версий в результате условий гонки между командами - GRANTи- DROP ROLE.
- Использование корректной функции для высвобождения памяти, выделенной libpq, для утилит pg_amcheck и pg_upgrade (Микаэль Пакье, Ранье Вилела) § § § - Эти недоработки могли приводить к сбоям в некоторых конфигурациях сборок для Windows, например в отладочной сборке libpq, используемой неотладочной сборкой вызывающего приложения. 
- Исправление планирования параллельного перестроения индексов утилитой reindexdb (Александр Коротков) § - Предыдущая реализация не позволяла достичь ожидаемого уровня параллельности. 
- Устранение сбоя при передаче повреждённых входных данных функции - heap_page_items()модуля- contrib/pageinspect(Дмитрий Коваленко)
- Устранение сбоя проверочного утверждения в функции - pg_freespace()модуля- contrib/pg_freespacemap(Тендер Ван) §- Вызов функции - pg_freespace()для отношений без физического хранилища (например, для представлений) приводил к сбою проверочного утверждения, хотя негативно на сборки без проверочных утверждений это не влияло. Теперь для таких случаев добавлена проверка ошибок.
- Запрет подтягивать условия ограничений из подзапросов в модуле - contrib/postgres_fdw(Александр Пыхалов) §- Это исправление позволяет предотвратить возникавшую в редких случаях ошибку «unexpected expression in subquery output» (непредвиденное выражение в результате подзапроса). 
- Исправление ошибки сборки, возникавшей при наличии старой версии файла - libpq_fe.hв системных каталогах- include(Том Лейн) §
- Исправление ошибки сборки в macOS 15.4 (Том Лейн, Питер Эйзентраут) § - Обновление macOS повредило проверку конфигурации для функции - strchrnul().
- Исправление маркировки данных отдельных буферов потоков чтения для Valgrind (Томас Манро) - Это исправление не влияет на код ядра выпущенных версий PostgreSQL, однако расширения, использующие данные отдельных буферов, могли сталкиваться с ложными ошибками во время тестирования под Valgrind. 
- Устранение предупреждений Valgrind, связанных с кодом хеширования строк (Джон Нейлор) § 
- Обновление данных часовых поясов до версии tzdata 2025b, включающее изменение правил перехода на летнее время в Чили, а также корректировку исторических данных для Ирана (Том Лейн) § - Появился новый часовой пояс America/Coyhaique для области Айсен в Чили, который позволяет учитывать для неё часовой пояс UTC-03 без перехода на летнее время и соответствующее расхождение с поясом America/Santiago.