E.2. Выпуск 17.5#

E.2. Выпуск 17.5

E.2. Выпуск 17.5 #

Дата релиза:  2025-05-08

Этот релиз содержит различные исправления из версии 17.4. Для получения информации о новых функциях в основном релизе 17, см. Раздел E.7.

E.2.1. Миграция на версию 17.5 #

Дамп/восстановление не требуется для тех, кто использует 17.X.

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

Также, если у вас есть BRIN bloom индексы, может быть целесообразно переиндексировать их после обновления. См. третью запись в журнале изменений ниже.

Также, если выполняется обновление с версии ранее 17.1, см. Раздел E.6.

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

  • Избегалось однобайтовое переполнение буфера при проверке строк с недопустимой кодировкой, которые утверждались как имеющие кодировку GB18030 (Ноа Миш, Андрес Фройнд) § §

    Хотя это маловероятно, мог произойти сбой SIGSEGV, если неполный многобайтовый символ появлялся в конце памяти. Это было возможно как на сервере, так и в приложениях, использующих libpq. (CVE-2025-4207)

  • Обрабатывались самоссылочные внешние ключи на секционированных таблицах корректно (Álvaro Herrera) §

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

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

  • Избежание потери данных при объединении сжатых резюме BRIN в brin_bloom_union() (Томаш Вондра) §

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

    Эта ошибка присутствовала начиная с версии 14, когда были введены BRIN bloom индексы, но этот путь кода тогда использовался редко. В версии 17 вероятность его использования значительно выше, потому что параллельные построения индексов теперь используют этот код.

  • Исправлены неожиданные ошибки атрибут имеет неправильный тип в запросах UPDATE, DELETE и MERGE, которые использовали ссылки на всю строку таблицы для представлений или функций в FROM (Tom Lane) §

  • Исправлено MERGE в секционированную таблицу с действиями DO NOTHING (Tender Wang) §

    Некоторые случаи завершились с ошибками неизвестное действие в MERGE WHEN clause.

  • Предотвращение сбоя в командах INSERT, когда таблица имеет GENERATED столбец с доменным типом данных, и ограничения домена запрещают значения null (Jian He) §

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

  • Корректно обрабатывались ссылки на внешние имена CTE, которые появляются внутри WITH выражения, прикрепленного к INSERT/UPDATE/DELETE/MERGE команды, находящейся внутри WITH (Tom Lane) §

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

  • Исправлена неправильная обработка приведения типов в ключах выражений конструктора JSON (Amit Langote) §

  • Не пытались параллелизовать array_agg(), когда аргумент был анонимного типа записи (Ричард Гуо, Том Лейн) §

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

  • Исправлены конструкции ARRAY(subquery) и ARRAY[expression, ...] для получения корректных результатов, когда ввод был типа int2vector или oidvector (Tom Lane) §

    Этот патч восстановил поведение, которое существовало до PostgreSQL 9.5: результат имеет тип int2vector[] или oidvector[].

  • Исправлены возможные ошибочные сообщения о недопустимых аффиксах при разборе Ispell словарей (Jacob Brazeal) §

  • Исправлено ALTER TABLE ADD COLUMN для правильной обработки случая с типом домена, который имеет значение по умолчанию (Jian He, Tom Lane, Tender Wang) § §

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

  • Исправлено неправильное поведение, когда имеются дублирующиеся имена столбцов в действии внешнего ключа ON DELETE SET DEFAULT или SET NULL (Tom Lane) §

  • Улучшено сообщение об ошибке для запрещенных попыток изменить свойства ограничения внешнего ключа (Álvaro Herrera) §

  • Избежана ошибка при сбросе флага relhassubclass временной таблицы, помеченной как ON COMMIT DELETE ROWS (Ноа Миш) §

  • Добавлено отсутствующее обратное преобразование опции INDENT в XMLSERIALIZE() (Джим Джонс) § §

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

  • Избегалась преждевременная оценка аргументов агрегатной функции, которая имела как FILTER, так и ORDER BY (или DISTINCT) опции (Дэвид Роули) §

    Если присутствует ORDER BY или DISTINCT, рассматривалась возможность предварительной сортировки входных значений агрегата, а не выполнения сортировки внутри узла плана Agg. Однако это проблематично, если входные данные агрегата включают выражения, которые могут завершиться ошибкой (например, деление, где некоторые из делителей могут быть равны нулю), и имеется предложение FILTER, предназначенное для предотвращения таких ошибок. Предварительная сортировка переместила бы вычисления выражений до проверки FILTER, что позволило бы ошибкам все равно произойти. Это избегалось, не выполняя предварительную сортировку, если присутствует FILTER и входные выражения являются чем-то более сложным, чем простой Var или Const.

  • Исправлены ошибочные выводы из ограничений столбца NOT NULL при наличии внешних соединений (Ричард Гуо) §

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

  • Избегались некорректные оптимизации, основанные на тестах IS [NOT] NULL, которые применялись к составным значениям (Брюс Момджан) §

  • Исправлена ошибка планировщика, из-за которой не удавалось идентифицировать более одного хешируемого подвыражения ScalarArrayOpExpr в рамках выражения верхнего уровня (Дэвид Гейер) §

    Это приводило к неоправданно неэффективному выполнению любых дополнительных подвыражений, которые могли быть обработаны с помощью хеш-таблицы (то есть, IN, NOT IN, или = ANY предложения с полностью постоянными правыми частями).

  • Исправлена некорректная оценка размера таблицы с низким коэффициентом заполнения (Томаш Вондра) §

    Когда планировщик оценивает количество строк в таблице, которая еще не была проанализирована, используется настройка fillfactor таблицы в оценке, но не было учтено ограничение результата как минимум одной строкой на страницу. Низкий fillfactor мог привести к необоснованно малой оценке.

  • Отключена оптимизация пропуска выборки в сканировании кучи с битовой картой (Маттиас ван де Меент) §

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

  • Исправлены проблемы с производительностью при запуске поиска в индексе GIN, когда имеется много ключей поиска (Tom Lane, Vinod Sridharan) § §

    Индексируемое предложение с множеством ключей (например, jsonbcol ?| array[...] с десятками тысяч элементов массива) занимало O(N2) времени для запуска и было неотменяемым в этот интервал.

  • Обнаружены отсутствующие процедуры поддержки в классе операторов BRIN-индекса, и сообщена ошибка вместо сбоя (Álvaro Herrera) §

  • Отвечать на прерывания (такие как отмена запроса) во время ожидания асинхронных подпланов узла плана Append (Хейкки Линкангас) §

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

  • Частота отчета статистики ввода-вывода активных отправителей WAL была увеличена (Бертран Друво) §

    Ранее представление pg_stat_io не удавалось накапливать ввод-вывод, выполняемый отправителем WAL, до завершения этого процесса. Теперь такой ввод-вывод будет сообщаться с задержкой не более одной секунды.

  • Исправлено состояние гонки в обработке synchronous_standby_names сразу после запуска (Мельников Максим, Майкл Пакье) §

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

  • Справляться с возможными изменениями в пределах запроса io_combine_limit (Томас Мунро) §

  • Избегать бесконечного цикла, если scram_iterations установлено на INT_MAX (Кевин К. Биджу) §

  • Избегались возможные сбои из-за двойного преобразования подзапроса json_array() (Том Лейн) §

  • Исправлена pg_strtof(), чтобы не происходил сбой с нулевым endptr (Александр Лахин, Том Лейн) §

  • Исправлен сбой после нехватки памяти в некоторых присвоениях GUC (Даниэль Густафссон) §

  • Избегался сбой, когда стеммер Snowball сталкивался с условием нехватки памяти (Максим Коротков) §

  • Исправлено чрезмерное освобождение структур SpecialJoinInfo во время планирования (Ричард Гуо) §

    Это приводило к сбоям во время планирования, если включено соединение по разделам.

  • Запрещено копирование аннулированных слотов репликации (Шлок Кьял) §

    Это предотвращает проблемы, когда недопустимый слот указывает на WAL, который уже был удалён.

  • Запрещено восстановление слотов логической репликации на резервных серверах, которые не находятся в режиме горячего резерва (Masahiko Sawada) §

    Это предотвращает сценарий, при котором слот мог бы оставаться действительным после повышения, даже если wal_level слишком низкий.

  • Предотвращено чрезмерное продвижение каталога xmin в режиме быстрого перемотки вперед логического декодирования (Zhijie Hou) §

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

  • Избегалась потеря данных, когда операции DDL, которые не берут сильную блокировку, затрагивали таблицы, которые логически реплицировались (Шлок Кьял, Хаято Курода) § §

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

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

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

  • Исправлен сбой в логической репликации, если у секционированной таблицы подписчика есть BRIN индекс (Том Лейн) §

  • Избегалось создание дублирующих снимков при поиске индекса в логической репликации (Хейкки Линнакангас) § §

  • Улучшено обнаружение подписок смешанного происхождения (Hou Zhijie, Shlok Kyal) §

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

  • Исправлены неверные детали контрольной точки в сообщении об ошибке о неправильном выборе временной шкалы восстановления (Дэвид Стил) §

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

  • Исправлен порядок операций в smgropen() (Андрес Фройнд) §

    Убедитесь, что объект SMgrRelation полностью инициализирован перед вызовом обратного вызова smgr_open, чтобы он мог быть корректно очищен, если обратный вызов завершится неудачей.

  • Удалено некорректное утверждение в pgstat_report_stat() (Майкл Пакье) §

  • Исправлено чрезмерно строгую проверку в gistFindCorrectParent() (Хейки Линнакангас) §

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

  • Исправлена редкая ошибка утверждения на резервных серверах, когда основной сервер был перезапущен (Хейкки Линнакангас) §

  • В PL/pgSQL избегалась ошибка неожиданный тип узла плана, когда определялся прокручиваемый курсор на простом запросе SELECT expression (Андрей Лепихов) §

  • Не пытались удалять отдельные разделы индексов в режиме --clean pg_dump (Jian He) §

    Сервер отклоняет такие команды DROP. Это не имеет реальных последствий, так как разделы все равно будут удалены в последующих DROP либо их родительских таблиц, либо их разделенного индекса. Однако ошибка, сообщаемая при попытке удаления, вызывает проблемы при восстановлении в режиме --single-transaction.

  • В pg_dumpall избегалось создание недопустимых команд GRANT для ролей, если pg_auth_members содержал недопустимые OID ролей (Tom Lane) §

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

  • В pg_amcheck и pg_upgrade использована правильная функция для освобождения выделений, сделанных libpq (Майкл Пакье, Раниер Вилела) § § §

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

  • Исправлено планирование параллельных операций реиндексации в reindexdb (Александр Коротков) §

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

  • Избегалось аварийное завершение работы с поврежденными входными данными в contrib/pageinspect's heap_page_items() (Дмитрий Коваленко) §

  • Предотвращен сбой утверждения в contrib/pg_freespacemap's pg_freespacemap() (Тендер Ван) §

    Применение pg_freespacemap() к отношению, не имеющему хранения (например, представление), вызывало сбой утверждения, хотя в сборках без утверждений это не имело негативного эффекта. Добавлена проверка ошибки для отклонения этого случая.

  • В contrib/postgres_fdw избегалось вытягивание условий ограничений из подзапросов (Александр Пыхалов) §

    Этот исправление предотвращает редкие случаи ошибок неожиданное выражение в выводе подзапроса.

  • Исправлена ошибка сборки, когда старая версия libpq_fe.h присутствовала в системных каталогах включения (Tom Lane) §

  • Исправлена ошибка сборки на macOS 15.4 (Том Лейн, Питер Айзентраут) §

    Это обновление macOS нарушило наш конфигурационный пробник для strchrnul().

  • Исправлена маркировка valgrind данных на буфер по потокам чтения (Томас Мунро) §

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

  • Избежаны жалобы valgrind на код хеширования строк (Джон Нейлор) §

  • Обновлены файлы данных часовых поясов до tzdata версии 2025b для изменений закона о летнем времени в Чили, а также исторические исправления для Ирана (Tom Lane) §

    Добавлена новая часовая зона America/Coyhaique для региона Айсен в Чили, чтобы учесть её переход на UTC-03 круглый год и, таким образом, отклонение от America/Santiago.