E.33. Выпуск 11.17

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

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

E.33.1. Миграция на версию 11.17

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

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

E.33.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 для транзакции, которая ещё не стала видимой, что могло иметь различные негативные последствия. Как правило, окно условий гонки довольно узкое, но синхронная репликация расширяет его, поскольку в этом окне выполняется ожидание синхронной реплики.

  • Исправление запросов, в которых переменная «вся строка» ссылается на результат функции, возвращающей домен поверх составного типа (Том Лейн)

  • Устранение ошибки планировщика «variable not found in subplan target list» (переменная не найдена в целевом списке подплана) при подтягивании наверх вложенного SELECT, задействованного в аргументе функции GROUPING (Ричард Гуо)

  • Исправление обработки рекурсии для триггеров секционированных таблицы в ALTER TABLE ... ENABLE/DISABLE TRIGGER (Альваро Эррера, Амит Ланготе)

    В определённых случаях эта команда завершалась ошибкой «trigger does not exist» (триггер не существует) при попытке изменить состояние триггера в дочерней секции, где его не было.

  • Исключение возможности получения от функции pg_stat_get_subscription() дополнительной строки с «мусорными» значениями (Кунтал Гхош)

  • Реализация очистки состояния сеанса в pg_stop_backup() (Фудзии Масао)

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

  • Исправление сопоставления псевдонимов соединяемых отношений в предложениях FOR [KEY] UPDATE/SHARE (Дин Рашид)

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

  • Устранение сбоя при использовании в конструкции XMLTABLE или JSON_TABLE слишком большого числа псевдонимов столбцов (Альваро Эррера)

  • Предотвращение выполнения выражений и функций ROW() со слишком большим количеством столбцов во FROM (Том Лейн)

    Запросы с более чем 1600 столбцами не поддерживаются и всегда завершаются ошибкой. Однако обнаружилось, что старую реализацию можно было довести до сбоя проверочных утверждений или краха, составив запрос с более чем 32K столбцами. Чтобы предотвратить это, добавлена проверка количества столбцов при разборе запроса.

  • Отображение столбцов SELECT, выводимых в выдаваемом определении правила или представления, с предложением AS "?column?", если могут существовать внешние ссылки на них (Том Лейн)

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

  • Исправление выгрузки представления, вызывающего во FROM функцию с результатом составного типа, какие-либо столбцы которого были удалены после создания представления (Том Лейн)

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

  • Передача информации о неявном создании семейств операторов событийным триггерам (Масахико Савада)

    Если при выполнении CREATE OPERATOR CLASS неявно создавалось семейство операторов, событийные триггеры не замечали создание этого объекта.

  • Корректировка изменения управляющего файла при выполнении процедуры точки перезапуска во время повышения ведомого сервера (Кётаро Хоригути)

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

  • Предотвращение срабатывания тайм-аута wal_receiver_timeout на ведомом сервере в процессе логической репликации больших транзакций (Вэй Ван, Амит Капила)

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

  • Запрет вложенных операций резервного копирования в режиме передачи данных логической репликации (Фудзии Масао)

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

  • Предотвращение утечки открытого дескриптора при чтении неправильного файла с сокращёнными обозначениями часовых поясов (Кётаро Хоригути)

    В таких случаях могли выдаваться некритичные предупреждения.

  • Обеспечение поддержки дополнительных серверных параметров, для которых в качестве короткого описания задано NULL (Стив Чавес)

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

  • Исправление обработки флагов BRIN_EVACUATE_PAGE в логике проверки целостности WAL (Хайян Ван)

  • Исправление некорректных проверочных утверждений в коде управления разделяемыми хеш-таблицами (Томас Манро)

  • Осуществление очистки после ошибок во время фиксации в 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 ненужной проверки владельца файла SSL-ключа (Том Лейн)

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

  • Обеспечение вывода вменяемого сообщения при потере подключения к серверу в ecpg (Том Лейн)

    Вследствие неправильной обработки ошибки, сформированной libpq, например при потере подключения, вместо полезного сообщения могла выдаваться строка «(null)», а в старых версиях мог произойти сбой.

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

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

  • Исключение лишних вызовов newlocale() в ecpglib (Ной Миш)

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

  • Добавление в psql перевода строки после прерывания команды \watch сигналом Control-C (Павел Стехуле)

    Теперь libedit (а возможно и libreadline) будет точно знать, в каком столбце находится курсор.

  • Устранение найденных в contrib/pg_stat_statements проблем с очень большими файлами текстов запросов на 32-битных платформах (Том Лейн)

  • Обеспечение в contrib/postgres_fdw передачи констант типов regconfig и reg* с правильной схемой (Том Лейн)

  • Блокировка сигналов во время выделения динамической общей памяти в Linux (Томас Манро)

    Это изменение позволяет избежать проблем при прерывании сигналом функции posix_fallocate().

  • Исправление обработки неожиданных ошибок EEXIST, выдаваемых функцией shm_open() (Томас Манро)

    Это предотвращает возможный сбой в Solaris.

  • Корректировка теста PL/Perl для обеспечения совместимости с Perl 5.36 (Дагфинн Ильмари Маннсакер)

  • Недопущение ошибочного использования устаревшей библиотеки libldap_r в случае, когда при сборке PostgreSQL обнаруживается несколько инсталляций OpenLDAP (Том Лейн)