E.27. Релиз 15.3#
E.27. Релиз 15.3
Дата релиза: 2023-05-11
Этот релиз содержит различные исправления из версии 15.2. Для информации о новых функциях в основном релизе 15, смотрите Раздел E.30.
E.27.1. Миграция на Версию 15.3
Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.
Однако, если вы обновляетесь с версии ранее 15.1, см. Раздел E.29.
E.27.2. Изменения
Предотвращено, чтобы
CREATE SCHEMA
не нарушала изменения вsearch_path
(Александр Лахин) § §Внутри команды
CREATE SCHEMA
, объекты в действующемsearch_path
, а также те, что в вновь созданной схеме, будут видимы даже внутри вызванной функции или скрипта, которые пытаются установить безопасныйsearch_path
. Это может позволить любому пользователю, имеющему разрешение на создание схемы, захватить привилегии функции определителя безопасности или скрипта расширения.Проект PostgreSQL благодарит Александра Лахина (Alexander Lakhin) за сообщение об этой проблеме. (CVE-2023-2454)
Политики безопасности на уровне строк корректно применены после встраивания функции, возвращающей набор (Стивен Фрост, Том Лейн) §
Если функция SQL-языка, возвращающая набор, ссылается на таблицу с политиками защиты на уровне строк, и она может быть встроена в вызывающий запрос, то в некоторых случаях, связанных с повторным использованием кэшированного плана под другой ролью, эти политики RLS могут не применяться должным образом. Это может позволить пользователю видеть или изменять строки, которые должны были быть невидимыми.
Проект PostgreSQL благодарит Вольфганга Вальтера (Wolfgang Walther) за сообщение об этой проблеме. (CVE-2023-2455)
Исправлена потенциальная порча шаблона (исходной) базы данных после
CREATE DATABASE
с опциейSTRATEGY WAL_LOG
(Натан Боссарт, Рё Мацуура) §Неправильная обработка буфера создавала риск того, что любые последующие изменения каталога
pg_class
шаблона могут быть потеряны.Исправлена утечка памяти и ненужные чтения с диска во время
CREATE DATABASE
с опциейSTRATEGY WAL_LOG
(Андрес Фройнд) §Избегался сбой, когда новое имя схемы опущено в
CREATE SCHEMA
(Майкл Пакье) §Стандарт SQL позволяет записывать
CREATE SCHEMA AUTHORIZATION
, при этом имя схемы по умолчанию равноowner_name
owner_name
. Однако некоторые части кода ожидают наличие имени схемы и могут не работать.Исправлены различные сбои планировщика с командами
MERGE
(Tom Lane) § §Планирование может завершиться с ошибками, такими как “переменная не найдена в списке целей подплана” или “PlaceHolderVar обнаружен там, где не ожидался”.
Исправлено количество строк, сообщаемое
MERGE
для некоторых крайних случаев (Дин Рашид) § §Количество строк, указанное в теге команды, учитывало строки, которые на самом деле не были изменены из-за возвращения NULL триггером
BEFORE ROW
. Это несоответствует тому, что происходит в обычномUPDATE
илиDELETE
, поэтому измените это, чтобы не учитывать такие строки. Кроме того, избегайте двойного учета строки когдаMERGE
перемещает ее в другую секцию секционированной таблицы.Исправлены проблемы
MERGE
с параллельными обновлениями (Дин Рашид, Álvaro Herrera) § §Некоторые случаи работали неправильно, если строка, которую нужно было обновить или удалить с помощью
MERGE
, только что была обновлена параллельной транзакцией. Это могло привести к сбою, или к выполнению неправильного действия слияния, или вообще никакого действия.Добавлена поддержка декомпиляции команд
MERGE
(Álvaro Herrera) §Это было упущено, когда была добавлена команда
MERGE
, но это необходимая поддержка дляMERGE
в новом стиле SQL функций.Исправлено включение/отключение триггеров внешнего ключа в секционированных таблицах (Tom Lane) §
ALTER TABLE ... ENABLE/DISABLE TRIGGER
не удалось, если применяется к триггерам обеспечения внешнего ключа секционированной таблицы, потому что он пытался найти клонированные триггеры для секций по имени, и они не имеют одинакового имени. Найдите их по родительскому OID триггера вместо этого.Запрещено изменение составных типов, которые хранятся в индексах (Tom Lane) §
ALTER TYPE
запрещает несовместимые с бинарным форматом изменения составных типов, если они хранятся в любых столбцах таблицы. (Возможно, это будет разрешено в один прекрасный день, но пока этого не произошло; последствия блокировки при перезаписи многих таблиц внушают страх.) Мы не учли возможность того, что индекс может содержать составной тип, который не присутствует в его таблице.Системные столбцы не разрешены в качестве элементов внешних ключей (Tom Lane) §
С момента удаления OID в качестве системного столбца, нет убедительного примера использования этого, и различные части кода больше его не поддерживают. Запретите его, а не пытайтесь исправить все случаи.
Убедитесь, что
COPY TO
из родительской таблицы с включенной RLS не копирует строки из дочерних таблиц (Антонин Хоуска) §Документация достаточно четко указывает, что
COPY TO
копирует строки только из указанной таблицы, не затрагивая дочерние таблицы наследования, которые она может иметь. Однако, если на таблице была включена защита на уровне строк, то это перестает быть верным.Избежано возможного сбоя, когда
array_position()
илиarray_positions()
передан пустой массив (Tom Lane) §Исправлено возможное выход за границы при извлечении в
to_char()
(Tom Lane) §При невезении это могло привести к сбою сервера.
Избегалось переполнения буфера в функции
translate()
(Даниил Анисимов) §При использовании функции удаления, функция может получить байт сразу после входной строки, создавая небольшой риск сбоя.
Настроена логика классификации символов, связанных с текстовым поиском, для правильного определения, является ли текущая локаль
C
(Джефф Дэвис) §Этот код сбивался, если правило сортировки по умолчанию в базе данных использовал ICU.
Избежано возможного сбоя при пустом вводе для типа
interval
(Tom Lane) §Снова разрешено использование экспоненциальной нотации в полях интервала ISO-8601 (Tom Lane) §
Ввод интервала, такой как
P0.1e10D
, официально не утвержден ISO-8601, но мы принимали его долгое время до версии 15, поэтому снова разрешим его.Исправлена ошибка установки курсора для ошибок разбора в строковых литералах JSON (Tom Lane) §
В большинстве случаев, когда в строковом литерале внутри значения JSON обнаруживается синтаксическая ошибка, курсор ошибки не устанавливается должным образом. Это приводило по крайней мере к бесполезному сообщению об ошибке (указывающему на компонент перед строкой, а не на реальное место проблемы), и могло даже привести к сбою в версии v14 и более поздних.
Исправлена порча данных из-за
vacuum_defer_cleanup_age
, превышающего текущее 64-битное xid (Андрес Фройнд) §В v14 и более поздних версиях с нестандартными настройками
vacuum_defer_cleanup_age
, было возможно вычислить очень большой горизонт очистки vacuum xid, что приводило к удалению строк, которые все еще активны. v12 и v13 имеют меньшую форму той же проблемы, затрагивающей только GiST индексы, что могло привести к слишком раннему перераспределению страниц индекса.Исправлена ошибка парсера, из-за которой не обнаруживались некоторые случаи неправильно вложенных агрегатов (Tom Lane) §
Этот просмотр мог привести к сбоям исполнителя для запросов, которые должны были быть отклонены как недействительные.
Исправлена порча структуры данных при разборе серийных опций
SEQUENCE NAME
(Дэвид Роули) §Это может привести к проблемам, если триггер события захватывает поврежденное дерево разбора.
Корректно обновлены отметки безопасности параллелизма узлов плана при перемещении initplans из одного узла в другой (Tom Lane) §
Этот недочет планировщика мог привести к ошибкам “subplan was not initialized” во время выполнения.
Избегалась ошибка с PlaceHolderVars в коде расширенной статистики (Tom Lane) §
Использование статистики типа зависимости могло привести к сбою с “PlaceHolderVar найден там, где его не ожидали”.
Исправлены некорректные проверки на то, может ли квалификационное условие, применяемое к подзапросу, быть преобразовано в “условие выполнения” оконной агрегатной функции внутри подзапроса (David Rowley) §
SubPlan внутри такого предложения мог бы вызвать сбои утверждений или неправильные ответы, как и в некоторых других необычных случаях.
Отключена оптимизация обратного перехода для оконных агрегатов, когда вызов содержит подзапросы (Дэвид Роули) §
Эта оптимизация требует, чтобы выражения аргументов агрегата давали повторяемые результаты, что может не соблюдаться для подзапроса.
Исправлены упущения в выполнении вложенных конструкций
ARRAY[]
(Александр Лахин, Том Лейн) §Правильно обнаруживайте переполнение общего пространства, необходимого для результирующего массива, избегая возможного сбоя из-за недостаточного выделения выходных ресурсов. Также убедитесь, что любое завершающее пространство в результирующем массиве обнулено; хотя оставление мусора там безвредно для большинства целей, это может привести к странному поведению позже.
Предотвращено падение при обновлении поля в столбце типа массив-домена-над-композитным-типом (Дмитрий Долгов) §
Исправлена логика отсечения секций для разделения по булевым столбцам (Дэвид Роули) §
Отсечение с условием вроде
boolcol IS NOT TRUE
была выполнена неправильно, что могло привести к невозвращению строк, в которыхboolcol
является NULL. Также, довольно маловероятный случай секционирования наNOT boolcol
был обработан неправильно.Исправлено состояние гонки при очистке по пакетам во время параллельного хеш-соединения (Томас Мунро, Мелани Плэгеман) §
Возможен сбой при неудачном тайминге и
parallel_leader_participation
=off
(что не является значением по умолчанию).Пересчитаны
GENERATED
столбцы после проверки EvalPlanQual (Tom Lane) §В режиме изоляции
READ COMMITTED
, эффекты обновления строки могут потребовать повторного применения к более новой версии строки, чем та, которую изначально нашел запрос. Если это так, нам нужно пересчитать все столбцыGENERATED
, на случай, если они зависят от столбцов, которые были изменены параллельным обновлением.Исправлена утечка памяти в выполнении плана Memoize (Дэвид Роули) §
Исправлена утечка счетчика ссылок на буфер при использовании пакетных вставок для внешней таблицы, включенной в дерево разделов (Александр Пыхалов) §
Поддержка настроек
vacuum_cost_delay
с субмиллисекундной точностью восстановлена (Томас Мунро) §Не балансировалась задержка стоимости vacuum, когда у таблицы было установлено значение
vacuum_cost_delay
равное нулю (Масахико Савада) §Отключение выравнивания времени задержек предполагается всегда, когда автоочистка обрабатывает таблицу с настройкой
vacuum_cost_delay
для каждого отношения, но это было сделано только для активных настроек, а не для нулевых.Исправлены сбои в крайних случаях, когда столбцы были добавлены в конец представления (Tom Lane) §
Исправлена редкая ошибка подпланов MULTIEXPR_SUBLINK в обновлениях с разделами (Андрес Фройнд, Том Лейн) §
Использование синтаксиса
INSERT ... ON CONFLICT DO UPDATE SET (c1, ...) = (SELECT ...)
с целевой таблицей, секционированной на части, может привести к сбою, если любая дочерняя таблица отличается от родительской (например, другой физический порядок столбцов). Это обычно проявляется как сбой проверок согласованности в исполнителе; но также возможны сбои или некорректные обновления данных.Исправлено обработку маркеров
DEFAULT
в многострочном запросеINSERT ... VALUES
на представлении, которое имеет правилоDO ALSO INSERT ... SELECT
(Дин Рашид) §Такие случаи обычно завершались ошибками “нераспознанный тип узла” или сбоями утверждения.
Поддержка ссылок на
OLD
иNEW
в подзапросах в действиях правил (Дин Рашид, Том Лейн) §Такие ссылки на самом деле являются поперечными ссылками, но сервер может выйти из строя, если подзапрос явно не помечен как
LATERAL
. Обеспечьте это неявно, когда это необходимо.При декомпиляции правила или тела SQL функции, содержащих
INSERT
/UPDATE
/DELETE
в пределахWITH
, следовало позаботиться о правильной печати псевдонима для целевой таблицы (Tom Lane) §Исправлены сбои в оптимизации
SERIALIZABLE READ ONLY
(Томас Мунро) § §Транзакции, уже помеченные как “обреченные”, сбивали с толку оптимизацию безопасного снимка для
SERIALIZABLE READ ONLY
транзакций. Оптимизация была ненужно прне указана в некоторых случаях. В других случаях происходил сбой утверждения (но в сборках без утверждений проблем не было).Избегать утечки слотов обратного вызова кэша в плагине логического декодирования
pgoutput
(Shi Yu) §Многократный запуск и выключение плагина в течение одной сессии в конечном итоге приведет к ошибке “не хватает слотов в списке relcache_callback_list”.
Избегались ненужные вызовы пользовательских валидаторов для параметров класса операторов индекса (Александр Коротков) §
Это изменение исправляет некоторые случаи, когда возникала неожиданная ошибка.
Избегалась бесполезная работа при сканировании многоколонного BRIN-индекса с несколькими ключами сканирования (Tomas Vondra) §
Существующий код фактически учитывал только последний ключ сканирования при принятии решения о соответствии диапазона, таким образом, обычно сканируя больше индекса, чем это было необходимо.
Исправлена обработка сетевой маски в классе операторов BRIN inet_minmax_multi_ops (Томаш Вондра) §
Эта ошибка вызвала сбой утверждения в сборках с включенным assert, но в основном безвредна в производственных сборках.
Исправлено разыменование висячего указателя во время построения буферизации индекса GiST (Александр Лахин) §
Эта ошибка, как правило, не вредит в рабочих сборках, поскольку полученное значение не является критическим; но в принципе это может вызвать сбой сервера.
Игнорировались удалённые столбцы и генерируемые столбцы во время логической репликации действия обновления или удаления (Onder Kalaci, Shi Yu) § §
Репликация с опцией
REPLICA IDENTITY FULL
не удалась, если таблица содержала такие столбцы.Исправлено название события ожидания для ввода-вывода буфера SLRU для временных меток фиксации (Александр Лахин) §
Это событие ожидания называется
CommitTsBuffer
согласно документации, но в коде оно было какCommitTSBuffer
. Измените код, чтобы он соответствовал документации, так как этот способ более согласован с именованием связанных событий ожидания.Повторно активирована отчетность о событии ожидания
SLRUFlushSync
(Томас Мунро) §Отчет об этом типе ожидания был случайно удален при рефакторинге кода.
Избежано возможного переполнения при расчете количества сегментов WAL, которые нужно сохранить (Kyotaro Horiguchi) §
Это может привести к тому, что
wal_keep_size
не будет точно соблюдаться.Отключена избыточная нагрузка на отчет о ходе запуска в режиме ожидания (Bharath Rupireddy) §
В режиме ожидания мы на самом деле не сообщаем о прогрессе восстановления, но мы все равно продолжаем работу по его отслеживанию.
Поддержка сертификатов RSA-PSS с привязкой канала SCRAM-SHA-256 (Джейкоб Чемпион, Хейкки Линкангас) §
Для использования этой функции требуется сборка с OpenSSL 1.1.1 или новее. Это касается как сервера, так и libpq.
Избегание состояния гонки с отслеживанием идентификатора процесса в Windows (Томас Мунро) § § §
Операционная система может повторно использовать PID до того, как постмастер заметит, что дочерний процесс исчез. Это может привести к отслеживанию более чем одного дочернего процесса с тем же PID, что вызовет путаницу.
Исправлена
list_copy_head()
для корректной работы с пустым списком (Дэвид Роули) §Этот случай не известен как достижимый для любого основного кода PostgreSQL, но расширения могут полагаться на его работоспособность.
Добавлены отсутствующие случаи в
SPI_result_code_string()
(Дин Рашид) §Исправлены ошибочные пометки Valgrind в
AllocSetRealloc()
(Карина Лицкевич) §В маловероятном случае, когда размер большого (>8kB) блока palloc уменьшается, сборка, осведомленная о Valgrind, может неправильно пометить состояние определенности освобожденной из блока памяти, возможно вызывая некорректные результаты во время тестирования Valgrind.
Исправлена ошибка утверждения для
MERGE
в секционированную таблицу с включенной построчной безопасностью (Дин Рашид) §Избежано сбоя утверждения при декодировании транзакционного логического сообщения репликации (Tomas Vondra) §
Избегалась чувствительность к локали при обработке экранирования регулярных выражений (Джефф Дэвис) §
Обратная косая черта, за которой следует символ, не являющийся ASCII, иногда может вызвать сбой утверждения, в зависимости от текущей локали.
Избегалось попыток записать пустую запись WAL в
log_newpage_range()
, когда последние несколько страниц в указанном диапазоне пусты (Маттиас ван де Меент) §Не совсем ясно, достижим ли этот случай в выпущенных ветках, но если это так, то может произойти сбой утверждения.
Исправлена утечка памяти в течение сессии в plpgsql
DO
блоках, которые используют выражения приведения (Ajit Awekar, Tom Lane) §Ужесточены проверки размерности массива при преобразовании структур списков Perl в многомерные SQL массивы (Tom Lane) §
plperl мог вести себя неправильно, когда вложенность подсписков была несогласованной, так что данные не представляли собой прямоугольный массив значений. Такие случаи теперь вызывают ошибки, но ранее они могли привести к сбою или мусорному выводу.
Ужесточены проверки размерности массивов при преобразовании структур списков Python в многомерные SQL массивы (Tom Lane) § §
plpython мог вести себя неправильно при работе с пустыми подсписками или когда вложенность подсписков была несогласованной, так что данные не представляли собой прямоугольный массив значений. Первое должно было привести к пустому выходному массиву, а второе - к ошибке. Но в некоторых случаях это приводило к сбою, а в других - к неожиданному выводу.
Исправлено разворачивание стека исключений в plpython (Син Го) §
Некоторые редкие случаи сбоев могут вернуться без очистки стека исключений PG_TRY, рискуя сбоем, если другая ошибка была вызвана до того, как следующий уровень стека был размотан.
Исправлена непоследовательная обработка ошибок GSS-шифрования в libpq's
PQconnectPoll()
(Michael Paquier) §При установленном значении
gssencmode
вrequire
, соединение не помечалось как нерабочее после сбоя инициализации GSS. Заставьте его немедленно выйти из строя, как это давно делается в эквивалентном случае для шифрования TLS.Исправлена возможная порча данных в программах ecpg, собранных с опцией
-C ORACLE
(Kyotaro Horiguchi) §Когда вызывается
ecpg_get_data()
сvarcharsize
, установленным в ноль, он может записать завершающий нулевой символ в последний байт предыдущего поля, обрезая данные в этом поле.Исправлено pg_dump так, чтобы секционированные таблицы, которые секционированы по хешу на столбце типа enum, могли быть успешно восстановлены (Tom Lane) §
Поскольку хеш-коды для значений enum зависят от OID, присвоенных enum, они обычно отличаются после дампа и восстановления, что означает, что строки часто должны попасть в другую секцию, чем они были изначально. Пользователи могут обойти это, указав опцию
--load-via-partition-root
; но поскольку шансы на успех без этого очень малы, научите pg_dump автоматически применять его к таким таблицам.Также, pg_restoreнастроен так, чтобы он не пытался усекать (
TRUNCATE
) целевые таблицы перед восстановлением в них, когда используется режим--load-via-partition-root
. Это позволяет избежать риска взаимных блокировок и потери данных.Файлы, не поддерживающие поиск, корректно обнаружены в Windows (Хуан Хосе Санта-Мария Флеча, Майкл Пакье, Даниэль Ватцингер) § §
Этот баг приводил к неправильной работе, когда pg_dump записывал в канал или pg_restore читал из него.
В pgbench в режиме “prepared” все команды в конвейере были подготовлены перед запуском конвейера (Álvaro Herrera) §
Это позволяет избежать сбоя, когда скрипт pgbench пытается запустить сериализуемую транзакцию внутри конвейера.
В коде проверки heap в
contrib/amcheck
правильно обработаны кортежи с нулевым xmin или xmax (Роберт Хаас) § §В
contrib/amcheck
корректно обработаны xids, которые кажутся до нулевой эпохи (Andres Freund) §В случаях повреждения данных можно видеть обернутый 32-битный xid, который кажется предшествующим первой эпохе xid. Повышение такого значения до 64-битной формы приводит к значению, далеко в будущем, что приводит к неверным отчетам. Для корректной работы, возвращайте FirstNormalFullTransactionId в таких случаях.
В
contrib/basebackup_to_shell
правильно обнаружено сбой при открытии канала (Роберт Хаас) §В
contrib/hstore_plpython
избегалось аварийное завершение, если значение Python, которое должно быть преобразовано, не являлось отображением (Дмитрий Долгов, Том Лейн) §Это должно вызвать ошибку, но Python 3 изменил некоторые API таким образом, что привело к неправильной работе проверки, что позволило сбою произойти.
Требовалось, чтобы параметр
siglen
индекса GiST на столбцеltree
, если указан, был кратен 4 (Александр Коротков) §Другие значения приводят к неправильному выравниванию доступа к содержимому индекса, что безвредно на совместимом с Intel оборудовании, но может вызвать сбой на некоторых других архитектурах.
В
contrib/pageinspect
добавлены защиты от некорректного ввода для функцииgist_page_items()
(Дмитрий Коваль) §Исправлено неправильное поведение в
contrib/pg_trgm
с невыполнимым регулярным выражением (Tom Lane) §Регулярное выражение, такое как
$foo
, является допустимым, но невыполнимым; компилятор регулярных выражений распознает это и создает пустой граф NFA. Попытка оптимизации такого графа в индекс pg_trgm GIN или GiST приводила к обращению за пределы рабочего массива, что могло привести к сбоям.Исправлена обработка escape-последовательностей в параметре
application_name
вcontrib/postgres_fdw
(Киотаро Хоригучи, Майкл Пакье) §Код для расширения этих возможностей может не сработать, если он выполняется в фоновом процессе, например, во время автоанализа внешней таблицы.
В
contrib/pg_walinspect
ограничено использование памяти вpg_get_wal_records_info()
(Бхарат Рупиредди) §Использована опция
--strip-unneeded
при удалении статических библиотек с помощью совместимого с GNU strip (Том Лейн) §Ранее,
make install-strip
использовалась опция-x
в этом случае. Это изменение позволяет избежать неправильного поведения llvm-strip, и также дает немного меньший вывод.Прекращена рекомендация автоматической загрузки файлов DTD для сборки документации, и действительно она отключена (Александр Алексеев, Питер Айзентраут, Том Лейн) §
Похоже, что теперь невозможно создать документацию SGML без локальной установки файлов DTD DocBook. Раньше xsltproc мог загружать эти файлы "на лету" с sourceforge.net; но теперь sourceforge.net разрешает только доступ по HTTPS, и ни одна общедоступная версия xsltproc не поддерживает это. Следовательно, удаляем части нашей документации, предполагающие, что это возможно или полезно, и вместо этого добавляем xsltproc's
--nonet
опцию в рецепты сборки.При запуске TAP-тестов в сборках PGXS использовалось более разумное расположение для временного каталога
portlock
(Питер Айзентраут) §Поместите его в
tmp_check
в каталог сборки. С предыдущим кодированием, сборка PGXS пыталась поместить его в каталог установки, которая не обязательно может быть доступна для записи.Обновлены файлы данных часовых поясов до версии tzdata 2023c для изменений закона о летнем времени в Египте, Гренландии, Марокко и Палестине. (Tom Lane) §
При соблюдении московского времени, Europe/Kirov и Europe/Volgograd теперь используют аббревиатуры MSK/MSD вместо числовых аббревиатур, для согласованности с другими часовыми поясами, соблюдающими московское время. Кроме того, America/Yellowknife больше не отличается от America/Edmonton; это влияет на некоторые отметки времени до 1948 года в этой области.