E.6. Выпуск 13.9

Дата выпуска: 2022-11-10

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

E.6.1. Миграция на версию 13.9

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

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

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

  • Предотвращение маловероятных случаев аварийной остановки при изменении данных и выполнении VACUUM одновременно (Том Лейн, Джефф Дэвис)

    Когда операция VACUUM устанавливает флаг «полностью видимая» для страницы, которая одновременно изменяется командой UPDATE или DELETE, эта команда снова должна сбросить флаг; в некоторых случаях этого не происходило, что вызывало аварийную остановку и перезапуск базы данных.

    Насколько известно, этот дефект мог проявляться в версиях 14 и 15, а в предыдущих не могло быть видимых проявлений.

  • Исправление VACUUM, позволяющее продолжать очистку, если при удалении страницы индекса btree в родительской странице не нашлась ссылка на удаляемую страницу (Питер Гейган)

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

  • Исправление обработки элементов DEFAULT в предложении VALUES с несколькими кортежами при добавлении данных в изменяемое представление (Том Лейн)

    Следствием исправленного теперь упущения могли быть ошибки «cache lookup failed for type» (ошибка поиска в кеше для типа) или даже аварийный сбой в старых версиях.

  • Недопущение имени _RETURN для всех правил, кроме правил ON SELECT (Том Лейн)

    Таким образом, задаваемое для представления правило ON SELECT будет отличаться от других задаваемых для него правил.

  • Устранение дефекта в управлении ресурсами при сохранении кортежей для триггеров AFTER (Том Лейн)

    При определённых обстоятельствах могла возникнуть ошибка «tupdesc reference NNNN is not owned by resource owner» (дескриптор кортежа NNNN не принадлежит владельцу ресурса), после чего происходила аварийная остановка.

  • Исправление ошибки, редко возникавшей во вложенных планах MULTIEXPR_SUBLINK при UPDATE с наследованием (Том Лейн)

    При выполнении команды UPDATE tab SET (c1, ...) = (SELECT ...), где целевая таблица секционирована или имеет потомков, мог произойти сбой, если дочерние таблицы имели существенные различия. Как правило, это проявлялось в нарушении проверок согласованности в исполнителе, но также могла произойти аварийная остановка или данные изменялись некорректно.

  • Корректировка формирования ограничений внешнего ключа для секций при выполнении ALTER TABLE ATTACH PARTITION (Жеан-Гийом де Рорте, Альваро Эррера)

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

  • Исправление выбора имени ограничения внешнего ключа для секций (Жеан-Гийом де Рорте)

    Если изначально заданное имя уже используется для какого-либо ограничения секции, выбирается новое имя; ранее оно выбиралось неправильно.

  • Исправление некорректного сопоставления индексных выражений и предикатов при создании секционированного индекса (Ричард Гуо, Том Лейн)

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

  • Предотвращение повреждения WAL после повышения ведомого сервера (Дилип Кумар, Роберт Хаас)

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

  • Исправление неверного порядка операций WAL при добавлении данных в индексы GIN по быстрому пути (Маттиас ван де Меент, Мингли Чжан)

    О негативном влиянии этого дефекта на работу ядра PostgreSQL неизвестно, но с некоторыми расширениями возникали проблемы.

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

    Устранённые теперь ошибки могли приводить к сбоям проверочных утверждений в отладочных сборках или же к утечкам памяти.

  • Предотвращение обращения к системным каталогам с использованием неверного снимка во время логического декодирования (Масахико Савада)

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

  • Добавление точек, в которых возможно прерывание при логическом декодировании (Амит Капила, Масахико Савада)

    Тем самым устраняются проблемы медленного отключения рабочих процессов репликации.

  • Предотвращение в рабочих процессах репликации попыток реплицировать данные секций в сторонние таблицы (Ши Юй, Том Лейн)

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

  • Удаление бессмысленной проверки идентификатора реплики для секционированных таблиц (Хоу Чжицзе)

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

  • Устранение сбоя рабочего процесса репликации в случае синтаксической ошибки в функции (Максим Орлов, Антон Мельников, Масахико Савада, Том Лейн)

    Если в команде CREATE FUNCTION или DO на языке SQL или PL/pgSQL была допущена синтаксическая ошибка, при выполнении этой команды рабочим процессом репликации он завершался аварийно из-за обращения по нулевому указателю или сбоя проверочного утверждения.

  • Исправление обработки допускающих изменение развёрнутых данных, передаваемых в функции SQL (Том Лейн)

    В случае неоднократного использования одного параметра в невстроенной SQL-функции, когда предполагается, что вызываемая из неё SQL-функция должна модифицировать его данные на месте, при следующих обращениях к этому параметру его значение было некорректным. (В ядре PostgreSQL механизм развёрнутых данных используется только для массивов и значений составного типа; однако расширения могут использовать его и для других структурированных типов.)

  • Исправление обработки значений NaN при проверке равенства значений типа circle (Ранье Вилела)

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

  • Отказ от вызова стеммера в Snowball для чрезмерно длинных слов (Олли Беттс, Том Лейн)

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

  • Ликвидация риска использования освобождённой памяти при сравнении строк (Том Лейн)

    Вследствие некорректного управления памятью в функциях сравнения строк код мог писать в уже освобождённые буферы и тем самым навредить следующему пользователю этой памяти. Это могло происходить при сравнении только довольно длинных строк (больше 1 КБ) и только при использовании правила сортировки ICU.

  • Добавление в планировщик проверки, предотвращающей обращения к таблице, для которой нет табличного метода доступа (Том Лейн)

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

  • Предотвращение краха процесса postmaster при повреждении общей памяти (Том Лейн)

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

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

  • Исправление некорректного выбора размера хеш-таблицы при обработке больших кортежей с очень маленьким объёмом work_mem (Мингли Чжан)

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

    Сообщения об этой проблеме не поступали, что говорит о том, что до версии 15 она была скрытой, не вполне понятно почему; в любом случае исправление перенесено и в старые версии.

  • Улучшение способности PL/pgSQL обрабатывать параметры, объявленные как RECORD (Том Лейн)

    Теперь для каждого конкретного типа, передаваемого в параметре RECORD в течение сеанса, для функции создаётся отдельная запись в кеше, как это делается для полиморфных параметров. Ранее в таких ситуациях могла возникнуть ошибка «type of parameter does not match that when preparing the plan» (тип параметра не соответствует тому, с которым подготавливался план).

  • Добавление в libpq недостающих проверок указателя соединения на NULL (Даниэле Вараццо, Том Лейн)

    Есть соглашение, что функции libpq должны проверять, не передан ли NULL в аргументе PGconn, и в этом случае завершаться штатной ошибкой, а не крахом. Функции PQflush() и PQisnonblocking() этому соглашению не следовали, но теперь они исправлены.

  • Устранение в ecpg исчезания класса хранения переменных при описании в одном объявлении нескольких переменных varchar или bytea (Андрей Соколов)

    Например, объявление static varchar str1[10], str2[20], str3[30]; преобразовывалось в ecpg таким образом, что пометка static оставалась только у переменной str1.

  • Обеспечение возможности кроссплатформенного перемещения табличных пространств в pg_basebackup (Том Лейн)

    Теперь удалённый путь в --tablespace-mapping может задаваться как абсолютный путь и в стиле Unix, и в стиле Windows, поскольку ОС исходного сервера и локальной системы могут различаться.

  • Устранение обращения к освобождённой памяти в pg_stat_statements (Цигуй Чжао)

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

  • Обеспечение в postgres_fdw наличия всех необходимых столбцов в целевых списках, формируемых для планов EvalPlanQual (Ричард Гуо, Эцуро Фудзита)

    Тем самым предупреждаются ошибки «variable not found in subplan target list» (переменная не найдена в целевом списке подплана), возникавшие в редких случаях.

  • Недопущение нежелательного вывода системной функции uuid_create() (Назир Билал Явуз)

    Модуль uuid-ossp ожидает, что функция libc uuid_create() вернёт UUID версии 1, но в последних версиях NetBSD возвращается UUID версии 4 (случайный). Теперь версия проверяется, и в случае несоответствия выдаётся ошибка. Из документации удалено упоминание NetBSD в перечне систем, подходящих для использования uuid-ossp. (Если для ваших целей подходят UUID версии 4, uuid-ossp вам вовсе не нужен — используйте функцию gen_random_uuid().)

  • Включение новых модулей Perl для тестирования в стандартную инсталляцию (Альваро Эррера)

    PostgreSQL/Test/Cluster.pm и PostgreSQL/Test/Utils.pm добавлены в список файлов для стандартной инсталляции версий до 15. Это может быть полезно для тестирования расширений, когда возникает желание использовать новые тесты в старых версиях.

  • Обеспечение в NetBSD динамического разрешения символов в момент запуска процесса postmaster (Андрес Фройнд, Том Лейн)

    Тем самым устраняется риск взаимоблокировки при выполнении динамического связывания в NetBSD 10.

  • Устранение несовместимостей с LLVM 15 (Томас Манро, Андрес Фройнд)

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

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

  • Переименование символа REF в REF_P во избежание проблем при компиляции в последних версиях macOS (Том Лейн)

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

  • Устранение различных предупреждений, выдаваемых компилятором clang версии 15 и выше (Том Лейн)

  • Обновление данных часовых поясов до версии tzdata 2022f, включающее изменение правил перехода на летнее время в Чили, Иране, Иордании, Мексике, Палестине, Сирии и на Фиджи, а также корректировку исторических данных для Чили, Крыма, Ирана и Мексики.

    Кроме того, пояс Europe/Kiev был переименован в Europe/Kyiv. Помимо этого, следующие пояса были включены в соседние, более популярные пояса, в которых время было таким же с 1970 г.: Antarctica/Vostok, Asia/Brunei, Asia/Kuala_Lumpur, Atlantic/Reykjavik, Europe/Amsterdam, Europe/Copenhagen, Europe/Luxembourg, Europe/Monaco, Europe/Oslo, Europe/Stockholm, Indian/Christmas, Indian/Cocos, Indian/Kerguelen, Indian/Mahe, Indian/Reunion, Pacific/Chuuk, Pacific/Funafuti, Pacific/Majuro, Pacific/Pohnpei, Pacific/Wake и Pacific/Wallis. (Это косвенно влияет на пояса, ранее включённые в другие: Arctic/Longyearbyen, Atlantic/Jan_Mayen, Iceland, Pacific/Ponape, Pacific/Truk и Pacific/Yap.) Пояса America/Nipigon, America/Rainy_River, America/Thunder_Bay, Europe/Uzhgorod и Europe/Zaporozhye также были включены в соседние, поскольку выяснилось, что заявления об отличиях этих поясов от соседних (после 1970 года) оказались ошибочными. Для всех этих поясов старое название сохранено в качестве альтернативного; фактически используются данные пояса, в который они были включены.

    В результате такого включения для включённых поясов теряется история до 1970 г., что может вызвать проблемы в приложениях, рассчитывающих на согласованный вывод timestamptz. Например, хранимое значение 1944-06-01 12:00 UTC ранее для часового пояса Europe/Stockholm выводилось как 1944-06-01 13:00:00+01, а теперь будет выводиться как 1944-06-01 14:00:00+02.

    В принципе возможно собрать файлы часовых поясов так, чтобы были восстановлены данные старых поясов, но при этом будут добавлены и другие старые (и, как правило, плохо проверенные) данные поясов, что принесёт по сравнению с предыдущей версией больше изменений, чем просто принятие изменений из проекта tzdata. В PostgreSQL было решено включить в поставку рекомендованные данные tzdb, и насколько нам известно, производители большинства операционных системы поступают так же. Тем не менее, если эти изменения приводят к существенным проблемам в вашем приложении, возможным решением будет установка локальной сборки файлов с данными часовых поясов tzdb, полученной с указанием параметров для обратной совместимости (см. параметры PACKRATDATA и PACKRATLIST).