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

E.13. Выпуск 16.2

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

Дата релиза:  2024-02-08

Этот выпуск содержит различные исправления из версии 16.1. Для получения информации о новых функциях в основном выпуске 16 см. Раздел E.15.

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

Снятие дампа/восстановление не требуется для тех, кто использует 16.X.

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

Также, если обновление выполняется с версии ранее 16.1, см. Раздел E.14.

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

  • Ужесточены ограничения безопасности в REFRESH MATERIALIZED VIEW CONCURRENTLY (Хейкки Линкангас) § §

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

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

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

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

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

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

    Некоторые редкие ситуации, связанные с боковыми ссылками, могут создавать некорректные планы. Затронутые запросы могут давать неправильные ответы или странные ошибки, такие как переменная не найдена в целевом списке подзапроса, или сбои исполнителя.

  • Исправлено некорректное оборачивание выражений вывода подзапроса в PlaceHolderVars (Том Лейн) §

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

  • Исправлено неправильное обработка условий выполнения оконной функции (Richard Guo) §

    Этот недочет мог приводить к ошибкам WindowFunc not found in subplan target lists

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

    Эта ошибка могла привести к ошибкам запись в кэше уже завершена.

  • Исправлено вычисление nullingrels при упрощении констант выбора поля (Ричард Гуо) §

    Неудача в выполнении этого привела к ошибкам, таким как wrong varnullingrels (b) (expected (b 3)) for Var 2/2.

  • Пропускались неподходящие действия, когда MERGE вызывал обновление с перекрестным разделением (Дин Рашид) §

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

  • Справляться с BEFORE ROW DELETE триггерами в обновлениях MERGE между разделами (Дин Рашид) §

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

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

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

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

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

  • Исправлено повреждение состояния локального буфера, когда возникает ошибка при попытке расширить временную таблицу (Tender Wang) §

  • Исправлено использование неправильного слота кортежа при вычислении агрегатов DISTINCT, которые имеют несколько аргументов (David Rowley) §

    Эта ошибка могла привести к таким ошибкам, как атрибут 1 типа record имеет неправильный тип.

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

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

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

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

  • Исправлена возможная ошибка во время ALTER TABLE ADD COLUMN на сложном дереве наследования (Tender Wang) §

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

  • Исправлены проблемы с дублирующимися именами токенов в командах ALTER TEXT SEARCH CONFIGURATION ... MAPPING (Тендер Ван, Майкл Пакье) §

  • Исправлено DROP ROLE с дублирующимися именами ролей (Michael Paquier) §

    Ранее это приводило к сбою кортеж уже обновлен самим собой. Вместо этого дубликат игнорируется.

  • Связанная таблица была правильно заблокирована во время DROP STATISTICS (Томаш Вондра) §

    Неудача при получении блокировки может привести к ошибкам кортеж одновременно удален, если DROP выполняется одновременно с ANALYZE.

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

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

  • Обнаружено, что новая запись кэша каталога устарела во время детостинга её полей (Tom Lane) § §

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

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

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

  • Обнаружено переполнение юлианской даты при добавлении или вычитании интервала к/из метки времени (Tom Lane) §

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

  • Добавлены дополнительные проверки на переполнение в interval_mul() и interval_div() (Дин Рашид) §

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

  • Позволено прерывание scram_SaltedPassword() (Bowen Shi) §

    С большими значениями scram_iterations эта функция могла выполняться долго. Разрешено прерывание запросами на отмену.

  • Убедитесь, что кэшированные статистические данные были сброшены после изменения stats_fetch_consistency (Shinya Kato) §

    Некоторые пути кода могли возвращать устаревшую статистику.

  • Проверка представления pg_file_settings на корректность непримененных значений для настроек с контекстом backend или superuser-backend (Tom Lane) §

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

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

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

  • Избегать сбоя, если дочерний индекс был удалён одновременно с REINDEX INDEX на секционированном индексе (Fei Changhong) § §

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

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

  • Избегалось преждевременное освобождение буферного пина при вставке индекса GIN (Tom Lane) §

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

  • Избегание сбоев с секционированными индексами SP-GiST (Tom Lane) §

    Попытка использовать индекс такого рода может привести к ошибкам Нет такого файла или каталога.

  • Исправлены тесты на владение большими объектами (Tom Lane) §

    Операции с большими объектами, требующие привилегий владельца, завершались с ошибкой неопознанный ID класса: 2613, если не выполнялись суперпользователем.

  • Исправлено изменение отчета о владении для больших объектов (Tom Lane) §

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

  • Исправлено отображение данных о времени ввода-вывода в EXPLAIN (BUFFERS) (Майкл Пакье) §

    Числа, обозначенные как shared/local, на самом деле относятся только к разделяемым буферам, поэтому измените эту метку на shared.

  • Обеспечена долговечность CREATE DATABASE (Ноа Миш) § §

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

  • Добавлено больше сообщений LOG при начале и завершении восстановления из резервной копии (Андрес Фройнд) §

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

  • Предотвращено некорректное обработку резервными серверами мертвых кортежей индекса во время подтранзакций (Fei Changhong) §

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

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

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

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

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

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

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

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

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

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

    Этот случай генерировал неправильно отформатированную команду COPY.

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

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

  • Возвращен правильный код состояния, когда новый клиент отключается, не ответив на запрос пароля сервера (Liu Lang, Tom Lane) §

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

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

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

  • Будьте более осторожны с тем, что OpenSSL не устанавливает errno при ошибке (Tom Lane) §

    Если errno не установлен, предположим, что причиной сообщенного сбоя является достижение конца файла при чтении. Это исправляет редкие случаи странных сообщений об ошибках, таких как не удалось принять SSL-соединение: Успех.

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

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

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

  • В PL/pgSQL добавлена поддержка SQL-команд, которые являются CREATE FUNCTION/CREATE PROCEDURE с телами в формате SQL-стандарта (Tom Lane) §

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

  • Исправлена обработка ошибок в libpq в конвейерах (Álvaro Herrera) § §

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

  • Функция PQsendFlushRequest() в libpq очищала буфер вывода клиента по тем же правилам, что и другие функции PQsend (Jelte Fennema-Nio) §

    В режиме конвейера может все еще потребоваться вызов PQflush(); но это изменение устраняет некоторую непоследовательность.

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

  • Исправлена зависящая от времени ошибка в передаче данных GSSAPI (Tom Lane) §

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

  • Изменение initdb для всегда раскомментирования записей postgresql.conf для параметров lc_xxx (Kyotaro Horiguchi) §

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

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

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

  • В pg_dump не выгружался объект расширенной статистики, если его базовая таблица не выгружалась (Риан МакГуайр, Том Лейн) §

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

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

  • Сделано ошибкой завершение скрипта pgbench с открытым конвейером (Anthonin Bonnefoy) §

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

  • Исправлен сбой в contrib/intarray, если массив с элементом, равным INT_MAX, вставлен в индекс gist__int_ops (Александр Лахин, Том Лейн) §

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

  • Сообщена более точная ошибка, когда функция contrib/pgstattuple pgstathashindex() применяется к секционированному хеш-индексу (Александр Лахин) §

  • На Windows подавлены параметры автозапуска при запуске подпроцессов в pg_ctl и pg_regress (Kyotaro Horiguchi) § §

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

  • Перемещена is_valid_ascii() из mb/pg_wchar.h в utils/ascii.h (Jubilee Young) §

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

  • Исправлены ошибки компиляции с libxml2 версии 2.12.0 и позже (Tom Lane) §

  • Исправлена ошибка компиляции кода WAL_DEBUG в Windows (Bharath Rupireddy) §

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

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

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

  • Обновлены файлы данных часовых поясов до версии tzdata 2024a для изменений закона о летнем времени в Гренландии, Казахстане и Палестине, а также исправления для антарктических станций Кейси и Восток. Также внесены исторические исправления для Вьетнама, Торонто и Микелона. (Tom Lane) §