E.16. Релиз 15.2#

E.16. Релиз 15.2

E.16. Релиз 15.2

Дата релиза:  2023-02-09

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

E.16.1. Миграция на версию 15.2

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

Однако, если вы обновляетесь с версии ранее 15.1, см. Раздел E.17.

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

  • В libpq может произойти утечка памяти после неудачной инициализации GSSAPI транспортного шифрования (Jacob Champion)

    Модифицированный сервер или неаутентифицированный «человек посередине» может отправить сообщение об ошибке без завершающего нуля во время настройки шифрования передачи GSSAPI (Kerberos). libpq затем скопирует эту строку, а также следующие байты в памяти приложения до следующего нулевого байта, в свой отчет об ошибке. В зависимости от того, что вызывающее приложение делает с отчетом об ошибке, это может привести к раскрытию содержимого памяти приложения. Также существует небольшая вероятность сбоя из-за чтения за пределами конца памяти. Исправлено путем правильного обнуления серверного сообщения. (CVE-2022-41862)

  • Исправлена ошибка расчета, какие столбцы GENERATED должны быть обновлены в дочерних таблицах во время UPDATE на разделенной таблице или дереве наследования (Amit Langote, Tom Lane)

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

  • Исправлена возможная ошибка вычисления столбцов GENERATED при использовании команды MERGE (Dean Rasheed)

    Когда первое действие на уровне строк команды MERGE было UPDATE, любые последующие действия INSERT не смогут вычислить GENERATED столбцы, которые считались ненужными для вычисления в действии UPDATE (поскольку они не зависят от каких-либо целевых столбцов UPDATE).

  • Исправлена проверка команды MERGE для недостижимых условий WHEN (Dean Rasheed)

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

  • Исправлен тест обнаружения правила MERGE (Dean Rasheed)

    MERGE не поддерживается на таблицах с правилами; но он также не работает на таблицах, которые ранее имели правила, но больше не имеют.

  • В команде MERGE не учитывайте действие DO NOTHING как обработанную кортеж (Álvaro Herrera)

    Это позволяет коду соответствовать документации.

  • WITH RECURSIVE ... CYCLE CTE разрешен доступ к своему выходному столбцу (Tom Lane)

    Ссылка на столбец SET из CTE завершилась ошибкой cache lookup failed for type 0.

  • Исправлена обработка ожидающих вставок при массовой вставке во внешнюю таблицу (Etsuro Fujita)

    В некоторых случаях ожидающие вставки не были сброшены во внешнюю таблицу (FDW) достаточно быстро, что приводило к логическим несоответствиям, например, триггеры BEFORE ROW не видели строк, которые они должны были видеть.

  • Настроена установка REPLICA IDENTITY на индексе, который еще не является (пока) допустимым (Tom Lane)

    Когда pg_dump выполняет дамп разделенного индекса, помеченного как REPLICA IDENTITY, он генерирует последовательность команд, которая применяет REPLICA IDENTITY до того, как разделенный индекс будет помечен как действительный, что приводит к сбою восстановления. Нет особо весомой причины запрещать это делать в таком порядке, поэтому разрешаем. Пометка все равно не будет иметь никакого эффекта, пока индекс не станет действительным.

  • Исправлена обработка маркеров DEFAULT в правилах, выполняющих INSERT из многорядного списка VALUES (Dean Rasheed)

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

  • Настроен отказ при использовании неопределенных переменных в проверках наличия jsonpath (Alexander Korotkov, David G. Johnston)

    Хотя операторы сопоставления jsonpath выдавали ошибку на неопределенные переменные в шаблоне пути, операторы существования считали это совпадением, без генерирования ошибок.

  • Исправлена поддержка индексации для типа jsonb для работы с подсчитанными значениями (Tom Lane, David G. Johnston)

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

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

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

  • Настроен учет нестандартных настроек checkpoint_completion_target (Bharath Rupireddy)

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

  • Настроена регистрация корректной конечной метки времени в режиме recovery_target_xid (Tom Lane)

    Когда завершалось восстановление на основе установки recovery_target_xid с параметром recovery_target_inclusive = off, выводилась неправильная отметка времени (всегда 2000-01-01) в сообщении журнала recovery stopping before ... transaction.

  • Оптимизирован отчет об ошибках для некоторых сбоев при чтении буферизованных файлов (Peter Eisentraut)

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

  • Удалено произвольное ограничение на количество элементов в int2vector и oidvector (Tom Lane)

    Входные функции для этих типов ранее отклоняли более 100 элементов. С введением функции списка столбцов логической репликации необходимо принимать int2vector с до 1600 столбцами, иначе длинные списки столбцов вызывают сбои логической репликации.

  • В расширенном протоколе запросов устранен немедленный коммит после команды ANALYZE, если запущен конвейер (Tom Lane)

    Если явного тега BEGIN TRANSACTION не было, ANALYZE самостоятельно выполнял коммит, что не должно происходить в последовательности команд в конвейере.

  • Настроено отклонение пакетов запроса отмены с неправильной длиной (Andrey Borodin)

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

  • Исправлены недочеты предварительной обработки планировщика для выражений условий выполнения оконных функций (Richard Guo, David Rowley)

    Это может привести к ошибкам планировщика, таким как WindowFunc не найден в списках целей подзапроса.

  • Исправлена возможная ошибка доступа к висячему указателю во время выполнения выражений run-condition оконной функции (David Rowley)

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

  • Добавлена защита от рекурсии и циклических зависимостей в подзапросе pullup (Tom Lane)

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

  • Исправлены проблемы планировщика при соединении узлов Memoize с частичными соединениями или параметризованными вложенными циклами (Richard Guo)

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

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

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

  • Ограничено количество работы по очистке, выполняемой функцией get_actual_variable_range (Simon Riggs)

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

  • Предотвратите сбой статистического механизма, когда изменяется тип связи (Andres Freund)

    Преобразование таблицы в представление может привести к сбоям или сбоям утверждения.

  • Исправлена недостаточная расстановка скобок при отображении конструкций AT TIME ZONE (Tom Lane)

    Это может привести к сбоям при экспорте/импорте для правил или представлений, в которых аргументом AT TIME ZONE является само выражение.

  • Настроено сохранение кешированных деревьев разбора для утилитарных операторов в SQL-функциях (Tom Lane, Daniel Gustafsson)

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

  • Настройка возможности отмены выполнения запросов полнотекстового поиска во время выполнения фразового сопоставления (Том Лэйн)

  • Устранена утечка памяти при хешировании строк с незаданными правилами сортировки (Jeff Davis)

  • Исправлена взаимоблокировка между процессом DROP DATABASE и рабочим процессом логической репликации (Hou Zhijie).

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

  • Настроена очистка объекта подключения libpq после неудачной попытки подключения к репликации (Andres Freund)

    Предыдущий вариант написания кода приводил к потере объекта-соединения. В фоновых кодовых путях это довольно безобидно, потому что вызывающий процесс просто завершается. Но в командах типа CREATE SUBSCRIPTION, такая ошибка приводила к небольшой утечке памяти в течение сессии.

  • В серверах горячего резервирования уменьшены ресурсы, направленные на отслеживание XID, помеченных как активные на основном сервере (Simon Riggs, Michail Nikolaev)

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

  • Настроено игнорирование недействительных слотов логической репликации при определении самого старого xmin каталога (Sirisha Chamarthi)

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

  • В логическом декодировании настроено уведомление удаленного узла, при обнаружении аварийного завершения транзакции (Hou Zhijie).

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

  • Исправлено использование неинициализированной памяти в логическом декодировании (Masahiko Sawada)

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

  • Настроено получение спинлока при обновлении общего состояния во время создания контекста логического декодирования (Masahiko Sawada)

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

  • Исправлен репликационный плагин pgoutput так, чтобы не отправлялись столбцы, которые не указаны в списке столбцов репликации таблицы (Hou Zhijie)

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

  • Устранены редкие случаи паники failed to acquire cleanup lock во время воспроизведения WAL при операциях разделения страниц хеш-индекса (Robert Haas)

  • Увеличен номер LSN страницы кучи при установке ее бита "все видимые" во время воспроизведения WAL (Jeff Davis)

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

  • int64_div_fast_to_numeric() настроена для работы с более широким диапазоном входных данных (Dean Rasheed)

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

  • Исправлена скрытая проблема переполнения буфера в логике WaitEventSet (Томас Манро)

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

  • Устранено номинально неопределенное поведение при доступе к общей памяти в 32-разрядных сборках (Andres Freund)

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

  • Исправлена ошибка утверждения в BRIN minmax-multi opclasses (Томас Вондра)

    Утверждение было слишком строгим, поэтому эта ошибка была безвредной в не-assert сборках.

  • Удалено неправильное утверждение в логике оптимизации useless-RESULT-RTE (Tom Lane)

  • Исправлены ошибки копирования и вставки в сообщениях о сбое поиска в кеше для проверки ACL (Justin Pryzby)

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

  • Исправлена возможная поврежденность очень больших файлов карты табличного пространства в pg_basebackup (Antonin Houska)

  • Устранено безобидное предупреждение от pg_dump в режиме --if-exists (Tom Lane)

    Если схема public имеет владельца, отличного от значения по умолчанию, то использование опции --if-exists утилиты pg_dump приводит к появлению предупреждающего сообщения warning: could not find where to insert IF EXISTS in statement "-- *not* dropping schema, since initdb creates it". Однако, вывод дампа был корректным.

  • psql \sf и \ef настроены для обработки функций SQL-языка, которые имеют тела функций стандарта SQL (Tom Lane)

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

  • Улучшена автодополнение для команды ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMA (Dean Rasheed)

  • contrib/pageinspect обновлен так, чтобы его функции, взаимодействующие с диском, помечались как PARALLEL RESTRICTED (Tom Lane)

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

  • contrib/seg настроена так, чтобы не возникало сбоев или выводился мусор, если входное число содержит более 127 цифр (Tom Lane)

  • Исправлена сборка в Microsoft Visual Studio 2013 (Tom Lane)

    Предыдущий патч предполагал, что все релевантные платформы имеют функцию snprintf(), но MSVC 2013 еще не имеет эту функцию. Используйте функцию sprintf() для этой платформе.

  • Исправлена ошибка компиляции при сборке PL/Perl с использованием MSVC при использовании Strawberry Perl (Andrew Dunstan)

  • Исправлена несовместимость PL/Perl, собранного с помощью MSVC, и библиотеки Perl, собранной с помощью gcc (Andrew Dunstan)

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

  • Подавление предупреждений компилятора от заголовочных файлов Perl (Andres Freund)

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

  • pg_waldump настроена для сборки на компиляторах, которые не отбрасывают неиспользуемые статические встроенные функции (Tom Lane)

  • Файлы данных часовых поясов обновлены до tzdata версии 2022g для учета изменений законодательства о переходе на летнее время в Гренландии и Мексике, а также для внесения исторических исправлений для северной Канады, Колумбии и Сингапура.

    Заметим, что новый часовой пояс America/Ciudad_Juarez был выделен из America/Ojinaga.