E.17. Выпуск 14.11

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

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

E.17.1. Миграция на версию 14.11

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

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

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

E.17.2. Изменения

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

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

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

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

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

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

  • Устранение необходимости поиска в списке ожидающих процессов при исключении из очереди LWLock (Андрес Фройнд)

    Это улучшение исправляет поведение O(N^2) при большом списке ожидания, что в некоторых случаях также приводит к существенному повышению пропускной способности.

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Корректное получение блокировки связанной таблицы при выполнении команды 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() (Дин Рашид)

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

  • Обеспечение проверки допустимости неприменяемых значений для параметров с контекстом 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» (Нет такого файла или каталога).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Сообщение об ошибках 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 не удалось повторно передать все необходимые данные).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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