E.44. Выпуск 14.5
Дата выпуска: 2022-08-11
В этот выпуск вошли различные исправления, внесённые после версии 14.4. За информацией о нововведениях версии 14 обратитесь к Разделу E.49.
E.44.1. Миграция на версию 14.5
Если используется версия 14.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 14.4, см. также Раздел E.46.
E.44.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 (Томас Манро) §По всей видимости её использование вызывает зависание и паническую остановку ядра, поэтому решено отказаться от неё, пока это не исправлено.
E.44. Release 14.5
Release date: 2022-08-11
This release contains a variety of fixes from 14.4. For information about new features in major release 14, see Section E.49.
E.44.1. Migration to Version 14.5
A dump/restore is not required for those running 14.X.
However, if you are upgrading from a version earlier than 14.4, see Section E.45.
E.44.2. Changes
Do not let extension scripts replace objects not already belonging to the extension (Tom Lane) §
This change prevents extension scripts from doing
CREATE OR REPLACEif there is an existing object that does not belong to the extension. It also preventsCREATE IF NOT EXISTSin the same situation. This prevents a form of trojan-horse attack in which a hostile database user could become the owner of an extension object and then modify it to compromise future uses of the object by other users. As a side benefit, it also reduces the risk of accidentally replacing objects one did not mean to.The PostgreSQL Project thanks Sven Klemm for reporting this problem. (CVE-2022-2625)
Fix replay of
CREATE DATABASEWAL records on standby servers (Kyotaro Horiguchi, Asim R Praveen, Paul Guo) § § § §Standby servers may encounter missing tablespace directories when replaying database-creation WAL records. Prior to this patch, a standby would fail to recover in such a case; however, such directories could be legitimately missing. Create the tablespace (as a plain directory), then check that it has been dropped again once replay reaches a consistent state.
Support “in place” tablespaces (Thomas Munro, Michael Paquier, Álvaro Herrera) § § §
Normally a Postgres tablespace is a symbolic link to a directory on some other filesystem. This change allows it to just be a plain directory. While this has no use for separating tables onto different filesystems, it is a convenient setup for testing. Moreover, it is necessary to support the
CREATE DATABASEreplay fix, which transiently creates a missing tablespace as an “in place” tablespace.Fix permissions checks in
CREATE INDEX(Nathan Bossart, Noah Misch) §The fix for CVE-2022-1552 caused
CREATE INDEXto apply the table owner's permissions while performing lookups of operator classes and other objects, where formerly the calling user's permissions were used. This broke dump/restore scenarios, because pg_dump issuesCREATE INDEXbefore re-granting permissions.In extended query protocol, force an immediate commit after
CREATE DATABASEand other commands that can't run in a transaction block (Tom Lane) §If the client does not send a Sync message immediately after such a command, but instead sends another command, any failure in that command would lead to rolling back the preceding command, typically leaving inconsistent state on-disk (such as a missing or extra database directory). The mechanisms intended to prevent that situation turn out to work for multiple commands in a simple-Query message, but not for a series of extended-protocol messages. To prevent inconsistency without breaking use-cases that work today, force an implicit commit after such commands.
Fix race condition when checking transaction visibility (Simon Riggs) §
TransactionIdIsInProgresscould reportfalsebefore the subject transaction is considered visible, leading to various misbehaviors. The race condition window is normally very narrow, but use of synchronous replication makes it much wider, because the wait for a synchronous replica happens in that window.Fix incorrect plans when sorting by an expression that contains a non-top-level set-returning function (Richard Guo, Tom Lane) § §
Fix incorrect permissions-checking code for extended statistics (Richard Guo) §
If there are extended statistics on a table that the user has only partial
SELECTpermissions on, some queries would fail with “unrecognized node type” errors.Fix extended statistics machinery to handle MCV-type statistics on boolean-valued expressions (Tom Lane) §
Statistics collection worked fine, but a query containing such an expression in
WHEREwould fail with “unknown clause type”.Avoid planner core dump with
clauses when there are MCV-type extended statistics on theconstant= ANY(array)arrayvariable (Tom Lane) § §Fix
ALTER TABLE ... ENABLE/DISABLE TRIGGERto handle recursion correctly for triggers on partitioned tables (Álvaro Herrera, Amit Langote) § §In certain cases, a “trigger does not exist” failure would occur because the command would try to adjust the trigger on a child partition that doesn't have it.
Allow cancellation of
ANALYZEwhile it is computing extended statistics (Tom Lane, Justin Pryzby) §In some scenarios with high statistics targets, it was possible to spend many seconds in an un-cancellable sort operation.
Improve syntax error messages for type
jsonpath(Andrew Dunstan) §Ensure that
pg_stop_backup()cleans up session state properly (Fujii Masao) §This omission could lead to assertion failures or crashes later in the session.
Fix
trim_array()to handle a zero-dimensional array argument sanely (Martin Kalcher) §Fix join alias matching in
FOR [KEY] UPDATE/SHAREclauses (Dean Rasheed) §In corner cases, a misleading error could be reported.
Reject
ROW()expressions and functions inFROMthat have too many columns (Tom Lane) § §Cases with more than about 1600 columns are unsupported, and have always failed at execution. However, it emerges that some earlier code could be driven to assertion failures or crashes by queries with more than 32K columns. Add a parse-time check to prevent that.
Fix dumping of a view using a function in
FROMthat returns a composite type, when column(s) of the composite type have been dropped since the view was made (Tom Lane) §This oversight could lead to dump/reload or pg_upgrade failures, as the dumped view would have too many column aliases for the function.
Disallow nested backup operations in logical replication walsenders (Fujii Masao) §
Fix memory leak in logical replication subscribers (Hou Zhijie) §
Fix logical replication's checking of replica identity when the target table is partitioned (Shi Yu, Hou Zhijie) § §
The replica identity columns have to be re-identified for the child partition.
Fix failures to update cached schema data in a logical replication subscriber after a schema change on the publisher (Shi Yu, Hou Zhijie) § §
Fix WAL consistency checking logic to correctly handle
BRIN_EVACUATE_PAGEflags (Haiyang Wang) § §Fix erroneous assertion checks in shared hashtable management (Thomas Munro) §
Avoid assertion failure when
min_dynamic_shared_memoryis set to a non-default value (Thomas Munro) §Arrange to clean up after commit-time errors within
SPI_commit(), rather than expecting callers to do that (Peter Eisentraut, Tom Lane) § §Proper cleanup is complicated and requires use of low-level facilities, so it's not surprising that no known caller got it right. This led to misbehaviors when a PL procedure issued
COMMITbut a failure occurred (such as a deferred constraint check). To improve matters, redefineSPI_commit()as starting a new transaction, so that it becomes equivalent toSPI_commit_and_chain()except that you get default transaction characteristics instead of preserving the prior transaction's characteristics. To make this somewhat transparent API-wise, redefineSPI_start_transaction()as a no-op. All known callers ofSPI_commit()immediately callSPI_start_transaction(), so they will not notice any change. Similar remarks apply toSPI_rollback().Also fix PL/Python, which omitted any handling of such errors at all, resulting in jumping out of the Python interpreter. This is reported to crash Python 3.11. Older Python releases leak some memory but seem okay with it otherwise.
Improve libpq's handling of idle states in pipeline mode (Álvaro Herrera, Kyotaro Horiguchi) § §
This fixes “message type 0x33 arrived from server while idle” warnings, as well as possible loss of end-of-query NULL results from
PQgetResult().Avoid core dump in ecpglib with unexpected orders of operations (Tom Lane) §
Certain operations such as
EXEC SQL PREPAREwould crash (rather than reporting an error as expected) if called before establishing any database connection.In ecpglib, avoid redundant
newlocale()calls (Noah Misch) § §Allocate a C locale object once per process when first connecting, rather than creating and freeing locale objects once per query. This mitigates a libc memory leak on AIX, and may offer some performance benefit everywhere.
In psql's
\watchcommand, echo a newline after cancellation with control-C (Pavel Stehule) §This prevents libedit (and possibly also libreadline) from becoming confused about which column the cursor is in.
Fix pg_upgrade to detect non-upgradable usages of functions taking
anyarray(Justin Pryzby) § §Version 14 changed some built-in functions to take type
anycompatiblearrayinstead ofanyarray. While this is mostly transparent, user-defined aggregates and operators built atop these functions have to be declared with exactly matching types. The presence of an object referencing the old signature will cause pg_upgrade to fail, so change it to detect and report such cases before beginning the upgrade.Fix possible report of wrong error condition after
clone()failure in pg_upgrade with--cloneoption (Justin Pryzby) §Fix
contrib/pg_stat_statementsto avoid problems with very large query-text files on 32-bit platforms (Tom Lane) §In
contrib/postgres_fdw, prevent batch insertion when there areWITH CHECK OPTIONconstraints (Etsuro Fujita) §Such constraints cannot be checked properly if more than one row is inserted at a time.
Fix
contrib/postgres_fdwto detect failure to send an asynchronous data fetch query (Fujii Masao) §Ensure that
contrib/postgres_fdwsends constants ofregconfigand otherreg*types with proper schema qualification (Tom Lane) §Block signals while allocating dynamic shared memory on Linux (Thomas Munro) § § §
This avoids problems when a signal interrupts
posix_fallocate().Detect unexpected
EEXISTerror fromshm_open()(Thomas Munro) §This avoids a possible crash on Solaris.
Avoid using
signalfd()on illumos systems (Thomas Munro) §This appears to trigger hangs and kernel panics, so avoid the function until a fix is available.