E.11. Выпуск 16.4#
E.11. Выпуск 16.4 #
Дата релиза: 2024-08-08
Этот выпуск содержит различные исправления из версии 16.3. Для получения информации о новых функциях в основном выпуске 16 см. Раздел E.15.
E.11.1. Миграция на версию 16.4 #
Снятие дампа/восстановление не требуется для тех, кто использует 16.X.
Однако, если обновление выполнялось с версии ранее 16.3, см. Раздел E.12.
E.11.2. Изменения #
Предотвращено выполнение несанкционированного кода во время pg_dump (Масахико Савада) §
Злоумышленник, способный создавать и удалять не временные объекты, мог внедрить SQL-код, который был бы выполнен параллельной сессией pg_dump с привилегиями роли, выполняющей pg_dump (которая часто является суперпользователем). Атака включает замену последовательности или аналогичного объекта на представление или внешнюю таблицу, которая выполнит вредоносный код. Чтобы предотвратить это, был введен новый серверный параметр
restrict_nonsystem_relation_kind
, который может отключить расширение нестандартных представлений, а также доступ к внешним таблицам, и pg_dump был обучен устанавливать его, когда он доступен. Следует отметить, что атака предотвращена только в том случае, если и pg_dump, и сервер, с которого он выполняет дамп, достаточно новы, чтобы иметь это исправление.Проект PostgreSQL благодарит Ноа Миша за сообщение об этой проблеме. (CVE-2024-7348)
Избежаны некорректные результаты из планов Merge Right Anti Join (Ричард Гуо) §
Если известно, что внутренняя связь имеет уникальные ключи соединения, слияние могло бы вести себя неправильно, когда во внешней связи есть дублированные ключи соединения.
Предотвращено зацикливание в
VACUUM
(Мелани Плагеман) §После того как отключенный резервный сервер с запущенной старой транзакцией переподключался к основному серверу, было возможно, что
VACUUM
на основном сервере путался в том, какие кортежи можно удалить, что приводило к бесконечному циклу.Исправлена ошибка после присоединения таблицы в качестве раздела, если у таблицы ранее были дочерние элементы наследования (Álvaro Herrera) §
Исправлена
ALTER TABLE DETACH PARTITION
для случаев, связанных с несогласованными ограничениями на основе индексов (Álvaro Herrera, Tender Wang) § §Когда у секционированной таблицы есть индекс, который не связан с ограничением, но у секции есть эквивалентный индекс, который связан, то отсоединение секции будет работать неправильно, оставляя ограничение бывшей секции с некорректным значением
coninhcount
. Это вызовет проблемы при любых дальнейших манипуляциях с этим ограничением.Исправлена настройка отсечения секций во время
ALTER TABLE DETACH PARTITION CONCURRENTLY
(Álvaro Herrera) § §Исполнитель предполагал, что ни одна секция не могла быть отсоедина между планированием и выполнением запроса на секционированной таблице. Это больше не является правдой с момента введения опции
DETACH PARTITION
сCONCURRENTLY
, что делает возможным временный сбой выполнения запроса при использовании этой опции.Корректно обновлено поле
pg_class
.reltuples
разбиенной таблицы до нуля после удаления её последнего дочернего раздела (Ноа Миш) §Первый
ANALYZE
на такой секционированной таблице должен был обновитьrelhassubclass
также, и это вызвало потерю обновленияreltuples
.Исправлена обработка полиморфных выходных аргументов для процедур (Tom Lane) § §
Оператор SQL
CALL
не разрешал правильные типы данных для таких аргументов, что приводило к ошибкам, таким как “невозможно отобразить значение типа anyelement”, или даже к полным сбоям. (НоCALL
в PL/pgSQL работал правильно.)Исправлено поведение стабильных функций, вызываемых из списка аргументов оператора
CALL
(Том Лейн) §Если
CALL
находится в атомарном контексте (например, существует внешний блок транзакции), такие функции передавались с неправильным снимком, что приводило к тому, что они видели устаревшие значения строк, измененных с начала внешней транзакции.Исправлен ввод времени в формате ISO-8601 “расширенный” для типов
time
иtimetz
(Tom Lane) §Снова разрешены случаи, такие как
T12:34:56
.Обнаружено переполнение целого числа в вычислениях
money
(Джозеф Кошаков) §Ни одна из арифметических функций для типа
money
ранее не проверяла переполнение, поэтому они молча давали неправильные ответы в случаях переполнения.Исправлено чрезмерно агрессивное ограничение аргумента масштаба в
round(numeric)
иtrunc(numeric)
(Дин Рашид) §Эти функции ограничивали свой аргумент масштаба до +/-2000, но существуют допустимые случаи использования, когда он должен быть больше; функции возвращали некорректные результаты в таких случаях. Вместо этого ограничение установлено на фактический допустимый диапазон типа
numeric
.Исправлен результат для
pg_size_pretty()
, когда применялся к наименьшему возможному значениюbigint
(Джозеф Кошаков) §Предотвращено завершение сбоем
pg_sequence_last_value()
на незарегистрированных последовательностях на резервных серверах и на временных последовательностях других сессий (Натан Боссарт) §Сделано так, чтобы возвращать NULL в этих случаях вместо выброса ошибки.
Исправлен разбор игнорируемых операторов в
websearch_to_tsquery()
(Tom Lane) §Согласно руководству, знаки препинания во входных данных
websearch_to_tsquery()
игнорируются, за исключением особых случаев с дефисами и кавычками. Однако, круглые скобки и некоторые другие символы, появляющиеся непосредственно передor
, могли вызвать, чтоor
будет рассматриваться как слово данных, а не как операторOR
, как ожидалось.Обнаружен еще один случай переполнения целого числа при вычислении новых размеров массива (Джозеф Кошаков) §
Отклонено применение размеров массива
[-2147483648:2147483647]
к пустому массиву. Это тесно связано с CVE-2023-5869, но кажется безвредным, так как массив все равно остается пустым.Исправлено непереносимое использование
strnxfrm()
(Джефф Дэвис) §Некоторые пути кода для недетерминированных сопоставлений могли завершиться с ошибками, такими как “pg_strnxfrm() вернул неожиданный результат”.
Обнаружен еще один случай устаревания новой записи кэша каталога при детостировании ее полей (Ноа Миш) §
Обновление на месте, происходящее во время расширения вынесенных полей в кортеж каталога, могло быть пропущено, что приводило к записи в кэше каталога, которая не содержала изменения на месте, но не считалась устаревшей. Это возможно только в каталоге
pg_database
, поэтому эффекты ограничены, но неправильное поведение возможно.Корректно проверена возможность обновления столбцов представления, на которые нацелены
INSERT
...DEFAULT
(Tom Lane) §Если такой столбец не может быть обновлен, должна быть выдана ошибка, сообщающая об этом. Но проверка была пропущена, и позже код сообщал бесполезную ошибку, такую как “номер атрибута
N
не найден в списке целей представления”.Избежана ситуация, когда сообщалась бесполезная внутренняя ошибка для некорректных рекурсивных запросов (Tom Lane) §
Переставлен порядок проверок ошибок, чтобы выдавалась точная ошибка, когда запрос
WITH RECURSIVE
не имел самоссылки во второй частиUNION
, но имел одну самоссылку в другом месте, таком какORDER BY
.Последовательности, принадлежащие блокировке, во время
ALTER TABLE SET LOGGED|UNLOGGED
(Ноа Миш) §Эти команды изменяли постоянство принадлежащих таблице последовательностей вместе с таблицей, но не удалось получить блокировку на последовательности при этом. Это могло привести к потере эффектов одновременных вызовов
nextval()
.Не выбрасывать ошибку, если поставленный в очередь триггер
AFTER
больше не существует (Том Лейн) §Возможно, что транзакция выполнит операцию, которая ставит в очередь отложенный
AFTER
триггер для последующего выполнения, а затем удалит триггер до того, как это произойдет. Ранее это приводило к странным ошибкам, таким как “не удалось найти триггерNNNN
”. Кажется, лучше молча ничего не делать, если триггер больше не существует в момент, когда он должен был быть выполнен.Исправлена ошибка удаления записей
pg_init_privs
для привилегий на уровне столбцов, когда их таблица удаляется (Tom Lane) §Если расширение предоставляет некоторые привилегии на уровне столбцов для таблицы, которую оно создает, соответствующие записи в каталоге остаются после удаления расширения. Это было безвредно до тех пор, пока OID таблицы не использовался повторно для другой связи, когда это могло бы помешать тому, что pg_dump выгружает для этой связи.
Исправлен выбор арбитражного индекса для
ON CONFLICT
когда желаемый индекс имеет выражения или предикаты (Tom Lane) §Если запрос с использованием
ON CONFLICT
обращался к целевой таблице через обновляемое представление, он мог завершиться с ошибкой “нет уникального или исключающего ограничения, соответствующего спецификации ON CONFLICT”, даже если соответствующий индекс существует.Отказано в изменении временной таблицы другой сессии с помощью
ALTER TABLE
(Том Лейн) §Проверки разрешений обычно предотвращали бы возникновение этого случая, но возможно достичь его, изменяя родительскую таблицу, дочерняя таблица которой является временной таблицей другой сессии. Выдать ошибку, если обнаружено, что такая дочерняя таблица принадлежит другой сессии.
Исправлена обработка расширенной статистики на выражениях в
CREATE TABLE LIKE STATISTICS
(Tom Lane) §Команда
CREATE
не смогла скорректировать ссылки на столбцы в выражениях статистики в соответствии с возможной разницей в нумерации столбцов новой таблицы. Это привело к созданию недействительных статистических объектов, которые впоследствии вызвали бы проблемы. Типичный сценарий, когда требуется перенумерация столбцов, возникает, когда исходная таблица содержит некоторые удаленные столбцы.Исправлена ошибка пересчета подзапросов, созданных из агрегатов
MIN()
илиMAX()
(Tom Lane) §В некоторых случаях агрегированный результат, вычисленный на одной строке внешнего запроса, мог быть повторно использован для последующих строк, когда этого не должно было происходить. Это наблюдалось только тогда, когда внешний запрос использовал
DISTINCT
, который реализован с помощью хеш-агрегации, но могут существовать и другие случаи.Повторно запрещено использование подчеркивания в позиционных параметрах (Эрик Винхольд) §
Начиная с версии 16, разрешено использование подчеркиваний в целочисленных литералах. Это изменение привело к тому, что ввод, такой как
$1_234
, воспринимался как единый токен, но это не работало корректно. Кажется, лучше вернуться к исходному определению, в котором символ параметра представляет собой только$
, за которым следуют цифры.Избегалось аварийное завершение работы, когда встроенная JIT функция бэкенда вызывала ошибку (Tom Lane) §
Состояние ошибки может включать указатели на динамически загруженный модуль, содержащий JIT-скомпилированный код (для строк местоположения ошибки). В некоторых путях кода модуль мог быть выгружен до обработки отчета об ошибке, что приводило к SIGSEGV при доступе к строкам местоположения.
Справляться с изменениями в поведении в libxml2 версии 2.13.x (Эрик Винхольд, Том Лейн) §
Примечательно, что теперь подавляются ошибки “chunk is not well balanced” из libxml2, если это не единственная сообщаемая ошибка. Это сделано для того, чтобы отчеты об ошибках были согласованы между версиями 2.13.x и более ранними версиями libxml2. В более ранних версиях это сообщение почти всегда было избыточным или совершенно некорректным, поэтому в версии 2.13.x существенно уменьшено количество случаев, в которых оно сообщается.
Исправлена обработка подтранзакций подготовленных транзакций при запуске сервера горячего резерва (Хейкки Линкангас) §
При запуске воспроизведения резервной копии на контрольной точке завершения работы WAL запись, транзакции, которые были подготовлены, но еще не завершены на основной системе, правильно понимаются как все еще находящиеся в процессе выполнения. Но подтранзакции подготовленной транзакции (созданные контрольными точками или PL/pgSQL блоками исключений) не учитывались и рассматривались как прерванные. Это приводило к несоответствиям, если подготовленная транзакция позже завершалась.
Предотвращена некорректная инициализация слотов логической репликации (Масахико Савада) §
В некоторых случаях начальная точка слота репликации в потоке WAL могла быть установлена на точку внутри транзакции, что приводило к сбоям утверждений или неправильным результатам декодирования.
Избежана ошибка “можно удалить статистику только один раз” во время создания и удаления слота репликации (Floris Van Nee) §
Исправлена утечка ресурсов в отправителе WAL логической репликации (Hou Zhijie) §
При выполнении процесса walsender происходила утечка памяти при публикации изменений в секционированную таблицу, в секциях, типы строк которых физически отличаются от типов строк секционированной таблицы.
Избегать утечки памяти после обработки уведомления или прерывания sinval (Tom Lane) §
Функции обработки этих событий могли переключить текущий контекст памяти на TopMemoryContext, что приводило к утечке данных на протяжении всей сессии, если любые данные выделялись до замены неправильной настройки. Наблюдались утечки, связанные (по крайней мере) с преобразованием кодировки входящих запросов и параметров, прикрепленных к сообщениям Bind.
Предотвращение утечки счетчиков ссылок для блока общей памяти, используемого для статистики (Anthonin Bonnefoy) §
Новый процесс бэкенда, присоединяющийся к общей памяти статистики, увеличивал счетчик ссылок, но не уменьшал его при выходе. После создания 232 сессий счетчик ссылок переполнялся до нуля, вызывая сбои при всех последующих запусках процессов бэкенда.
Предотвращены взаимные блокировки и сбои утверждений во время усечения журнала multixact SLRU (Хейкки Линнакангас) §
Процесс, пытающийся удалить сегменты SLRU, мог заблокироваться с процессом контрольной точки.
Избегалось возможное отсутствие событий конца ввода на сокетах Windows (Томас Мунро) §
Windows сообщает о событии FD_CLOSE только один раз после отключения удаленного конца соединения. При неудачном стечении обстоятельств это сообщение могло быть пропущено, и ожидание могло продолжаться бесконечно, или, по крайней мере, до истечения тайм-аута, в ожидании дальнейшего ввода.
Исправлено переполнение буфера при ошибках разбора JSON для неполных байтовых последовательностей (Джейкоб Чемпион) §
Было возможно выйти за пределы входного буфера на несколько байт, когда последние байты составляли неполный многобайтовый символ. Хотя обычно это безвредно, в принципе это могло вызвать сбой.
Отключено создание stateful TLS сессионных билетов с помощью OpenSSL (Даниэль Густафссон) § § §
Это позволяет избежать возможных сбоев с клиентами, которые считают, что получение сессионного билета означает поддержку возобновления TLS-сессии.
При перепланировании PL/pgSQL “простого выражения”, проверяется, что оно все еще простое (Tom Lane) §
Некоторые довольно искусственные случаи, такие как удаление ссылочной функции и её воссоздание в виде агрегата, могли привести к неожиданным сбоям, таким как “неожиданный тип узла плана”.
Исправлена обработка PL/pgSQL целочисленных диапазонов, содержащих подчеркивания (Эрик Винхольд) §
Начиная с версии 16, разрешено использование подчеркиваний в целочисленных литералах, но PL/pgSQL не смог обработать примеры такие как
FOR i IN 1_001..1_003
.Исправлены рекурсивные функции, возвращающие
RECORD
, в PL/Python (Том Лейн) §Если мы рекурсируем к новому вызову той же функции, которая передает другой список определений столбцов (предложение
AS
), это приведет к ошибке, потому что внутренний вызов перезапишет представление внешнего вызова о том, какой тип строки возвращать.Не повреждено PL/Python's
TD
словарь во время рекурсивного вызова триггера (Tom Lane) §Если PL/Python-триггер вызвал другой триггер, созданный для внутреннего триггера словарь
TD
перезаписывал словарьTD
внешнего триггера.Исправлено PL/Tcl сообщение об ошибке синтаксиса недопустимого списка в результате функции, возвращающей кортеж (Эрик Винхольд, Том Лейн) §
Такой случай мог привести к сбою или к выдаче вводящей в заблуждение контекстной информации, которая на самом деле относится к предыдущей ошибке Tcl.
Избегалось использование небезопасной для потоков функции
strerror()
в libpq (Петер Айзентраут) §Некоторые сообщения об ошибках, возвращаемые OpenSSL, могли быть искажены в многопоточных приложениях.
Избегалась утечка памяти в pg_dump во время бинарного обновления (Даниэль Густафссон) §
Убедитесь, что
pg_restore
-l
правильно сообщаются зависимые записи TOC (Том Лейн) §Если
-l
был указан вместе с опциями выборочного восстановления, такими как-n
или-N
, зависимые записи TOC, такие как комментарии, были бы исключены из списка, даже если бы фактическое восстановление выбрало их.Позволено
contrib/pg_stat_statements
различать служебные команды, появляющиеся внутри функций на языке SQL (Anthonin Bonnefoy) §Исполнитель функции языка SQL не передал идентификатор запроса, который вычислен для утилиты (не
SELECT
/INSERT
/UPDATE
/DELETE
/MERGE
) оператора.Избежана ошибка “курсор может сканировать только вперед” в
contrib/postgres_fdw
(Etsuro Fujita) §Эта ошибка могла возникнуть, если удаленный сервер является v15 или более поздней версии и внешняя таблица сопоставлена с нетривиальным удаленным представлением.
В
contrib/postgres_fdw
не отправлялись предложенияFETCH FIRST WITH TIES
на удаленный сервер (Japin Li) §Удалённый сервер может не реализовать это предложение или может интерпретировать его иначе, чем мы бы сделали это локально, поэтому не стоит рисковать попыткой удалённого выполнения.
Избегать конфликта с заголовками
<regex.h>
, предоставленными системой (Томас Мунро) §Это исправляет ошибку компиляции на macOS версии 15 и выше.
Исправлена в остальном безвредная ошибка утверждения в оценке стоимости Memoize (Дэвид Роули) §
Исправлены в остальном безвредные сбои утверждений в
REINDEX CONCURRENTLY
, применяемом к индексу SP-GiST (Tom Lane) §