E.13. Релиз 15.5#

E.13. Релиз 15.5

E.13. Релиз 15.5

Дата релиза:  2023-11-09

Этот релиз содержит различные исправления из версии 15.4. Для получения информации о новых функциях в основном релизе 15, см. Раздел E.18.

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

Не требуется резервное копирование/восстановление для тех, кто использует версию 15.X.

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

Также, если вы обновляетесь с версии ранее 15.4, см. Раздел E.14.

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

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

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

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

  • Настроено обнаружение целочисленного переполнения при вычислении новых размеров массива (Tom Lane)

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

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

  • Устранена отправка сигналов фоновым рабочим процессам и процессам autovacuum от pg_signal_backend (Noah Misch, Jelte Fennema-Nio)

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

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

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

  • Исправлено неправильное поведение при рекурсивном разделении страницы в построении индекса GiST (Heikki Linnakangas)

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

  • Устранено удаление дубликатов записей индекса btree для столбцов interval (Noah Misch)

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

  • Настроена более корректная обработка данных типа date в индексах BRIN datetime_minmax_multi_ops (Tomas Vondra)

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

  • Настроена более корректная обработка больших значений timestamp и timestamptz в индексах BRIN datetime_minmax_multi_ops (Tomas Vondra)

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

  • Устранено переполнение вычислений в индексах BRIN interval_minmax_multi_ops с крайними значениями интервалов (Tomas Vondra)

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

  • Исправлена генерация шагов разделения и выполнение обрезки разделов для хэш-разделенных таблиц с несколькими ключами разделения (David Rowley)

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

  • Исправлена непоследовательная повторная проверка одновременно обновленных строк во время MERGE (Dean Rasheed)

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

  • Настроена правильная идентификация целевой таблицы в наследуемой команде UPDATE/DELETE/MERGE даже когда родительская таблица исключается ограничениями (Amit Langote, Tom Lane)

    Если изначально указанная таблица исключена из-за ограничений, но не все её наследники исключены, то первым не исключённым наследником определялась основная целевая таблица. Это приводило к срабатыванию триггеров на уровне операторов, связанных с этой таблицей, а не с изначально указанной таблицей, как должно быть. В версии 16, тот же недочет мог также привести к ошибкам недопустимый perminfoindex 0 в RTE с relid NNNN.

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

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

  • Исправлена утечка памяти внутри запроса в выполнении Memoize (Orlov Aleksej, David Rowley)

  • Исправлена утечка памяти внутри запроса, когда функция, возвращающая набор, многократно возвращала ноль строк (Tom Lane)

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

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

    Ранее возникала жалоба поддерживается только heap AM.

  • Настроена более корректная обработка недопустимых индексов в различных SQL функциях (Noah Misch)

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

  • Исправлена pg_stat_reset_single_table_counters() для правильной работы с общей каталогом (Masahiro Ikeda)

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

  • Устранен преждевременный сбой при выделения памяти для длинных входных данных для to_tsvector() (Tom Lane)

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

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

  • Исправлено некорректное кодирование в gtsvector_picksplit() (Alexander Lakhin)

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

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

  • В COPY FROM, настроено чистое завершение работы при необходимости неподдерживаемого преобразования кодировки (Tom Lane)

    Недавний рефакторинг случайно удалил предусмотренную проверку ошибок в этом случае, так что выдавалось сообщение cache lookup failed for function 0, вместо информативного сообщения об ошибке.

  • Исправлен сбой EXPLAIN, если параметр, отмеченный для отображения EXPLAIN, имеет значение NULL во время загрузки (Xing Guo, Aleksander Alekseev, Tom Lane)

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

  • Гарантировано наличие снимка при удалении временных таблиц ON COMMIT DROP (Tom Lane)

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

  • Исправлен неправильный ответ на сигналы завершения в дочерних процессах, только что созданных с помощью system() (Nathan Bossart)

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

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

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

  • Исправлены разорванные чтения pg_control в соответствующих SQL функциях (Thomas Munro)

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

  • Устранено целочисленного переполнение при вычислении размера массива строк активности фонового процесса (Jakub Wartak)

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

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

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

  • Настроено отправление фоновым писателем сообщения о любых записях WAL, которые он делает, в счетчики статистики (Nazir Bilal Yavuz)

  • Исправлено некорректное поведение принудительной очистки в pgstat_report_wal() (Ryoga Yoshida, Michael Paquier)

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

  • Настроено отслеживание зависимости кэшированных CALL операторов, и перепланировать их при необходимости (Tom Lane)

    Команды DDL, такие как замена функции, которая была встроена в аргумент CALL, могут создать необходимость повторного планирования CALL, который был кэширован PL/pgSQL. Это не происходило, что приводило к неправильному поведению или странным ошибкам, таким как не удалось найти в кэше.

  • Устранен возможный сбой из-за указателя pfree-a-NULL в случае ошибки при настройке соединения OpenSSL (Sergey Shinderuk)

  • Настроено правильное отслеживание глубины вложенности при проверке типа переменных RECORD на внешних уровнях запроса (Richard Guo)

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

  • Настроено отслеживание зависимости хеш-функции и обратных функций узлов плана ScalarArrayOpExpr (David Rowley)

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

  • Исправлена ошибка обработки в управлении кэшем типа RECORD (Thomas Munro)

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

  • Исправлена ошибка утверждения при повторной попытке логической декодировки в той же сессии после ошибки (Hou Zhijie)

  • Настроена классификация ошибок из-за нехватки памяти при чтении WAL как фатальных (Michael Paquier)

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

  • Исправлена возможная ошибка восстановления из-за попытки выделить память на основе ложного поля длины записи WAL (Thomas Munro, Michael Paquier)

  • Устранены условия гонки при удалении базы данных, которое могло привести к зависанию автозапуска вакуума (Andres Freund, Will Mortensen, Jacob Speidel)

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

  • Исправлено недоразумение с размером типа данных в управлении логической лентой (Ranier Vilela)

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

  • Устранено непреднамеренное закрытие stdin процесса syslogger (Heikki Linnakangas)

  • Устранено повторное подтверждение кэша плана для утилитарных операторов, которые не подвергались интересной обработке во время анализа синтаксиса (Tom Lane)

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

  • Настроено сохранение значения attmissingval по ссылке в долгоживущем контексте, пока они используются (Andrew Dunstan)

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

  • Пересчитано эффективное значение search_path после ALTER ROLE (Jeff Davis)

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

  • Исправлена ошибка could not duplicate handle, возникающая в Windows, когда min_dynamic_shared_memory установлено выше нуля (Thomas Munro)

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

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

  • Удалено некорректное утверждение в обработке исключений PL/Python (Alexander Lakhin)

  • Исправлена ошибка утверждения в pg_dump, когда запрашивалось дампирование схемы pg_catalog (Питер Айзентраут)

  • Исправлено pg_restore, чтобы выборочные восстановления включали как ACL на уровне таблицы, так и ACL на уровне столбца для выбранных таблиц (Euler Taveira, Tom Lane)

    Ранее восстанавливался бы только ACL на уровне таблицы, если бы оба типа присутствовали.

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

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

  • Устранено создание недопустимых временных имен слотов в pg_basebackup (Jelte Fennema)

    Это наблюдалось только в случае, когда соединение с сервером проходит через pgbouncer.

  • Исправлены ложные ошибки too many client connections в pgbench на Windows (Noah Misch)

  • В contrib/amcheck не сообщается о прерванном удалении страницы как о повреждении (Noah Misch)

    Это исправление предотвращает ложные срабатывания сообщений первый дочерний элемент самой левой целевой страницы не является самым левым на своем уровне, блок NNNN не является самым левым или левая ссылка/правая ссылка в индексе XXXX не совпадают. Они появлялись, если amcheck запускался после незавершенного удаления страницы индекса btree и до того, как VACUUM завершал очистку.

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

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

  • Добавлена поддержка LLVM 16 и 17 (Thomas Munro, Dmitry Dolgov)

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

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

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

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

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