E.25. Выпуск 13.15
Дата выпуска: 2024-05-09
В этот выпуск вошли различные исправления, внесённые после версии 13.14. За информацией о нововведениях версии 13 обратитесь к Разделу E.40.
E.25.1. Миграция на версию 13.15
Если используется версия 13.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 13.14, см. также Раздел E.26.
E.25.2. Изменения
Исправление поведения команды
INSERT
при вставке из нескольких строкVALUES
в целевой столбец, который является доменом, определённым поверх массива или составного типа (Том Лейн)В таких случаях команда либо завершалась ошибкой с сообщением о несовпадающих типах данных, либо вставлялись непредсказуемые приведённые значения, в результате чего могли выдаваться странные результаты.
Исправление некорректного отсечения секции NULL в случаях, когда таблица секционирована по логическому столбцу и запрос содержит логическое предложение
IS NOT
(Дэвид Роули)Значение NULL удовлетворяло предложению вида
, поэтому отсечение секции, содержащей значения NULL, приводило к некорректным результатам.boolcol
IS NOT FALSEОбеспечение перемещения всех последовательностей, принадлежащих таблице, в новую схему при использовании команды
ALTER FOREIGN TABLE SET SCHEMA
(Том Лейн)Перемещение обычной таблицы в новую схему приводит к тому, что все последовательности, принадлежащие таблице, также перемещаются в эту схему (вместе с индексами и ограничениями). Раньше последовательности сторонних таблиц не перемещались.
Исправление подсчёта страниц в куче командой
EXPLAIN
при сканировании кучи по битовой карте (Мелани Плейгман)Ранее не учитывались страницы кучи, не содержащие видимых кортежей, но более логично подсчитывать все страницы, возвращаемые при сканировании индекса по битовой карте.
Предотвращение взаимоблокировок при удалении потерянных временных таблиц (Михаил Жилин)
Если сеанс, создающий временную таблицу, завершается сбоем без удаления таблицы, процесс автоочистки рано или поздно попытается удалить потерянную таблицу. Однако входящий сеанс, которому назначено то же временное пространство имён, тоже сделает это. Раньше такие одновременные попытки очистки могли приводить к взаимоблокировкам, если временная таблица имела зависимость (например, принадлежащую ей последовательность).
Устранение условий гонки при проверке значений замороженных XID для каждого отношения (Ной Миш)
Вычисление значений замороженных XID для каждой базы данных на основе значений каждого отношения при выполнении команды
VACUUM
могло сбиваться из-за параллельного изменения этих значений другой командойVACUUM
.Запрет преобразования таблицы в представление во внешней команде SQL, использующей эту таблицу (Том Лейн)
Это позволяет избегать сбоев.
Обеспечение применения условий соединения, сгенерированных на основе классов эквивалентности, на правильном уровне плана (Том Лейн)
В версиях до PostgreSQL 16 сгенерированные условия могли оцениваться ниже внешних соединений, что приводило к неверным результатам запроса, поскольку они должны оцениваться выше (после) внешних соединений. Это касалось всех версий в случаях соединений с конструкциями
UNION ALL
, когда в столбце соединения в результате некоторых подзапросовSELECT
возвращались константы.Предотвращение ненужного использования режима движущегося агрегата для окна с неподвижным началом рамки (Валлимахараджан Джи)
В случаях, когда в качестве оконной функции использовался простой агрегат, а начало рамки окна указывалось как
UNBOUNDED PRECEDING
, рамка не могла перемещаться, поэтому не следовало использовать специальный (и более дорогой) режим движущегося агрегата. Данная оптимизация изначально должна была работать, но из-за ошибки в коде никогда не применялась.Предотвращение использования ранее освобождённых данных при планировании соединений на уровне секций GEQO-оптимизатором (Том Лейн)
Такие случаи обычно приводили к сбою или неожиданному сообщению об ошибке.
Исправление некорректного отображения кодов для видов статистики в сообщениях об ошибках «requested statistics kind
X
is not yet built» (запрошенный вид статистики X ещё не создан) (Дэвид Роули)Более аккуратная обработка функций, возвращающих
RECORD
, в предложенияхFROM
(Том Лейн)Выходные столбцы такого вызова функции должны определяться предложением
AS
, которое указывает имена столбцов и типы данных. Если фактическое выходное значение функции не соответствует этому указанию, предполагается, что во время выполнения должна выдаваться ошибка. Однако в некоторых местах кода фактическое значение могло проверяться преждевременно, и если оно не соответствовало, могли возникать странные ошибки или сбои проверочных утверждений.Устранение путаницы в отношении типа возвращаемой строки процедур на языке SQL (Том Лейн)
Процедура, реализованная на языке SQL, которая возвращает один столбец составного типа, могла вызывать сбой проверочного утверждения или аварийный сбой.
Добавление защитных проверок глубины стека в некоторых рекурсивных функциях (Егор Чиндяскин)
Обнаружение целочисленного переполнения при добавлении или вычитании значений типа
interval
из значений типаtimestamp
(Джозеф Кошаков)В некоторых случаях, которые должны вызывать ошибку выхода за пределы допустимого диапазона, вместо этого выдавался неверный результат.
Устранение условий гонки в функции
pg_get_expr()
(Том Лейн)Функция должна была возвращать NULL, если параллельно удалялось отношение, на которое ссылался аргумент, но иногда вместо этого выдавалась ошибка.
Устранение ошибки в обнаружении старых идентификаторов транзакций в функциях, касающихся статуса XID (Карина Лицкевич)
Ранее идентификаторы транзакций больше 231 могли быть ошибочно идентифицированы как последние, что приводило к неправильному поведению функций
pg_xact_status()
илиtxid_status()
.Исправление утечки файлового дескриптора при возникновении ошибки во время ожидания в функции
WaitEventSetWait
(Эцуро Фудзита)Вызов ошибки при обращении к индексу во время его перестроения (Том Лейн)
Раньше при перестроении вызывалось проверочное утверждение, а теперь — обычная ошибка времени выполнения, т. е. при попытке перестроить индекс с некорректным обращением к той же таблице, пользователи сразу увидят более точное сообщение об ошибке.
Обеспечение вывода полностью дополненного значения при сканировании только индекса столбцов
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/pgSQLCASE
.Устранение выдачи ложных несовпадений коротких и длинных значений заголовков в
contrib/amcheck
(Андрей Бородин, Михаил Жилин)Данные переменной длины в кортеже кучи или индексном кортеже могут иметь короткий или длинный заголовок, в зависимости от параметров сжатия, которые применялись при их создании. Эти значения теперь считаются эквивалентными, и сообщение о несовпадении не выводится.
Исключение запросов на сортировку по константе в
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 (Томас Манро, Брюс Момджян, Том Лейн)