E.3. Выпуск 16.2 #

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

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

E.3.1. Миграция на версию 16.2 #

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

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

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

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

  • Усиление ограничений безопасности команды REFRESH MATERIALIZED VIEW CONCURRENTLY (Хейкки Линнакангас)

    Один из шагов команды параллельного обновления выполнялся со слабыми ограничениями безопасности. Если владелец материализованного представления убеждал суперпользователя или другого пользователя с расширенными правами выполнить параллельное обновление этого представления, владелец представления мог контролировать код, выполняемый с правами пользователя, который запускал команду REFRESH. Уязвимость устранена, теперь весь пользовательский код запускается от имени владельца представления, как и предполагается.

    Поскольку единственный известный способ использования уязвимости не работает в PostgreSQL 16.0 и более поздних версиях, предполагается, что на практике версия 16 не подвержена ей.

    Проект PostgreSQL благодарит Педро Гальегоса за сообщение об этой проблеме. (CVE-2024-0985)

  • Устранение утечки памяти при выполнении встраивания JIT (Андрес Фройнд, Даниэль Густафссон)

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

  • Предотвращение создания некорректных планов соединения секций (Ричард Гуо)

    Некоторые необычные ситуации, связанные с ссылками LATERAL, могли приводить к созданию некорректных планов. При этом могли выдаваться неверные результаты или вызываться странные ошибки, такие как «variable not found in subplan target list» (переменная не найдена в целевом списке подплана), или сбой исполнителя.

  • Устранение неправильного обёртывания выходных выражений подзапроса в PlaceHolderVar (Том Лейн)

    Исправление исключает получение неправильных результаты, когда подзапрос находится под внешним объединением и в нём есть выходной столбец, который ссылается в LATERAL на что-то за пределами области внешнего соединения. Из-за действий внешнего соединения выходной столбец мог не отображаться как NULL, когда должен был.

  • Устранение неправильной обработки условий запуска оконных функций (Ричард Гуо)

    Неправильная обработка могла приводить к ошибкам «WindowFunc not found in subplan target lists» (оконная функция не найдена в целевом списке подплана).

  • Устранение ошибки в обнаружении уникальности планов Memoize с внутренней стороны соединения (Ричард Гуо)

    Это упущение могло приводить к ошибкам «cache entry already complete» (запись в кеш уже выполнена).

  • Исправлено вычисление varnullingrel при выборе поля, сводимого к константе (Ричард Гуо)

    Ранее такое вычисление приводило к ошибкам вида «wrong varnullingrels (b) (expected (b 3)) for Var 2/2» (неправильные varnullingrels (b) (ожидалось (b 3)) для Var 2/2).

  • Пропуск недопустимых действий при межсекционных изменениях, вызванных командой MERGE (Дин Рашид)

    Если при выполнении действия MERGE UPDATE для секционированной таблицы операция UPDATE превращается в DELETE и INSERT из-за изменения столбца ключа разбиения, то теперь пропускается запуск триггеров AFTER UPDATE ROW,а также другие действия после обновления, например проверки RLS. Эти действия обычно завершались ошибкой, поэтому обычное действие UPDATE не выполняло их в таких случаях, и MERGE теперь тоже не будет.

  • Правильная обработка триггеров BEFORE ROW DELETE при межсекционных изменениях, выполняемых командой MERGE (Дин Рашид)

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

  • Недопущение обращения к разделяемому буферу в триггерах BEFORE ROW UPDATE (Александр Лахин, Том Лейн)

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

  • Предотвращение запроса слишком большого размера разделяемой памяти при параллельном хеш-соединении (Томас Манро, Андрей Лепихов, Александр Коротков)

    Ограничивающее значение было слишком большим, что приводило к возникновению ошибок «invalid DSA memory alloc request size» (недопустимый запрошенный размер разделяемой памяти DSA) при достаточно больших ожидаемых размерах хеш-таблицы.

  • Устранение повреждения состояния локального буфера при возникновении ошибки во время попытки расширения временной таблицы (Тендер Ван)

  • Исправление использования слота кортежа при оценке агрегатов DISTINCT с несколькими аргументами (Дэвид Роули).

    Ранее использование неправильного слота могло приводить к ошибкам вида «attribute 1 of type record has wrong type» (атрибут 1 записи типа имеет неправильный тип).

  • Предотвращение сбоев проверочных утверждений в функциях heap_update() и heap_delete() в случаях, когда кортеж, обновляемый триггером обеспечения целостности внешнего ключа, не проходит дополнительную перекрёстную проверку видимости (Александр Лахин)

    Эта ошибка не влияла на сборки без проверочных утверждений.

  • Исправление слишком строгого проверочного утверждения для параметра false_positive_rate в классах операторов BRIN bloom (Александр Лахин)

    Эта ошибка не влияла на сборки без проверочных утверждений.

  • Устранение возможного сбоя при выполнении команды ALTER TABLE ADD COLUMN для сложного дерева наследования (Тендер Ван)

    Если дочерняя таблица наследовала новый столбец через несколько промежуточных родителей, команда завершалась ошибкой «tuple already updated by self» (кортеж уже изменился сам).

  • Устранение проблем с повторяющимися именами фрагментов в командах ALTER TEXT SEARCH CONFIGURATION... MAPPING (Тендер Ван, Микаэль Пакье)

  • Исправление поведения команды DROP ROLE с дублирующимися именами ролей (Микаэль Пакье)

    Ранее это приводило к ошибке «tuple already updated by self» (кортеж уже изменился сам). Теперь дубликат игнорируется.

  • Корректное получение блокировки связанной таблицы при выполнении команды DROP STATISTICS (Томаш Вондра)

    Невозможность получить блокировку могла приводить к ошибкам «tuple concurrently deleted» (одновременное удаление кортежей), если команда DROP выполнялась одновременно с командой ANALYZE.

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

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

  • Обнаружение устаревания новой записи в кеше каталога при распаковке полей (Том Лейн)

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

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

    Вычисление 0 - INT64_MIN должно вызывать ошибку переполнения, что и происходит на большинстве платформ. Однако платформы, не имеющие ни встроенного целочисленного переполнения, ни 128-битных целых чисел, не могли обнаружить переполнение и вместо вызова ошибки вычисляли INT64_MIN.

  • Обнаружение переполнения юлианской даты при добавлении значений типа interval к значениям типа timestamp или вычитании первых из вторых (Том Лейн)

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

  • Добавление дополнительных проверок на переполнение в функциях interval_mul() и interval_div() (Дин Рашид)

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

  • Возможность прерывания функции scram_SaltedPassword() (Боуэн Ши)

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

  • Удаление данных кешированной статистики после изменения переменной stats_fetch_consistency (Синъя Като)

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

  • Обеспечение проверки допустимости неприменяемых значений для параметров с контекстом backend или superuser-backend в представлении pg_file_settings (Том Лейн)

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

  • Сопоставление правил сортировки при сопоставлении существующего индекса с новым секционированным индексом (Питер Эйзентраут)

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

  • Предотвращение сбоя при удалении дочернего индекса одновременно с выполнением команды REINDEX INDEX для секционированного индекса (Фей Чанхун)

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

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

  • Предотвращение преждевременного освобождения закрепления буфера при вставке индекса GIN (Том Лейн)

    Если разделение корневой страницы индекса происходило одновременно с пользовательской вставкой, выполнение кода могло завершаться ошибкой «buffer NNNN is not owned by resource owner» (буфер NNNN не принадлежит владельцу ресурса).

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

    Попытка использовать индекс такого типа могла приводить к ошибкам «No such file or directory» (Нет такого файла или каталога).

  • Исправление проверок владения большими объектами (Том Лейн)

    При выполнении не суперпользователями операции с большими объектами, требующими прав владения, завершались ошибкой «unrecognized class ID: 2613» (нераспознанный ID класса: 2613).

  • Исправление отчётов об изменении владельца для больших объектов (Том Лейн)

    Ничего не делающая команда ALTER LARGE OBJECT OWNER (то есть команда, выбирающая существующего владельца) передавала неправильный идентификатор класса в PostAlterHook, что могло вызывать нарушения в работе любого расширения, использующего этот обработчик.

  • Исправление отчётов о данных времени ввода-вывода в EXPLAIN (BUFFERS) (Микаэль Пакье)

    Значения, помеченные как «shared/local» (общие/локальные), на самом деле относятся только к общим буферам, поэтому эта метка была изменена на «shared» (общие).

  • Обеспечение надёжности команды CREATE DATABASE (Ной Миш)

    При сбое операционной системы во время или вскоре после выполнения команды CREATE DATABASE восстановление или последующие подключения к новой базе данных могли завершаться ошибкой. Если в этом временном окне была создана базовая резервная копия, при попытке её использовать могли наблюдаться аналогичные проблемы. При этом каталог базы данных, файл PG_VERSION или файл pg_filenode.map могли быть пустыми или отсутствовать.

  • Запись в журнал дополнительных сообщений LOG при запуске и завершении восстановления из резервной копии (Андрес Фройнд)

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

  • Предотвращение неправильной обработки «мёртвых» индексных кортежей во время подтранзакций на резервных серверах (Фей Чанхун)

    Флаг startedInRecovery был неправильно задан для подтранзакций. Это влияло только на обработку «мёртвых» индексных кортежей и могло позволить запросу в подтранзакции игнорировать записи индекса, которые он должен возвращать (если они уже «мертвы» на ведущем сервере, но не «мертвы» для транзакции на резервном), или преждевременно помечать на резервном сервере «мёртвыми» такие записи, которые ещё не являются «мёртвыми» на ведущем. Неясно, приводил ли последний случай к каким-либо серьёзным последствиям, но предполагалось другое поведение.

  • Исправление обработки сигналов в процессах walreceiver (Хейкки Линнакангас)

    Отменено изменение, из-за которого процессы walreceiver не реагировали на SIGTERM во время ожидания установки соединения репликации.

  • Устранение риска целочисленного переполнения при проверке того, поместится ли запись в буфер декодирования WAL (Томас Манро)

    Эта ошибка, по-видимому, являлась скрытой, за исключением случаев запуска 32-битной сборки PostgreSQL на 64-битной платформе.

  • Устранение взаимоблокировок между процессом применения изменений логической репликации, процессом tablesync и процессом сеанса, пытающимся изменить подписку (Шлок Кьял)

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

  • Обеспечение корректной передачи значений столбцов по умолчанию подключаемым модулем логической репликации pgoutput (Никхил Бенеш)

    Команда ALTER TABLE ADD COLUMN с постоянным значением по умолчанию для нового столбца не перезаписывает существующие кортежи, вместо этого предполагается, что при чтении будет вставлено правильное значение по умолчанию в кортеж, в котором отсутствует этот столбец. Если впоследствии для таблицы была инициирована репликация, pgoutput передавал NULL вместо правильного значения по умолчанию для такого столбца, что могло нарушить репликацию на подписчике.

  • Устранение сбоя начальной синхронизации логической репликации для таблицы без столбцов (Вигнеш Си)

    При таком сбое команда COPY создавалась в некорректном формате.

  • Повторная проверка строки подключения подписки перед использованием (Вигнеш Си)

    Повторная проверка предназначена для выявления случаев, когда подписка была создана без пароля (что разрешено суперпользователям), но затем владелец подписки был изменён на обычного пользователя.

  • Возвращение правильного кода состояния, когда новый клиент отключается, не отвечая на запрос пароля сервером (Лю Ланг, Том Лейн)

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

  • Исправление несовместимости с OpenSSL 3.2 (Тристан Партин, Бо Андресон)

    Раньше предполагалось, что для частного хранилища можно использовать поле «data», что не вызывало проблем, но в версии 3.2 приводило к сбоям и сообщениям о двойном освобождении. Теперь используется поле BIO «app_data».

  • Особое внимание у случаям, когда OpenSSL не устанавливает errno при возникновении ошибки (Том Лейн)

    Теперь, если errno не установлен, предполагается, что причиной сообщения о сбое является чтение признака конца файла. Это исправление устраняет редкие случаи странных сообщений об ошибках, таких как «could not accept SSL connection: Success» (не удалось принять SSL-соединение: Успех).

  • Устранение утечки файлового дескриптора при сбое функции обёртки сторонних данных ForeignAsyncRequest (Хейкки Линнакангас)

  • Устранение незначительной утечки памяти при проверке строки подключения в команде CREATE SUBSCRIPTION (Джефф Дэвис)

  • Сообщение об ошибках ENOMEM из системных вызовов, связанных с файлами, в виде ERRCODE_OUT_OF_MEMORY, а не ERRCODE_INTERNAL_ERROR (Александр Кузьменков)

  • Поддержка SQL-команд типа CREATE FUNCTION/CREATE PROCEDURE с телами по стандарту SQL в PL/pgSQL (Том Лейн)

    Ранее выполнение таких команд завершалось сбоем из-за ошибок разбора, вызванных появлением точек с запятой в теле функции.

  • Исправление обработки ошибок в конвейерах библиотекой libpq (Альваро Эррера)

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

  • Обеспечение сброса буфера вывода клиента функцией libpq PQsendFlushRequest() по тем же правилам, что и другие функции PQsend (Йелте Феннема-Нио)

    В конвейерном режиме всё равно может потребоваться вызов функции PQflush(), но это изменение устраняет ранее существовавшую несогласованность.

  • Устранение условий гонки при инициализации библиотекой libpq поддержки OpenSSL одновременно в двух разных потоках (Вилли Манн, Микаэль Пакье)

  • Устранение сбоя с зависимостью от времени при передаче данных GSSAPI (Том Лейн)

    При использовании шифрования GSSAPI в неблокирующем режиме библиотека libpq иногда выдавала ошибку «GSSAPI caller failed to retransmit all data needing to be retried» (вызывающей стороне GSSAPI не удалось повторно передать все необходимые данные).

  • Изменение поведения утилиты initdb: теперь всегда удаляются знаки комментариев для параметров lc_xxx в файле postgresql.conf (Кётаро Хоригути)

    Утилита initdb работала таким образом до версии 16, и теперь это поведение восстановлено. Изменение поведения ранее привело к тому, что параметр --no-locale не оказывал должного эффекта на lc_messages.

  • Исключение выгрузки в pg_dump политик RLS или меток безопасности для объектов, являющихся членами расширения (Том Лейн, Джейкоб Чемпион)

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

  • Исключение выгрузки объекта расширенной статистики в pg_dump, если нижележащая для него таблица не выгружается (Райан Макгуайр, Том Лейн)

    Такое поведение соответствует поведению других зависимых объектов, таких как индексы.

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

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

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

  • Устранения сбоя в contrib/intarray в случаях, когда массив с элементом, равным INT_MAX, вставлялся в индекс gist__int_ops (Александр Лахин, Том Лейн)

  • Повышение информативности сообщений об ошибках при применении функции hash_bitmap_info() contrib/pageinspect к секционированному хеш-индексу (Александр Лахин, Микаэль Пакье)

  • Повышение информативности сообщений об ошибках при применении функции pgstathashindex() contrib/pgstattuple к секционированному хеш-индексу (Александр Лахин)

  • Отключение в Windows параметров автозапуска при запуске подпроцессов в pg_ctl и pg_regress (Кётаро Хоригути)

    При запуске дочернего процесса через cmd.exe теперь передаётся флаг /D, чтобы предотвратить выполнение любых команд автозапуска, указанных в реестре. Это позволяет избежать возможных непредвиденных побочных эффектов.

  • Перенос функции is_valid_ascii() из mb/pg_wchar.h в utils/ascii.h (Джубили Янг)

    Это изменение позволяет не включать <simd.h> в pg_wchar.h, что ранее вызывало проблемы для некоторого стороннего кода.

  • Устранение ошибок компиляции с libxml2 версии 2.12.0 или новее (Том Лейн)

  • Устранение ошибок компиляции кода WAL_DEBUG в Windows (Бхарат Рупиредди)

  • Подавление предупреждений компилятора о конструкциях в заголовочных файлах Python (Питер Эйзентраут, Том Лейн)

    При использовании предпочтительных параметров компилятора выдаются предупреждения о конструкциях, появляющихся в последних версиях заголовочных файлов Python. При использовании gcc эти предупреждения можно подавить с помощью указаний pragma.

  • Исключение предупреждений об устаревании при компиляции с использованием LLVM 18 (Томас Манро)

  • Обновление данных часовых поясов до версии tzdata 2024a, включающее изменение правил перехода на летнее время в Гренландии, Казахстане и Палестине, исправления для антарктических станций Кейси и «Восток», а также корректировку исторических данных для Вьетнама, Торонто и Микелона.