E.6. Выпуск 16.1 #
Дата выпуска: 2023-11-09
В этот выпуск вошли различные исправления, внесённые после версии 16.0. За информацией о нововведениях версии 16 обратитесь к Разделу E.7.
E.6.1. Миграция на версию 16.1 #
Если используется версия 16.X, выгрузка/восстановление базы не требуется.
Однако было обнаружено несколько ошибок, потенциально приводивших к тому, что поиск по некоторым типам индексов выдавал неверные результаты поиска или работал необоснованно неэффективно. После установки этого обновления рекомендуется перестроить возможно повреждённые индексы. Подробнее данные изменения описаны в пунктах 4-7 ниже.
E.6.2. Изменения #
Исправление обработки аргументов неизвестного типа в агрегатных функциях
DISTINCT
"any"
(Том Лейн). §Эта ошибка приводила к тому, что значение типа
text
интерпретировалось как значение типаunknown
(то есть строка, завершающаяся нулевым символом), при этом во время выполнения могло раскрываться содержимое памяти сервера после значенияtext
.Проект PostgreSQL благодарит Цзинчжоу Фу за сообщение об этой проблеме. (CVE-2023-5868)
Выявление целочисленного переполнения при вычислении новых размерностей массива (Том Лейн)
При назначении новых элементов индексам массива, которые находятся за пределами границ текущего массива, в особых случаях могло происходить необнаруживаемое целочисленное переполнение. Потенциально были возможны манипуляции с памятью для выполнения произвольного кода, а также раскрытие содержимого памяти сервера.
Проект PostgreSQL благодарит Педро Гальегоса за сообщение об этой проблеме. (CVE-2023-5869)
Запрет для роли
pg_signal_backend
отправлять сигналы обслуживающим процессам и процессам автоочистки (Ной Миш, Йелте Феннема-Нио) § §В документации сказано, что роль
pg_signal_backend
не может отправлять сигналы процессам, принадлежащим суперпользователям. Однако она могла отправлять сигналы обслуживающим процессам, поскольку OID роли у них равен нулю. Теперь такой OID считается указанием принадлежности суперпользователю. Отмена одного из этих типов процессов почти никак не влияет на безопасность с точки зрения основного кода (сразу запускается новый), но обслуживающие процессы расширений могли быть уязвимы.Также теперь гарантируется, что в таких процессах корректно задан параметр
is_superuser
. Конкретных примеров влияния этого упущения на безопасность не обнаружено, но для некоторых расширений оно могло оказаться существенным.Проект PostgreSQL благодарит Хеманта Сандрану и Махендракара Шринивасарао за сообщение об этой проблеме. (CVE-2023-5870)
Устранение некорректного поведения при рекурсивном разделении страницы в процессе построения индекса GiST (Хейкки Линнакангас) §
Устранены случаи, когда положение ссылки вниз на странице отслеживалось неправильно, с помощью введения некоторой логики, позволяющей исправлять такие ошибки, а не продолжать работу, игнорируя их. Устранённая проблема могла приводить к неверным результатам при последующих поисках по индексу. После установки данного обновления может оказаться целесообразным перестроить все индексы GiST.
Предотвращение дублирования записей индекса-B-дерева для столбцов типа
interval
(Ной Миш) §Существуют значения
interval
, которые различаются, но считаются равными при сравнении, например24:00:00
и1 day
, что нарушало работу предположений при исключении дубликатов в индексах-B-деревьях, поэтому столбцы типаinterval
необходимо убрать из такого исключения. Это упущение могло приводить к неправильным результатам сканирования только индекса. Более того, после обновления модуль amcheck сообщает об ошибке почти для всех таких индексов. Пользователям следует перестроить любые индексы-B-деревья для столбцовinterval
.Более корректная обработка значений типа
date
в индексах BRINdatetime_minmax_multi_ops
(Томаш Вондра) §Расчёт расстояния между значениями дат был обратным, что приводило к неверным решениям о выборе записей для слияния сводок. Индекс выдавал правильные результаты, но гораздо менее эффективно, чем должен был. Рекомендуется перестроить индексы BRIN
minmax_multi
для столбцовdate
.Более корректная обработка больших значений типов
timestamp
иtimestamptz
в индексах BRINdatetime_minmax_multi_ops
(Томаш Вондра) § §Ошибочно считалось, что бесконечности находятся не на большом, а на нулевом расстоянии от других значений, что приводило к неверным решениям о выборе записей для слияния сводок. Кроме того, конечные, но очень большие значения (около конечных точек допустимого диапазона временных меток) могли вызывать внутренние переполнения, что также приводило к неверным решениям. Индекс выдавал правильные результаты, но гораздо менее эффективно, чем должен был. Рекомендуется перестроить индексы BRIN
minmax_multi
для столбцовtimestamp
иtimestamptz
, если столбец содержит или содержал бесконечности или большие конечные значения.Предотвращение переполнения вычислений в индексах BRIN
interval_minmax_multi_ops
с крайними значениями интервала (Томаш Вондра) §Эта ошибка могла приводить к неожиданным сбоям при попытке вставить в такой индекс большие значения интервалов.
Исправление поэтапного создания секций и отсечения секций во время выполнения для таблиц, секционированных по хешу с несколькими ключами секционирования (Дэвид Роули) § §
В некоторых случаях, связанных с условием
IS NULL
для одного из ключей секционирования, мог происходить сбой.Исправление несогласованной перепроверки одновременно обновляемых строк во время выполнения команды
MERGE
(Дин Рашид) §Если при изменении строки в режиме
READ COMMITTED
обнаруживается, что целевая строка была только что изменена параллельной транзакцией, для изменённой строки перепроверяются условияWHERE
запроса. Для командыMERGE
не гарантировалось, что во время этой перепроверки использовались правильные строки других соединяемых таблиц, что, возможно, приводило к неправильным решениям о том, должна ли изменённая строка снова изменяться командойMERGE
.Правильное определение целевой таблицы в наследуемой команде
UPDATE
/DELETE
/MERGE
, даже если родительская таблица была исключена ограничениями (Амит Ланготе, Том Лейн) § § §Если ограничение исключало первоначально указанную таблицу, но не всех её потомков в иерархии наследования, первый неисключённый потомок определялся как основная целевая таблица. Из-за этого на уровне операторов срабатывали триггеры, связанные с этой таблицей, а не с первоначально указанной. В версии 16 это упущение могло приводить к появлению ошибок «invalid perminfoindex 0 in RTE with relid NNNN» (неверный perminfoindex 0 в RTE с relid NNNN).
Исправление позиции индекса-B-дерева для предложений ScalarArrayOpExpr в особых случаях при обработке пометки/восстановления (Питер Гейган) §
При восстановлении сканирования индекса с ранее помеченной позицией в коде могли пропускаться необходимые шаги настройки, если сканирование продвинулось точно до конца совпадений для предложения ScalarArrayOpExpr (то есть
indexcol = ANY(ARRAY[])
). Это могло приводить к потере некоторых строк, которые должны были быть включены в выборку при сканировании.Устранение утечки памяти внутри запроса при выполнении Memoize (Алексей Орлов, Дэвид Роули) §
Устранение утечки памяти внутри запроса, когда функция, возвращающая множество, неоднократно не возвращала ни одной строки (Том Лейн) §
Устранение сбоя при применении функции
cursor_to_xmlschema()
к порталу, не возвращающему данные (Боюй Ян) §Устранение неправильного повторного использования условия исходного фильтра при последовательных вызовах функции
pg_logical_slot_get_changes()
(Хоу Чжицзе)Исходное условие, установленное одним вызовом этой функции, повторно использовалось в последующих вызовах, в которых не указан исходный аргумент. Такое поведение было некорректным.
Вывод корректного сообщения об ошибке, если
pgrowlocks()
применяется к секционированной таблице (Дэвид Роули) §Ранее выводилось неточное сообщение об ошибке «only heap AM is supported» (поддерживается только AM в куче).
Более корректная обработка нерабочих индексов специальными SQL-функциями (Ной Миш)
Если одна из функций
pgstatindex()
,pgstatginindex()
,pgstatashindex()
илиpgstattuple()
применяется к нерабочему индексу, в журнал теперь выводится сообщение об ошибке. Если одна из функцийbrin_desummarize_range()
,brin_summarize_new_values()
,brin_summarize_range()
илиgin_clean_pending_list()
применяется к нерабочему индексу, сообщение вносится в журнал в зависимости от уровня отладки. Раньше эти функции пытались обработать индекс и демонстрировали странное поведение в зависимости от результатов невыполненной командыCREATE INDEX
.Предотвращение сбоя из-за преждевременного выделения памяти при длинных входных данных в функции
to_tsvector()
(Том Лейн) §Исключение выделения лишнего пространства на диске для созданного
tsvector
в функцииtsvectorrecv()
(Денис Ерохин) §Если входящий вектор включает данные о местоположении, в результате выполнения двоичной функции приёма использовалось лишнее пространство (примерно равное размеру данных о положении) в готовом
tsvector
. В особых случаях это могло приводить к сбою из-за ошибки «maximum total lexeme length exceeded» (превышена максимальная общая длина лексемы) для векторов, длина которых на момент создания была ниже ограничения. В любом случае это могло приводить к потере места на диске.Улучшение проверки на наличие повреждений данных, сжатых методом PGLZ (Флавьен Гедес) §
Исправление команды
ALTER SUBSCRIPTION
для отражения изменений работы параметраrun_as_owner
(Хоу Чжицзе) §Исправление массовой вставки данных в секционированные таблицы (Андрес Фройнд) §
Неправильное использование состояния вставки между секциями могло приводить к сбоям во время выполнения
COPY FROM
, что обычно проявлялось в виде ошибок вида «could not read block NNNN in file XXXX: read only 0 of 8192 bytes» (не удалось прочитать блок NNNN в файле XXXX (прочитано байт: 0 из 8192)).Предотвращение вычисления стандартных значений столбца, которые не понадобятся команде
COPY FROM
(Лауренц Альбе) §Это исправление позволяет предотвратить возможную ошибку, когда значение по умолчанию фактически недопустимо для столбца, или если выражение по умолчанию не может быть вычислено в текущем контексте. Такие особые случаи иногда возникают, например, при восстановлении резервных копий. В предыдущих версиях такие ошибки не наблюдались, поэтому исправление внесено в версию 16.
Исправление сообщения об ошибке при необходимости преобразования неподдерживаемой кодировки в
COPY FROM
(Том Лейн) §Во время недавней реорганизации кода была случайно удалена соответствующая проверка ошибок для этого случая, так что выводилось сообщение «cache lookup failed for function 0» (ошибка поиска в кеше для функции 0) вместо нужного сообщения.
Предотвращение сбоя команды
EXPLAIN
в случаях, если параметр, помеченный как отображаемый вEXPLAIN
, имеет значение NULL при старте системы (Син Го, Александр Алексеев, Том Лейн) §Ни один встроенный параметр не соответствует этому описанию, но такие параметры могут определяться в расширениях.
Обеспечение существования снимка при удалении временных таблиц условием
ON COMMIT DROP
(Том Лейн) §Это исправление предотвращает возможное неправильное поведение в случаях, когда какие-либо записи каталога для временных таблиц имеют достаточно длинные поля, требующие применения TOAST (например, очень сложное условие
CHECK
).Предотвращение неправильной реакции дочерних процессов, только что созданных функцией
system()
, на сигналы завершения работы (Натан Боссарт) §Это исправление позволяет избежать условий гонки, при которых дочерний процесс, выделенный функцией
system()
, но ещё не выполнивший намеченную дочернюю программу, может получить сигнал, предназначенный для процесса родительского сервера и завершить работу. Получение такого сигнала приводило к выполнению дублирующихся действий по очистке.Устранение разрывов чтения
pg_control
в клиентских программах (Томас Манро) §В некоторых файловых системах чтение
pg_control
может не быть атомарным действием при одновременной записи этого файла сервером. Этот случай можно обнаружить по неверной контрольной сумме (CRC). Теперь попытка чтения повторяется несколько раз, чтобы проверить, станет ли файл допустимым, прежде чем выводится сообщение об ошибке.Предотвращение разрывов чтения
pg_control
в соответствующих SQL-функциях (Томас Манро) §Перед чтением
pg_control
получается соответствующая блокировка для обеспечения согласованного представления этого файла.Исправление ошибок «could not find pathkey item to sort» (не удалось найти элемент ключа пути для сортировки), возникающих при планировании агрегатных функций с параметрами
ORDER BY
илиDISTINCT
(Дэвид Роули) §Предотвращение целочисленного переполнения при вычислении размера массива строк активности обслуживающего процесса (Якуб Вартак) §
На 64-разрядных машинах допускаются достаточно большие значения
track_activity_query_size
, чтобы вызвать 32-разрядное переполнение при умножении на разрешённое количество соединений. Однако в коде, фактически выделяющем локальный массив для каждого обслуживающего процесса, были упущения, и массив выделялся неправильно.Исправление кратковременного отображения противоречивой статистики выполнения команды
ANALYZE
для унаследованных таблиц (Хейкки Линнакангас) §Счётчикам на уровне блоков должно присваиваться нулевое значение одновременно с изменением поля текущего отношения.
Исправление процесса фоновой записи для передачи счётчикам статистики информации о любых записях в WAL, выполняемых этим процессом (Назир Билал Явуз) §
Устранение путаницы с поведением принудительного сброса данных на диск в функции
pgstat_report_wal()
(Рёга Йошида, Микаэль Пакье)Ранее некоторые статистики о вводе-выводе WAL терялись при завершении работы.
Исправление отслеживания статистики расширений временных таблиц (Карина Лицкевич, Андрес Фройнд) §
Ранее расширение временных таблиц учитывалось как запись в обычные таблицы, а не временные.
Учёт времени, затраченного на операции расширения отношений, как времени записи, если включён параметр
track_io_timing
(Назир Билал Явуз) §Отслеживание зависимостей кешированных операторов
CALL
и их перепланирование, если оно необходимо (Том Лейн) §Команды DDL, такие как замена функции, встроенной в аргумент
CALL
, могут вызвать необходимость перепланированияCALL
, кешированного PL/pgSQL. Ранее перепланирование не выполнялось, что приводило к неправильному поведению или странным ошибкам, таким как «cache lookup failed» (не удалось выполнить поиск в кеше).Предотвращение возможного сбоя из-за вызова pfree для нулевого указателя в случае ошибки при установлении соединения OpenSSL (Сергей Шиндерук) §
Правильное отслеживание глубины вложенности при проверке переменных типа
RECORD
на внешних уровнях запроса (Ричард Гуо) §Неправильное отслеживание могло приводить к сбоям проверочных утверждений, аварийным сбоям или ошибкам «bogus varno» (неприемлемое значение varno).
Отслеживание зависимостей хеш-функций и обратных функций узлов плана ScalarArrayOpExpr (Дэвид Роули) §
В большинстве случаев исправленное упущение было безвредным, поскольку эти функции были доступны, пока работал исходный оператор узла.
Исправление некорректной обработки ошибок в управлении кешем типа
RECORD
(Томас Манро) §Ошибка нехватки памяти, возникающая в неподходящее время, могла оставлять после себя несогласованное состояние, приводившее к зацикливанию.
Обработка ошибок, связанных с нехваткой памяти при чтении WAL, как критических (Микаэль Пакье)
Раньше они рассматривались как ошибки о неприемлемых данных, в результате чего делался вывод о достижении конца WAL, что было некорректно и могло приводить к несогласованному воспроизведению WAL.
Исправление возможного сбоя восстановления из-за попытки выделить память на основе неприемлемой длины записи WAL (Томас Манро, Микаэль Пакье) § §
Исправление ошибки «could not duplicate handle» (не удалось продублировать указатель), возникавшей в Windows, когда значение
min_dynamic_shared_memory
было больше нуля (Томас Манро) §Исправление порядка операций в
GenericXLogFinish
(Джефф Девис) §В коде были нарушены условия, необходимые для обеспечения безопасности данных при сбое, поскольку запись в WAL происходила перед тем, как изменённые буферы помечались как «грязные». В коде ядра эта функция не используется, но её используют расширения (например,
contrib/bloom
).Удаление неверного проверочного утверждения при обработке исключений PL/Python (Александр Лахин) §
Исправление в программе pg_dump, позволяющее записывать новый параметр подписок
run_as_owner
(Филип Уорнер).Из-за исправленного упущения ранее в версии 16 подписки всегда восстанавливались со значением
false
параметраrun_as_owner
, в отличие от предыдущих.Исправление поведения утилиты pg_restore для включения в выборочное восстановление начальных прав доступа как на уровне таблицы, так и на уровне столбца для выбранных таблиц (Эйлер Тавейра, Том Лейн) §
Ранее при наличии прав обоих уровней восстанавливались только права на уровне таблицы.
Добавление в программу pg_upgrade логики для проверки использования типов данных
abstime
,reltime
иtinterval
(Álvaro Herrera ) §Эти устаревшие типы данных были удалены в PostgreSQL версии 12, поэтому добавлена проверка, чтобы убедиться в их отсутствии в старой базе данных перед выполнением её обновления.
Предотвращение ложных ошибок «too many client connections» (слишком много клиентских подключений) при использовании программы pgbench в Windows (Ной Миш) §
Исправление обработки нескольких ключей
-N
утилитой vacuumdb (Натан Боссарт, Кувамура Масаки) §Несколько ключей
-N
должны исключать таблицы в нескольких схемах, но на самом деле этого не происходило из-за ошибочной конструкции сгенерированного запроса.Исправление работы утилиты vacuumdb для учёта параметра
--buffer-usage-limit
в режиме только анализа (Рёга Йошида, Дэвид Роули) §Исключение сообщений о повреждении данных при прерванном удалении страницы в
contrib/amcheck
(Ной Миш) §Это исправление предотвращает выдачу несоответствующих сообщений об ошибках «the first child of leftmost target page is not leftmost of its level» (первый дочерний элемент крайней левой целевой страницы не является крайним левым на её уровне), «block NNNN is not leftmost» (блок NNNN не является крайним левым) или «left link/right link pair in index XXXX not in agreement» (пара левая ссылка/правая ссылка в индексе XXXX не согласуется). Эти сообщения появлялись, если модуль amcheck запускался после незавершённого удаления страницы индекса-B-дерева и до выполнения очистки
VACUUM
.Исправление ошибки в индексах
contrib/btree_gin
по столбцамinterval
, проявлявшейся при сканировании индекса с использованием оператора<
или<=
(Дин Рашид)Ранее при таком сканировании выдавались не все элементы, которые должны были.
Добавление поддержки LLVM версий 16 и 17 (Томас Манро, Дмитрий Долгов) § § §
Подавление различных предупреждений во время сборки в последней версии macOS (Том Лейн) § §
В среде Xcode 15 (выпущенной вместе с macOS Sonoma) изменилось поведение компоновщика таким образом, что при сборке PostgreSQL появляется множество предупреждений о дублирующихся библиотеках. Они безвредны, но раздражают, поэтому повторное упоминание библиотек было удалено. Также исключено использование флага компоновщика
-multiply_defined suppress
, который долгое время не использовался и стал причиной множества жалоб пользователей.Возврат к использованию
python
при сборке файла правилcontrib/unaccent
, если не был указан параметр--with-python
и не была задана переменнаяmake
PYTHON
(Япинь Ли) §Удаление
PHOT
(время на островах Феникс) из списка аббревиатур часовых поясов по умолчанию (Том Лейн) §Присутствие этой аббревиатуры в списке по умолчанию могло приводить к ошибкам в последних выпусках Debian и Ubuntu, поскольку в них больше не устанавливается базовая запись tzdb по умолчанию. Поскольку это аббревиатура для зоны с общим населением около двух десятков человек, от неё вполне можно отказаться. При необходимости её можно указать в пользовательском файле аббревиатур.