E.5. Выпуск 11.18
Дата выпуска: 2022-11-10
В этот выпуск вошли различные исправления, внесённые после версии 11.17. За информацией о нововведениях версии 11 обратитесь к Разделу E.23.
E.5.1. Миграция на версию 11.18
Если используется версия 11.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 11.14, см. также Раздел E.9.
E.5.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).