E.27. Выпуск 10.23
Дата выпуска: 2022-11-10
В этот выпуск вошли различные исправления, внесённые после версии 10.22. За информацией о нововведениях версии 10 обратитесь к Разделу E.50.
Этот выпуск PostgreSQL должен стать последним в серии 10.X. Пользователям следует поторопиться с переходом на более новую основную версию.
E.27.1. Миграция на версию 10.23
Если используется версия 10.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 10.19, см. также Раздел E.31.
E.27.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 она была скрытой, не вполне понятно почему; в любом случае исправление перенесено и в старые версии.
Добавление в 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.
Добавление возможности использовать
__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).