E.37. Выпуск 12.7

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

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

E.37.1. Миграция на версию 12.7

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

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

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

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

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

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

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

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

  • Исправление потенциально некорректного вычисления результатов UPDATE ... RETURNING для межсекционных изменений с соединением (Амит Ланготе, Эцуро Фудзита)

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

  • Обеспечение корректного изменения свойств отложенности ограничений в секционированных таблицах (Альваро Эррера)

    В случае применения команды ALTER TABLE ... ALTER CONSTRAINT к ограничению внешнего ключа секционированной таблицы, свойства DEFERRABLE и/или INITIALLY DEFERRED, относящиеся к ограничениям и триггерам конечных секций, не корректировались должным образом. В результате такие ограничения не работали как ожидалось. После перехода на эту версию вы можете исправить все некорректно работающие секционированные таблицы, выполнив для них команду ALTER, задающую нужные свойства.

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

  • Требование полного совпадения определений генерируемых столбцов в родительской таблице и в дочерней таблице, присоединяемой к ней с помощью ALTER TABLE ... INHERIT (Питер Эйзентраут)

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

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

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

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

  • Обеспечение сохранения заданных для индекса ориентиров статистики в процессе REINDEX CONCURRENTLY (Микаэль Пакье)

  • Исправление работы конструкции COMMIT AND CHAIN с транзакцией, в которой есть активные точки сохранения (Фудзии Масао)

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

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

  • Исправление ошибки использования освобождённой памяти при сохранении кортежей для триггеров AFTER (Амит Ланготе)

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

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

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

  • Добавление поддержки событийных триггеров в 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, решено оставить прежний вариант.

  • Передача корректного OID триггера пост-обработчикам изменений в объектах при выполнении ALTER CONSTRAINT (Альваро Эррера)

    При изменении свойств триггера во время ALTER CONSTRAINT пост-обработчик изменения уведомлялся о том, что изменяется триггер, но вместо OID триггера получал OID ограничения.

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

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

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

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

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

  • Ликвидация ошибки, возникавшей в блоке PL/pgSQL DO, в котором используются переменные составного типа и при этом осуществляется управление транзакциями (Том Лейн)

    Ранее в таком случае выдавалось сообщение об утечке дескрипторов кортежей.

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

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

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

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

  • Исправление в функции psql ON_ERROR_ROLLBACK обработки команд COMMIT AND CHAIN (Артур Насименту)

    Ранее при попытке её использовать с такими командами выдавалась ошибка «savepoint "pg_psql_temporary_savepoint" does not exist» (точка сохранения "pg_psql_temporary_savepoint" не существует).

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

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

  • Исправление в pg_dump выгрузки генерируемых столбцов для секционированных таблиц (Питер Эйзентраут)

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

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

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

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

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

  • Исправление некорректного расчёта прогресса в pg_checksums (Синъя Като)

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

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

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

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

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