E.28. Релиз 15.2#

E.28. Релиз 15.2

E.28. Релиз 15.2

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

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

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

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

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

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

  • libpq может утекать содержимое памяти после неудачного инициирования шифрования транспорта GSSAPI (Джейкоб Чемпион) §

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

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

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

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

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

  • Исправлена проверка MERGE на недостижимые WHEN условия (Дин Рашид) §

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

  • Исправлен тест обнаружения правил в MERGE (Дин Рашид) §

    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 быть установленным на индекс, который (ещё) не является допустимым (Том Лейн) §

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

  • Исправлено обработку маркеров DEFAULT в правилах, которые выполняют INSERT из многострочного списка VALUES (Дин Рашид) §

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

  • Использования неопределенных переменных в проверках существования jsonpath были отклонены (Александр Коротков, Дэвид Г. Джонстон) §

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

  • Исправлено индексирование jsonb для работы с поджаренными значениями индексов (Том Лейн, Дэвид Г. Джонстон) §

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

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

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

  • Учитывались нестандартные настройки checkpoint_completion_target (Бхарат Рупиредди) §

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

  • Записывалась правильная конечная временная метка в режиме recovery_target_xid (Tom Lane) §

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

  • Улучшена отчетность об ошибках для некоторых сбоев чтения буферизованных файлов (Петер Айзентраут) §

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

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

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

  • В расширенном протоколе запросов избегалось немедленное выполнение commit после ANALYZE, если выполнялся конвейер (Tom Lane) §

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

  • Отклонены пакеты запросов на отмену с неправильной длиной (Андрей Бородин) §

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

  • Исправлены недочеты предварительной обработки планировщика для выражений условий выполнения оконных функций (Ричард Гуо, Дэвид Роули) §

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

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

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

  • Добавлены защиты от рекурсии и зацикливания при вытягивании подзапросов (Tom Lane) §

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

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

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

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

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

  • Ограничено количество работы по очистке, выполняемой get_actual_variable_range (Саймон Риггс) §

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

  • Предотвращено запутывание статистического механизма при изменении relkind отношения (Андрес Фройнд) §

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

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

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

  • Предотвращено перезаписывание кэшированных деревьев разбора для утилитарных операторов в SQL функциях (Том Лейн, Даниэль Густафссон) §

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

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

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

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

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

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

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

  • На серверах горячего резерва снижены затраты на обработку для отслеживания XID, известных как активные на первичном сервере (Саймон Риггс, Михаил Николаев) §

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

  • Игнорированы недействительные слоты логической репликации при определении самого старого каталога xmin (Сириша Чамарти) §

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

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

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

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

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

  • Захват спинлока при обновлении общего состояния во время создания контекста логического декодирования (Масахико Савада) §

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

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

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

  • Избегалась редкая паника не удалось получить блокировку очистки во время воспроизведения WAL операций разделения страниц хеш-индекса (Роберт Хаас) §

  • LSN страницы кучи был продвинут при установке ее бита "все видимые" во время воспроизведения WAL (Джефф Дэвис) §

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

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

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

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

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

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

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

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

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

  • Удалено ошибочное утверждение в логике оптимизации бесполезного-RESULT-RTE (Том Лейн) §

  • Исправлены ошибки копирования и вставки в сообщениях об ошибках поиска в кэше для проверок ACL (Джастин Пшибы) §

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

  • Исправлена возможная порча очень больших файлов карты таблиц в pg_basebackup (Антонин Хоуска) §

  • Избегалось безвредное предупреждение от 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 (Дин Рашид) §

  • Обновлено 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 (Эндрю Данстан) §

  • Исправлено несоответствие PL/Perl, собранного с MSVC, по сравнению с библиотекой Perl, собранной с gcc (Эндрю Данстан) §

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

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

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

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

  • Обновлены файлы данных часовых поясов до версии tzdata 2022g для изменений закона о летнем времени в Гренландии и Мексике, а также исторические исправления для северной Канады, Колумбии и Сингапура. (Tom Lane) §

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