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
).