E.15. Выпуск 15.2

Дата выпуска: 2023-02-09

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

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

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

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

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

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

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

  • Исправление вычисления генерируемых столбцов (GENERATED), которые должны обновляться в дочерних таблицах во время выполнения команды UPDATE для секционированной таблицы или дерева наследования (Амит Ланготе, Том Лейн)

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

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

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

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

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

  • Исправление проверки наличия правил для команд MERGE (Дин Рашид)

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

  • Исключение кортежей, к которым применялась команда MERGE с действием DO NOTHING, из подсчёта числа обработанных (Альваро Эррера)

    Это приводит поведение кода в соответствие с документацией.

  • Добавление возможности обращения к результирующему столбцу в рекурсивном CTE (WITH RECURSIVE ... CYCLE) (Том Лейн)

    Ссылка на столбец SET из общего табличного выражения приводила к ошибке «cache lookup failed for type 0» (ошибка поиска в кеше для типа 0).

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

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

  • Возможность назначения пометки REPLICA IDENTITY нерабочему (пока) индексу (Том Лейн)

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

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

    В некоторых случаях маркер DEFAULT не заменялся правильным выражением со стандартным значением, что приводило к ошибке «unrecognized node type» (нераспознанный тип узла).

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

    В то время как операторы сопоставления jsonpath выдавали ошибку при обнаружении неопределённой переменной в шаблоне пути, операторы существования рассматривали её как соответствующую.

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

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

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

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

  • Учёт нестандартных значений checkpoint_completion_target (Бхарат Рупиредди)

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

  • Запись в журнал правильной отметки времени окончания при восстановлении до recovery_target_xid (Том Лейн)

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

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

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

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

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

  • Недопущение немедленной фиксации после выполнения команды ANALYZE в расширенном протоколе запросов, если используется конвейерный режим (Том Лейн)

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

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

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

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

    Эти недостатки могли приводить к ошибкам планировщика, таким как «WindowFunc not found in subplan target lists» (WindowFunc не найден в целевом списке подплана).

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

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

  • Добавление защиты от рекурсии и зацикливания при «подтягивании» подзапросов (Том Лейн)

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

  • Устранение ошибок планировщика при использовании узлов Memoize для планирования соединений с учётом секционирования или параметризованных соединений с вложенными циклами (Ричард Гуо)

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

  • Исправление кода соединений с учётом секционирования для ситуаций, когда невозможно создать план для каждой секции (Том Лейн)

    Раньше могли возникать ошибки вида «could not devise a query plan for the given query» (не удалось выработать план для данного запроса).

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

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

  • Предотвращение сбоев в работе механизма статистики при изменении типа отношения (Андрес Фройнд)

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

  • Исправление отображения конструкций AT TIME ZONE в скобках (Том Лейн)

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

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

    Если SQL-функция выполняла одну и ту же служебную команду несколько раз в рамках одного вызывающего запроса, это могло приводить к сбою или сообщению о странных ошибках, таких как «unrecognized node type» (нераспознанный тип узла).

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

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

  • Устранение взаимоблокировок команды DROP DATABASE и рабочего процесса логической репликации (Хоу Чжицзе)

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

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

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

  • Уменьшение на серверах горячего резерва количества операций по поиску транзакций, активных на ведущем сервере (Саймон Риггс, Михаил Николаев)

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

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

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

  • Передача уведомления удалённому узлу об обнаруженном сбое транзакции при логическом декодировании (Хоу Чжицзе)

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

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

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

  • Получение циклической блокировки (spinlock) при обновлении общего состояния во время создания контекста логического декодирования (Масахико Савада)

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

  • Исправление ошибки, из-за которой подключаемый модуль репликации pgoutput отправлял столбцы, не указанные в списке реплицируемых столбцов таблицы (Хоу Чжицзе)

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

  • Предотвращение редкой ошибки критического уровня «failed to acquire cleanup lock» (не удалось получить блокировку для очистки) во время воспроизведения из WAL операций разделения страницы хеш-индекса (Роберт Хаас)

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

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

  • Исправление ошибки в функции int64_div_fast_to_numeric(), позволяющее ей работать с более широким диапазоном входных данных (Дин Рашид)

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

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

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

  • Исключение номинально неопределённого поведения при доступе к общей памяти в 32-разрядных сборках (Андрес Фройнд)

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

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

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

  • Удаление ошибочного утверждения в логике оптимизации ненужных результирующих RTE (Том Лейн)

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

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

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

  • Исключение безвредных предупреждений от pg_dump при использовании --if-exists (Том Лейн)

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

  • Исправление команд \sf и \ef в psql для обработки SQL-функций, тела которых соответствуют стандарту SQL (Том Лейн)

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

  • Исправление дополнения табуляцией команды ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMA (Дин Рашид)

  • Добавление указаний PARALLEL RESTRICTED для функций contrib/pageinspect, обращающихся к диску (Том Лейн)

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

  • Исправление ошибки, из-за которой модуль contrib/seg вызывал сбой или выводил мусор, если вводилось число, содержащее более 127 цифр (Том Лейн)

  • Исправление сборки на Microsoft Visual Studio 2013 (Том Лейн)

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

  • Устранение ошибки компиляции при сборке PL/Perl с MSVC с использованием Strawberry Perl (Эндрю Дунстан)

  • Устранение несоответствия сборки PL/Perl с MSVC библиотеке Perl, собранной с gcc (Эндрю Дунстан)

    Такие комбинации ранее могли завершаться ошибкой «loadable library and perl binaries are mismatched» (несоответствие загружаемой библиотеки сборке perl).

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

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

  • Внесение исправлений в код pg_waldump, чтобы он собирался компиляторами, которые не отбрасывают неиспользуемые функции static inline (Том Лейн)

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

    Кроме того, новый часовой пояс America/Ciudad_Juarez был отделён от America/Ojinaga.