E.12. Выпуск 16.3#

E.12. Выпуск 16.3

E.12. Выпуск 16.3 #

Дата релиза:  2024-05-09

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

E.12.1. Миграция на версию 16.3 #

Снятие дампа/восстановление не требуется для тех, кто использует 16.X.

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

Также, если обновление выполняется с версии ранее 16.2, см. Раздел E.13.

E.12.2. Изменения #

  • Ограничена видимость записей pg_stats_ext и pg_stats_ext_exprs для владельца таблицы (Nathan Bossart) §

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

    Проект PostgreSQL благодарит Лукаса Фиттла за сообщение об этой проблеме. (CVE-2024-4317)

    Само по себе это исправление исправит поведение только в новых кластерах баз данных, инициализированных с помощью initdb. Если вы хотите применить это изменение в существующем кластере, вам нужно будет сделать следующее:

    1. Найдите SQL-скрипт fix-CVE-2024-4317.sql в каталоге share установки PostgreSQL (обычно расположенном где-то вроде /usr/share/postgresql/). Убедитесь, что используется скрипт, соответствующий вашей основной версии PostgreSQL. Если этот файл не виден, либо ваша версия не уязвима (затронуты только v14–v16), либо ваша минорная версия слишком стара, чтобы содержать исправление.

    2. В каждой базе данных кластера выполните скрипт fix-CVE-2024-4317.sql от имени суперпользователя. В psql это будет выглядеть так

      \i /usr/share/postgresql/fix-CVE-2024-4317.sql
      

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

    3. Не забудьте включить базы данных template0 и template1, иначе уязвимость останется в базах данных, которые будут созданы позже. Чтобы исправить template0, потребуется временно разрешить ей принимать подключения. Сделайте это с помощью

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
      

      а затем после исправления template0, отмените это с помощью

      ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
      

  • Исправлено INSERT из нескольких строк VALUES в целевой столбец, который является доменом над массивом или составным типом (Tom Lane) §

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

  • Требуется привилегия SELECT на целевой таблице для MERGE с клаузой DO NOTHING (Álvaro Herrera) §

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

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

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

  • Исправлено некорректное удаление NULL раздела, когда таблица разделена по булевому столбцу и в запросе используется булево IS NOT условие (Дэвид Роули) §

    NULL-значение удовлетворяет предложению, такому как boolcol IS NOT FALSE, поэтому исключение секции, содержащей NULL-значения, приводило к неправильным ответам.

  • Сделано так, чтобы ALTER FOREIGN TABLE SET SCHEMA перемещал любые принадлежащие последовательности в новую схему (Tom Lane) §

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

  • Сделано так, чтобы ALTER TABLE ... ADD COLUMN создавал последовательности идентификаторов/серий с той же устойчивостью, что и их владеющие таблицы (Петер Айзентраут) §

    CREATE UNLOGGED TABLE сделает все принадлежащие последовательности также незарегистрированными. ALTER TABLE упустил это соображение, так что добавленный столбец идентификатора имел бы зарегистрированную последовательность, что кажется бессмысленным.

  • Улучшено сообщение об ошибке ALTER TABLE ... ALTER COLUMN TYPE, когда существует зависимая функция или публикация (Tom Lane) § §

  • В CREATE DATABASE ключевые слова стратегии распознавались без учета регистра для согласованности с другими опциями (Tomas Vondra) §

  • Исправлено EXPLAIN подсчет страниц кучи, к которым был осуществлен доступ с помощью сканирования кучи по битовой карте (Мелани Плагеман) §

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

  • Исправлен вывод EXPLAIN для подпланов в MERGE (Дин Рашид) §

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

  • Избежание взаимоблокировки при удалении осиротевших временных таблиц (Михаил Жилин) §

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

  • Исправлено обновление состояния карты видимости в VACUUM с опцией DISABLE_PAGE_SKIPPING (Хейки Линнакангас) §

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

  • Избегание состояния гонки при проверке значений замороженного XID для каждой связи (Ноа Миш) §

    VACUUM вычисление значений frozen-XID для каждой базы данных на основе значений для каждой таблицы могло быть запутано одновременным обновлением этих значений другим VACUUM.

  • Исправлено использование буфера при параллельной очистке (Anthonin Bonnefoy) §

    Доступы к буферу, выполненные параллельными рабочими, не были учтены в статистике, сообщаемой в режиме VERBOSE.

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

    В версиях до PostgreSQL 16, было возможно, что сгенерированные условия оценивались ниже внешних соединений, когда они должны были оцениваться выше (после) внешнего соединения, что приводило к неправильным результатам запроса. Во всех версиях существует аналогичная опасность при рассмотрении соединений с деревьями UNION ALL, которые имеют постоянные выходные данные для столбца соединения в некоторых ветвях SELECT.

  • Исправлены ошибки не удалось найти элемент pathkey для сортировки, возникающие при планировании агрегатных функций с опциями ORDER BY или DISTINCT (David Rowley) §

    Это похоже на исправление, примененное в 16.1, но оно решает проблему для параллельных планов.

  • Предотвращена потенциально некорректная оптимизация некоторых оконных функций (Дэвид Роули) §

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

  • Избегалось ненужное использование режима скользящей агрегации с неподвижной оконной рамкой (Vallimaharajan G) §

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

  • Избегалось использование уже освобожденных данных при планировании соединений по разделам под GEQO (Tom Lane) §

    Это обычно заканчивалось бы сбоем или неожиданным сообщением об ошибке.

  • Избегалось освобождение данных, которые все еще используются, в Memoize (Тендер Ван, Андрей Лепихов) §

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

  • Исправлены некорректно сообщаемые коды видов статистики в сообщениях об ошибках запрашиваемая статистика вида X еще не построена (Дэвид Роули) §

  • Использовалась хеш-таблица вместо линейного поиска для объектов catcache list (Том Лейн) §

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

  • Будьте более осторожны с функциями, возвращающими RECORD, в FROM (Tom Lane) § §

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

  • Исправлено недоразумение относительно возвращаемого типа строки процедур на языке SQL (Tom Lane) §

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

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

  • Исправлены ошибки округления и опасности переполнения в date_bin() (Моаз Ассали) §

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

  • Обнаружено переполнение целого числа при добавлении или вычитании interval к/из timestamp (Joseph Koshakow) §

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

  • Избегание состояния гонки в pg_get_expr() (Tom Lane) §

    Если отношение, на которое ссылается аргумент, было удалено одновременно, намерение функции состоит в том, чтобы вернуть NULL, но иногда она завершалась с ошибкой.

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

    Идентификаторы транзакций более чем 231 транзакций в прошлом могли быть ошибочно определены как недавние, что приводило к неправильному поведению pg_xact_status() или txid_status().

  • Убедиться, что карта свободного пространства таблицы не возвращает страницу, которая находится за пределами конца таблицы (Ронан Данкло) §

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

  • Исправлена утечка файлового дескриптора, когда ошибка была выброшена во время ожидания в WaitEventSetWait (Etsuro Fujita) §

  • Избегалось повреждение стека исключений, если FDW реализовал асинхронное добавление, но не были настроены условия ожидания для узла плана Append для ожидания (Александр Пыхалов) §

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

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

  • Убедиться, что индексные сканирования только по столбцам name возвращают полностью дополненное значение (Дэвид Роули) §

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

  • Исправлено состояние гонки, которое могло привести к сообщению о неверной причине конфликта при аннулировании слота репликации (Бертран Друво) §

  • Исправлено состояние гонки при принятии решения, требуется ли операция синхронизации таблицы в логической репликации (Vignesh C) §

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

  • Исправлен сбой с DSM-выделениями более 4 ГБ (Хейкки Линнакангас) §

  • Отключение, если клиентский сокет новой серверной сессии не может быть переведен в неблокирующий режим (Хейкки Линкангас) §

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

  • Исправлено недостаточное сообщение об ошибках с OpenSSL 3.0.0 и позже (Хейкки Линнакангас, Том Лейн) §

    Ошибки, переданные через OpenSSL, сообщались с числовым кодом ошибки, а не с чем-то читаемым.

  • Исправлена потокобезопасность отчетов об ошибках для getaddrinfo() в Windows (Томас Мунро) §

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

  • Избегать одновременных вызовов bindtextdomain() в libpq и ecpglib (Tom Lane) § §

    Хотя реализация gettext от GNU, кажется, справляется с параллельными вызовами, версия, доступная на Windows, нет.

  • Исправлен сбой в препроцессоре ecpg, если программа пыталась переопределить макрос, который был определен в командной строке препроцессора (Tom Lane) § § §

  • В ecpg избегалось выдача ложных предупреждений неподдерживаемая функция будет передана на сервер (Tom Lane) §

  • Убедитесь, что строковый результат функции intoasc() в ecpg правильно завершается нулем (Олег Целебровский) §

  • В параметре -c приложения initdb имена параметров сопоставлены без учета регистра (Tom Lane) §

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

  • В psql избегалась утечка результата запроса после отмены запроса (Tom Lane) §

    Это произошло только при отмене не последнего запроса в строке запроса, сделанной с разделителями \;.

  • Исправлено pg_dumpall так, чтобы комментарии к ролям, если они присутствуют, выгружались независимо от настройки --no-role-passwords (Даниэль Густафссон, Álvaro Herrera) §

  • Пропущены файлы с именем .DS_Store в pg_basebackup, pg_checksums, и pg_rewind (Даниэль Густафссон) §

    Это позволяет избежать проблем в macOS, где Finder может создавать такие файлы.

  • Исправлен PL/pgSQL разбор однострочных комментариев (комментарии в стиле --), следующих за выражениями (Эрик Винхольд, Том Лейн) §

    Эта ошибка вызывала ошибки синтаксического анализа, если такой комментарий следовал за WHEN выражением в PL/pgSQL CASE операторе.

  • В contrib/amcheck не сообщалось о ложных сбоях совпадения из-за значений короткого и длинного заголовка (Андрей Бородин, Михаил Жилин) § §

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

  • Исправлены ошибки в функциях вывода BRIN (Tomas Vondra) § §

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

  • В contrib/postgres_fdw избегалось выполнение запросов на сортировку по константе (Дэвид Роули) §

    Это могло произойти в случаях с UNION ALL с подзапросами, возвращающими константы. Сортировка по константе, конечно, бесполезна, но также существует риск неправильной интерпретации удаленным сервером, что приводит к ошибкам ORDER BY position N is not in select list.

  • Сделано так, чтобы contrib/postgres_fdw устанавливал часовой пояс удаленной сессии на GMT а не UTC (Tom Lane) §

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

  • В contrib/xml2 избегалось использование функций библиотеки, которые были объявлены устаревшими в последних версиях libxml2 (Дмитрий Коваль) §

  • Исправлена несовместимость с LLVM 18 (Томас Мунро, Дмитрий Долгов) §

  • Разрешено make check работать с библиотекой C musl (Томас Манро, Брюс Момджян, Том Лейн) §