E.34. Выпуск 11.21
Дата выпуска: 2023-08-10
В этот выпуск вошли различные исправления, внесённые после версии 11.20. За информацией о нововведениях версии 11 обратитесь к Разделу E.55.
Сообщество PostgreSQL прекратит выпуск обновлений для версии 11.X в ноябре 2023 г. Поэтому пользователям не следует медлить с переходом на более новую основную версию.
E.34.1. Миграция на версию 11.21
Если используется версия 11.X, выгрузка/восстановление базы не требуется.
Однако если вы используете индексы BRIN, может быть целесообразно их перестроить; прочитайте вторую запись в списке изменений.
Если вы обновляете сервер с более ранней версии, чем 11.14, см. также Раздел E.41.
E.34.2. Изменения
Запрет замены имени схемы или владельца в скрипте расширения, если имя содержит кавычку, обратную косую черту или знак доллара (Ной Миш)
Данное ограничение защищает от атак методом SQL-инъекций через доверенные расширения.
Проект PostgreSQL благодарит Мику Гейта, Валери Вулард, Тима Кэри-Смита и Кристофа Берга за сообщение об этой проблеме. (CVE-2023-39417)
Устранение путаницы в индексах BRIN между пустыми (без строк) зонами и зонами, заполненными NULL; исправление неправильного слияния сводок по зонам, заполненным NULL (Томаш Вондра)
Каждое из этих упущений могло приводить к потере информации о том, что зона индекса BRIN содержала какие-либо значения NULL, так что последующие запросы, которые должны были возвращать NULL, не делали этого.
Это исправление само по себе не корректирует ошибочные записи BRIN. Рекомендуется выполнить
REINDEXдля всех индексов BRIN, которые могут использоваться для поиска NULL.Предотвращение ситуации, когда после прерывания команды
DROP DATABASEбаза данных остаётся повреждённой, но доступной (Андрес Фройнд)Если команда
DROP DATABASEпрерывалась после того, как начала выполнять необратимые действия, целевая база данных оставалась доступной (поскольку происходил откат удаления её строкиpg_database), но её содержимое повреждалось. Исправление такого поведения заключается в том, что база данных помечается как недоступная до начала выполнения необратимых операций. Последующий сбой данной команды оставит базу данных частично доступной, но единственно возможное действие для неё — выполнить ещё одну командуDROP DATABASE.Обеспечение правильной пометки секционированных индексов как рабочих или нерабочих при их создании (Микаэль Пакье)
Если новый секционированный индекс совпадал с существующим, но нерабочим индексом в одной из секций, этот секционированный индекс мог быть преждевременно помечен как рабочий. Это могло приводить к неправильному поведению или сбоям проверочных утверждений в последующих запросах к секционированной таблице.
Игнорирование нерабочих дочерних индексов при сопоставлении секционированных индексов с дочерними во время выполнения
ALTER TABLE ATTACH PARTITION(Микаэль Пакье)Такие индексы теперь игнорируются, и вместо них создаются новые дочерние индексы.
Устранение возможной ошибки при пометке секционированного индекса как рабочего после присоединения всех его секций (Микаэль Пакье)
При обновлении записи индекса в
pg_indexмогли использоваться устаревшие данные для других столбцов. Одним из обнаруженных симптомов являлась ошибка «attempted to update invisible tuple» (попытка обновить невидимый кортеж).Исправление ошибки в коде, из-за которой команда
ALTER EXTENSION SET SCHEMAне всегда сообщала об ошибке, если расширение содержало какие-либо объекты за пределами схемы расширения (Микаэль Пакье, Хейкки Линнакангас).Команда
ALTER EXTENSION SET SCHEMAдолжна возвращать ошибку, если расширение содержит объекты в нескольких схемах. Эта проверка была запрограммирована некорректно и в некоторых случаях не срабатывала, что приводило к непредсказуемому поведению.Отключение использования частичных уникальных индексов для доказательства уникальности в планировщике (Дэвид Роули)
Использование частичных уникальных индексов могло приводить к созданию неправильных планов, поскольку предполагаемая уникальность строк, прочитанных из таблицы, могла не соблюдаться, если рассматриваемый индекс не использовался для сканирования таблицы.
Предотвращение создания некорректных планов для сторонних соединений с предложениями соединений, содержащими псевдоконстанты (Эцуро Фудзита)
В настоящее время в планировщике отсутствует поддержка добавления предложений соединений, содержащих псевдоконстанты, к удалённому выносимому наружу соединению, поэтому данное исправление отключает создание удалённых соединений в таких случаях. (Более подходящее решение потребует кардинальных изменений структур данных планировщика, поэтому оно будет внесено в одной из следующих основных версий.)
Корректная обработка вложенных операторов SELECT для политик RLS и представлений с барьером безопасности при расширении действий правил (Том Лейн)
Устранение условий гонки при обнаружении конфликтов для режима изоляции
SERIALIZABLE(Томас Манро)Конфликты могли не обнаруживаться при сканировании кучи по битовой карте, при использовании индексов GIN и при проверке изначально пустого индекса-B-дерева. Все эти случаи могли приводить к сбоям сериализуемости, поскольку некорректно допускалась фиксация конфликтующих транзакций.
Устранение периодических сбоев при попытке обновить поле столбца составного типа (Том Лейн)
Если общее значение столбца составного типа было достаточно велико, чтобы потребовалось отдельное хранение значения TOAST, несвоевременная очистка кеша могла приводить к ошибкам или сбоям сервера.
Предотвращение сбоев с переполнением стека при использовании очень сложных шаблонов текстового поиска (Том Лейн)
Добавление возможности использовать фрагменты длиной до 10240 байт в
pg_hba.confиpg_ident.conf(Том Лейн)Предыдущее ограничение в 256 байт оказалось недостаточным в некоторых случаях.
Исправление неправильной обработки условий нехватки памяти C++ (Хейкки Линнакангас)
При использовании JIT нехватка памяти при вызове
newв C++ вызывала критическую ошибку PostgreSQL вместо ожидаемого исключения C++.Предотвращение потери потенциально полезных сегментов общей памяти, когда освобождение страницы приводит к объединению диапазонов свободного пространства (Дунмин Лю)
Сегмент перемещается в соответствующую «корзину» с учётом изменившегося объёма, чтобы его можно было найти при последующем поиске.
Возможность продолжения работы
VACUUMпосле обнаружения определённых типов повреждения индекса-B-дерева (Питер Гейган)Если обнаружена недействительная ссылка на страницу того же уровня, сообщение записывается в журнал и работа продолжается, а не завершается ошибкой как раньше. Исправить повреждённый индекс может только выполнение
REINDEX, но завершениеVACUUMдо перестроения индекса могло значительно ухудшить ситуацию.Обеспечение снятия блокировки
WrapLimitsVacuumLockпосле обнаружения в процессе очистки недопустимых данных вpg_database.datfrozenxidилиpg_database.datminmxid(Андрес Фройнд)Невозможность снятия этой блокировки могла позже приводить к взаимоблокировке, несмотря на то, что блокировка снималась при завершении сеанса или возникновении какой-либо другой ошибки.
Предотвращение двойного воспроизведения подготовленных транзакций во время восстановления после сбоя (suyu.cmj, Микаэль Пакье)
Если происходил сбой во время выполнения контрольной точки с некоторыми уже записанными на диск данными о состоянии двухфазной транзакции, при восстановлении после сбоя подготовленные транзакции могли воспроизводиться дважды, что приводило к критической ошибке, такой как «lock is already held» (блокировка уже получена) в процессе запуска.
Обеспечение выполнения
fsyncдля только что созданной, но пока пустой таблицы в следующей контрольной точке (Хейкки Линнакангас)Раньше функция
fsyncне вызывалась, и при сбое операционной системы пустой файл удалялся, в результате последующие операции с таблицей могли завершаться ошибкой «could not open file» (не удалось открыть файл).Обеспечение внесения в журнал записи о создании слоя инициализации нежурналируемого индекса (Хейкки Линнакангас)
Хотя слой основных данных нежурналируемого индекса не записывается в WAL, слой инициализации индекса должен записываться, чтобы гарантировать согласованное состояние для восстановления индекса после сбоя. Этот шаг пропускался, если слой инициализации не содержал данных, что невозможно при использовании любого стандартного метода доступа к индексу, но возможно при использовании расширений.
Добавление отсутствующих инициализаций флагов окончания задержки контрольной точки (suyu.cmj)
Отсутствие инициализаций могло приводить к ненужным задержкам контрольных точек или сбоям проверочных утверждений в сборках с включёнными проверками.
Предотвращение сбоя проверочного утверждения при обработке пустого оператора через расширенный протокол запросов в уже прерванной транзакции (Том Лейн)
Исправление обработки пустой строки функцией Soundex
difference()вcontrib/fuzzystrmatch(Александр Лахин, Том Лейн)Передача входной строки, не содержащей алфавитных символов, приводила к непредсказуемому результату.
Уточнение проверок пробельных символов во входных данных для
contrib/hstore(Эван Джонс)В некоторых случаях символы ошибочно распознавались как пробельные и поэтому отбрасывались.
Запрет слишком больших входных массивов с классом операторов индекса
gist__int_opsвcontrib/intarray(Анкит Кумар Пандей, Александр Лахин)Раньше выдавалось сообщение
NOTICE, но работа продолжалась, при этом создавалась неверная запись в индексе, что при чтении индекса могло приводить к сбою.Предотвращение бесполезной двойной распаковки записей индекса GiST в
contrib/intarray(Константин Книжник, Маттиас ван де Меент, Том Лейн)Обеспечение актуального состояния
pg_index.indisreplidentв записях кеша отношений (Шрути Говда)В некоторых случаях значение данного поля могло быть устаревшим. Код ядра не использует копию кеша отношений, так что эта ошибка не влияет на работу самого Postgres, но могут быть расширения, для которых это исправление актуально.
Устранение предупреждений при компиляции с использованием OpenSSL 3.0.0 или более поздней версии, о том, что данная версия устарела (Питер Эйзентраут)
E.34. Release 11.21
Release date: 2023-08-10
This release contains a variety of fixes from 11.20. For information about new features in major release 11, see Section E.55.
The PostgreSQL community will stop releasing updates for the 11.X release series in November 2023. Users are encouraged to update to a newer release branch soon.
E.34.1. Migration to Version 11.21
A dump/restore is not required for those running 11.X.
However, if you use BRIN indexes, it may be advisable to reindex them; see the second changelog entry below.
Also, if you are upgrading from a version earlier than 11.14, see Section E.41.
E.34.2. Changes
Disallow substituting a schema or owner name into an extension script if the name contains a quote, backslash, or dollar sign (Noah Misch)
This restriction guards against SQL-injection hazards for trusted extensions.
The PostgreSQL Project thanks Micah Gate, Valerie Woolard, Tim Carey-Smith, and Christoph Berg for reporting this problem. (CVE-2023-39417)
Fix confusion between empty (no rows) ranges and all-NULL ranges in BRIN indexes, as well as incorrect merging of all-NULL summaries (Tomas Vondra)
Each of these oversights could result in forgetting that a BRIN index range contains any NULL values, potentially allowing subsequent queries that should return NULL values to miss doing so.
This fix will not in itself correct faulty BRIN entries. It's recommended to
REINDEXany BRIN indexes that may be used to search for nulls.Avoid leaving a corrupted database behind when
DROP DATABASEis interrupted (Andres Freund)If
DROP DATABASEwas interrupted after it had already begun taking irreversible steps, the target database remained accessible (because the removal of itspg_databaserow would roll back), but it would have corrupt contents. Fix by marking the database as inaccessible before we begin to perform irreversible operations. A failure after that will leave the database still partially present, but nothing can be done with it except to issue anotherDROP DATABASE.Ensure that partitioned indexes are correctly marked as valid or not at creation (Michael Paquier)
If a new partitioned index matches an existing but invalid index on one of the partitions, the partitioned index could end up being marked valid prematurely. This could lead to misbehavior or assertion failures in subsequent queries on the partitioned table.
Ignore invalid child indexes when matching partitioned indexes to child indexes during
ALTER TABLE ATTACH PARTITION(Michael Paquier)Such an index will now be ignored, and a new child index created instead.
Fix possible failure when marking a partitioned index valid after all of its partitions have been attached (Michael Paquier)
The update of the index's
pg_indexentry could use stale data for other columns. One reported symptom is an “attempted to update invisible tuple” error.Fix
ALTER EXTENSION SET SCHEMAto complain if the extension contains any objects outside the extension's schema (Michael Paquier, Heikki Linnakangas)Erroring out if the extension contains objects in multiple schemas was always intended; but the check was mis-coded so that it would fail to detect some cases, leading to surprising behavior.
Don't use partial unique indexes for uniqueness proofs in the planner (David Rowley)
This could give rise to incorrect plans, since the presumed uniqueness of rows read from a table might not hold if the index in question isn't used to scan the table.
Avoid producing incorrect plans for foreign joins with pseudoconstant join clauses (Etsuro Fujita)
The planner currently lacks support for attaching pseudoconstant join clauses to a pushed-down remote join, so disable generation of remote joins in such cases. (A better solution will require ABI-breaking changes of planner data structures, so it will have to wait for a future major release.)
Correctly handle sub-SELECTs in RLS policy expressions and security-barrier views when expanding rule actions (Tom Lane)
Fix race conditions in conflict detection for
SERIALIZABLEisolation mode (Thomas Munro)Conflicts could be missed when using bitmap heap scans, when using GIN indexes, and when examining an initially-empty btree index. All these cases could lead to serializability failures due to improperly allowing conflicting transactions to commit.
Fix intermittent failures when trying to update a field of a composite column (Tom Lane)
If the overall value of the composite column is wide enough to require out-of-line toasting, then an unluckily-timed cache flush could cause errors or server crashes.
Prevent stack-overflow crashes with very complex text search patterns (Tom Lane)
Allow tokens up to 10240 bytes long in
pg_hba.confandpg_ident.conf(Tom Lane)The previous limit of 256 bytes has been found insufficient for some use-cases.
Fix mishandling of C++ out-of-memory conditions (Heikki Linnakangas)
If JIT is in use, running out of memory in a C++
newcall would lead to a PostgreSQL FATAL error, instead of the expected C++ exception.Avoid losing track of possibly-useful shared memory segments when a page free results in coalescing ranges of free space (Dongming Liu)
Ensure that the segment is moved into the appropriate “bin” for its new amount of free space, so that it will be found by subsequent searches.
Allow
VACUUMto continue after detecting certain types of b-tree index corruption (Peter Geoghegan)If an invalid sibling-page link is detected, log the issue and press on, rather than throwing an error as before. Nothing short of
REINDEXwill fix the broken index, but preventingVACUUMfrom completing until that is done risks making matters far worse.Ensure that
WrapLimitsVacuumLockis released afterVACUUMdetects invalid data inpg_database.datfrozenxidorpg_database.datminmxid(Andres Freund)Failure to release this lock could lead to a deadlock later, although the lock would be cleaned up if the session exits or encounters some other error.
Avoid double replay of prepared transactions during crash recovery (suyu.cmj, Michael Paquier)
After a crash partway through a checkpoint with some two-phase transaction state data already flushed to disk by this checkpoint, crash recovery could attempt to replay the prepared transaction(s) twice, leading to a fatal error such as “lock is already held” in the startup process.
Ensure that a newly created, but still empty table is
fsync'ed at the next checkpoint (Heikki Linnakangas)Without this, if there is an operating system crash causing the empty file to disappear, subsequent operations on the table might fail with “could not open file” errors.
Ensure that creation of the init fork of an unlogged index is WAL-logged (Heikki Linnakangas)
While an unlogged index's main data fork is not WAL-logged, its init fork should be, to ensure that we have a consistent state to restore the index to after a crash. This step was missed if the init fork contains no data, which is a case not used by any standard index AM; but perhaps some extension behaves that way.
Fix missing reinitializations of delay-checkpoint-end flags (suyu.cmj)
This could result in unnecessary delays of checkpoints, or in assertion failures in assert-enabled builds.
Avoid assertion failure when processing an empty statement via the extended query protocol in an already-aborted transaction (Tom Lane)
Fix
contrib/fuzzystrmatch's Soundexdifference()function to handle empty input sanely (Alexander Lakhin, Tom Lane)An input string containing no alphabetic characters resulted in unpredictable output.
Tighten whitespace checks in
contrib/hstoreinput (Evan Jones)In some cases, characters would be falsely recognized as whitespace and hence discarded.
Disallow oversize input arrays with
contrib/intarray'sgist__int_opsindex opclass (Ankit Kumar Pandey, Alexander Lakhin)Previously this code would report a
NOTICEbut press on anyway, creating an invalid index entry that presents a risk of crashes when the index is read.Avoid useless double decompression of GiST index entries in
contrib/intarray(Konstantin Knizhnik, Matthias van de Meent, Tom Lane)Ensure that
pg_index.indisreplidentis kept up-to-date in relation cache entries (Shruthi Gowda)This value could be stale in some cases. There is no core code that relies on the relation cache's copy, so this is only a latent bug as far as Postgres itself is concerned; but there may be extensions for which it is a live bug.
Silence deprecation warnings when compiling with OpenSSL 3.0.0 or later (Peter Eisentraut)