E.6. Выпуск 11.17
Дата выпуска: 2022-08-11
В этот выпуск вошли различные исправления, внесённые после версии 11.16. За информацией о нововведениях версии 11 обратитесь к Разделу E.23.
E.6.1. Миграция на версию 11.17
Если используется версия 11.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 11.14, см. также Раздел E.9.
E.6.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 (Том Лейн)