E.8. Выпуск 16.4 #

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

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

E.8.1. Миграция на версию 16.4 #

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

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

E.8.2. Изменения #

  • Запрет выполнения несанкционированного кода во время работы pg_dump (Масахико Савада)

    Злоумышленник, способный создавать и удалять невременные объекты, мог внедрить SQL-код, который выполнялся бы параллельным сеансом pg_dump с правами роли, запускавшей pg_dump (которая зачастую является суперпользователем). Атака заключается в замене последовательности или аналогичного объекта представлением или внешней таблицей, которая выполняет вредоносный код. Чтобы её предотвратить, был добавлен новый параметр сервера restrict_nonsystem_relation_kind, который может отключить расширение невстроенных представлений и доступ к сторонним таблицам, а также позволяет pg_dump устанавливать такой параметр, если это возможно. Обратите внимание, что атака предотвращается, только если версии pg_dump и сервера, с которого выполняется выгрузка, содержат это исправление.

    Проект PostgreSQL благодарит Ноя Миша за сообщение об этой проблеме. (CVE-2024-7348)

  • Предотвращение некорректных результатов планов Merge Right Anti Join (Ричард Гуо)

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

  • Предотвращение бесконечного цикла в VACUUM (Мелани Плейгман)

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

  • Устранение ошибки после добавления таблицы в качестве секции, если у этой таблицы ранее были потомки в иерархии наследования (Альваро Эррера)

  • Исправление поведения команды ALTER TABLE DETACH PARTITION в случаях, связанных с несогласованными ограничениями на основе индексов (Альваро Эррера, Тендер Ван)

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

  • Исправлена настройка отсечения секций во время выполнения ALTER TABLE DETACH PARTITION CONCURRENTLY (Альваро Эррера)

    Исполнитель предполагал, что ни одна секция не может быть отсоединена в интервале между планированием и выполнением запроса для секционированной таблицы. С появлением параметра CONCURRENTLY действия DETACH PARTITION это не так: теперь при использовании этого действия временно возможно завершение запроса ошибкой.

  • Исправление изменения значения поля pg_class.reltuples секционированной таблицы на ноль после удаления её последней дочерней секции (Ной Миш)

    Первая команда ANALYZE для такой секционированной таблицы должна была также изменять relhassubclass, и это приводило к потере изменений reltuples.

  • Исправление обработки полиморфных выходных аргументов для процедур (Том Лейн)

    SQL-оператор CALL не разрешал правильные типы данных для таких аргументов, что приводило к ошибкам вида «cannot display a value of type anyelement» (значение типа anyelement нельзя вывести) или даже к аварийным сбоям. (При этом оператор CALL в PL/pgSQL работал правильно.)

  • Исправление поведения стабильных функций, вызываемых из списка аргументов оператора CALL (Том Лейн)

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

  • Исправление ввода «расширенного» формата времени ISO-8601 для типов time и timetz (Том Лейн)

    Теперь вновь разрешены варианты вида T12:34:56.

  • Обнаружение целочисленного переполнения в вычислениях money (Джозеф Кошаков)

    Никакие арифметические функции для типа money ранее не имели соответствующих проверок, поэтому при переполнении просто выдавали неверные результаты.

  • Исправлено чрезмерно агрессивное ограничение аргумента масштаба в функциях round(numeric) и trunc(numeric) (Дин Рашид)

    Эти функции ограничивали свой масштаб аргумента до +/-2000, но есть допустимые сценарии использования для больших значений: в таких случаях функции возвращали неверные результаты. Теперь предел диапазона ограничен только типом numeric.

  • Исправление результатов применения функции pg_size_pretty() к наименьшему возможному значению bigint (Джозеф Кошаков)

  • Предотвращение сбоя функции pg_sequence_last_value() при использовании для нежурналируемых последовательностей на резервных серверах и во временных последовательностях других сеансов (Натан Боссарт)

    Теперь вместо вывода ошибки в таких случаях возвращается NULL.

  • Исправление разбора игнорируемых операторов в функции websearch_to_tsquery() (Том Лейн)

    Согласно руководству, пунктуация во входных данных функции websearch_to_tsquery() игнорируется, за исключением тире и кавычек в некоторых особых случаях. Однако скобки и некоторые другие символы, появляющиеся непосредственно перед or, могли приводить к тому, что or рассматривался как обычное слово в данных, а не как оператор OR.

  • Обнаружение нового случая целочисленного переполнения при вычислении новых размерностей массива (Джозеф Кошаков)

    Применение размерностей [-2147483648:2147483647] к пустому массиву отклоняется. Эта проблема тесно связана с CVE-2023-5869, но не является критичной, поскольку массив всё равно оказывается пустым.

  • Исправление непереносимого использования strnxfrm() (Джефф Девис)

    В некоторых местах кода проверки недетерминированных правил сортировки могли завершаться ошибками, например «pg_strnxfrm() returned unexpected result» (pg_strnxfrm() вернула неожиданный результат).

  • Обнаружение ещё одного случая устаревания новой записи в кеше каталога при распаковке (detoasting) полей (Ной Миш)

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

  • Исправление проверки изменчивости столбцов представления для выражений INSERT ... DEFAULT (Том Лейн)

    Если такой столбец является неизменяемым, должно было бы выдаваться сообщение об ошибке. Но проверка пропускалась, и затем в более позднем месте кода выдавалась бесполезная ошибка, например «attribute number N not found in view targetlist» (атрибут номер N не найден в списке целей представления).

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

    Порядок проверок ошибок был изменён так, чтобы ошибка выдавалась в точке, когда запрос WITH RECURSIVE не ссылается на себя во второй ветви UNION, но имеет одну ссылку на себя в каком-то другом месте, например в ORDER BY.

  • Блокировка принадлежащих таблице последовательностей во время выполнения ALTER TABLE SET LOGGED|UNLOGGED (Ной Миш)

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

  • Предотвращение ошибок, если поставленный в очередь триггер AFTER больше не существует (Том Лейн)

    Транзакция могла выполнять операцию, которая ставит в очередь отложенный триггер AFTER для последующего выполнения, а затем удалять триггер до его срабатывания. Раньше это приводило к странным ошибкам, таким как «could not find trigger NNNN» (не удалось найти триггер NNNN). Если триггер не существует в момент, когда он должен был сработать, логичнее, чтобы ничего не происходило, а не выдавалась ошибка.

  • Устранение ошибки, из-за которой не удалялись записи pg_init_privs для прав на уровне столбцов при удалении их таблицы (Том Лейн)

    Если расширение предоставляло определённые права на уровне столбцов для таблицы, которую оно создало, после удаления расширения оставались соответствующие записи каталога. Это было безвредно до тех пор, пока/если OID таблицы не переиспользовался для другого отношения и не вмешивался в результат работы pg_dump для этого отношения.

  • Исправление выбора решающего индекса для ON CONFLICT, когда у нужного индекса есть выражения или предикаты (Том Лейн)

    Если запрос с ON CONFLICT обращался к целевой таблице через изменяемое представление, он мог завершиться ошибкой «there is no unique or exclusion constraint matching the ON CONFLICT specification» (нет уникального ограничения или ограничения-исключения, соответствующего указанию ON CONFLICT), даже если соответствующий индекс существует.

  • Отклонение изменений временной таблицы другого сеанса с помощью ALTER TABLE (Том Лейн)

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

  • Исправление обработки расширенной статистики для выражений в CREATE TABLE LIKE STATISTICS (Том Лейн)

    Команда CREATE не могла настроить ссылки на столбцы в статистических выражениях для соответствия возможно отличающейся нумерации столбцов новой таблицы. Это приводило к появлению недействительных объектов статистики, которые впоследствии могли вызывать проблемы. Типичный сценарий, требующий перенумерации столбцов — наличие в исходной таблице удалённых столбцов.

  • Устранение ошибки пересчёта подзапросов, сгенерированных агрегатными функциями MIN() или MAX() (Том Лейн)

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

  • Возобновление запрета на использование подчеркивания в позиционных параметрах (Эрик Винхольд)

    Начиная с версии 16, для целочисленных констант была добавлена возможность содержать подчёркивания. Это изменение привело к тому, что ввод вида $1_234, воспринимался как единый фрагмент, но это работало некорректно. Поэтому было принято решение вернуться к исходному определению, в котором в параметре допускался только символ $, за которым следовали цифры.

  • Предотвращение сбоев в случаях, когда встроенная JIT-компилятором функция вызывает ошибку (Том Лейн)

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

  • Адаптация под изменения в поведении libxml2 версии 2.13.x (Эрик Винхольд, Том Лейн)

    В частности, теперь ошибки «chunk is not well balanced» (порция плохо сбалансирована) из libxml2 подавляются, только если это не единственная вызванная ошибка. Цель этого исправления — сделать сообщения об ошибках согласованными между 2.13.x и более ранними версиями libxml2. В более ранних версиях это сообщение почти всегда было избыточным или совершенно неверным, поэтому в версии 2.13.x существенно уменьшено количество случаев, в которых оно выводится.

  • Исправление обработки подтранзакций подготовленных транзакций при запуске сервера горячего резерва (Хейкки Линнакангас)

    При запуске воспроизведения резервным сервером записи WAL контрольной точки типа shutdown, транзакции, которые были подготовлены, но ещё не зафиксированы на ведущем сервере, правильно распознаются как выполняющиеся. Но подтранзакции подготовленной транзакции (созданные точками сохранения или блоками исключений PL/pgSQL) не учитывались и считались прерванными. Это приводило к несогласованности, если подготовленная транзакция затем фиксировалась.

  • Предотвращение неправильной инициализации слотов логической репликации (Масахико Савада)

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

  • Устранение ошибки «can only drop stats once» (статистику можно удалить только один раз) во время создания и удаления слота репликации (Флорис Ван Ни)

  • Устранение утечки ресурсов при логической репликации передатчика WAL (Хоу Чжицзе)

    В процессе walsender происходила утечка памяти при публикации изменений для секционированной таблицы, типы строк секций которой физически отличаются от типов строк секционированной таблицы.

  • Предотвращение утечки памяти после обслуживания прерывания notify или sinval (Том Лейн)

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

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

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

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

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

  • Предотвращение возможной потери событий конца ввода для сокетов Windows (Томас Манро)

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

  • Устранение выхода за границу буфера в отчётах об ошибках разбора JSON для неполных байтовых последовательностей (Джейкоб Чемпион)

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

  • Отключение создания сеансовых билетов TLS типа stateful с помощью OpenSSL (Даниэль Густафссон)

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

  • Добавление проверки, что «простые выражения» PL/pgSQL остаются простыми при перепланировании (Том Лейн)

    В некоторых довольно искусственных случаях, например при удалении указываемой функции и её пересоздании в качестве агрегатной, могли возникать неожиданные сбои, такие как «unexpected plan node type» (неожиданный тип узла плана).

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

    Начиная с версии 16, для целочисленных констант была добавлена возможность содержать подчёркивания, но PL/pgSQL не мог работать с такими примерами, как FOR i IN 1_001..1_003.

  • Исправление рекурсивных функций PL/Python, возвращающих RECORD (Том Лейн)

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

  • Устранение повреждений словаря TD PL/Python во время рекурсивного вызова триггера (Том Лейн)

    Если триггер языка PL/Python приводил к вызову другого триггера, словарь TD, созданный для внутреннего триггера, перезаписывал словарь TD внешнего.

  • Устранение ошибки, из-за которой PL/Tcl сообщал о недопустимом синтаксисе списка в результате функции, возвращающей кортеж (Эрик Винхольд, Том Лейн)

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

  • Предотвращение небезопасного использования strerror() в многопоточной среде в libpq (Питер Эйзентраут)

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

  • Предотвращение утечки памяти в pg_dump во время обновления в двоичном формате (Даниэль Густафссон)

  • Гарантия корректного вывода зависимых записей TOC при использовании pg_restore с параметром -l (Том Лейн)

    Если параметр -l был указан вместе с параметрами выборочного восстановления, такими как -n или -N, зависимые записи TOC, например комментарии, исключались из списка, даже если должны были быть включены в фактическое восстановление.

  • Возможность contrib/pg_stat_statements различать служебные операторы внутри функций языка SQL (Антонин Боннефой)

    Исполнителю функции языка SQL не удавалось передать идентификатор запроса, вычисляемый для служебных операторов (не SELECT/INSERT/UPDATE/DELETE/MERGE).

  • Устранение ошибки «cursor can only scan forward» (курсор может сканировать только вперёд) в contrib/postgres_fdw (Эцуро Фудзита)

    Эта ошибка могла возникать, если версия удалённого сервера была 15 или выше, и при этом внешняя таблица сопоставлялась с нетривиальным удалённым представлением.

  • Запрет отправления предложений FETCH FIRST WITH TIES на удалённый сервер в contrib/postgres_fdw (Япинь Ли)

    Удалённый сервер мог не реализовать это условие или интерпретировать его иначе, чем это делалось локально, поэтому теперь удалённое выполнение отключено.

  • Предотвращение конфликтов с заголовками <regex.h>, предоставляемыми системой (Томас Манро)

    Это исправление устраняет ошибку компиляции в macOS версии 15 и выше.

  • Исправление сбоев проверочных утверждений в оценке стоимости Memoize (Дэвид Роули)

  • Исправление сбоев проверочных утверждений в REINDEX CONCURRENTLY, применяемых к индексу SP-GiST (Том Лейн)