E.37. Выпуск 12.14

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

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

E.37.1. Миграция на версию 12.14

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

Если вы обновляете сервер с более ранней версии, чем 12.10, см. также Раздел E.41.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Предотвращение ошибки «wrong tuple length» (неверная длина кортежа) в конце выполнения команды VACUUM (Ашвин Агравал, Цзюньфэн Ян)

    Эта ошибка возникала, если команда VACUUM должна была изменить значение datfrozenxid для текущей базы данных, а в базе было так много предоставленных прав, что значение datacl требовало отдельного хранения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Предотвращение небезопасного использования указателя rd_smgr элемента кеша отношений (Амул Сул)

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

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

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

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

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

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

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

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

  • Исключение вызова небезопасных серверных функций в pg_dump до установления блокировки для проверяемых таблиц (Том Лейн, Жиль Даролд)

    Программа pg_dump использовала определённые серверные функции, которые могли вызывать сбой при проверке таблицы, удаляемой в этот момент. Сбои такого типа были устранены путём гарантированной установки блокировки ACCESS SHARE до выяснения свойств таблицы, а также исключением применения таких функций к таблицам, которые не будут выгружаться.

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

  • Исправление ошибочного утверждения истинности в contrib/postgres_fdw (Эцуро Фудзита)

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

  • Устранение предупреждений в модуле contrib/sepgsql о том, что устарела версия libselinux (Микаэль Пакье)

  • Исправление сборки на 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.