E.36. Выпуск 9.6.21
Дата выпуска: 2021-02-11
В этот выпуск вошли различные исправления, внесённые после версии 9.6.20. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.
Сообщество PostgreSQL прекратит выпуск обновлений для версии 9.6.X в ноябре 2021 г. Поэтому пользователям не следует медлить с переходом на более новую основную версию.
E.36.1. Миграция на версию 9.6.21
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако обратите внимание на первый пункт в списке изменений, описывающий случаи, в которых рекомендуется перестроить индексы после обновления версии.
Также, если вы обновляете сервер с версии, более ранней, чем 9.6.16, см. Раздел E.41.
E.36.2. Изменения
Добавление в
CREATE INDEX CONCURRENTLYожидания завершения подготовленных транзакций (Андрей Бородин)На этапе, когда команда
CREATE INDEX CONCURRENTLYждёт завершения всех выполняющихся в это время транзакций, чтобы она могла увидеть добавленные ими строки, она с той же целью должна дожидаться завершения и всех подготовленных транзакций. В противном случае строки, добавленные подготовленными транзакциями, могут не попасть в новый индекс, вследствие чего запросы, использующие этот индекс, не будут их видеть. В инсталляциях, где включены подготовленные транзакции (max_prepared_transactions> 0), рекомендуется перестроить все ранее построенные в неблокирующем режиме индексы, если их могла затронуть эта проблема.Недопущение ошибочных результатов при применении
WHERE CURRENT OFк курсору, план выполнения которого содержит узел MergeAppend (Том Лейн)Такая конструкция не поддерживается (вообще говоря, курсор с
ORDER BYне обязательно будет поддерживать простое изменение); ранее её не запрещалось использовать, но это было чревато незаметными ошибками.Устранение сбоя при применении
WHERE CURRENT OFк курсору, план выполнения которого содержит нестандартный узел сканирования (Дэвид Гейер)Исправление обработки местозаполнителя, который вычисляется на некотором уровне соединения и используется только на этом же уровне (Том Лейн)
В результате данного упущения планировщик мог выдавать ошибки «failed to build any
N-way joins» (не удалось построить никакиеN-сторонние соединения).Проверка поддержки пометки/восстановления позиций индексными методами доступа (Эндрю Гирт)
Тем самым предупреждаются ошибки с сообщениями об отсутствии опорных функций, возникавшие в редких особых случаях.
Обеспечение корректной обработки в команде
ALTER DEFAULT PRIVILEGESповторяющихся аргументов (Микаэль Пакье)Ранее в случае повторения имени роли или схемы в одной команде могли выдаваться ошибки «tuple already updated by self» (кортеж уже изменился сам собой) или нарушаться ограничения уникальности.
Осуществление сброса связанных с ACL кешей при изменениях в
pg_authid(Ной Миш)Тем самым гарантируется, что решения, связанные с правами доступа, будут приниматься с учётом действия
ALTER ROLE ... [NO] INHERIT.Предотвращение некорректной обработки неоднозначных предложений
CREATE TABLE LIKE(Том Лейн)Предложение
LIKEповторно рассматривается после создания новой таблицы, когда выполняется импорт индексов и т. п. Ранее при повторном анализе могла быть найдена другая таблица с тем же именем, что приводило к неожиданному поведению; например, это происходило при создании новой временной таблицы с тем же именем, что у исходной таблицы вLIKE.Изменение порядка действий в
CREATE TABLE LIKE, чтобы индексы копировались до создания ограничений внешнего ключа (Том Лейн)Теперь случай, когда ограничение внешнего ключа, объявленное на внешнем уровне
CREATE TABLEи ссылающееся на саму таблицу, зависит от индекса, создаваемого предложениемLIKE, обрабатывается корректно.Недопущение преобразования наследуемой дочерней таблицы в представление (Том Лейн)
Обеспечение корректного освобождения дискового пространства, выделенного для удаляемого отношения, при фиксировании транзакции (Томас Манро)
Ранее, если удаляемое отношение занимало несколько сегментов по 1 ГБ, немедленно освобождался объём только первого. Файлы остальных сегментов просто удалялись, что не позволяло ядру освободить занимаемое ими место, пока эти файлы были открытыми в других обслуживающих процессах.
Исправление обработки многобайтовых символов, экранированных обратной косой чертой, в
COPY FROM(Хейкки Линнакангас)Ранее многобайтовый символ, идущий после обратной косой черты, обрабатывался некорректно. Так, в некоторых клиентских кодировках часть многобайтового символа могла восприниматься как разделитель полей или как маркер конца данных.
Отказ от ненужного создания хеш-таблиц для исполнителя при выполнении
EXPLAINбезANALYZE(Алексей Баштанов)Устранение недавно привнесённых условий гонки при обработке очереди
LISTEN/NOTIFY(Том Лейн)Только что подключившийся к очереди процесс-приёмник уведомлений мог попытаться прочитать страницы SLRU, которые в этот момент обрезались, что могло привести к ошибке.
Указатель на хвост очереди мог получить значение, не соответствующее позиции ни одного из процессов, в результате чего логика очистки очереди фактически отключалась. Продолжающиеся вызовы
NOTIFYзатем приводили к появлению предупреждений о переполнении очереди, и в конце концов передача уведомлений полностью останавливалась до перезапуска сервера.Реализация поддержки всех возможных сочетаний типов JSON оператором конкатенации
jsonb(Том Лейн)До этого поддерживалась конкатенация двух объектов или двух массивов JSON. Теперь обрабатываются и другие случаи — отличные от массивов аргументы помещаются в одноэлементные массивы, которые затем складываются. Ранее некоторые сочетания аргументов обрабатывались по этому принципу, а с другими возникали ошибки.
Исправление ошибки обращения к неинициализированному значению при разборе квантификатора
*в регулярном выражении в режиме BRE (Том Лейн)В результате ошибки этот квантификатор мог работать как «нежадный», то есть как квантификатор
*?в расширенных регулярных выражениях.Исправления поведения
power()со значениемnumeric, равнымINT_MIN(-2147483648) (Дин Рашид)Ранее для такого числа возвращался результат без значимых цифр.
Предотвращение возможной потери данных вследствие некорректного определения позиции зацикливания в журнале SLRU (Ной Миш)
Позиция зацикливания обычно оказывается в середине страницы и должна округляться до границы страницы, однако это делалось неправильно. Негативные последствия это могло иметь, только если SLRU-кеш переполнялся в пределах одной страницы, что маловероятно в правильно функционирующей системе. Проявляться это могло в последующих ошибках «apparent wraparound» (видимо, произошло зацикливание) и «could not access status of transaction» (не удалось получить состояние транзакции).
Устранение утечек памяти в процессах walsender при передаче новых снимков для логического декодирования (Амит Капила)
Исправление поведения walsender при получении дополнительных команд после завершения репликации (Джефф Девис)
Выявление взаимоблокировок, возможных между серверами горячего резерва и стартовым процессом (применяющим WAL) (Фудзии Масао)
Стартовый процесс не выполнял процедуру обнаружения взаимоблокировок, поэтому когда он оказывался последним в ситуации взаимного ожидания, взаимоблокировка не диагностировалась.
Устранение платформенных особенностей при разборе значений
recovery_target_xid(Микаэль Пакье)Целевой XID может задаваться как 64-битное значение, а для его разбора использовалась функция
strtoul(), неподходящая для этого на платформах, гдеlongимеет размер 32 бита (например, в Windows).Устранение сбоя утверждения истинности в
pg_get_functiondef()при анализе функции с указаниемTRANSFORM(Том Лейн)Восстановление в psql возможности передавать пароль в аргументе
строка_соединениякоманды\connect(Том Лейн)Это работало раньше, но в результате недавнего исправления этот пароль перестал восприниматься (и поэтому запрашивался дополнительно).
Устранение разнообразных дефектов в реализации команды psql
\help(Кётаро Хоригути, Том Лейн)Команда
\helpс двумя словами в аргументах не могла найти описание команды только для первого слова. Например, команда\help reset allдолжна была показать справку поRESET, но она этого не делала. Кроме того,\helpв ряде случаев не вызывала постраничник, тогда как должна была. Наконец, в прежней реализации имелись утечки памяти.Исправление в pg_dump обработки указаний
WITH GRANT OPTIONв изначально устанавливаемых правах в расширениях (Ной Миш)В случае, когда скрипт расширения создаёт объект и даёт права доступа к нему с правом передачи, а пользователь затем отзывает эти права, pg_dump не мог выдать корректный SQL восстановления состояния. (Эта проблема если и затрагивает, то лишь немногие расширения.)
Рассмотрение в процедуре pg_rewind всех требующихся WAL-файлов при синхронизации резервного сервера (Иэн Барвик, Хейкки Линнакангас)
Передача имени корректной базы данных в сообщениях об ошибках подключения, выдаваемых некоторых клиентскими программами (Альваро Эррера)
Когда имя базы данных не задавалось в командной строке, а выбиралось подразумеваемое по умолчанию, программы pg_dumpall, pgbench, oid2name и vacuumlo выдавали неверные сообщения об ошибках в случае сбоя подключения.
Устранение утечки памяти в
contrib/auto_explain(Ли Япинь)Память, занятая в процессе формирования вывода
EXPLAIN, не освобождалась до конца текущей транзакции (для оператора верхнего уровня) или до завершения внешнего оператора (для вложенного оператора). В частности это создавало проблемы при включённом параметреlog_nested_statements.Устранение в
contrib/postgres_fdwутечки открытых подключений к внешним серверам при удалении сопоставлений пользователей или объекта стороннего сервера (Бхарат Рупиредди)Использовать подключения, связанные с удалённым сопоставлением пользователя или сторонним сервером, нельзя, но ранее они сохранялись открытыми на протяжении локального сеанса.
Добавление в
contrib/pgcryptoпроверки кода возврата, выдаваемого функциями OpenSSL EVP (Микаэль Пакье)В действительности ошибки в этом месте не ожидаются, но это изменение убирает предупреждения статистических анализаторов.
Предотвращения сбоя в коде поддержки индексов GiST в модуле
contrib/pg_trgm, происходившего в редком случае вызова функции picksplit для разделения ровно двух элементов (Эндрю Гирт, Александр Коротков)Исправление расчёта тайм-аутов в
contrib/pg_prewarmиcontrib/postgres_fdw(Алексей Кондратов, Том Лейн)В основном цикле главного процесса
contrib/pg_prewarmошибочно вычислялась задержка в 1000 раз меньше ожидаемой, вследствие чего он создавал лишнюю нагрузку для процессора. Ожидая результата от удалённого сервера, модульcontrib/postgres_fdwустанавливал вместо желаемого тайм-аута в 1000 раз больший (хотя эта ошибка нивелировалась 60-секундным ограничением сверху).Обе эти ошибки были следствием неправильного пересчёта секунд с микросекундами в миллисекунды. Чтобы в будущем таких ошибок не было, добавлена удобная функция
TimestampDifferenceMilliseconds().Улучшение логики configure в части выбора
PG_SYSROOTв macOS (Том Лейн)Новый подход с большей вероятностью даст желаемый результат в случаях, когда Xcode новее нижележащей операционной системы. В случае выбора sysroot, не соответствующего версии ОС, скомпилированные программы могут не работать.
Добавление при сборке в macOS ключа
-isysrootна этапах компоновки и компиляции (Джеймс Хиллиард)Это должно помогать в ситуациях, когда версия Xcode не согласуется с версией операционной системы.
Обновление данных часовых поясов до версии tzdata 2021a, включающее изменение правил перехода на летнее время в России (смену часового пояса в Волгограде) и Южном Судане, а также корректировку исторических данных для Австралии, Багам, Белиза, Бермуд, Ганы, Израиля, Кении, Нигерии, Палестины, Сейшел и Вануату.
В частности, часовой пояс Australia/Currie был признан равнозначным Australia/Hobart и ненужным.
E.36. Release 9.6.21
Release date: 2021-02-11
This release contains a variety of fixes from 9.6.20. For information about new features in the 9.6 major release, see Section E.57.
The PostgreSQL community will stop releasing updates for the 9.6.X release series in November 2021. Users are encouraged to update to a newer release branch soon.
E.36.1. Migration to Version 9.6.21
A dump/restore is not required for those running 9.6.X.
However, see the first changelog item below, which describes cases in which reindexing indexes after the upgrade may be advisable.
Also, if you are upgrading from a version earlier than 9.6.16, see Section E.41.
E.36.2. Changes
Fix
CREATE INDEX CONCURRENTLYto wait for concurrent prepared transactions (Andrey Borodin)At the point where
CREATE INDEX CONCURRENTLYwaits for all concurrent transactions to complete so that it can see rows they inserted, it must also wait for all prepared transactions to complete, for the same reason. Its failure to do so meant that rows inserted by prepared transactions might be omitted from the new index, causing queries relying on the index to miss such rows. In installations that have enabled prepared transactions (max_prepared_transactions> 0), it's recommended to reindex any concurrently-built indexes in case this problem occurred when they were built.Avoid incorrect results when
WHERE CURRENT OFis applied to a cursor whose plan contains a MergeAppend node (Tom Lane)This case is unsupported (in general, a cursor using
ORDER BYis not guaranteed to be simply updatable); but the code previously did not reject it, and could silently give false matches.Fix crash when
WHERE CURRENT OFis applied to a cursor whose plan contains a custom scan node (David Geier)Fix planner's handling of a placeholder that is computed at some join level and used only at that same level (Tom Lane)
This oversight could lead to “failed to build any
N-way joins” planner errors.Be more careful about whether index AMs support mark/restore (Andrew Gierth)
This prevents errors about missing support functions in rare edge cases.
Fix
ALTER DEFAULT PRIVILEGESto handle duplicated arguments safely (Michael Paquier)Duplicate role or schema names within the same command could lead to “tuple already updated by self” errors or unique-constraint violations.
Flush ACL-related caches when
pg_authidchanges (Noah Misch)This change ensures that permissions-related decisions will promptly reflect the results of
ALTER ROLE ... [NO] INHERIT.Prevent misprocessing of ambiguous
CREATE TABLE LIKEclauses (Tom Lane)A
LIKEclause is re-examined after initial creation of the new table, to handle importation of indexes and such. It was possible for this re-examination to find a different table of the same name, causing unexpected behavior; one example is where the new table is a temporary table of the same name as theLIKEtarget.Rearrange order of operations in
CREATE TABLE LIKEso that indexes are cloned before building foreign key constraints (Tom Lane)This fixes the case where a self-referential foreign key constraint declared in the outer
CREATE TABLEdepends on an index that's coming from theLIKEclause.Disallow converting an inheritance child table to a view (Tom Lane)
Ensure that disk space allocated for a dropped relation is released promptly at commit (Thomas Munro)
Previously, if the dropped relation spanned multiple 1GB segments, only the first segment was truncated immediately. Other segments were simply unlinked, which doesn't authorize the kernel to release the storage so long as any other backends still have the files open.
Fix handling of backslash-escaped multibyte characters in
COPY FROM(Heikki Linnakangas)A backslash followed by a multibyte character was not handled correctly. In some client character encodings, this could lead to misinterpreting part of a multibyte character as a field separator or end-of-copy-data marker.
Avoid preallocating executor hash tables in
EXPLAINwithoutANALYZE(Alexey Bashtanov)Fix recently-introduced race conditions in
LISTEN/NOTIFYqueue handling (Tom Lane)A newly-listening backend could attempt to read SLRU pages that were in process of being truncated, possibly causing an error.
The queue tail pointer could become set to a value that's not equal to the queue position of any backend, resulting in effective disabling of the queue truncation logic. Continued use of
NOTIFYthen led to queue-fill warnings, and eventually to inability to send any more notifies until the server is restarted.Allow the
jsonbconcatenation operator to handle all combinations of JSON data types (Tom Lane)We can concatenate two JSON objects or two JSON arrays. Handle other cases by wrapping non-array inputs in one-element arrays, then performing an array concatenation. Previously, some combinations of inputs followed this rule but others arbitrarily threw an error.
Fix use of uninitialized value while parsing a
*quantifier in a BRE-mode regular expression (Tom Lane)This error could cause the quantifier to act non-greedy, that is behave like a
*?quantifier would do in full regular expressions.Fix numeric
power()for the case where the exponent is exactlyINT_MIN(-2147483648) (Dean Rasheed)Previously, a result with no significant digits was produced.
Prevent possible data loss from incorrect detection of the wraparound point of an SLRU log (Noah Misch)
The wraparound point typically falls in the middle of a page, which must be rounded off to a page boundary, and that was not done correctly. No issue could arise unless an installation had gotten to within one page of SLRU overflow, which is unlikely in a properly-functioning system. If this did happen, it would manifest in later “apparent wraparound” or “could not access status of transaction” errors.
Fix memory leak in walsender processes while sending new snapshots for logical decoding (Amit Kapila)
Fix walsender to accept additional commands after terminating replication (Jeff Davis)
Ensure detection of deadlocks between hot standby backends and the startup (WAL-application) process (Fujii Masao)
The startup process did not run the deadlock detection code, so that in situations where the startup process is last to join a circular wait situation, the deadlock might never be recognized.
Fix portability problem in parsing of
recovery_target_xidvalues (Michael Paquier)The target XID is potentially 64 bits wide, but it was parsed with
strtoul(), causing misbehavior on platforms wherelongis 32 bits (such as Windows).Avoid assertion failure in
pg_get_functiondef()when examining a function with aTRANSFORMoption (Tom Lane)In psql, re-allow including a password in a
connection_stringargument of a\connectcommand (Tom Lane)This used to work, but a recent bug fix caused the password to be ignored (resulting in prompting for a password).
Fix assorted bugs in psql's
\helpcommand (Kyotaro Horiguchi, Tom Lane)\helpwith two argument words failed to find a command description using only the first word, for example\help reset allshould show the help forRESETbut did not. Also,\helpoften failed to invoke the pager when it should. It also leaked memory.Fix pg_dump to handle
WITH GRANT OPTIONin an extension's initial privileges (Noah Misch)If an extension's script creates an object and grants privileges on it with grant option, then later the user revokes such privileges, pg_dump would generate incorrect SQL for reproducing the situation. (Few if any extensions do this today.)
In pg_rewind, ensure that all WAL is accounted for when rewinding a standby server (Ian Barwick, Heikki Linnakangas)
Report the correct database name in connection failure error messages from some client programs (Álvaro Herrera)
If the database name was defaulted rather than given on the command line, pg_dumpall, pgbench, oid2name, and vacuumlo would produce misleading error messages after a connection failure.
Fix memory leak in
contrib/auto_explain(Japin Li)Memory consumed while producing the
EXPLAINoutput was not freed until the end of the current transaction (for a top-level statement) or the end of the surrounding statement (for a nested statement). This was particularly a problem withlog_nested_statementsenabled.In
contrib/postgres_fdw, avoid leaking open connections to remote servers when a user mapping or foreign server object is dropped (Bharath Rupireddy)Open connections that depend on a dropped user mapping or foreign server can no longer be referenced, but formerly they were kept around anyway for the duration of the local session.
In
contrib/pgcrypto, check for error returns from OpenSSL's EVP functions (Michael Paquier)We do not really expect errors here, but this change silences warnings from static analysis tools.
In
contrib/pg_trgm's GiST index support, avoid crash in the rare case that picksplit is called on exactly two index items (Andrew Gierth, Alexander Korotkov)Fix miscalculation of timeouts in
contrib/pg_prewarmandcontrib/postgres_fdw(Alexey Kondratov, Tom Lane)The main loop in
contrib/pg_prewarm's autoprewarm parent process underestimated its desired sleep time by a factor of 1000, causing it to consume much more CPU than intended. When waiting for a result from a remote server,contrib/postgres_fdwoverestimated the desired timeout by a factor of 1000 (though this error had been mitigated by imposing a clamp to 60 seconds).Both of these errors stemmed from incorrectly converting seconds-and-microseconds to milliseconds. Introduce a new API
TimestampDifferenceMilliseconds()to make it easier to get this right in the future.Improve configure's heuristics for selecting
PG_SYSROOTon macOS (Tom Lane)The new method is more likely to produce desirable results when Xcode is newer than the underlying operating system. Choosing a sysroot that does not match the OS version may result in nonfunctional executables.
While building on macOS, specify
-isysrootin link steps as well as compile steps (James Hilliard)This likewise improves the results when Xcode is out of sync with the operating system.
Update time zone data files to tzdata release 2021a for DST law changes in Russia (Volgograd zone) and South Sudan, plus historical corrections for Australia, Bahamas, Belize, Bermuda, Ghana, Israel, Kenya, Nigeria, Palestine, Seychelles, and Vanuatu.
Notably, the Australia/Currie zone has been corrected to the point where it is identical to Australia/Hobart.