E.2. Выпуск 15.5

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

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

E.2.1. Миграция на версию 15.5

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

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

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

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

  • Исправление обработки аргументов неизвестного типа в агрегатных функциях DISTINCT "any" (Том Лейн).

    Эта ошибка приводила к тому, что значение типа text интерпретировалось как значение типа unknown (то есть строка, завершающаяся нулевым символом), при этом во время выполнения могло раскрываться содержимое памяти сервера после значения text.

    Проект PostgreSQL благодарит Цзинчжоу Фу за сообщение об этой проблеме. (CVE-2023-5868)

  • Выявление целочисленного переполнения при вычислении новых размерностей массива (Том Лейн)

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

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

  • Запрет для роли pg_signal_backend отправлять сигналы обслуживающим процессам и процессам автоочистки (Ной Миш, Йелте Феннема-Нио)

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

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

    Проект PostgreSQL благодарит Хеманта Сандрану и Махендракара Шринивасарао за сообщение об этой проблеме. (CVE-2023-5870)

  • Устранение некорректного поведения при рекурсивном разделении страницы в процессе построения индекса GiST (Хейкки Линнакангас)

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

  • Предотвращение дублирования записей индекса-B-дерева для столбцов типа interval (Ной Миш)

    Существуют значения interval, которые различаются, но считаются равными при сравнении, например 24:00:00 и 1 day, что нарушало работу предположений при исключении дубликатов в индексах-B-деревьях, поэтому столбцы типа interval необходимо убрать из такого исключения. Это упущение могло приводить к неправильным результатам сканирования только индекса. Более того, после обновления модуль amcheck сообщает об ошибке почти для всех таких индексов. Пользователям следует перестроить любые индексы-B-деревья для столбцов interval.

  • Более корректная обработка значений типа date в индексах BRIN datetime_minmax_multi_ops (Томаш Вондра)

    Расчёт расстояния между значениями дат был обратным, что приводило к неверным решениям о выборе записей для слияния сводок. Индекс выдавал правильные результаты, но гораздо менее эффективно, чем должен был. Рекомендуется перестроить индексы BRIN minmax_multi для столбцов date.

  • Более корректная обработка больших значений типов timestamp и timestamptz в индексах BRIN datetime_minmax_multi_ops (Томаш Вондра)

    Ошибочно считалось, что бесконечности находятся не на большом, а на нулевом расстоянии от других значений, что приводило к неверным решениям о выборе записей для слияния сводок. Кроме того, конечные, но очень большие значения (около конечных точек допустимого диапазона временных меток) могли вызывать внутренние переполнения, что также приводило к неверным решениям. Индекс выдавал правильные результаты, но гораздо менее эффективно, чем должен был. Рекомендуется перестроить индексы BRIN minmax_multi для столбцов timestamp и timestamptz, если столбец содержит или содержал бесконечности или большие конечные значения.

  • Предотвращение переполнения вычислений в индексах BRIN interval_minmax_multi_ops с крайними значениями интервала (Томаш Вондра)

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

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

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

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

    Если при изменении строки в режиме READ COMMITTED обнаруживается, что целевая строка была только что изменена параллельной транзакцией, для изменённой строки перепроверяются условия WHERE запроса. Для команды MERGE не гарантировалось, что во время этой перепроверки использовались правильные строки других соединяемых таблиц, что, возможно, приводило к неправильным решениям о том, должна ли изменённая строка снова изменяться командой MERGE.

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

    Если ограничение исключало первоначально указанную таблицу, но не всех её потомков в иерархии наследования, первый неисключённый потомок определялся как основная целевая таблица. Из-за этого на уровне операторов срабатывали триггеры, связанные с этой таблицей, а не с первоначально указанной. В версии 16 это упущение могло приводить к появлению ошибок «invalid perminfoindex 0 in RTE with relid NNNN» (неверный perminfoindex 0 в RTE с relid NNNN).

  • Исправление позиции индекса-B-дерева для предложений ScalarArrayOpExpr в особых случаях при обработке пометки/восстановления (Питер Гейган)

    При восстановлении сканирования индекса с ранее помеченной позицией в коде могли пропускаться необходимые шаги настройки, если сканирование продвинулось точно до конца совпадений для предложения ScalarArrayOpExpr (то есть indexcol = ANY(ARRAY[])). Это могло приводить к потере некоторых строк, которые должны были быть включены в выборку при сканировании.

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

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

  • Устранение сбоя при применении функции cursor_to_xmlschema() к порталу, не возвращающему данные (Боюй Ян)

  • Вывод корректного сообщения об ошибке, если pgrowlocks() применяется к секционированной таблице (Дэвид Роули)

    Ранее выводилось неточное сообщение об ошибке «only heap AM is supported» (поддерживается только AM в куче).

  • Более корректная обработка нерабочих индексов специальными SQL-функциями (Ной Миш)

    Если одна из функций pgstatindex(), pgstatginindex(), pgstatashindex() или pgstattuple() применяется к нерабочему индексу, в журнал теперь выводится сообщение об ошибке. Если одна из функций brin_desummarize_range(), brin_summarize_new_values(), brin_summarize_range() или gin_clean_pending_list() применяется к нерабочему индексу, сообщение вносится в журнал в зависимости от уровня отладки. Раньше эти функции пытались обработать индекс и демонстрировали странное поведение в зависимости от результатов невыполненной команды CREATE INDEX.

  • Исправление работы функции pg_stat_reset_single_table_counters() с общими каталогами (Масахиро Икеда)

    Раньше сброс был неэффективен.

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

  • Исключение выделения лишнего пространства на диске для созданного tsvector в функции tsvectorrecv() (Денис Ерохин)

    Если входящий вектор включает данные о местоположении, в результате выполнения двоичной функции приёма использовалось лишнее пространство (примерно равное размеру данных о положении) в готовом tsvector. В особых случаях это могло приводить к сбою из-за ошибки «maximum total lexeme length exceeded» (превышена максимальная общая длина лексемы) для векторов, длина которых на момент создания была ниже ограничения. В любом случае это могло приводить к потере места на диске.

  • Исправление некорректного кода в функции gtsvector_picksplit() (Александр Лахин)

    Ранее могли приниматься некорректные решения о разделении страниц в индексах GiST по столбцам tsvector.

  • Улучшение проверки на наличие повреждений данных, сжатых методом PGLZ (Флавьен Гедес)

  • Исправление сообщения об ошибке при необходимости преобразования неподдерживаемой кодировки в COPY FROM (Том Лейн)

    Во время недавней реорганизации кода была случайно удалена соответствующая проверка ошибок для этого случая, так что выводилось сообщение «cache lookup failed for function 0» (ошибка поиска в кеше для функции 0) вместо нужного сообщения.

  • Предотвращение сбоя команды EXPLAIN в случаях, если параметр, помеченный как отображаемый в EXPLAIN, имеет значение NULL при старте системы (Син Го, Александр Алексеев, Том Лейн)

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

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

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

  • Предотвращение неправильной реакции дочерних процессов, только что созданных функцией system(), на сигналы завершения работы (Натан Боссарт)

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

  • Устранение разрывов чтения pg_control в клиентских программах (Томас Манро)

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

  • Предотвращение разрывов чтения pg_control в соответствующих SQL-функциях (Томас Манро)

    Перед чтением pg_control получается соответствующая блокировка для обеспечения согласованного представления этого файла.

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

    На 64-разрядных машинах допускаются достаточно большие значения track_activity_query_size, чтобы вызвать 32-разрядное переполнение при умножении на разрешённое количество соединений. Однако в коде, фактически выделяющем локальный массив для каждого обслуживающего процесса, были упущения, и массив выделялся неправильно.

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

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

  • Исправление процесса фоновой записи для передачи счётчикам статистики информации о любых записях в WAL, выполняемых этим процессом (Назир Билал Явуз)

  • Устранение путаницы с поведением принудительного сброса данных на диск в функции pgstat_report_wal() (Рёга Йошида, Микаэль Пакье)

    Ранее некоторые статистики о вводе-выводе WAL терялись при завершении работы.

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

    Команды DDL, такие как замена функции, встроенной в аргумент CALL, могут вызвать необходимость перепланирования CALL, кешированного PL/pgSQL. Ранее перепланирование не выполнялось, что приводило к неправильному поведению или странным ошибкам, таким как «cache lookup failed» (не удалось выполнить поиск в кеше).

  • Предотвращение возможного сбоя из-за вызова pfree для нулевого указателя в случае ошибки при установлении соединения OpenSSL (Сергей Шиндерук)

  • Правильное отслеживание глубины вложенности при проверке переменных типа RECORD на внешних уровнях запроса (Ричард Гуо)

    Неправильное отслеживание могло приводить к сбоям проверочных утверждений, аварийным сбоям или ошибкам «bogus varno» (неприемлемое значение varno).

  • Отслеживание зависимостей хеш-функций и обратных функций узлов плана ScalarArrayOpExpr (Дэвид Роули)

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

  • Исправление некорректной обработки ошибок в управлении кешем типа RECORD (Томас Манро)

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

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

  • Обработка ошибок, связанных с нехваткой памяти при чтении WAL, как критических (Микаэль Пакье)

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

  • Исправление возможного сбоя восстановления из-за попытки выделить память на основе неприемлемой длины записи WAL (Томас Манро, Микаэль Пакье)

  • Устранение состояния гонки при удалении базы данных, которое могло приводить к «зависанию» процесса запуска автоочистки (Андрес Фройнд, Вилл Мортенсен, Джейкоб Спидел)

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

  • Исправление путаницы в размерах типов данных при управлении логическими лентами (Ранье Вилела)

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

  • Предотвращение непредусмотренного закрытия stdin процесса syslogger (Хейкки Линнакангас)

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

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

  • Сохранение передаваемых по ссылке значений attmissingval в долгосрочном контексте на время их использования (Эндрю Дунстан)

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

  • Перерасчёт эффективного значения search_path после ALTER ROLE (Джефф Дэвис)

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

  • Исправление ошибки «could not duplicate handle» (не удалось продублировать указатель), возникавшей в Windows, когда значение min_dynamic_shared_memory было больше нуля (Томас Манро)

  • Исправление порядка операций в GenericXLogFinish (Джефф Девис)

    В коде были нарушены условия, необходимые для обеспечения безопасности данных при сбое, поскольку запись в WAL происходила перед тем, как изменённые буферы помечались как «грязные». В коде ядра эта функция не используется, но её используют расширения (например, contrib/bloom).

  • Удаление неверного проверочного утверждения при обработке исключений PL/Python (Александр Лахин)

  • Устранение сбоя проверочного утверждения в pg_dump при попытке выгрузить схему pg_catalog (Питер Эйзентраут)

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

    Ранее при наличии прав обоих уровней восстанавливались только права на уровне таблицы.

  • Добавление в программу pg_upgrade логики для проверки использования типов данных abstime, reltime и tinterval (Álvaro Herrera )

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

  • Предотвращение создания недопустимых имён временных слотов в pg_basebackup (Йелте Феннема)

    Проблема наблюдалась только при соединении с сервером через pgbouncer.

  • Предотвращение ложных ошибок «too many client connections» (слишком много клиентских подключений) при использовании программы pgbench в Windows (Ной Миш)

  • Исключение сообщений о повреждении данных при прерванном удалении страницы в contrib/amcheck (Ной Миш)

    Это исправление предотвращает выдачу несоответствующих сообщений об ошибках «the first child of leftmost target page is not leftmost of its level» (первый дочерний элемент крайней левой целевой страницы не является крайним левым на её уровне), «block NNNN is not leftmost» (блок NNNN не является крайним левым) или «left link/right link pair in index XXXX not in agreement» (пара левая ссылка/правая ссылка в индексе XXXX не согласуется). Эти сообщения появлялись, если модуль amcheck запускался после незавершённого удаления страницы индекса-B-дерева и до выполнения очистки VACUUM.

  • Исправление ошибки в индексах contrib/btree_gin по столбцам interval, проявлявшейся при сканировании индекса с использованием оператора < или <= (Дин Рашид)

    Ранее при таком сканировании выдавались не все элементы, которые должны были.

  • Добавление поддержки LLVM версий 16 и 17 (Томас Манро, Дмитрий Долгов)

  • Подавление различных предупреждений во время сборки в последней версии macOS (Том Лейн)

    В среде Xcode 15 (выпущенной вместе с macOS Sonoma) изменилось поведение компоновщика таким образом, что при сборке PostgreSQL появляется множество предупреждений о дублирующихся библиотеках. Они безвредны, но раздражают, поэтому повторное упоминание библиотек было удалено. Также исключено использование флага компоновщика -multiply_defined suppress, который долгое время не использовался и стал причиной множества жалоб пользователей.

  • Возврат к использованию python при сборке файла правил contrib/unaccent, если не был указан параметр --with-python и не была задана переменная make PYTHON (Япинь Ли)

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

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