E.14. Выпуск 14.5
Дата выпуска: 2022-08-11
В этот выпуск вошли различные исправления, внесённые после версии 14.4. За информацией о нововведениях версии 14 обратитесь к Разделу E.19.
E.14.1. Миграция на версию 14.5
Если используется версия 14.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 14.4, см. также Раздел E.16.
E.14.2. Изменения
Предотвращение замены объекта при выполнении скрипта расширения, если этот объект до этого не принадлежал расширению (Том Лейн) §
Теперь скриптам расширения запрещается выполнять
CREATE OR REPLACE
для существующего объекта, не принадлежащего расширению. Также запрещается выполнятьCREATE IF NOT EXISTS
в аналогичной ситуации. Тем самым обеспечивается защита от атак с внедрением троянского кода, когда злонамеренный пользователь базы данных мог стать владельцем объекта в расширении, а затем изменить его с целью перехватить управление при его дальнейшем использовании другими пользователями. Попутно эта защита снижает риск случайной замены объектов.Проект PostgreSQL благодарит Свена Клемма за сообщение об этой проблеме. (CVE-2022-2625)
Исправление воспроизведения записей WAL для
CREATE DATABASE
на ведомых серверах (Кётаро Хоригути, Асим Правин, Пол Гуо) § § § §На ведомых серверах могут отсутствовать каталоги табличных пространств, необходимые для воспроизведения записей WAL о создании базы данных. До этого исправления ведомый сервер не мог восстановиться в таких случаях, хотя каталоги могли отсутствовать на законных основаниях. Теперь табличное пространство создаётся (как обычный каталог), а по достижении согласованного состояния проверяется, что оно было корректно удалено.
Поддержка «внутренних» табличных пространств (Томас Манро, Микаэль Пакье, Альваро Эррера) § § §
В PostgreSQL табличное пространство — это обычно символическая ссылка на каталог в другой файловой системе. Теперь табличное пространство может представлять собой простой каталог. Это не позволяет размещать таблицы в разных файловых системах, но полезно при тестировании. Кроме того, это является частью решения предыдущей проблемы, которое заключается в том, что отсутствующее табличное пространство временно создаётся в виде «внутреннего» пространства.
Исправление проверки прав в
CREATE INDEX
(Натан Боссарт, Ной Миш) §В результате исправления уязвимости CVE-2022-1552 команда
CREATE INDEX
стала искать классы операторов и другие объекты с правами владельца таблицы, а не с правами выполняющего её пользователя, как это было ранее. При этом возникала проблема с выгрузкой/восстановлением данных, поскольку pg_dump выполняетCREATE INDEX
до назначения прав.Выполнение немедленной фиксации транзакции в расширенном протоколе запросов после
CREATE DATABASE
и других команд, которые нельзя использовать в блоке транзакции (Том Лейн) §Если клиент сразу после такой команды отправляет не сообщение Sync, а другую команду, любой сбой в последней приводит к откату предыдущей. Обычно следствием этого будет рассогласование состояния на диске (например, будет отсутствовать или обнаружится лишний каталог базы данных). Механизмы предотвращения такой несогласованности, как выяснилось, работают, когда несколько команд передаются в одном сообщении простого протокола, но не когда они передаются в последовательности сообщений расширенного протокола. Чтобы обеспечить согласованность и при этом не поломать сценарии использования, которые работали ранее, теперь после таких команд выполняется неявная фиксация транзакции.
Устранение условий гонки при проверке видимости транзакций (Саймон Риггс) §
Функция
TransactionIdIsInProgress
могла выдатьfalse
для транзакции, которая ещё не стала видимой, что могло иметь различные негативные последствия. Как правило, окно условий гонки довольно узкое, но синхронная репликация расширяет его, поскольку в этом окне выполняется ожидание синхронной реплики.Исправление некорректного планирования при сортировке по выражению, в котором функция, возвращающая множество, вызывается не на верхнем уровне (Ричард Гуо, Том Лейн) § §
Исправление некорректного кода проверки прав для расширенной статистики (Ричард Гуо) §
Если для таблицы имелась расширенная статистика, пользователь, не имеющий всех прав для выполнения
SELECT
, обращаясь к ней, получал ошибку «unrecognized node type» (нераспознанный тип узла).Добавление обработки статистики MCV по логическим выражениям в механизм расширенной статистики (Том Лейн) §
Статистика по логическим выражениям собиралась корректно, но запрос с таким выражением в
WHERE
завершался ошибкой «unknown clause type» (неизвестный тип предложения).Предотвращение аварийного сбоя планировщика в ходе обработки предложений
при наличии расширенной статистики типа MCV по переменным-массивам (Том Лейн) § §константа
= ANY(массив
)Исправление обработки рекурсии для триггеров секционированных таблицы в
ALTER TABLE ... ENABLE/DISABLE TRIGGER
(Альваро Эррера, Амит Ланготе) § §В определённых случаях эта команда завершалась ошибкой «trigger does not exist» (триггер не существует) при попытке изменить состояние триггера в дочерней секции, где его не было.
Предоставление возможности отменить
ANALYZE
во время расчёта расширенной статистики (Том Лейн, Джастин Призби) §В некоторых сценариях с большими значениями ориентира статистики операция сортировки могла выполняться долго, и прервать её было нельзя.
Улучшение сообщений об ошибках синтаксиса для типа
jsonpath
(Эндрю Дунстан) §Реализация очистки состояния сеанса в
pg_stop_backup()
(Фудзии Масао) §Раньше такая очистка не выполнялась, что могло приводить к ошибкам или сбоям проверочных утверждений в том же сеансе.
Исправление поведения
trim_array()
при получении массива нулевой размерности (Мартин Калхер) §Исправление сопоставления псевдонимов соединяемых отношений в предложениях
FOR [KEY] UPDATE/SHARE
(Дин Рашид) §Ранее в особых случаях могло выдаваться неверное сообщение об ошибке.
Предотвращение выполнения выражений и функций
ROW()
со слишком большим количеством столбцов воFROM
(Том Лейн) § §Запросы с более чем 1600 столбцами не поддерживаются и всегда завершаются ошибкой. Однако обнаружилось, что старую реализацию можно было довести до сбоя проверочных утверждений или краха, составив запрос с более чем 32K столбцами. Чтобы предотвратить это, добавлена проверка количества столбцов при разборе запроса.
Исправление выгрузки представления, вызывающего во
FROM
функцию с результатом составного типа, какие-либо столбцы которого были удалены после создания представления (Том Лейн) §Ранее выгруженное представление могло содержать лишние псевдонимы для столбцов результата функции, что препятствовало восстановлению данных или работе pg_upgrade.
Запрет вложенных операций резервного копирования в режиме передачи данных логической репликации (Фудзии Масао) §
Устранение утечки памяти в коде подписчика логической репликации (Хоу Чжицзе) §
Корректировка проверки идентификатора реплики при логической репликации с секционированной целевой таблицей (Ши Юй, Хоу Чжицзе) § §
Столбцы, образующие идентификатор реплики, должны проверяться для дочерней секции.
Обеспечение обновления кешируемых данных схемы на подписчике логической репликации в случае изменения схемы (Ши Юй, Хоу Чжицзе) §
Исправление обработки флагов
BRIN_EVACUATE_PAGE
в логике проверки целостности WAL (Хайян Ван) § §Исправление некорректных проверочных утверждений в коде управления разделяемыми хеш-таблицами (Томас Манро) §
Устранение сбоя проверочного утверждения при использовании ненулевого значения
min_dynamic_shared_memory
(Томас Манро) §Осуществление очистки после ошибок во время фиксации в
SPI_commit()
вместо перекладывания очистки на вызывающий код (Питер Эйзентраут, Том Лейн) § §Корректно провести очистку сложно, и при этом нужно использовать низкоуровневые средства, поэтому неудивительно, что это нигде не было сделано правильно. В результате возникали сбои, когда процедура PL вызывала
COMMIT
и в это время возникала ошибка (например, из-за отложенной проверки-ограничения). Чтобы улучшить ситуацию, теперьSPI_commit()
по определению начинает новую транзакцию, то есть работает так же, какSPI_commit_and_chain()
, но новая транзакция имеет характеристики по умолчанию, а не характеристики предыдущей транзакции. Чтобы это изменение было прозрачным с точки зрения API, функцияSPI_start_transaction()
сохранена, но теперь не делает ничего. Везде, где в существующем коде вызывается функцияSPI_commit()
, за ней сразу вызываетсяSPI_start_transaction()
, поэтому данное изменение там никак не проявится. Подобные замечания применимы и кSPI_rollback()
.Также исправления внесены в реализацию PL/Python, в которой такие ошибки вообще не обрабатывались, что приводило к выходу из интерпретатора Python. Поступали сообщения о том, что это вызывало падение Python 3.11. В предыдущих версиях Python проблемы ограничивались утечкой памяти.
Усовершенствование обработки состояний простоя в конвейерном режиме в libpq (Альваро Эррера, Кётаро Хоригути) § §
Также устранены предупреждения вида «message type 0x33 arrived from server while idle» (от сервера во время простоя получено сообщение типа 0x33) и возможная потеря NULL, завершающего результаты запроса, в
PQgetResult()
.Предотвращение аварийного сбоя в ecpglib при выполнении операций не в ожидаемом порядке (Том Лейн) §
Если определённые операции, например
EXEC SQL PREPARE
, выполнялись до установления подключения к базе данных, мог произойти сбой (вместо ошибки, как можно было ожидать).Исключение лишних вызовов
newlocale()
в ecpglib (Ной Миш) § §Раньше объекты локали C создавались и освобождались для каждого запроса, теперь же объект локали выделяется один раз для каждого процесса при первом подключении. Это устраняет утечку памяти libc в AIX и может несколько повысить общую производительность.
Добавление в psql перевода строки после прерывания команды
\watch
сигналом Control-C (Павел Стехуле) §Теперь libedit (а возможно и libreadline) будет точно знать, в каком столбце находится курсор.
Добавление в pg_upgrade обнаружения функций с аргументами
anyarray
, не поддерживающих обновление (Джастин Призби) § §В версии 14 некоторые встроенные функции стали принимать тип
anycompatiblearray
вместоanyarray
. Хотя это изменение в большой степени прозрачно, пользовательские агрегатные функции и операторы, созданные поверх этих функций, должны принимать точно такие же типы. Обновить базу с объектами, ссылающимися на старую сигнатуру, pg_upgrade не может, поэтому теперь такие объекты обнаруживаются и их список выводится до начала обновления.Исправление диагностики ошибок после сбоя
clone()
при запуске pg_upgrade с ключом--clone
(Джастин Призби) §Устранение найденных в
contrib/pg_stat_statements
проблем с очень большими файлами, содержащими тексты запросов, на 32-битных платформах (Том Лейн) §Отключение в расширении
contrib/postgres_fdw
массового добавления данных при наличии ограниченийWITH CHECK OPTION
(Эцуро Фудзита) §Такие ограничения невозможно проверить должным образом, когда в одной операции вставляется несколько строк.
Устранение найденных в
contrib/pg_stat_statements
проблем с очень большими файлами текстов запросов на 32-битных платформах (Том Лейн) §Обеспечение в
contrib/postgres_fdw
передачи констант типовregconfig
иreg*
с правильной схемой (Том Лейн) §Блокировка сигналов во время выделения динамической общей памяти в Linux (Томас Манро) § § §
Это изменение позволяет избежать проблем при прерывании сигналом функции
posix_fallocate()
.Исправление обработки неожиданных ошибок
EEXIST
, выдаваемых функциейshm_open()
(Томас Манро) §Это предотвращает возможный сбой в Solaris.
Исключение использования функции
signalfd()
в системе illumos (Томас Манро) §По всей видимости её использование вызывает зависание и паническую остановку ядра, поэтому решено отказаться от неё, пока это не исправлено.