E.37. Выпуск 11.18

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Запрет разворачивания подзапросов без предложения FROM, когда во внешнем запросе есть наборы группирования (Том Лейн)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Предотвращение краха процесса 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 (Том Лейн)

  • Устранение различных предупреждений, выдаваемых компилятором 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).