E.33. Выпуск 10.17

Дата выпуска: 2021-05-13

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

E.33.1. Миграция на версию 10.17

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

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

E.33.2. Изменения

  • Предотвращение целочисленного переполнения при вычислении индексов в массивах (Том Лейн)

    Ранее код обработки массивов не отслеживал переполнение целого при сложении нижней границы с длиной массива. В результате элементы с запредельными индексами (которые нельзя записать в виде целого числа) оказывались недоступными, но что ещё хуже, в дальнейшем они нарушали работу операций присваивания. Это могло приводить к перезаписи памяти и, как следствие, сбоям или нежелательным изменениям данных. (CVE-2021-32027)

  • Исправление некорректной обработки «отбросовых» столбцов в целевых списках INSERT ... ON CONFLICT ... UPDATE (Том Лейн)

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

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

  • Запрещение пометки допустимости NULL для столбца идентификации (Вик Фиринг)

    Указание GENERATED ... AS IDENTITY подразумевает ограничение NOT NULL, поэтому оно не должно приниматься с явным указанием NULL.

  • Реализация возможности задавать в ALTER ROLE/DATABASE ... SET произвольные параметры role, session_authorization и temp_buffers (Том Лейн)

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

  • Устранение ошибки, связанной с приведением результата выражения COLLATE к типу, не поддерживающему сортировку (Том Лейн)

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

  • Недопущение вызова оконных функций и процедур через сообщения по протоколу «быстрого пути» (Том Лейн)

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

  • Добавление поддержки событийных триггеров в pg_identify_object_as_address() (Джоэл Джейкобсон)

  • Исправление в функции to_char() обработки кодов формата, задающих месяц римскими цифрами, с отрицательными интервалами (Жюльен Руо)

    Ранее при вызове функции с такими параметрами обычно происходил сбой.

  • Проверка указания в аргументе функции pg_import_system_collations() корректного OID схемы (Tom Lane)

  • Устранение обращения к неинициализированному значению при разборе квантификатора \{m,n\} в регулярном выражении в режиме BRE (Том Лейн)

    В результате ошибки этот квантификатор мог работать как «нежадный», то есть как квантификатор {m,n}? в расширенных регулярных выражениях.

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

    Ранее для запросов вида SELECT ... GROUP BY a, b, ctid могли выдаваться странные оценки.

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

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

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

    При использовании в индексе BRIN страничных зон размера, не равного степени двух, были возможны особые случаи, когда в ходе сканирования битовой карты происходило обращение к странице за физическим концом таблицы, приводившее к ошибке «could not open file» (не удалось открыть файл).

  • Недопущение некорректной смены линии времени при восстановлении незафиксированных двухфазных транзакций из WAL (Соумйадип Чакраборти, Джимми Йи, Кевин Йеп)

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

  • Освобождение всех блокировок в случае остановки стартового процесса ведомого сервера (Фудзии Масао)

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

  • Устранение сбоя при выполнении команды ALTER SUBSCRIPTION REFRESH в рабочем процессе логической репликации (Питер Смит)

    Код ядра не выполняет такую команду, но она вполне может выполняться в триггере реплики.

  • Использование по умолчанию значения wal_sync_method = fdatasync в последних версиях FreeBSD (Томас Манро)

    Во FreeBSD 13 поддерживается режим open_datasync, и он в принципе должен использоваться по умолчанию, однако пока не ясно, в чём его преимущество для Postgres, решено оставить прежний вариант.

  • Обеспечение полной очистки в случае прерывания при отсоединении сегмента DSM (Томас Манро)

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

  • Устранение утечки памяти при инициализации SSL-параметров сервера (Микаэль Пакье)

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

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

  • Предотвращение бесконечного цикла в libpq при получении некорректной длины в сообщении ParameterDescription (Том Лейн)

  • Использование правильных разделителей (обратной косой черты) в пути к программе pg_ctl, который выводит initdb в инструкции по запуску сервера (Нитин Ядав)

  • Восстановление в psql предыдущего поведения присваивания \connect service=значение (Tom Lane)

    В результате предыдущего исправления ошибки переменные окружения (например, PGPORT) стали переопределять записи в файле служб в данном контексте. Сейчас восстановлено прежнее поведение, при котором действует обратный приоритет.

  • Устранение условий гонки при обнаружении изменений в файле командой psql \e и связанными с ней командами (Лауренц Альбе)

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

  • Добавление недостающей проверки версии файла в pg_restore (Том Лейн)

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

  • Добавление в pg_upgrade дополнительных проверок на наличие в пользовательских таблицах типов, не поддерживающих обновление (Том Лейн)

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

  • Исправление в pg_waldump подсчёта записей XACT при сборе статистики по записям (Кётаро Хоригути)

  • Ликвидация в contrib/amcheck ошибочного проверочного утверждения, не допускающего одновременно установленные в кортеже флаги HEAP_XMAX_LOCK_ONLY и HEAP_KEYS_UPDATED (Жюльен Руо)

    Такое состояние вполне легально после SELECT FOR UPDATE.

  • Корректировка правил сборки с VPATH для совместимости с последними версиями компилятора Oracle Developer Studio (Ной Миш)

  • Исправление тестирования языка PL/Python для Python 3 в ОС Solaris (Ной Миш)