E.9. Выпуск 16.3 #
Дата выпуска: 2024-05-09
В этот выпуск вошли различные исправления, внесённые после версии 16.2. За информацией о нововведениях версии 16 обратитесь к Разделу E.12.
E.9.1. Миграция на версию 16.3 #
Если используется версия 16.X, выгрузка/восстановление базы не требуется.
Однако в системных представлениях pg_stats_ext
и pg_stats_ext_exprs
была обнаружена уязвимость безопасности, которая потенциально позволяла аутентифицированным пользователям базы данных видеть данные, к которым они не должны были иметь доступа. Если такая угроза безопасности вызывает опасения, выполните действия, указанные в первом пункте списка изменений ниже.
Также, если вы обновляете сервер с более ранней версии, чем 16.2, см. Раздел E.10.
E.9.2. Изменения #
Видимость записей
pg_stats_ext
иpg_stats_ext_exprs
ограничена владельцем таблицы (Натан Боссарт)В этих представлениях не скрывалась статистика для выражений со столбцами, на чтение которых у текущего пользователя не было разрешения. Столбцы представления, такие как
most_common_vals
, могли содержать данные, важные для безопасности. Потенциальные взаимодействия не до конца понятны, поэтому в целях безопасности строки в этих представлениях теперь видимы только владельцу связанной таблицы.Проект PostgreSQL благодарит Лукаса Фиттла за сообщение об этой проблеме. (CVE-2024-4317)
Это исправление корректирует поведение только в новых кластерах баз данных, созданных с помощью initdb. Чтобы применить это изменение в существующем кластере, необходимо сделать следующее:
Найдите скрипт SQL
fix-CVE-2024-4317.sql
в каталогеshare
инсталляции PostgreSQL (обычно он находится в/usr/share/postgresql/
). Обязательно используйте скрипт, соответствующий вашей основной версии PostgreSQL. Отсутствие данного файла означает, что либо основная версия не подвержена уязвимости (она есть только в версиях 14–16), либо корректирующая версия слишком устарела для исправления.В каждой базе данных кластера запустите скрипт
fix-CVE-2024-4317.sql
от имени суперпользователя. В psql это будет выглядеть так:\i /usr/share/postgresql/fix-CVE-2024-4317.sql
(путь к файлу должен быть изменён соответствующим образом). Любая ошибка потенциально указывает на то, что используется неправильная версия скрипта. Рекомендуется выполнить скрипт несколько раз.
Не забудьте применить скрипт к шаблонам баз данных
template0
иtemplate1
, иначе уязвимости будут подвержены базы данных, созданные позднее. Чтобы исправитьtemplate0
, необходимо временно разрешить ему принимать соединения. Для этого используйтеALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
, а после исправления
template0
отмените разрешение с помощьюALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
Исправление поведения команды
INSERT
при вставке из нескольких строкVALUES
в целевой столбец, который является доменом, определённым поверх массива или составного типа (Том Лейн)В таких случаях команда либо завершалась ошибкой с сообщением о несовпадающих типах данных, либо вставлялись непредсказуемые приведённые значения, в результате чего могли выдаваться странные результаты.
Требование права
SELECT
для целевой таблицы при выполнении командыMERGE
с предложениемDO NOTHING
(Альваро Эррера)Право
SELECT
всегда требовалось во всех практических случаях, но теперь оно требуется, даже если запрос не считывает столбцы целевой таблицы. Это позволяет избежать особого случая, когда для командыMERGE
не требуются никакие права, что кажется нежелательным, даже если команда ничего не делает.Исправление обработки самоизменяемых кортежей при выполнении команды
MERGE
(Дин Рашид)Теперь, если целевая строка соединяется с более чем одной исходной строкой, выдаётся ошибка согласно требованиям стандарта SQL. (Ранее код мог игнорировать это условие при выполнении параллельного изменения.) Кроме того, теперь выдаётся корректное сообщение об ошибке, если целевая строка уже обновлена более поздней командой в текущей транзакции, когда в запросе используется триггер
BEFORE
или изменчивая функция.Исправление некорректного отсечения секции NULL в случаях, когда таблица секционирована по логическому столбцу и запрос содержит логическое предложение
IS NOT
(Дэвид Роули)Значение NULL удовлетворяло предложению вида
, поэтому отсечение секции, содержащей значения NULL, приводило к некорректным результатам.boolcol
IS NOT FALSEОбеспечение перемещения всех последовательностей, принадлежащих таблице, в новую схему при использовании команды
ALTER FOREIGN TABLE SET SCHEMA
(Том Лейн)Перемещение обычной таблицы в новую схему приводит к тому, что все последовательности, принадлежащие таблице, также перемещаются в эту схему (вместе с индексами и ограничениями). Раньше последовательности сторонних таблиц не перемещались.
Обеспечение того же режима журналирования последовательностей со столбцами идентификаторов или столбцами serial, создаваемых командой
ALTER TABLE ... ADD COLUMN
, что и у таблицы-владельца (Питер Эйзентраут)Если таблица создаётся как нежурналируемая командой
CREATE UNLOGGED TABLE
, журналирование любых принадлежащих таблице последовательностей также не выполняется. Но для командыALTER TABLE
такое поведение не обеспечивалось, так что выполнялось ненужное журналирование последовательности с добавленными столбцами идентификаторов.Улучшение информативности сообщения об ошибке
ALTER TABLE ... ALTER COLUMN TYPE
при наличии зависимой функции или публикации (Том Лейн)Распознавание ключевых слов стратегии создания базы данных в команде
CREATE DATABASE
без учёта регистра для обеспечения согласованности с другими параметрами (Томаш Вондра)Исправление подсчёта страниц в куче командой
EXPLAIN
при сканировании кучи по битовой карте (Мелани Плейгман)Ранее не учитывались страницы кучи, не содержащие видимых кортежей, но более логично подсчитывать все страницы, возвращаемые при сканировании индекса по битовой карте.
Исправление вывода команды
EXPLAIN
для подпланов вMERGE
(Дин Рашид)При выполнении команды
EXPLAIN
параметры подплана, ссылающиеся на переменные в других частях дерева плана, иногда не отображались должным образом.Предотвращение взаимоблокировок при удалении потерянных временных таблиц (Михаил Жилин)
Если сеанс, создающий временную таблицу, завершается сбоем без удаления таблицы, процесс автоочистки рано или поздно попытается удалить потерянную таблицу. Однако входящий сеанс, которому назначено то же временное пространство имён, тоже сделает это. Раньше такие одновременные попытки очистки могли приводить к взаимоблокировкам, если временная таблица имела зависимость (например, принадлежащую ей последовательность).
Исправление обновления состояния карты видимости при выполнении команды
VACUUM
с параметромDISABLE_PAGE_SKIPPING
(Хейкки Линнакангас)Из-за недочёта реализации очистка в таком режиме вызывала загрязнение всех страниц в куче , что приводило к избыточному вводу-выводу. Кроме того, не очищались неправильно установленные биты карты видимости.
Устранение условий гонки при проверке значений замороженных XID для каждого отношения (Ной Миш)
Вычисление значений замороженных XID для каждой базы данных на основе значений каждого отношения при выполнении команды
VACUUM
могло сбиваться из-за параллельного изменения этих значений другой командойVACUUM
.Исправление отчётов об использовании буфера при параллельной очистке (Антонин Боннефой)
Обращения к буферу, выполняемые параллельными рабочими процессами, не учитывались в статистике, предоставляемой в режиме
VERBOSE
.Обеспечение применения условий соединения, сгенерированных на основе классов эквивалентности, на правильном уровне плана (Том Лейн)
В версиях до PostgreSQL 16 сгенерированные условия могли оцениваться ниже внешних соединений, что приводило к неверным результатам запроса, поскольку они должны оцениваться выше (после) внешних соединений. Это касалось всех версий в случаях соединений с конструкциями
UNION ALL
, когда в столбце соединения в результате некоторых подзапросовSELECT
возвращались константы.Исправление ошибок «could not find pathkey item to sort» (не удалось найти элемент ключа пути для сортировки), возникающих при планировании агрегатных функций с параметрами
ORDER BY
илиDISTINCT
(Дэвид Роули)Это исправление похоже на вошедшее в версию 16.1, но оно решает проблему с параллельными планами.
Предотвращение потенциально некорректной оптимизации некоторых оконных функций (Дэвид Роули)
Оптимизация «условий запуска» была отключена для
ntile()
иcount()
с непостоянными аргументами. Это позволяет избежать возможного некорректного поведения при выполнении вложенных запросов SELECT, что ранее обычно приводило к таким ошибкам, как «WindowFunc not found in subplan target lists» (оконная функция не найдена в целевом списке подплана).Предотвращение ненужного использования режима движущегося агрегата для окна с неподвижным началом рамки (Валлимахараджан Джи)
В случаях, когда в качестве оконной функции использовался простой агрегат, а начало рамки окна указывалось как
UNBOUNDED PRECEDING
, рамка не могла перемещаться, поэтому не следовало использовать специальный (и более дорогой) режим движущегося агрегата. Данная оптимизация изначально должна была работать, но из-за ошибки в коде никогда не применялась.Предотвращение использования ранее освобождённых данных при планировании соединений на уровне секций GEQO-оптимизатором (Том Лейн)
Такие случаи обычно приводили к сбою или неожиданному сообщению об ошибке.
Предотвращение освобождения ещё используемых данных в Memoize (Тендер Ван, Андрей Лепихов)
В производственных сборках эта ошибка зачастую не вызывала никаких проблем, поскольку освобождённые данные, скорее всего, не перезаписывались до использования.
Исправление некорректного отображения кодов для видов статистики в сообщениях об ошибках «requested statistics kind
X
is not yet built» (запрошенный вид статистики X ещё не создан) (Дэвид Роули)Использование хеш-таблицы вместо линейного поиска для объектов «catcache list» (Том Лейн)
Это изменение решает проблемы с производительностью, которые наблюдались при выполнении определённых операций в инсталляциях с тысячами ролей.
Более аккуратная обработка функций, возвращающих
RECORD
, в предложенияхFROM
(Том Лейн)Выходные столбцы такого вызова функции должны определяться предложением
AS
, которое указывает имена столбцов и типы данных. Если фактическое выходное значение функции не соответствует этому указанию, предполагается, что во время выполнения должна выдаваться ошибка. Однако в некоторых местах кода фактическое значение могло проверяться преждевременно, и если оно не соответствовало, могли возникать странные ошибки или сбои проверочных утверждений.Устранение путаницы в отношении типа возвращаемой строки процедур на языке SQL (Том Лейн)
Процедура, реализованная на языке SQL, которая возвращает один столбец составного типа, могла вызывать сбой проверочного утверждения или аварийный сбой.
Добавление защитных проверок глубины стека в некоторых рекурсивных функциях (Егор Чиндяскин)
Устранение ошибок округления и возможности переполнения в функции
date_bin()
(Моааз Ассали)В случаях, когда приводимое значение предшествовало временной метке источника и их разность уже была кратна точному шагу, в коде шаг всё равно вычитался неправильно. Кроме того, были выявлены некоторые случаи целочисленного переполнения, которые могли приводить к неверным результатам.
Обнаружение целочисленного переполнения при добавлении или вычитании значений типа
interval
из значений типаtimestamp
(Джозеф Кошаков)В некоторых случаях, которые должны вызывать ошибку выхода за пределы допустимого диапазона, вместо этого выдавался неверный результат.
Устранение условий гонки в функции
pg_get_expr()
(Том Лейн)Функция должна была возвращать NULL, если параллельно удалялось отношение, на которое ссылался аргумент, но иногда вместо этого выдавалась ошибка.
Устранение ошибки в обнаружении старых идентификаторов транзакций в функциях, касающихся статуса XID (Карина Лицкевич)
Ранее идентификаторы транзакций больше 231 могли быть ошибочно идентифицированы как последние, что приводило к неправильному поведению функций
pg_xact_status()
илиtxid_status()
.Исключение поведения, при котором карта свободного пространства таблицы возвращает страницу, находящуюся за концом таблицы (Ронан Данклау)
Поскольку карта свободного пространства не заносится в журнал WAL, ранее такое поведение было возможно в крайних случаях, связанных со сбоем ОС, повышением реплики или восстановлением PITR. В результате выдавалась ошибка «could not read block» (не удалось прочитать блок).
Исправление утечки файлового дескриптора при возникновении ошибки во время ожидания в функции
WaitEventSetWait
(Эцуро Фудзита)Предотвращение повреждения стека исключений, если FDW реализует асинхронное добавление данных, но без настройки условий ожидания для узла плана Append (Александр Пыхалов)
Вызов ошибки при обращении к индексу во время его перестроения (Том Лейн)
Раньше при перестроении вызывалось проверочное утверждение, а теперь — обычная ошибка времени выполнения, т. е. при попытке перестроить индекс с некорректным обращением к той же таблице, пользователи сразу увидят более точное сообщение об ошибке.
Обеспечение вывода полностью дополненного значения при сканировании только индекса столбцов
name
(Дэвид Роули)Ранее возвращался указатель на это значение, поскольку физически хранящееся в индексе значение усекается. Это вызывало ошибки при тестировании с использованием valgrind. Теоретически это могло приводить к сбоям, но сообщений о них не поступало.
Устранение условий гонки, которые могли приводить к выводу сообщения с неправильной причиной конфликта при аннулировании слота репликации (Бертран Друво)
Устранение условий гонки при принятии решения о необходимости операции синхронизации таблицы в логической репликации (Вигнеш C)
Событие аннулирования, поступающее во время определения подписчиком, какие таблицы необходимо синхронизировать, игнорировалось, поэтому любые таблицы, нуждающиеся в синхронизации, могли обрабатываться несвоевременно.
Исправление сбоя при выделении памяти объёмом более 4ГБ в DSM (Хейкки Линнакангас)
Прерывание подключения, если при создании нового сеанса сокет клиента не может быть переведён в неблокирующий режим (Хейкки Линнакангас)
Раньше теоретически было возможно работать с сокетом, находящимся в блокирующем режиме, но полноценная поддержка такой возможности долгое время отсутствовала, поэтому теперь ошибка выдаётся сразу при установке подключения, а не уже при появлении некорректного поведения.
Устранение некорректных сообщений об ошибках с OpenSSL 3.0.0 и более поздних версий (Хейкки Линнакангас, Том Лейн)
Ошибки, о которых сообщала система через OpenSSL, выводились в виде числового кода ошибки, а не в читаемом виде.
Обеспечение потокобезопасности отчётов об ошибках для функции
getaddrinfo()
в Windows (Томас Манро)В многопоточной клиентской программе libpq могло выводиться некорректное или повреждённое сообщение об ошибке после сбоя при поиске сети.
Предотвращение параллельных вызовов функций
bindtextdomain()
в libpq и ecpglib (Том Лейн)Хотя в реализации gettext для GNU параллельные вызовы обрабатываются корректно, в доступной для Windows версии могли возникать сбои.
Устранение сбоя в препроцессоре ecpg при попытке программы переопределить макрос, который был определён в командной строке препроцессора (Том Лейн)
Предотвращение выдачи ложных предупреждений «unsupported feature will be passed to server» (неподдерживаемая функция будет передана на сервер) в ecpg (Том Лейн)
Корректное завершение строк в результатах функции
intoasc()
в ecpg нулевым символом (Олег Целебровский)Сопоставление имён параметров без учёта регистра в параметре
-c
initdb (Том Лейн)Сервер обрабатывает имена параметров без учёта регистра, поэтому данный код должен действовать так же. Это позволяет избежать внесения избыточных записей в сгенерированный файл
postgresql.conf
.Предотвращение утечки результатов запроса после его отмены в psql (Том Лейн)
Это происходило только при отмене непоследнего запроса в строке запроса с разделителями
\;
.Исправление в pg_dumpall, чтобы комментарии ролей при их наличии выгружались независимо от параметра
--no-role-passwords
(Даниэль Густафссон, Альваро Эррера)Пропуск файлов с именем
.DS_Store
в pg_basebackup, pg_checksums и pg_rewind (Даниэль Густафссон)Это позволяет избежать проблем в macOS, где Finder может создавать такие файлы.
Исправление в PL/pgSQL разбора однострочных комментариев (в стиле
--
), следующих за выражениями (Эрик Винхольд, Том Лейн)Это упущение приводило к ошибкам разбора, если такой комментарий следовал за выражением
WHEN
в операторе PL/pgSQLCASE
.Устранение выдачи ложных несовпадений коротких и длинных значений заголовков в
contrib/amcheck
(Андрей Бородин, Михаил Жилин)Данные переменной длины в кортеже кучи или индексном кортеже могут иметь короткий или длинный заголовок, в зависимости от параметров сжатия, которые применялись при их создании. Эти значения теперь считаются эквивалентными, и сообщение о несовпадении не выводится.
Устранение ошибок в функциях вывода BRIN (Томаш Вондра)
Эти функции вывода используются только для отображения записей индекса в
contrib/pageinspect
, поэтому ошибки имели ограниченное практическое значение.Исключение запросов на сортировку по константе в
contrib/postgres_fdw
(Дэвид Роули)Это могло происходить в случаях выполнения
UNION ALL
с подзапросами, выдающими константу. Сортировка по константе не только бесполезна, но также могла неверно обрабатываться удалённым сервером, что приводило к ошибкам «ORDER BY positionN
is not in select list» (в списке выборки ORDER BY нет позиции N).Установка часового пояса
GMT
, а неUTC
для удалённого сеанса вcontrib/postgres_fdw
(Том Лейн)На практике результат не поменяется. Однако
GMT
распознаётся жёстко заданным кодом на сервере, аUTC
ищется в базе данных часовых поясов. Таким образом, в прежней реализации мог происходить сбой в редких случаях, если в базе данных часовых поясов удалённого сервера не хватало записей.Исключение использования в
contrib/xml2
библиотечных функций, которые признаны устаревшими в последних версиях libxml2 (Дмитрий Коваль)Устранение несовместимости с LLVM 18 (Томас Манро, Дмитрий Долгов)
Возможность
make check
работать с библиотекой С musl (Томас Манро, Брюс Момджян, Том Лейн)