E.23. Выпуск 15.7#
E.23. Выпуск 15.7
Дата релиза: 2024-05-09
Этот выпуск содержит различные исправления из версии 15.6. Для получения информации о новых функциях в основном выпуске 15 см. Раздел E.30.
E.23.1. Миграция на версию 15.7
Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.
Однако в системных представлениях pg_stats_ext
и pg_stats_ext_exprs
была найдена уязвимость безопасности, потенциально позволяющая
аутентифицированным пользователям базы данных видеть данные, которые они не должны видеть. Если это
вызывает беспокойство в вашей установке, выполните шаги, указанные в первой
записи журнала изменений ниже, чтобы исправить это.
Также, если вы обновляетесь с версии раньше, чем 15.6, смотрите Раздел E.24.
E.23.2. Изменения
Ограничена видимость записей
pg_stats_ext
иpg_stats_ext_exprs
для владельца таблицы (Nathan Bossart) §Эти представления не скрывали статистику для выражений, которые включают столбцы, к которым у пользователя, осуществляющего доступ, нет разрешения на чтение. Столбцы представлений, такие как
most_common_vals
, могли раскрыть данные, имеющие отношение к безопасности. Потенциальные взаимодействия здесь не полностью ясны, поэтому, в интересах безопасности, строки в этих представлениях сделаны видимыми только для владельца связанной таблицы.Проект PostgreSQL благодарит Лукаса Фиттла за сообщение об этой проблеме. (CVE-2024-4317)
Само по себе это исправление исправит поведение только в новых кластерах баз данных, инициализированных с помощью initdb. Если вы хотите применить это изменение в существующем кластере, вам нужно будет сделать следующее:
Найдите SQL-скрипт
fix-CVE-2024-4317.sql
в каталогеshare
установки PostgreSQL (обычно расположенном где-то вроде/usr/share/postgresql/
). Убедитесь, что используется скрипт, соответствующий вашей основной версии PostgreSQL. Если этот файл не виден, либо ваша версия не уязвима (затронуты только v14–v16), либо ваша минорная версия слишком стара, чтобы содержать исправление.В каждой базе данных кластера выполните скрипт
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
в целевой столбец, который является доменом над массивом или составным типом (Tom Lane) §Такие случаи либо завершились бы с неожиданными жалобами на несоответствие типов данных, либо вставили бы неожиданные приведения типов, которые могли бы привести к странным результатам.
Требуется привилегия
SELECT
на целевой таблице дляMERGE
с клаузойDO NOTHING
(Álvaro Herrera) §Привеления
SELECT
потребовалась бы во всех практических случаях в любом случае, но требуется даже если запрос не читает столбцы целевой таблицы. Это избегает крайний случай, в которомMERGE
не потребовал бы никаких привилегий, что кажется нежелательным, даже если это команда, не выполняющая никаких действий.Исправлена обработка самостоятельно измененных кортежей в
MERGE
(Дин Рашид) §Выбрасывать ошибку, если целевая строка соединяется с более чем одной исходной строкой, как требуется стандартом SQL. (Предыдущее кодирование могло молча игнорировать это условие, если был задействован параллельный обновление.) Также, выбрасывать ненаводящую на заблуждение ошибку, если целевая строка уже обновлена более поздней командой в текущей транзакции, благодаря
BEFORE
триггеру или используемой в запросе изменчивой функции.Исправлено некорректное удаление NULL-раздела, когда таблица была разделена по булевому столбцу, а в запросе было условие
IS NOT
для булевого типа (David Rowley) §NULL-значение удовлетворяет предложению, такому как
, поэтому исключение секции, содержащей NULL-значения, приводило к неправильным ответам.boolcol
IS NOT FALSEСделано так, чтобы
ALTER FOREIGN TABLE SET SCHEMA
перемещал любые принадлежащие последовательности в новую схему (Tom Lane) §Перемещение обычной таблицы в новую схему вызывает перемещение любых последовательностей, принадлежащих таблице, в эту схему (вместе с индексами и ограничениями). Однако это было упущено для внешних таблиц.
Сделано так, чтобы
ALTER TABLE ... ADD COLUMN
создавал идентификационные/серийные последовательности с той же устойчивостью, что и их владеющие таблицы (Петер Айзентраут) §CREATE UNLOGGED TABLE
сделает все принадлежащие последовательности также незарегистрированными.ALTER TABLE
упустил это соображение, так что добавленный столбец идентификатора имел бы зарегистрированную последовательность, что кажется бессмысленным.Улучшено сообщение об ошибке
ALTER TABLE ... ALTER COLUMN TYPE
, когда существует зависимая функция или публикация (Tom Lane) § §В
CREATE DATABASE
ключевые слова стратегии распознаны без учета регистра для согласованности с другими опциями (Tomas Vondra) §Исправлено
EXPLAIN
подсчет страниц кучи, к которым был осуществлен доступ с помощью сканирования кучи по битовой карте (Мелани Плагеман) §Ранее страницы кучи, не содержащие видимых кортежей, не учитывались; но кажется более последовательным учитывать все страницы, возвращаемые сканированием по битовой карте.
Исправлен вывод
EXPLAIN
для подпланов вMERGE
(Дин Рашид) §EXPLAIN
иногда не удавалось правильно отображать параметры подплана, ссылающиеся на переменные в других частях дерева плана.Избежание взаимоблокировки при удалении осиротевших временных таблиц (Михаил Жилин) §
Если сессия, создающая временную таблицу, завершится сбоем, не удалив таблицу, autovacuum в конечном итоге попытается удалить осиротевшую таблицу. Однако входящяя сессия, которому назначено то же временное пространство имен, также попытается это сделать. Если у временной таблицы есть зависимость (например, принадлежащая последовательность), то между этими двумя попытками очистки может возникнуть взаимоблокировка.
Избежано состояния гонки при проверке значений замороженного XID для каждой связи (Ноа Миш) §
VACUUM
вычисление значений frozen-XID для каждой базы данных на основе значений для каждой таблицы могло быть запутано одновременным обновлением этих значений другимVACUUM
.Исправлено сообщение об использовании буфера для параллельной очистки (Anthonin Bonnefoy) §
Доступы к буферу, выполненные параллельными рабочими, не были учтены в статистике, сообщаемой в режиме
VERBOSE
.Запрещено преобразование таблицы в представление в рамках внешней SQL-команды, которая использует эту таблицу (Tom Lane) §
Это позволяет избежать возможных сбоев.
Убедиться, что условия соединения, сгенерированные из классов эквивалентности, применены на правильном уровне плана (Том Лейн) §
В версиях до PostgreSQL 16, было возможно, что сгенерированные условия оценивались ниже внешних соединений, когда они должны были оцениваться выше (после) внешнего соединения, что приводило к неправильным результатам запроса. Во всех версиях существует аналогичная опасность при рассмотрении соединений с деревьями
UNION ALL
, которые имеют постоянные выходные данные для столбца соединения в некоторых ветвяхSELECT
.Предотвращена потенциально некорректная оптимизация некоторых оконных функций (Дэвид Роули) §
Отключена оптимизация “условия выполнения” для
ntile()
иcount()
с неконстантными аргументами. Это позволяет избежать возможного некорректного поведения с подзапросами, что обычно приводит к ошибкам типа “WindowFunc не найден в целевых списках подплана”.Избегалось ненужное использование режима скользящей агрегации с неподвижной оконной рамкой (Vallimaharajan G) §
Когда обычный агрегат используется как оконная функция, и начало оконной рамки указано как
UNBOUNDED PRECEDING
, голова рамки не может двигаться, поэтому нет необходимости использовать специальный (и более дорогой) режим перемещающегося агрегата. Эта оптимизация была задумана с самого начала, но из-за ошибки в коде она никогда не срабатывала.Избегалось использование уже освобожденных данных при планировании соединений по разделам под GEQO (Tom Lane) §
Это обычно заканчивалось бы сбоем или неожиданным сообщением об ошибке.
Избегалось освобождение все еще используемых данных в Memoize (Тендер Ван, Андрей Лепихов) §
В производственных сборках эта ошибка часто не вызывала никаких проблем, так как освобожденные данные, скорее всего, не были бы перезаписаны до их использования.
Исправлены некорректно сообщаемые коды видов статистики в сообщениях об ошибках “запрашиваемый вид статистики
X
еще не построен” (Дэвид Роули) §Будьте более осторожны с функциями, возвращающими
RECORD
, вFROM
(Tom Lane) § §Выходные столбцы такого вызова функции должны быть определены с помощью предложения
AS
, которое указывает имена столбцов и типы данных. Если фактическое значение выхода функции не соответствует этому, предполагается, что ошибка будет выброшена во время выполнения. Однако некоторые пути кода преждевременно проверяли бы фактическое значение и потенциально выдавали бы странные ошибки или терпели бы сбои утверждений, если оно не соответствует ожиданиям.Исправлено недоразумение относительно возвращаемого типа строки процедур на языке SQL (Tom Lane) §
Процедура, реализованная на языке SQL, которая возвращала бы один столбец составного типа, могла бы вызвать сбой утверждения или дамп ядра.
Добавлены защитные проверки глубины стека для некоторых рекурсивных функций (Егор Чиндяскин) §
Исправлены ошибки округления и опасности переполнения в
date_bin()
(Моаз Ассали) §В случае, когда исходная временная метка была перед исходной временной меткой и их разница уже была точным кратным шагу, код неправильно вычитал шаг в любом случае. Также, были обнаружены некоторые случаи переполнения целых чисел, которые могли бы привести к неправильным результатам.
Обнаружено переполнение целого числа при добавлении или вычитании
интервала
к/изметки времени
(Joseph Koshakow) §Некоторые случаи, которые должны были вызвать ошибку выхода за пределы диапазона, вместо этого приводили к неправильному результату.
Избежано состояния гонки в
pg_get_expr()
(Tom Lane) §Если отношение, на которое ссылается аргумент, было удалено одновременно, намерение функции состоит в том, чтобы вернуть NULL, но иногда она завершалась с ошибкой.
Исправлено обнаружение старых идентификаторов транзакций в функциях статуса XID (Карина Лицкевич) §
Идентификаторы транзакций более чем 231 транзакций в прошлом могли быть ошибочно определены как недавние, что приводило к неправильному поведению
pg_xact_status()
илиtxid_status()
.Убедиться, что карта свободного пространства таблицы не возвращает страницу, которая находится за пределами конца таблицы (Ронан Данкло) §
Поскольку карта свободного пространства не регистрируется в WAL, это было возможно в крайних случаях, связанных с сбоем ОС, повышением реплики или восстановлением PITR. Результатом была бы ошибка “не удалось прочитать блок”.
Исправлена утечка файлового дескриптора, когда ошибка была выброшена во время ожидания в
WaitEventSetWait
(Etsuro Fujita) §Избегалось повреждение стека исключений, если FDW реализовывал асинхронное добавление, но не настраивались условия ожидания для узла плана Append (Александр Пыхалов) §
Выброшена ошибка, если индекс был доступен во время его переиндексации (Tom Lane) §
Ранее это было просто проверкой утверждения, но это было повышено до обычной ошибки времени выполнения. Это обеспечит более точное сообщение об ошибке при переиндексации пользовательского выражения индекса, которое пытается получить доступ к своей собственной таблице.
Убедитесь, что индекс-сканирование только на столбцах
name
возвращает полностью дополненное значение (Дэвид Роули) §Значение, физически хранящееся в индексе, было усечено, и ранее указатель на это значение возвращался вызывающим. Это вызывало жалобы при тестировании под valgrind. В теории это могло привести к сбоям, хотя ни одного не было сообщено.
Исправлено состояние гонки при принятии решения, требуется ли операция синхронизации таблицы в логической репликации (Виньеш С) §
Событие аннулирования, поступившее во время идентификации подписчиком таблиц, которые необходимо синхронизировать, могло быть забыто, так что любые таблицы, которые недавно нуждаются в синхронизации, могли не обрабатываться своевременно.
Исправлена ошибка, приводившая к сбою при выделении DSM объемом более 4 ГБ (Хейкки Линнакангас) §
Отключение, если клиентский сокет новой серверной сессии не может быть переведен в неблокирующий режим (Хейкки Линкангас) §
Когда-то теоретически было возможно работать с сокетом, который находится в блокирующем режиме; но это не работало полностью в течение долгого времени, поэтому ошибка возникала при запуске соединения, а не проявлялась позже.
Исправлено недостаточное сообщение об ошибках с OpenSSL 3.0.0 и позже (Хейкки Линкангас, Том Лейн) §
Ошибки, переданные через OpenSSL, сообщались с числовым кодом ошибки, а не с чем-то читаемым.
Избегались одновременные вызовы
bindtextdomain()
в libpq и ecpglib (Tom Lane) § §Хотя реализация gettext от GNU, кажется, справляется с параллельными вызовами, версия, доступная на Windows, нет.
Исправлен сбой в препроцессоре ecpg, если программа пыталась переопределить макрос, который был определен в командной строке препроцессора (Tom Lane) § § §
В ecpg избегалось выдача ложных предупреждений “unsupported feature will be passed to server” (Том Лейн) §
Убедитесь, что строковый результат функции ecpg
intoasc()
правильно завершается нулем (Олег Целебровский) §В psql избегалась утечка результата запроса после отмены запроса (Tom Lane) §
Это произошло только при отмене не последнего запроса в строке запроса, сделанной с разделителями
\;
.Исправлено pg_dumpall так, чтобы комментарии к ролям, если они присутствуют, выгружались независимо от настройки
--no-role-passwords
(Даниэль Густафссон, Álvaro Herrera) §Пропущены файлы с именем
.DS_Store
в pg_basebackup, pg_checksums, и pg_rewind (Даниэль Густафссон) §Это позволяет избежать проблем в macOS, где Finder может создавать такие файлы.
Исправлен PL/pgSQL разбор однострочных комментариев (
--
-стиль комментариев), следующих за выражениями (Эрик Винхольд, Том Лейн) §Эта ошибка вызывала ошибки синтаксического анализа, если такой комментарий следовал за
WHEN
выражением в PL/pgSQLCASE
операторе.В
contrib/amcheck
не сообщалось о ложных сбоях совпадения из-за коротких и длинных значений заголовков (Андрей Бородин, Михаил Жилин) § §Переменная длина данных в куче кортежей или индексных кортежей могла иметь либо короткий, либо длинный заголовок, в зависимости от параметров сжатия, которые применялись при его создании. Эти случаи следовало рассматривать как эквивалентные, а не жаловаться, если есть разница.
Исправлены ошибки в функциях вывода BRIN (Tomas Vondra) §
Эти функции вывода используются только для отображения записей индекса в
contrib/pageinspect
, поэтому ошибки имеют ограниченное практическое значение.В
contrib/postgres_fdw
избегалось создание запросов на сортировку по константе (Дэвид Роули) §Это могло произойти в случаях с
UNION ALL
с подзапросами, возвращающими константы. Сортировка по константе, конечно, бесполезна, но также существует риск неправильной интерпретации удаленным сервером, что приводит к ошибкам “ORDER BY positionN
is not in select list”.Сделано так, чтобы
contrib/postgres_fdw
устанавливал часовой пояс удаленной сессии наGMT
а неUTC
(Tom Lane) §Это должно иметь те же результаты для практических целей. Однако,
GMT
распознается жестко запрограммированным кодом в сервере, в то время какUTC
ищется в базе данных часовых поясов. Таким образом, старый код мог бы потерпеть неудачу в маловероятном случае, если бы в базе данных часовых поясов удаленного сервера отсутствовали записи.В
contrib/xml2
избегалось использование функций библиотеки, которые были объявлены устаревшими в последних версиях libxml2 (Дмитрий Коваль) §Исправлена несовместимость с LLVM 18 (Томас Мунро, Дмитрий Долгов) §
Позволено
make check
работать с библиотекой C musl (Томас Манро, Брюс Момджиан, Том Лейн) §