E.37. Выпуск 12.17
Дата выпуска: 2023-11-09
В этот выпуск вошли различные исправления, внесённые после версии 12.16. За информацией о нововведениях версии 12 обратитесь к Разделу E.54.
E.37.1. Миграция на версию 12.17
Если используется версия 12.X, выгрузка/восстановление базы не требуется.
Однако если вы используете индексы BRIN, может быть целесообразно их перестроить; прочитайте четвёртую запись в списке изменений.
Если вы обновляете сервер с более ранней версии, чем 12.16, см. также Раздел E.38.
E.37.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.
Исправление поэтапного создания секций и отсечения секций во время выполнения для таблиц, секционированных по хешу с несколькими ключами секционирования (Дэвид Роули) § §
В некоторых случаях, связанных с условием
IS NULL
для одного из ключей секционирования, мог происходить сбой.Исправление позиции индекса-B-дерева для предложений ScalarArrayOpExpr в особых случаях при обработке пометки/восстановления (Питер Гейган) §
При восстановлении сканирования индекса с ранее помеченной позицией в коде могли пропускаться необходимые шаги настройки, если сканирование продвинулось точно до конца совпадений для предложения ScalarArrayOpExpr (то есть
indexcol = ANY(ARRAY[])
). Это могло приводить к потере некоторых строк, которые должны были быть включены в выборку при сканировании.Устранение утечки памяти внутри запроса, когда функция, возвращающая множество, неоднократно не возвращала ни одной строки (Том Лейн) §
Устранение сбоя при применении функции
cursor_to_xmlschema()
к порталу, не возвращающему данные (Боюй Ян) §Вывод корректного сообщения об ошибке, если
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» (превышена максимальная общая длина лексемы) для векторов, длина которых на момент создания была ниже ограничения. В любом случае это могло приводить к потере места на диске.Исправление некорректного кода в функции
gtsvector_picksplit()
(Александр Лахин) §Ранее могли приниматься некорректные решения о разделении страниц в индексах GiST по столбцам
tsvector
.Исправление работы команд
COMMIT AND CHAIN
/ROLLBACK AND CHAIN
при наличии неосвобождённой точки сохранения (Лю Сян, Том Лейн) §Вместо свойств текущей транзакции ранее эти команды распространяли на новую транзакцию некоторые свойства предыдущей транзакции.
Предотвращение сбоя команды
EXPLAIN
в случаях, если параметр, помеченный как отображаемый вEXPLAIN
, имеет значение NULL при старте системы (Син Го, Александр Алексеев, Том Лейн) §Ни один встроенный параметр не соответствует этому описанию, но такие параметры могут определяться в расширениях.
Обеспечение существования снимка при удалении временных таблиц условием
ON COMMIT DROP
(Том Лейн) §Это исправление предотвращает возможное неправильное поведение в случаях, когда какие-либо записи каталога для временных таблиц имеют достаточно длинные поля, требующие применения TOAST (например, очень сложное условие
CHECK
).Предотвращение неправильной реакции дочерних процессов, только что созданных функцией
system()
, на сигналы завершения работы (Натан Боссарт) § §Это исправление позволяет избежать условий гонки, при которых дочерний процесс, выделенный функцией
system()
, но ещё не выполнивший намеченную дочернюю программу, может получить сигнал, предназначенный для процесса родительского сервера и завершить работу. Получение такого сигнала приводило к выполнению дублирующихся действий по очистке.Устранение разрывов чтения
pg_control
в клиентских программах (Томас Манро) §В некоторых файловых системах чтение
pg_control
может не быть атомарным действием при одновременной записи этого файла сервером. Этот случай можно обнаружить по неверной контрольной сумме (CRC). Теперь попытка чтения повторяется несколько раз, чтобы проверить, станет ли файл допустимым, прежде чем выводится сообщение об ошибке.Предотвращение разрывов чтения
pg_control
в соответствующих SQL-функциях (Томас Манро) §Перед чтением
pg_control
получается соответствующая блокировка для обеспечения согласованного представления этого файла.Предотвращение целочисленного переполнения при вычислении размера массива строк активности обслуживающего процесса (Якуб Вартак) §
На 64-разрядных машинах допускаются достаточно большие значения
track_activity_query_size
, чтобы вызвать 32-разрядное переполнение при умножении на разрешённое количество соединений. Однако в коде, фактически выделяющем локальный массив для каждого обслуживающего процесса, были упущения, и массив выделялся неправильно.Отслеживание зависимостей кешированных операторов
CALL
и их перепланирование, если оно необходимо (Том Лейн) §Команды DDL, такие как замена функции, встроенной в аргумент
CALL
, могут вызвать необходимость перепланированияCALL
, кешированного PL/pgSQL. Ранее перепланирование не выполнялось, что приводило к неправильному поведению или странным ошибкам, таким как «cache lookup failed» (не удалось выполнить поиск в кеше).Правильное отслеживание глубины вложенности при проверке переменных типа
RECORD
на внешних уровнях запроса (Ричард Гуо) §Неправильное отслеживание могло приводить к сбоям проверочных утверждений, аварийным сбоям или ошибкам «bogus varno» (неприемлемое значение varno).
Предотвращение ошибки «record type has not been registered»(тип записи не зарегистрирован) при пересборке представления, содержащего ссылки на поля составных констант (Том Лейн) §
Возможность извлечения полей из выражения
ROW()
типаRECORD
(Том Лейн) §Код SQL распознаёт названия полей
f1
,f2
и т. д. и может использовать эти имена для извлечения полей из выражения. Первоначально это изменение было внесено в версию 13 и теперь вносится в более старые ветки для поддержки тестов на наличие связанных с этим ошибок.Исправление некорректной обработки ошибок в управлении кешем типа
RECORD
(Томас Манро) §Ошибка нехватки памяти, возникающая в неподходящее время, могла оставлять после себя несогласованное состояние, приводившее к зацикливанию.
Устранение сбоя проверочного утверждения при повторной попытке логического декодирования в том же сеансе после ошибки (Хоу Чжицзе) §
Обработка ошибок, связанных с нехваткой памяти при чтении WAL, как критических (Микаэль Пакье)
Раньше они рассматривались как ошибки о неприемлемых данных, в результате чего делался вывод о достижении конца WAL, что было некорректно и могло приводить к несогласованному воспроизведению WAL.
Исправление возможного сбоя восстановления из-за попытки выделить память на основе неприемлемой длины записи WAL (Томас Манро, Микаэль Пакье) § §
Обеспечение сообщения об ошибке при обнаружении недопустимого заголовка страницы в случае восстановления WAL в режиме ожидания (Юго Нагата, Кётаро Хоригути) §
Предотвращение перепроверки кеша плана для служебных операторов, которые не требуют сложного разбора (Том Лейн) §
Помимо экономии нескольких циклов, это улучшение предотвращает сбой после аннулирования кеша для операторов, которые не должны создавать снимок, таких как
SET TRANSACTION ISOLATION LEVEL
.Сохранение передаваемых по ссылке значений
attmissingval
в долгосрочном контексте на время их использования (Эндрю Дунстан) §Это улучшение позволяет избежать возможного использования недействительных указателей, когда слот кортежа существует дольше дескриптора кортежа, с помощью которого было построено его значение.
Перерасчёт эффективного значения
search_path
послеALTER ROLE
(Джефф Дэвис) § §Это улучшение гарантирует, что после переименования роли значение специальной строки
$user
будет переопределено.Исправление порядка операций в
GenericXLogFinish
(Джефф Девис) §В коде были нарушены условия, необходимые для обеспечения безопасности данных при сбое, поскольку запись в WAL происходила перед тем, как изменённые буферы помечались как «грязные». В коде ядра эта функция не используется, но её используют расширения (например,
contrib/bloom
).Удаление неверного проверочного утверждения при обработке исключений PL/Python (Александр Лахин) §
Исправление поведения утилиты pg_restore для включения в выборочное восстановление начальных прав доступа как на уровне таблицы, так и на уровне столбца для выбранных таблиц (Эйлер Тавейра, Том Лейн) §
Ранее при наличии прав обоих уровней восстанавливались только права на уровне таблицы.
Добавление в программу pg_upgrade логики для проверки использования типов данных
abstime
,reltime
иtinterval
(Álvaro Herrera ) § §Эти устаревшие типы данных были удалены в PostgreSQL версии 12, поэтому добавлена проверка, чтобы убедиться в их отсутствии в старой базе данных перед выполнением её обновления.
Предотвращение создания недопустимых имён временных слотов в pg_basebackup (Йелте Феннема) §
Проблема наблюдалась только при соединении с сервером через pgbouncer.
Предотвращение ложных ошибок «too many client connections» (слишком много клиентских подключений) при использовании программы pgbench в Windows (Ной Миш) §
Исключение сообщений о повреждении данных при прерванном удалении страницы в
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
, который долгое время не использовался и стал причиной множества жалоб пользователей.Удаление
PHOT
(время на островах Феникс) из списка аббревиатур часовых поясов по умолчанию (Том Лейн) §Присутствие этой аббревиатуры в списке по умолчанию могло приводить к ошибкам в последних выпусках Debian и Ubuntu, поскольку в них больше не устанавливается базовая запись tzdb по умолчанию. Поскольку это аббревиатура для зоны с общим населением около двух десятков человек, от неё вполне можно отказаться. При необходимости её можно указать в пользовательском файле аббревиатур.