E.6. Выпуск 15.3

Дата выпуска: 2023-05-11

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

E.6.1. Миграция на версию 15.3

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

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

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

  • Устранение уязвимости команды CREATE SCHEMA при внесении изменений в search_path (Александр Лахин)

    В команде CREATE SCHEMA объекты в текущем search_path, а также объекты в новой схеме были видны даже внутри вызываемой функции или скрипта, пытающихся задать безопасный search_path. Это потенциально позволяло любому пользователю, имеющему разрешение на создание схемы, перехватить права функции, определяющей контекст безопасности, или скрипта расширения.

    Проект PostgreSQL благодарит Александра Лахина за сообщение об этой проблеме. (CVE-2023-2454)

  • Исправление применения политик защиты на уровне строк после встраивания функции, возвращающей множества (Стивен Фрост, Том Лейн)

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

    Проект PostgreSQL благодарит Вольфганга Вальтера за сообщение об этой проблеме. (CVE-2023-2455)

  • Устранение потенциального повреждения шаблонной (исходной) базы данных после выполнения команды CREATE DATABASE с параметром STRATEGY WAL_LOG (Натан Боссарт, Рё Мацумура)

    Некорректная обработка буфера могла приводить к потере более поздних изменений каталога pg_class шаблона.

  • Устранение утечки памяти и ненужных операций чтения с диска во время выполнения команды CREATE DATABASE с параметром STRATEGY WAL_LOG (Андрес Фройнд)

  • Предотвращение сбоев при выполнении CREATE SCHEMA без указания имени новой схемы (Микаэль Пакье)

    В соответствии со стандартом SQL допускается написание CREATE SCHEMA AUTHORIZATION имя_владельца, при этом именем схемы становится имя_владельца. Однако в некоторых местах кода требовалось наличие имени схемы, что приводило к сбою.

  • Устранение различных сбоев планировщика при выполнении команды MERGE (Том Лейн)

    Планирование могло прерваться такой ошибкой, как «variable not found in subplan target list» (переменная не найдена в целевом списке подплана) или «PlaceHolderVar found where not expected» (PlaceHolderVar найдена не там, где ожидалось).

  • Исправление подсчёта количества строк, выводимого командой MERGE, для некоторых особых случаев (Дин Рашид)

    При подсчёте количества строк, указанного в метке команды, учитывались строки, которые фактически не были изменены из-за того, что триггер BEFORE ROW возвращал NULL. Для согласованности с поведением простых команд UPDATE/DELETE, теперь такие строки не учитываются. Кроме того, строка не учитывается дважды при её перемещении командой MERGE в другую секцию секционированной таблицы.

  • Устранение проблем команды MERGE при параллельных обновлениях (Дин Рашид, Альваро Эррера)

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

  • Добавлена поддержка декомпиляции команд MERGE (Альваро Эррера)

    При появлении команды MERGE такая поддержка не была добавлена, но она необходима для MERGE в функциях SQL нового стиля.

  • Исправление включения/отключения триггеров, связанных с внешними ключами в секционированных таблицах (Том Лейн)

    Команда ALTER TABLE ... ENABLE/DISABLE TRIGGER завершалась ошибкой при применении к триггерам обеспечения целостности внешнего ключа секционированной таблицы, поскольку она пыталась найти «клонированные» триггеры для секций по имени, а у таких триггеров не бывает одинаковых имён. Теперь вместо этого поиск ведётся по OID родительского триггера.

  • Запрет изменения составных типов, хранящихся в индексах (Том Лейн)

    В команде ALTER TYPE запрещено использовать несовместимые на двоичном уровне изменения составных типов, хранящихся в каких-либо столбцах таблицы. (Возможно, когда-нибудь это будет разрешено, но пока этого не произошло; последствия блокировок перезаписи множества таблиц пугают.) Ранее не была замечена возможность, что индекс может содержать составной тип, которого нет в таблице этого индекса.

  • Запрет использования системных столбцов как элементов внешних ключей (Том Лейн)

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

  • Запрет копирования строк дочерних таблиц при выполнении команды COPY TO для таблицы с включённой защитой на уровне строк (Антонин Хоуска)

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

  • Предотвращение возможных сбоев при передаче пустого массива функциям array_position() и array_positions() (Том Лейн)

  • Исправление возможного чтения за пределами выборки данных функцией to_char() (Том Лейн)

    В особом случае это могло приводить к краху сервера.

  • Исправление выхода за границу буфера в функции translate() (Даниил Анисимов)

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

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

    Это упущение могло привести к некорректному поведению кода, когда основное правило сортировки использовало ICU.

  • Предотвращение возможного сбоя при вводе пустого значения для типа interval (Том Лейн)

  • Возвращение возможности использовать экспоненциальную запись для полей значений interval в формате ISO 8601 (Том Лейн)

    Ввод интервалов в виде P0.1e10D, не разрешён официально по ISO 8601, но допускался задолго до версии 15, поэтому сейчас вновь разрешён к использованию.

  • Исправление объявления курсора для ошибок разбора в строковых константах JSON (Том Лейн)

    В большинстве случаев, когда в строковом литерале внутри значения JSON обнаруживалась синтаксическая ошибка, не удавалось правильно установить курсор ошибки. В результате выдавалось бесполезное сообщение об ошибке (указывающее на фрагмент перед строкой, а не на фактическую проблемную зону), а в версии 14 и выше даже мог происходить сбой.

  • Устранение повреждения данных, вызванного превышением значения переменной vacuum_defer_cleanup_age текущего 64-битного XID (Андрес Фройнд)

    В версии 14 и выше при нестандартных значениях vacuum_defer_cleanup_age XID горизонта очистки мог оказаться слишком большим, что приводило к удалению ещё живых строк при очистке. В версиях 12 и 13 эта проблема затрагивала только индексы GiST, что могло приводить к досрочной перезаписи страниц индекса.

  • Исправление ошибки анализатора запроса, из-за которой в особых случаях могли не обнаруживаться неправильно вложенные агрегатные функции (Том Лейн)

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

  • Устранение повреждения структуры данных при разборе параметров SEQUENCE NAME (Дэвид Роули)

    Если событийный триггер перехватывал повреждённое дерево запроса, могли возникать проблемы.

  • Корректное обновление характеристик безопасности распараллеливания узлов плана при перемещении инициализирующих планов с одного узла на другой (Том Лейн)

    В результате данного упущения планировщик мог выдавать ошибки «subplan was not initialized» (подплан не был инициализирован).

  • Устранение сбоев переменных PlaceHolderVars в коде расширенной статистики (Том Лейн)

    Использование расширенной статистики по типам зависимости могло приводить к сбою из-за ошибки «PlaceHolderVar found where not expected» (PlaceHolderVar найдена не там, где ожидалось).

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

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

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

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

  • Исправление ошибок при выполнении вложенных конструкций ARRAY[] (Александр Лахин, Том Лейн)

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

  • Предотвращение сбоя при изменении поля в столбце массива доменного типа, созданного поверх составного типа (Дмитрий Долгов)

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

    Отсечение с таким условием, как boolcol IS NOT TRUE, выполнялось неправильно, что могло приводить к тому, что строки, в которых boolcol равен NULL, не возвращались. Кроме того, обрабатывался неправильно довольно редкий случай секционирования при NOT boolcol.

  • Устранение условий гонки при очистке по порциям во время параллельного хеш-соединения (Томас Манро, Мелани Плейгман)

    При неудачном выборе времени и parallel_leader_participation = off (не являющимся значением по умолчанию) был возможен сбой.

  • Повторное вычисление столбцов GENERATED после проверки EvalPlanQual (Том Лейн)

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

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

  • Устранение утечки памяти в счётчике ссылок буфера при массовом добавлении данных в стороннюю таблицу, включённую в дерево секционирования (Александр Пыхалов)

  • Восстановлена возможность указания значений параметров vacuum_cost_delay с долями миллисекунд (Томас Манро)

  • Отключение балансировки задержки очистки по стоимости, если параметр vacuum_cost_delay в таблице для каждого отношения равен нулю (Масахико Савада)

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

  • Устранение сбоев в особых случаях при добавлении столбцов в конец представления (Том Лейн)

  • Исправление ошибки, редко возникавшей во вложенных планах MULTIEXPR_SUBLINK при изменении секционированных таблиц (Том Лейн)

    Использование синтаксиса INSERT ... ON CONFLICT DO UPDATE SET (c1, ...) = (SELECT ...) с секционированной целевой таблицей могло приводить к ошибке, если какая-либо дочерняя таблица отличалась от родительской (например, имела другой физический порядок столбцов). Обычно это проявлялось как ошибка при проверке согласованности в исполнителе; но также был возможен сбой или некорректное изменение данных.

  • Исправление обработки маркеров DEFAULT в многострочном запросе INSERT ... VALUES к представлению с правилом DO ALSO INSERT ... SELECT (Дин Рашид)

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

  • Поддержка ссылок на OLD и NEW в подзапросах внутри действий правил (Дин Рашид, Том Лейн)

    Такие ссылки на самом деле являются ссылками LATERAL, но если подзапрос не был явно помечен как LATERAL, это могло вызывать крах сервера. При необходимости это выполняется неявно.

  • Обеспечение написания правильного псевдонима целевой таблицы при декомпиляции правила или тела SQL-функции, содержащего INSERT/UPDATE/DELETE внутри WITH (Том Лейн)

  • Устранение ошибок в оптимизации SERIALIZABLE READ ONLY (Томас Манро)

    Транзакции, уже помеченные как «обречённые», запутывали оптимизацию безопасных снимков для транзакций SERIALIZABLE READ ONLY. В некоторых случаях оптимизация необоснованно пропускалась. В других случаях происходил сбой проверочного утверждения (но в сборках без проверочных утверждений проблем не наблюдалось).

  • Предотвращение утечки слотов обработчика кеша в модуле логического декодирования pgoutput (Ши Юй)

    Несколько циклов запуска и отключения модуля в течение одного сеанса в конечном итоге могли приводить к ошибке «out of relcache_callback_list slots» (нет свободных слотов relcache_callback_list).

  • Исключение ненужных вызовов пользовательских функций проверки для параметров класса операторов индекса (Александр Коротков)

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

  • Исключение ненужной работы при сканировании составного индекса BRIN с несколькими ключами сканирования (Томаш Вондра)

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

  • Исправление обработки маски сети в классе операторов BRIN inet_minmax_multi_ops (Томаш Вондра)

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

  • Исправление обращения к недействительному указателю при построении индекса GiST с буферизацией (Александр Лахин)

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

  • Игнорирование удалённых столбцов и генерируемых столбцов во время логической репликации действий изменения или удаления (Ондер Каладжи, Ши Юй)

    Ранее репликация с параметром REPLICA IDENTITY FULL завершалась ошибкой, если таблица содержала такие столбцы.

  • Исправление имени события ожидания в вводе-выводе буфера SLRU для времени фиксации транзакции (Александр Лахин)

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

  • Возвращение сообщения о событии ожидания SLRUFlushSync (Томас Манро)

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

  • Устранение возможного антипереполнения при расчёте количества сохраняемых сегментов WAL (Кётаро Хоригути)

    Это могло приводить к неправильному учёту wal_keep_size.

  • Устранение накладных расходов по вызову startup_progress_timeout_handler() в режиме ожидания (Бхарат Рупиредди)

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

  • Поддержка сертификатов RSA-PSS со связыванием каналов SCRAM-SHA-256 (Джейкоб Чемпион, Хейкки Линнакангас)

    Для этой функциональности требуется сборка с OpenSSL 1.1.1 или выше. Она влияет как на сервер, так и на libpq.

  • Устранение условий гонки при отслеживании идентификатора процесса в Windows (Томас Манро)

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

  • Исправление работы функции list_copy_head() с пустым списком (Дэвид Роули)

    О негативном влиянии этого дефекта на работу ядра PostgreSQL неизвестно, но с некоторыми расширениями возникали проблемы.

  • Добавление недостающих кодов состояния в SPI_result_code_string() (Дин Рашид)

  • Исправление ошибочных пометок Valgrind для AllocSetRealloc() (Карина Лицкевич)

    В особом случае при уменьшении размера большого (>8КБ) непрерывного блока памяти, выделенного через palloc, сборка под контролем Valgrind могла неправильно отметить состояние памяти, освобождённой от порции, что могло приводить к неверным результатам во время тестирования Valgrind.

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

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

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

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

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

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

  • Устранение утечки памяти во время существования сеанса в блоках plpgsql DO, в которых используются выражения приведения типа (Аджит Авекар, Том Лейн)

  • Уточнение проверки размерности массива при преобразовании структур списка Perl в многомерные массивы SQL (Том Лейн)

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

  • Уточнение проверки размерности массива при преобразовании структур списка Python в многомерные массивы SQL (Том Лейн)

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

  • Исправление раскрутки стека исключений в plpython (Син Го)

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

  • Исправление непоследовательной обработки ошибок GSS-шифрования в функции PQconnectPoll() расширения libpq (Микаэль Пакье)

    Если для параметра gssencmode установлено значение require, соединение не помечалось как разорванное после сбоя инициализации GSS. Теперь работа немедленно прекращается, как это уже давно было сделано для аналогичного случая с шифрованием TLS.

  • Предупреждение возможного повреждения данных в программах ecpg, собранных с параметром -C ORACLE (Кётаро Хоригути)

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

  • Внесение исправлений в код pg_dump для последующего успешного восстановления секционированных таблиц с хеш-секционированием по столбцу типа-перечисления (Том Лейн)

    Поскольку хеш-коды для значений типа-перечисления зависят от OID, присвоенных перечислению, они обычно отличаются после выгрузки и восстановления, а это означает, что строки часто оказываются не в той секции, где они были изначально. Пользователи могут изменить это поведение, указав параметр --load-via-partition-root; но поскольку без него шансов на успех почти нет, pg_dump теперь автоматически применяет его к таким таблицам.

    Кроме того, исправлено поведение pg_restore, чтобы исключить попытки выполнить команду TRUNCATE для целевых таблиц перед восстановлением данных в них при использовании --load-via-partition-root. Это позволяет избежать взаимоблокировок и потери данных.

  • Правильное обнаружение файлов, недоступных для поиска в Windows (Хуан Хосе Сантамария Флеча, Микаэль Пакье, Даниэль Ватцингер)

    Эта ошибка приводила к неправильному поведению, когда расширение pg_dump писало канал ввода/вывода или pg_restore читало его.

  • Подготовка всех команд в конвейере перед его запуском в режиме «prepared» расширения pgbench (Альваро Эррера)

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

  • Корректная обработка кортежей, имеющих нулевой xmin или xmax, в коде contrib/amcheck для проверки кучи (Роберт Хаас)

  • Правильная обработка XID, появившихся до эпохи 0, в contrib/amcheck (Андрес Фройнд)

    В случае ошибки мы можем видеть «зацикленный» 32-битный XID, который предшествует эпохе первого XID. Преобразование такого значения в 64-битную форму приводило к получению значения в далёком будущем, и, следовательно, к неправильным отчётам. В таких случаях для корректной работы теперь возвращается FirstNormalFullTransactionId.

  • Корректное определение сбоя в contrib/basebackup_to_shell при открытии канала (Роберт Хаас)

  • Предотвращение сбоев в contrib/hstore_plpython, если преобразуемое значение Python не является сопоставлением (Дмитрий Долгов, Том Лейн)

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

  • Требование использования значений, кратных 4, для параметра siglen индекса GiST в столбце ltree (Александр Коротков)

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

  • Добавление защиты от неправильного ввода для функции gist_page_items() в contrib/pageinspect (Дмитрий Коваль)

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

    Регулярное выражение, такое как $foo, является допустимым, но невыполнимым; компилятор регулярных выражений распознаёт это и создаёт пустую диаграмму НКА. Попытка оптимизировать такую диаграмму для сканирования индекса GIN или GiST в pg_trgm приводила к выходу за границу рабочего массива, что могло вызывать сбои.

  • Исправление обработки спецпоследовательностей в параметре application_name в contrib/postgres_fdw (Кётаро Хоригути, Микаэль Пакье)

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

  • Ограничение использования памяти функцией pg_get_wal_records_info() в contrib/pg_walinspect (Бхарат Рупиредди)

  • Использование параметра --strip-unneeded при удалении лишнего из статических библиотек GNU-совместимым расширением strip (Том Лейн)

    Ранее процедура make install-strip использовала в этом случае параметр -x. Это изменение позволяет избежать неправильного поведения llvm-strip, а также немного сокращает вывод.

  • Удаление рекомендаций выполнить автоматическую загрузку файлов DTD для сборки документации и полное отключение такой возможности (Александр Алексеев, Питер Эйзентраут, Том Лейн)

    Теперь нет возможности собирать документацию SGML, не установив файлы DTD DocBook локально. Раньше xsltproc мог загружать эти файлы на лету с sourceforge.net; но sourceforge.net сейчас разрешает доступ только по HTTPS, а ни одна версия xsltproc этого не поддерживает. Поэтому части документации, предполагающие, что это возможно или полезно, были удалены, и вместо этого в рецепты сборки был добавлен параметр xsltproc --nonet.

  • Использование подходящего расположения для временного каталога portlock при проведении TAP-тестов в сборках PGXS (Питер Эйзентраут)

    Теперь этот каталог создаётся в tmp_check в каталоге сборки. Раньше сборки с PGXS пытались создавать его в каталоге установки, который не обязательно был доступен для записи.

  • Обновление данных часовых поясов до версии tzdata 2023c, включающее изменение правил перехода на летнее время в Египте, Гренландии, Марокко и Палестине.

    Для обозначения московского времени в часовых поясах Europe/Kirov и Europe/Volgograd теперь вместо числовых аббревиатур используются аббревиатуры MSK/MSD для согласованности с другими часовыми поясами, использующими московское время. Кроме того, часовой пояс America/Yellowknife теперь идентичен America/Edmonton; это отражается на некоторых временных метках до 1948 года в данной зоне.