E.28. Выпуск 14.5

Дата выпуска: 2022-08-11

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

E.28.1. Миграция на версию 14.5

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

Если вы обновляете сервер с более ранней версии, чем 14.4, см. также Раздел E.30.

E.28.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» (неизвестный тип предложения).

  • Предотвращение аварийного сбоя планировщика в ходе обработки предложений константа = ANY(массив) при наличии расширенной статистики типа MCV по переменным-массивам (Том Лейн)

  • Исправление обработки рекурсии для триггеров секционированных таблицы в 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 (Томас Манро)

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