E.12. Выпуск 15.6#

E.12. Выпуск 15.6

E.12. Выпуск 15.6

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

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

E.12.1. Миграция на версию 15.6

Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.

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

Также, если вы обновляетесь с версии ранее 15.5, см. Раздел E.13.

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

  • Ужесточены ограничения безопасности в REFRESH MATERIALIZED VIEW CONCURRENTLY (Heikki Linnakangas)

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

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

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

  • Устранена утечка памяти при встраивании JIT (Andres Freund, Daniel Gustafsson)

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

  • При извлечении из LWLock, исключена необходимость поиска в списке ожидающих процессов (Andres Freund)

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

  • Устранено создание некорректных планов соединения с партицированием (Richard Guo)

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

  • Исправлено некорректное обертывание выражений вывода подзапроса в PlaceHolderVars (Tom Lane)

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

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

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

  • Исправлены неправильные действия, при обновлении партиций командой MERGE (Dean Rasheed)

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

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

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

  • Устранен доступ к буферу, который больше не закреплён, в триггерах BEFORE ROW UPDATE (Alexander Lakhin, Tom Lane)

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

  • Устранен запрос чрезмерно большого участка общей памяти в параллельном хэш-соединении (Thomas Munro, Andrei Lepikhov, Alexander Korotkov)

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

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

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

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

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

  • Исправлены проблемы с дублирующимися именами токенов в командах ALTER TEXT SEARCH CONFIGURATION ... MAPPING (Тender Wang, Michael Paquier)

  • Исправлена блокировка соответствующих таблиц во время выполнения DROP STATISTICS (Tomas Vondra)

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

  • Исправлена проверка волатильности функции для GENERATED и DEFAULT выражений (Tom Lane)

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

  • Настроено обнаружение устаревания новых записей кэша каталога при распаковке полей (detoasting) (Tom Lane)

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

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

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

  • Добавлено обнаружение переполнения юлианской даты при добавлении или вычитании типа interval к/из timestamp (Tom Lane)

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

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

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

  • Настроено удаление кэшированной статистики после изменения stats_fetch_consistency (Shinya Kato)

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

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

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

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

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

  • Исправлен сбой при удалении дочернего индекса одновременно с REINDEX INDEX на партицированном индексе (Fei Changhong)

  • Исправлена недостаточная блокировка при очистке незавершенного разделения внутренней страницы GIN-индекса (Fei Changhong, Heikki Linnakangas)

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

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

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

  • Поправлены сбои с разделенными индексами SP-GiST (Tom Lane)

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

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

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

  • Исправлено отображение данных о времени ввода-вывода в EXPLAIN (BUFFERS) (Michael Paquier)

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

  • Обеспечена долговечность CREATE DATABASE (Noah Misch)

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

  • Добавлено больше сообщений LOG при запуске и завершении восстановления из резервной копии (Andres Freund)

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

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

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

  • Исправлена опасность целочисленных переполнений при проверке, поместится ли запись в буфер декодирования WAL (Thomas Munro)

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

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

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

  • Настроена правильная передача значений по умолчанию для столбцов плагином логической репликации pgoutput (Nikhil Benesch)

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

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

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

  • Предотвращено исследование системных каталогов с неправильным снимком во время логического декодирования (Fei Changhong)

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

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

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

  • Исправлена несовместимость с OpenSSL 3.2 (Tristan Partin, Bo Andreson)

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

  • Исправлены случаи, когда OpenSSL не устанавливает errno при возникновении ошибке (Tom Lane)

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

  • Исправлена утечка файловых дескрипторов при сбое функции ForeignAsyncRequest обертки внешних данных (Heikki Linnakangas)

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

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

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

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

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

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

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

  • Устранены условия гонки когда libpq инициализирует поддержку OpenSSL одновременно в двух разных потоках (Willi Mann, Michael Paquier)

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

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

  • Устранена выгрузки RLS или меток безопасности для объектов-членов расширений в pg_dump(Tom Lane, Jacob Champion)

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

  • Устранена выгрузка объекта расширенной статистики в pg_dump, если соответсвующая нижележащая таблица не выгружается (Rian McGuire, Tom Lane)

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

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

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

  • В contrib/bloom, исправлена чрезмерно строгая проверка для false_positive_rate (Alexander Lakhin)

  • Исправлен сбой в contrib/intarray, если массив с элементом, равным INT_MAX, был вставлен в индекс gist__int_ops (Alexander Lakhin, Tom Lane)

  • Повышена детальность сообщений об ошибках, когда функция contrib/pageinspect's hash_bitmap_info() применяется к разделенному хеш-индексу (Alexander Lakhin, Michael Paquier)

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

  • На 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 (Питер Айзентраут, Tom Lane)

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

  • Устранена генерация предупреждений об устаревании при компиляции с LLVM 18 (Thomas Munro)

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