E.9. Выпуск 12.14
Дата выпуска: 2023-02-09
В этот выпуск вошли различные исправления, внесённые после версии 12.13. За информацией о нововведениях версии 12 обратитесь к Разделу E.23.
E.9.1. Миграция на версию 12.14
Если используется версия 12.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 12.10, см. также Раздел E.13.
E.9.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.