E.1. Выпуск 10.23
Дата выпуска: 2022-11-10
В этот выпуск вошли различные исправления, внесённые после версии 10.22. За информацией о нововведениях версии 10 обратитесь к Разделу E.24.
Этот выпуск PostgreSQL должен стать последним в серии 10.X. Пользователям следует поторопиться с переходом на более новую основную версию.
E.1.1. Миграция на версию 10.23
Если используется версия 10.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 10.19, см. также Раздел E.5.
E.1.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).
E.1. Release 10.23
Release date: 2022-11-10
This release contains a variety of fixes from 10.22. For information about new features in major release 10, see Section E.24.
This is expected to be the last PostgreSQL release in the 10.X series. Users are encouraged to update to a newer release branch soon.
E.1.1. Migration to Version 10.23
A dump/restore is not required for those running 10.X.
However, if you are upgrading from a version earlier than 10.19, see Section E.5.
E.1.2. Changes
Fix
VACUUMto press on if an attempted page deletion in a btree index fails to find the page's parent downlink (Peter Geoghegan)Rather than throwing an error, just log the issue and continue without deleting the empty page. Previously, a buggy operator class or corrupted index could indefinitely prevent completion of vacuuming of the index, eventually leading to transaction wraparound problems.
Fix handling of
DEFAULTtokens that appear in a multi-rowVALUESclause of anINSERTon an updatable view (Tom Lane)This oversight could lead to “cache lookup failed for type” errors, or in older branches even to crashes.
Disallow rules named
_RETURNthat are notON SELECT(Tom Lane)This avoids confusion between a view's
ON SELECTrule and any other rules it may have.Repair rare failure of MULTIEXPR_SUBLINK subplans in inherited updates (Tom Lane)
Use of the syntax
UPDATE tab SET (c1, ...) = (SELECT ...)with an inherited or partitioned target table could result in failure if the child tables are sufficiently dissimilar. This typically manifested as failure of consistency checks in the executor; but a crash or incorrect data updates are also possible.Avoid flattening
FROM-less subqueries when the outer query has grouping sets (Tom Lane)This oversight could lead to assertion failures or planner errors such as “variable not found in subplan target list”.
Prevent WAL corruption after a standby promotion (Dilip Kumar, Robert Haas)
When a PostgreSQL instance performing archive recovery (but not using standby mode) is promoted, and the last WAL segment that it attempted to read ended in a partial record, the instance would write an invalid WAL segment on the new timeline.
Fix mis-ordering of WAL operations in fast insert path for GIN indexes (Matthias van de Meent, Zhang Mingli)
This mistake is not known to have any negative consequences within core PostgreSQL, but it did cause issues for some extensions.
Fix bugs in logical decoding when replay starts from a point between the beginning of a transaction and the beginning of its subtransaction (Masahiko Sawada, Kuroda Hayato)
These errors could lead to assertion failures in debug builds, and otherwise to memory leaks.
Prevent examining system catalogs with the wrong snapshot during logical decoding (Masahiko Sawada)
If decoding begins partway through a transaction that modifies system catalogs, the decoder may not recognize that, causing it to fail to treat that transaction as in-progress for catalog lookups.
Accept interrupts in more places during logical decoding (Amit Kapila, Masahiko Sawada)
This ameliorates problems with slow shutdown of replication workers.
Avoid crash after function syntax error in replication workers (Maxim Orlov, Anton Melnikov, Masahiko Sawada, Tom Lane)
If a syntax error occurred in a SQL-language or PL/pgSQL-language
CREATE FUNCTIONorDOcommand executed in a logical replication worker, the worker process would crash with a null pointer dereference or assertion failure.Fix handling of read-write expanded datums that are passed to SQL functions (Tom Lane)
If a non-inlined SQL function uses a parameter in more than one place, and one of those functions expects to be able to modify read-write datums in place, then later uses of the parameter would observe the wrong value. (Within core PostgreSQL, the expanded-datum mechanism is only used for array and composite-type values; but extensions might use it for other structured types.)
In Snowball dictionaries, don't try to stem excessively-long words (Olly Betts, Tom Lane)
If the input word exceeds 1000 bytes, return it as-is after case folding, rather than trying to run it through the Snowball code. This restriction protects against a known recursion-to-stack-overflow problem in the Turkish stemmer, and it seems like good insurance against any other safety or performance issues that may exist in the Snowball stemmers. Such a long string is surely not a word in any human language, so it's doubtful that the stemmer would have done anything desirable with it anyway.
Fix use-after-free hazard in string comparisons (Tom Lane)
Improper memory management in the string comparison functions could result in scribbling on no-longer-allocated buffers, potentially breaking things for whatever is using that memory now. This would only happen with fairly long strings (more than 1kB), and only if an ICU collation is in use.
Prevent postmaster crash when shared-memory state is corrupted (Tom Lane)
The postmaster process is supposed to survive and initiate a database restart if shared memory becomes corrupted, but one bit of code was being insufficiently cautious about that.
Add some more defenses against recursion till stack overrun (Richard Guo, Tom Lane)
Avoid long-term memory leakage in the autovacuum launcher process (Reid Thompson)
The lack of field reports suggests that this problem is only latent in pre-v15 branches; but it's not very clear why, so back-patch the fix anyway.
Add missing guards for
NULLconnection pointer in libpq (Daniele Varrazzo, Tom Lane)There's a convention that libpq functions should check for a NULL PGconn argument, and fail gracefully instead of crashing.
PQflush()andPQisnonblocking()didn't get that memo, so fix them.In ecpg, fix omission of variable storage classes when multiple
varcharorbyteavariables are declared in the same declaration (Andrey Sokolov)For example, ecpg translated
static varchar str1[10], str2[20], str3[30];in such a way that onlystr1was markedstatic.Allow cross-platform tablespace relocation in pg_basebackup (Robert Haas)
Allow the remote path in
--tablespace-mappingto be either a Unix-style or Windows-style absolute path, since the source server could be on a different OS than the local system.In pg_stat_statements, fix access to already-freed memory (zhaoqigui)
This occurred if pg_stat_statements tracked a
ROLLBACKcommand issued via extended query protocol. In debug builds it consistently led to an assertion failure. In production builds there would often be no visible ill effect; but if the freed memory had already been reused, the likely result would be to store garbage for the query string.In postgres_fdw, ensure that target lists constructed for EvalPlanQual plans will have all required columns (Richard Guo, Etsuro Fujita)
This avoids “variable not found in subplan target list” errors in rare cases.
Reject unwanted output from the platform's
uuid_create()function (Nazir Bilal Yavuz)The uuid-ossp module expects libc's
uuid_create()to produce a version-1 UUID, but recent NetBSD releases produce a version-4 (random) UUID instead. Check for that, and complain if so. Drop the documentation's claim that the NetBSD implementation is usable for uuid-ossp. (If a version-4 UUID is okay for your purposes, you don't need uuid-ossp at all; just usegen_random_uuid().)Include new Perl test modules in standard installations (Álvaro Herrera)
Add
PostgreSQL/Test/Cluster.pmandPostgreSQL/Test/Utils.pmto the standard installation file set in pre-version-15 branches. This is for the benefit of extensions that want to use newly-written test code in older branches.On NetBSD, force dynamic symbol resolution at postmaster start (Andres Freund, Tom Lane)
This avoids a risk of deadlock in the dynamic linker on NetBSD 10.
Allow use of
__sync_lock_test_and_set()for spinlocks on any machine (Tom Lane)This eases porting to new machine architectures, at least if you're using a compiler that supports this GCC builtin function.
Rename symbol
REFtoREF_Pto avoid compile failure on recent macOS (Tom Lane)Silence assorted compiler warnings from clang 15 and later (Tom Lane)
Update time zone data files to tzdata release 2022f for DST law changes in Chile, Fiji, Iran, Jordan, Mexico, Palestine, and Syria, plus historical corrections for Chile, Crimea, Iran, and Mexico.
Also, the Europe/Kiev zone has been renamed to Europe/Kyiv. Also, the following zones have been merged into nearby, more-populous zones whose clocks have agreed with them since 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 and Pacific/Wallis. (This indirectly affects zones that were already links to one of these: Arctic/Longyearbyen, Atlantic/Jan_Mayen, Iceland, Pacific/Ponape, Pacific/Truk, and Pacific/Yap.) America/Nipigon, America/Rainy_River, America/Thunder_Bay, Europe/Uzhgorod, and Europe/Zaporozhye were also merged into nearby zones after discovering that their claimed post-1970 differences from those zones seem to have been errors. In all these cases, the previous zone name remains as an alias; but the actual data is that of the zone that was merged into.
These zone mergers result in loss of pre-1970 timezone history for the merged zones, which may be troublesome for applications expecting consistency of
timestamptzdisplay. As an example, the stored value1944-06-01 12:00 UTCwould previously display as1944-06-01 13:00:00+01if the Europe/Stockholm zone is selected, but now it will read out as1944-06-01 14:00:00+02.It is possible to build the time zone data files with options that will restore the older zone data, but that choice also inserts a lot of other old (and typically poorly-attested) zone data, resulting in more total changes from the previous release than accepting these upstream changes does. PostgreSQL has chosen to ship the tzdb data as-recommended, and so far as we are aware most major operating system distributions are doing likewise. However, if these changes cause significant problems for your application, a possible solution is to install a local build of the time zone data files using tzdb's backwards-compatibility options (see their
PACKRATDATAandPACKRATLISToptions).