E.37. Выпуск 12.13

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

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

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

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

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

E.37.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, он должен штатно перезапустить базу данных, но в одном месте кода были предприняты не все меры для этого.

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

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

    Сообщения об этой проблеме не поступали, что говорит о том, что до версии 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).