E.21. Выпуск 14.12

Дата выпуска: 2024-05-09

В этот выпуск вошли различные исправления, внесённые после версии 14.11. За информацией о нововведениях версии 14 обратитесь к Разделу E.33.

E.21.1. Миграция на версию 14.12

Если используется версия 14.X, выгрузка/восстановление базы не требуется.

Однако в системных представлениях pg_stats_ext и pg_stats_ext_exprs была обнаружена уязвимость безопасности, которая потенциально позволяла аутентифицированным пользователям базы данных видеть данные, к которым они не должны были иметь доступа. Если такая угроза безопасности вызывает опасения, выполните действия, указанные в первом пункте списка изменений ниже.

Если вы обновляете сервер с более ранней версии, чем 14.11, см. также Раздел E.22.

E.21.2. Изменения

  • Видимость записей pg_stats_ext и pg_stats_ext_exprs ограничена владельцем таблицы (Натан Боссарт)

    В этих представлениях не скрывалась статистика для выражений со столбцами, на чтение которых у текущего пользователя не было разрешения. Столбцы представления, такие как most_common_vals, могли содержать данные, важные для безопасности. Потенциальные взаимодействия не до конца понятны, поэтому в целях безопасности строки в этих представлениях теперь видимы только владельцу связанной таблицы.

    Проект PostgreSQL благодарит Лукаса Фиттла за сообщение об этой проблеме. (CVE-2024-4317)

    Это исправление корректирует поведение только в новых кластерах баз данных, созданных с помощью initdb. Чтобы применить это изменение в существующем кластере, необходимо сделать следующее:

    1. Найдите скрипт SQL fix-CVE-2024-4317.sql в каталоге share инсталляции PostgreSQL (обычно он находится в /usr/share/postgresql/). Обязательно используйте скрипт, соответствующий вашей основной версии PostgreSQL. Отсутствие данного файла означает, что либо основная версия не подвержена уязвимости (она есть только в версиях 14–16), либо корректирующая версия слишком устарела для исправления.

    2. В каждой базе данных кластера запустите скрипт fix-CVE-2024-4317.sql от имени суперпользователя. В psql это будет выглядеть так:

      \i /usr/share/postgresql/fix-CVE-2024-4317.sql

      (путь к файлу должен быть изменён соответствующим образом). Любая ошибка потенциально указывает на то, что используется неправильная версия скрипта. Рекомендуется выполнить скрипт несколько раз.

    3. Не забудьте применить скрипт к шаблонам баз данных template0 и template1, иначе уязвимости будут подвержены базы данных, созданные позднее. Чтобы исправить template0, необходимо временно разрешить ему принимать соединения. Для этого используйте

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;

      , а после исправления template0 отмените разрешение с помощью

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
  • Исправление поведения команды INSERT при вставке из нескольких строк VALUES в целевой столбец, который является доменом, определённым поверх массива или составного типа (Том Лейн)

    В таких случаях команда либо завершалась ошибкой с сообщением о несовпадающих типах данных, либо вставлялись непредсказуемые приведённые значения, в результате чего могли выдаваться странные результаты.

  • Исправление некорректного отсечения секции NULL в случаях, когда таблица секционирована по логическому столбцу и запрос содержит логическое предложение IS NOT (Дэвид Роули)

    Значение NULL удовлетворяло предложению вида boolcol IS NOT FALSE, поэтому отсечение секции, содержащей значения NULL, приводило к некорректным результатам.

  • Обеспечение перемещения всех последовательностей, принадлежащих таблице, в новую схему при использовании команды ALTER FOREIGN TABLE SET SCHEMA (Том Лейн)

    Перемещение обычной таблицы в новую схему приводит к тому, что все последовательности, принадлежащие таблице, также перемещаются в эту схему (вместе с индексами и ограничениями). Раньше последовательности сторонних таблиц не перемещались.

  • Улучшение информативности сообщения об ошибке ALTER TABLE ... ALTER COLUMN TYPE при наличии зависимой функции или публикации (Том Лейн)

  • Исправление подсчёта страниц в куче командой EXPLAIN при сканировании кучи по битовой карте (Мелани Плейгман)

    Ранее не учитывались страницы кучи, не содержащие видимых кортежей, но более логично подсчитывать все страницы, возвращаемые при сканировании индекса по битовой карте.

  • Предотвращение взаимоблокировок при удалении потерянных временных таблиц (Михаил Жилин)

    Если сеанс, создающий временную таблицу, завершается сбоем без удаления таблицы, процесс автоочистки рано или поздно попытается удалить потерянную таблицу. Однако входящий сеанс, которому назначено то же временное пространство имён, тоже сделает это. Раньше такие одновременные попытки очистки могли приводить к взаимоблокировкам, если временная таблица имела зависимость (например, принадлежащую ей последовательность).

  • Устранение условий гонки при проверке значений замороженных XID для каждого отношения (Ной Миш)

    Вычисление значений замороженных XID для каждой базы данных на основе значений каждого отношения при выполнении команды VACUUM могло сбиваться из-за параллельного изменения этих значений другой командой VACUUM.

  • Запрет преобразования таблицы в представление во внешней команде SQL, использующей эту таблицу (Том Лейн)

    Это позволяет избегать сбоев.

  • Обеспечение применения условий соединения, сгенерированных на основе классов эквивалентности, на правильном уровне плана (Том Лейн)

    В версиях до PostgreSQL 16 сгенерированные условия могли оцениваться ниже внешних соединений, что приводило к неверным результатам запроса, поскольку они должны оцениваться выше (после) внешних соединений. Это касалось всех версий в случаях соединений с конструкциями UNION ALL, когда в столбце соединения в результате некоторых подзапросов SELECT возвращались константы.

  • Предотвращение ненужного использования режима движущегося агрегата для окна с неподвижным началом рамки (Валлимахараджан Джи)

    В случаях, когда в качестве оконной функции использовался простой агрегат, а начало рамки окна указывалось как UNBOUNDED PRECEDING, рамка не могла перемещаться, поэтому не следовало использовать специальный (и более дорогой) режим движущегося агрегата. Данная оптимизация изначально должна была работать, но из-за ошибки в коде никогда не применялась.

  • Предотвращение использования ранее освобождённых данных при планировании соединений на уровне секций GEQO-оптимизатором (Том Лейн)

    Такие случаи обычно приводили к сбою или неожиданному сообщению об ошибке.

  • Предотвращение освобождения ещё используемых данных в Memoize (Тендер Ван, Андрей Лепихов)

    В производственных сборках эта ошибка зачастую не вызывала никаких проблем, поскольку освобождённые данные, скорее всего, не перезаписывались до использования.

  • Исправление некорректного отображения кодов для видов статистики в сообщениях об ошибках «requested statistics kind X is not yet built» (запрошенный вид статистики X ещё не создан) (Дэвид Роули)

  • Более аккуратная обработка функций, возвращающих 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. Теоретически это могло приводить к сбоям, но сообщений о них не поступало.

  • Исправление сбоя при выделении памяти объёмом более 4ГБ в DSM (Хейкки Линнакангас)

  • Прерывание подключения, если при создании нового сеанса сокет клиента не может быть переведён в неблокирующий режим (Хейкки Линнакангас)

    Раньше теоретически было возможно работать с сокетом, находящимся в блокирующем режиме, но полноценная поддержка такой возможности долгое время отсутствовала, поэтому теперь ошибка выдаётся сразу при установке подключения, а не уже при появлении некорректного поведения.

  • Устранение некорректных сообщений об ошибках с OpenSSL 3.0.0 и более поздних версий (Хейкки Линнакангас, Том Лейн)

    Ошибки, о которых сообщала система через OpenSSL, выводились в виде числового кода ошибки, а не в читаемом виде.

  • Предотвращение параллельных вызовов функций bindtextdomain() в libpq и ecpglib (Том Лейн)

    Хотя в реализации gettext для GNU параллельные вызовы обрабатываются корректно, в доступной для Windows версии могли возникать сбои.

  • Устранение сбоя в препроцессоре ecpg при попытке программы переопределить макрос, который был определён в командной строке препроцессора (Том Лейн)

  • Предотвращение выдачи ложных предупреждений «unsupported feature will be passed to server» (неподдерживаемая функция будет передана на сервер) в ecpg (Том Лейн)

  • Корректное завершение строк в результатах функции intoasc() в ecpg нулевым символом (Олег Целебровский)

  • Исправление в pg_dumpall, чтобы комментарии ролей при их наличии выгружались независимо от параметра --no-role-passwords (Даниэль Густафссон, Альваро Эррера)

  • Исправление в PL/pgSQL разбора однострочных комментариев (в стиле --), следующих за выражениями (Эрик Винхольд, Том Лейн)

    Это упущение приводило к ошибкам разбора, если такой комментарий следовал за выражением WHEN в операторе PL/pgSQL CASE.

  • Устранение выдачи ложных несовпадений коротких и длинных значений заголовков в contrib/amcheck (Андрей Бородин, Михаил Жилин)

    Данные переменной длины в кортеже кучи или индексном кортеже могут иметь короткий или длинный заголовок, в зависимости от параметров сжатия, которые применялись при их создании. Эти значения теперь считаются эквивалентными, и сообщение о несовпадении не выводится.

  • Устранение ошибок в функциях вывода BRIN (Томаш Вондра)

    Эти функции вывода используются только для отображения записей индекса в contrib/pageinspect, поэтому ошибки имели ограниченное практическое значение.

  • Исключение запросов на сортировку по константе в contrib/postgres_fdw (Дэвид Роули)

    Это могло происходить в случаях выполнения UNION ALL с подзапросами, выдающими константу. Сортировка по константе не только бесполезна, но также могла неверно обрабатываться удалённым сервером, что приводило к ошибкам «ORDER BY position N is not in select list» (в списке выборки ORDER BY нет позиции N).

  • Установка часового пояса GMT, а не UTC для удалённого сеанса в contrib/postgres_fdw (Том Лейн)

    На практике результат не поменяется. Однако GMT распознаётся жёстко заданным кодом на сервере, а UTC ищется в базе данных часовых поясов. Таким образом, в прежней реализации мог происходить сбой в редких случаях, если в базе данных часовых поясов удалённого сервера не хватало записей.

  • Исключение использования в contrib/xml2 библиотечных функций, которые признаны устаревшими в последних версиях libxml2 (Дмитрий Коваль)

  • Устранение несовместимости с LLVM 18 (Томас Манро, Дмитрий Долгов)

  • Возможность make check работать с библиотекой С musl (Томас Манро, Брюс Момджян, Том Лейн)