E.41. Выпуск 12.13
Дата выпуска: 2022-11-10
В этот выпуск вошли различные исправления, внесённые после версии 12.12. За информацией о нововведениях версии 12 обратитесь к Разделу E.54.
E.41.1. Миграция на версию 12.13
Если используется версия 12.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 12.10, см. также Раздел E.44.
E.41.2. Изменения
- Предотвращение маловероятных случаев аварийной остановки при изменении данных и выполнении - VACUUMодновременно (Том Лейн, Джефф Дэвис) § §- Когда операция - VACUUMустанавливает флаг «полностью видимая» для страницы, которая одновременно изменяется командой- UPDATEили- DELETE, эта команда снова должна сбросить флаг; в некоторых случаях этого не происходило, что вызывало аварийную остановку и перезапуск базы данных.- Насколько известно, этот дефект мог проявляться в версиях 14 и 15, а в предыдущих не могло быть видимых проявлений. 
- Исправление - VACUUM, позволяющее продолжать очистку, если при удалении страницы индекса btree в родительской странице не нашлась ссылка на удаляемую страницу (Питер Гейган)- Теперь в этом случае не выдаётся ошибка, а просто записывается сообщение в журнал и операция продолжается, оставляя пустую страницу. Раньше при наличии дефектного класса операторов или повреждённого индекса очистка индекса не могла завершиться, что в конце концов могло вызвать проблемы с зацикливанием идентификаторов транзакций. 
- Исправление обработки элементов - DEFAULTв предложении- VALUESс несколькими кортежами при добавлении данных в изменяемое представление (Том Лейн) §- Следствием исправленного теперь упущения могли быть ошибки «cache lookup failed for type» (ошибка поиска в кеше для типа) или даже аварийный сбой в старых версиях. 
- Недопущение имени - _RETURNдля всех правил, кроме правил- ON SELECT(Том Лейн) §- Таким образом, задаваемое для представления правило - ON SELECTбудет отличаться от других задаваемых для него правил.
- Устранение дефекта в управлении ресурсами при сохранении кортежей для триггеров - AFTER(Том Лейн) §- При определённых обстоятельствах могла возникнуть ошибка «tupdesc reference - NNNNis 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).