E.48. Выпуск 12.6
Дата выпуска: 2021-02-11
В этот выпуск вошли различные исправления, внесённые после версии 12.5. За информацией о нововведениях версии 12 обратитесь к Разделу E.54.
E.48.1. Миграция на версию 12.6
Если используется версия 12.X, выгрузка/восстановление базы не требуется.
Однако обратите внимание на второй и третий пункты в списке изменений, описывающие случаи, в которых рекомендуется перестроить индексы после обновления версии.
Если вы обновляете сервер с более ранней версии, чем 12.2, см. также Раздел E.52.
E.48.2. Изменения
- Устранение утечки информации в сообщениях об ошибках при нарушении ограничений (Хейкки Линнакангас) § - Если команда - UPDATEпытается переместить строку в другую секцию и обнаруживает, что эта строка нарушает какое-либо ограничение новой секции и столбцы в этой секции располагаются не в том физическом порядке, что в родительской таблице, выдаваемое сообщение об ошибке может включать содержимое столбцов, которые пользователь не должен читать, не имея права- SELECT. (CVE-2021-3393)
- Исправление ошибочной обработки одновременных разделений страниц при добавлении данных в индекс GiST (Хейкки Линнакангас) § - При параллельном добавлении данных записи могли помещаться в некорректные страницы индекса, что приводило к его повреждению. Поэтому рекомендуется перестроить все индексы GiST, в которые данные могли вставляться параллельным образом. 
- Добавление в - CREATE INDEX CONCURRENTLYожидания завершения подготовленных транзакций (Андрей Бородин) §- На этапе, когда команда - CREATE INDEX CONCURRENTLYждёт завершения всех выполняющихся в это время транзакций, чтобы она могла увидеть добавленные ими строки, она с той же целью должна дожидаться завершения и всех подготовленных транзакций. В противном случае строки, добавленные подготовленными транзакциями, могут не попасть в новый индекс, вследствие чего запросы, использующие этот индекс, не будут их видеть. В инсталляциях, где включены подготовленные транзакции (- max_prepared_transactions> 0), рекомендуется перестроить все ранее построенные в неблокирующем режиме индексы, если их могла затронуть эта проблема.
- Устранение сбоя при выполнении оператора - CALLили- DO, осуществляющего откат транзакции, по расширенному протоколу запросов (Томас Манро, Том Лейн) §- В PostgreSQL 13 в этом случае гарантированно происходило обращение по нулевому указателю. В более ранних версиях эта ошибка не проявлялась, но уверенности в том, что в них исключены проблемы, нет. 
- Исправление логики отсечения секций при обработке асимметричных наборов секций с секционированием по хешу (Том Лейн) § - Если у таблицы, секционируемой по хешу, оказывались секции неравных размеров (то есть значения по модулю неоднородны) или не хватало секций для некоторых значений, реализация отсечения секций в планировщике могла ошибочно заключить, что некоторые секции сканировать не нужно, в результате чего запросы могли не находить существующие строки. 
- Недопущение ошибочных результатов при применении - WHERE CURRENT OFк курсору, план выполнения которого содержит узел MergeAppend (Том Лейн)- Такая конструкция не поддерживается (вообще говоря, курсор с - ORDER BYне обязательно будет поддерживать простое изменение); ранее её не запрещалось использовать, но это было чревато незаметными ошибками.
- Устранение сбоя при применении - WHERE CURRENT OFк курсору, план выполнения которого содержит нестандартный узел сканирования (Дэвид Гейер) §
- Исправление ошибочной обработки местозаполнителей, замена которых должна откладываться до выполнения внешнего соединения (Том Лейн) § - Ошибка происходила, в частности, с простейшими подзапросами, содержащими отложенные ссылки на результаты внешнего соединения, и приводила к построению некорректного плана. Известны случаи, когда в результате выдавалось сообщение об ошибке «failed to assign all NestLoopParams to plan nodes» (не удалось назначить все элементы NestLoopParams узлам плана), но возможны и другие проявления. 
- Исправление обработки местозаполнителей в ходе удаления ненужных результирующих RTE (Том Лейн) § - В результате упущения планировщик мог выдавать ошибки «no relation entry for relid - N» (не найден элемент отношения с номером- N).
- Исправление обработки местозаполнителя, который вычисляется на некотором уровне соединения и используется только на этом же уровне (Том Лейн) § - В результате данного упущения планировщик мог выдавать ошибки «failed to build any - N-way joins» (не удалось построить никакие- N-сторонние соединения).
- Проверка поддержки пометки/восстановления позиций индексными методами доступа (Эндрю Гирт) § - Тем самым предупреждаются ошибки с сообщениями об отсутствии опорных функций, возникавшие в редких особых случаях. 
- Изменение параметров для решения проблемы нехватки слотов DSM при очень активном использовании параллельных запросов (Томас Манро) § 
- Исправление завышенной оценки объёма общей памяти, требующегося для параллельных запросов (Такаюки Цунакава) § 
- Обеспечение корректной обработки в команде - 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, обрабатывается корректно.
- Запрет выполнения - CREATE STATISTICSс системными каталогами (Томаш Вондра) §
- Недопущение преобразования наследуемой дочерней таблицы в представление (Том Лейн) § 
- Обеспечение корректного освобождения дискового пространства, выделенного для удаляемого отношения, при фиксировании транзакции (Томас Манро) § - Ранее, если удаляемое отношение занимало несколько сегментов по 1 ГБ, немедленно освобождался объём только первого. Файлы остальных сегментов просто удалялись, что не позволяло ядру освободить занимаемое ими место, пока эти файлы были открытыми в других обслуживающих процессах. 
- Недопущение удаления табличного пространства, на которое ссылается секционированное отношение, но не хранит в нём свои данные (Альваро Эррера) - Ранее удаление в таких условиях допускалось, но при последующих операциях с секционированным отношением возникали ошибки. 
- Исправление расчёта прогресса при выполнении - CLUSTER(Маттиас ван де Меент) §
- Исправление обработки многобайтовых символов, экранированных обратной косой чертой, в - COPY FROM(Хейкки Линнакангас) §- Ранее многобайтовый символ, идущий после обратной косой черты, обрабатывался некорректно. Так, в некоторых клиентских кодировках часть многобайтового символа могла восприниматься как разделитель полей или как маркер конца данных. 
- Отказ от ненужного создания хеш-таблиц для исполнителя при выполнении - EXPLAINбез- ANALYZE(Алексей Баштанов) §
- Устранение недавно привнесённых условий гонки при обработке очереди - LISTEN/- NOTIFY(Том Лейн) §- Только что подключившийся к очереди процесс-приёмник уведомлений мог попытаться прочитать страницы SLRU, которые в этот момент обрезались, что могло привести к ошибке. - Указатель на хвост очереди мог получить значение, не соответствующее позиции ни одного из процессов, в результате чего логика очистки очереди фактически отключалась. Продолжающиеся вызовы - NOTIFYзатем приводили к появлению предупреждений о переполнении очереди, и в конце концов передача уведомлений полностью останавливалась до перезапуска сервера.
- Реализация поддержки всех возможных сочетаний типов JSON оператором конкатенации - jsonb(Том Лейн) §- До этого поддерживалась конкатенация двух объектов или двух массивов JSON. Теперь обрабатываются и другие случаи — отличные от массивов аргументы помещаются в одноэлементные массивы, которые затем складываются. Ранее некоторые сочетания аргументов обрабатывались по этому принципу, а с другими возникали ошибки. 
- Исправление ошибки обращения к неинициализированному значению при разборе квантификатора - *в регулярном выражении в режиме BRE (Том Лейн) §- В результате ошибки этот квантификатор мог работать как «нежадный», то есть как квантификатор - *?в расширенных регулярных выражениях.
- Исправления поведения - power()со значением- numeric, равным- INT_MIN(-2147483648) (Дин Рашид) § §- Ранее для такого числа возвращался результат без значимых цифр. 
- Устранение целочисленного переполнения в функциях - substring()(Том Лейн. Павел Стехуле) §- Когда сумма заданной начальной позиции и длины выходила за границы целого, поведение функции - substring()было некорректным — она либо выдавала ошибку «negative substring length» (отрицательная длина подстроки), тогда как должна была успешно отработать, либо игнорировала действительно отрицательную длину (и в большинстве случаев возвращала всю строку).
- Предотвращение возможной потери данных вследствие некорректного определения позиции зацикливания в журнале SLRU (Ной Миш) § - Позиция зацикливания обычно оказывается в середине страницы и должна округляться до границы страницы, однако это делалось неправильно. Негативные последствия это могло иметь, только если SLRU-кеш переполнялся в пределах одной страницы, что маловероятно в правильно функционирующей системе. Проявляться это могло в последующих ошибках «apparent wraparound» (видимо, произошло зацикливание) и «could not access status of transaction» (не удалось получить состояние транзакции). 
- Устранение утечек памяти в процессах walsender при передаче новых снимков для логического декодирования (Амит Капила) § 
- Исправление поведения walsender при получении дополнительных команд после завершения репликации (Джефф Девис) § 
- Выявление взаимоблокировок, возможных между серверами горячего резерва и стартовым процессом (применяющим WAL) (Фудзии Масао) § - Стартовый процесс не выполнял процедуру обнаружения взаимоблокировок, поэтому когда он оказывался последним в ситуации взаимного ожидания, взаимоблокировка не диагностировалась. 
- Обеспечение надёжного обнаружения конфликтов восстановления при удалении из индекса записи, ссылающейся на элемент в цепочке HOT (Питер Гейган) § § - Ранее код не проходил по цепочке HOT и поэтому мог получить неактуальный горизонт XID, вследствие чего могли возникать конфликты при обработке изменений на ведомом сервере. На практике эффект ошибки был ограниченным, так как в большинстве случаев правильный горизонт вычислялся в сопутствующих операциях. 
- Безусловное переопределение значения - KRB5_KTNAMEв переменных окружения сервера любым непустым значением параметра- krb_server_keyfile(Том Лейн) §- Ранее приоритетность зависела от того, запросил ли клиент шифрование GSS. 
- Добавление в сообщения, выводимые в журнал сервера в случае невозможности сопоставить соединение с записями - pg_hba.conf, информации о том, включено ли шифрование GSS (Кётаро Хоригути, Том Лейн) §- Эта информация полезна при наличии в - pg_hba.confзаписей- hostgssencили- hostnogssenc.
- Устранение разнообразных дефектов в реализации шифрования GSS на стороне сервера (Том Лейн) - Отказ от бессмысленного требования использовать исключительно GSS-аутентификацию в случае применения шифрования GSS. Добавление сведений о шифровании GSS в выводимые в журнал сообщения о подключениях. Включение объёма памяти, требующейся для GSS, в расчёт суммарного необходимого объёма общей памяти (ранее могли возникать проблемы при очень больших значениях - max_connections). Предотвращение бесконечной рекурсии, возможной ранее при попытке выдать сообщение о критической ошибке шифрования GSS.
- Обеспечение очистки необработанных запросов к фоновым рабочим процессам в начале процедуры выключения в режимах «smart» и «fast» (Том Лейн) § - Ранее были возможны условия гонки, когда дочерний процесс, запросивший для себя фоновый рабочий процесс непосредственно перед выключением сервера, оказывался в состоянии бесконечного ожидания и таким образом препятствовал выключению. 
- Устранение платформенных особенностей при разборе значений - recovery_target_xid(Микаэль Пакье) §- Целевой XID может задаваться как 64-битное значение, а для его разбора использовалась функция - strtoul(), неподходящая для этого на платформах, где- longимеет размер 32 бита (например, в Windows).
- Недопущение параллельного построения индексов при работе сервера в однопользовательском режиме (Юлинь Пей) § 
- Наделение индексных МД возможностью поддерживать неключевые столбцы и при этом поддерживать только один ключевой столбец (Том Лейн) § 
- Устранения сбоя утверждения истинности при параллельном агрегировании с нестрогой функцией десериализации (Эндрю Гирт) § - Таких агрегатных функций нет в ядре PostgreSQL, но они есть в некоторых расширениях, например, в PostGIS. В сборках без утверждений истинности эта ошибка в любом случае была безвредна. 
- Устранение сбоя утверждения истинности в - pg_get_functiondef()при анализе функции с указанием- TRANSFORM(Том Лейн)
- Исправление ошибочного выделения структуры данных в операторе - CALLязыка PL/pgSQL (Том Лейн) § §- Команда - CALL, вызывающая из одной процедуры PL/pgSQL другую, имеющую параметры OUT, прерывалась ошибкой, если вызываемая процедура выполняла- COMMITили- ROLLBACK.
- Добавление в libpq возможности перейти к SSL-шифрованию в случае неудачи с GSS (Том Лейн) § - Ранее, если зашифрованное GSS соединение было установлено успешно, но затем произошла ошибка в процессе аутентификации, вместо перехода к SSL устанавливалось незашифрованное соединение. В результате либо могли иметь место неожиданные ошибки соединений, либо незаметно использовалось незащищённое соединение, тогда как ожидалось именно защищённое. Благо GSS-шифрование могло включиться успешно, только если и клиент, и сервер имели действительные билеты в одной инфраструктуре Kerberos. Кажется маловероятным, что в таком окружении будет обязательным использование SSL-шифрования. 
- Восстановление в psql возможности передавать пароль в аргументе - строка_соединениякоманды- \connect(Том Лейн) §- Это работало раньше, но в результате недавнего исправления этот пароль перестал восприниматься (и поэтому запрашивался дополнительно). 
- Избавление от ограничения ширины выводимых командами psql - \dзначений столбцов по умолчанию (Том Лейн) §- Ранее эти значения обрезались по ширине 128 символов. 
- Устранение разнообразных дефектов в реализации команды psql - \help(Кётаро Хоригути, Том Лейн) §- Команда - \helpс двумя словами в аргументах не могла найти описание команды только для первого слова. Например, команда- \help reset allдолжна была показать справку по- RESET, но она этого не делала. Кроме того,- \helpв ряде случаев не вызывала постраничник, тогда как должна была. Наконец, в прежней реализации имелись утечки памяти.
- Исправление в pg_dump выгрузки наследуемых генерируемых столбцов (Питер Эйзентраут) § - Предыдущее поведение приводило к ошибкам при восстановлении (не критичным). 
- Изменение поведения pg_dump с тем, чтобы в скрипте восстановления команды - ALTER PUBLICATION ADD TABLEвыполнялись от имени владельца публикации, а команды- ALTER INDEX ATTACH PARTITION— от имени владельца секционированного индекса (Том Лейн) § §- Ранее эти команды выполнялись от имени роли, запустившей скрипт восстановления; в большинстве случаев это должно работать, но в некоторых ситуациях эта роль может не иметь нужных прав. 
- Исправление в pg_dump обработки указаний - WITH GRANT OPTIONв изначально устанавливаемых правах в расширениях (Ной Миш) §- В случае, когда скрипт расширения создаёт объект и даёт права доступа к нему с правом передачи, а пользователь затем отзывает эти права, pg_dump не мог выдать корректный SQL восстановления состояния. (Эта проблема если и затрагивает, то лишь немногие расширения.) 
- Рассмотрение в процедуре pg_rewind всех требующихся WAL-файлов при синхронизации резервного сервера (Иэн Барвик, Хейкки Линнакангас) § § § 
- Запрет использования в pgbench имён переменных, начинающихся с цифры (Фабьен Коэльо) § - Таким образом, pgbench не будет пытаться подставлять переменные в значения времени, которые могут содержать строки вида - 12:34.
- Передача имени корректной базы данных в сообщениях об ошибках подключения, выдаваемых некоторых клиентскими программами (Альваро Эррера) § - Когда имя базы данных не задавалось в командной строке, а выбиралось подразумеваемое по умолчанию, программы pg_dumpall, pgbench, oid2name и vacuumlo выдавали неверные сообщения об ошибках в случае сбоя подключения. 
- Устранение утечки памяти в - contrib/auto_explain(Ли Япинь)- Память, занятая в процессе формирования вывода - EXPLAIN, не освобождалась до конца текущей транзакции (для оператора верхнего уровня) или до завершения внешнего оператора (для вложенного оператора). В частности это создавало проблемы при включённом параметре- log_nested_statements.
- Устранение в - contrib/postgres_fdwутечки открытых подключений к внешним серверам при удалении сопоставлений пользователей или объекта стороннего сервера (Бхарат Рупиредди) §- Использовать подключения, связанные с удалённым сопоставлением пользователя или сторонним сервером, нельзя, но ранее они сохранялись открытыми на протяжении локального сеанса. 
- Добавление в - contrib/pgcryptoпроверки кода возврата, выдаваемого функциями OpenSSL EVP (Микаэль Пакье) §- В действительности ошибки в этом месте не ожидаются, но это изменение убирает предупреждения статистических анализаторов. 
- Повышение стабильности - contrib/pg_prewarmв случае остановки кластера до завершения разогрева (Том Лейн) §- Ранее модуль autoprewarm при выходе записывал в свой файл состояния номера только тех блоков, которые ему удалось загрузить к данному моменту, что могло приводить к значительному ограничению его полезности при следующем запуске. Теперь запись в этот файл не будет производиться до завершения начального этапа загрузки модуля. 
- Предотвращения сбоя в коде поддержки индексов 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 не согласуется с версией операционной системы. 
- Исправление компиляции JIT для обеспечение совместимости с LLVM 11 и LLVM 12 (Андрес Фройнд) § § 
- Исправление ошибок в обработке ссылок на логические переменные при компиляции выражений JIT (Андрес Фройнд) § - С мест не поступали сообщения о проявлениях этих ошибок, но они вполне возможны на некоторых архитектурах. 
- Исправление ошибки компиляции с ICU версии 68 или новее (Том Лейн) § 
- Исключение вызова - memcpy()с равным NULL указателем источника и нулевым размером при создании секционированного индекса (Альваро Эррера) §- Хотя сам по себе такой вызов не считается опасным, некоторые компиляторы полагают, что аргументы - memcpy()всегда отличны от NULL, и вследствие этого могут некорректно оптимизировать соседний код.
- Обновление данных часовых поясов до версии tzdata 2021a, включающее изменение правил перехода на летнее время в России (смену часового пояса в Волгограде) и Южном Судане, а также корректировку исторических данных для Австралии, Багам, Белиза, Бермуд, Ганы, Израиля, Кении, Нигерии, Палестины, Сейшел и Вануату. - В частности, часовой пояс Australia/Currie был признан равнозначным Australia/Hobart и ненужным.