E.13. Выпуск 13.2

Дата выпуска: 2021-02-11

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

E.13.1. Миграция на версию 13.2

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

Однако обратите внимание на первый пункт в списке изменений, где говорится о возможной необходимости пересоздать хранимые представления. Также ознакомьтесь с третьим и четвёртым пунктом в этом списке, описывающими случаи, в которых рекомендуется перестроить индексы после обновления версии.

E.13.2. Изменения

  • Исправление ошибки при проверке прав SELECT на уровне столбцов в некоторых запросах с соединением (Том Лейн)

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

    Эта проблема затрагивает хранимые представления, в которых останутся неполные карты использования столбцов, и таким образом права доступа не будут проверяться корректно и после обновления представлений. Поэтому в инсталляциях, где важны ограничения доступа на уровне столбцов, рекомендуется выполнить CREATE OR REPLACE для всех пользовательских представлений, чтобы их определения были корректно разобраны заново.

    Проект PostgreSQL благодарит Свена Клемма за сообщение об этой проблеме. (CVE-2021-20229)

  • Устранение утечки информации в сообщениях об ошибках при нарушении ограничений (Хейкки Линнакангас)

    Если команда UPDATE пытается переместить строку в другую секцию и обнаруживает, что эта строка нарушает какое-либо ограничение новой секции и столбцы в этой секции располагаются не в том физическом порядке, что в родительской таблице, выдаваемое сообщение об ошибке может включать содержимое столбцов, которые пользователь не должен читать, не имея права SELECT. (CVE-2021-3393)

  • Исправление ошибочной обработки одновременных разделений страниц при добавлении данных в индекс GiST (Хейкки Линнакангас)

    При параллельном добавлении данных записи могли помещаться в некорректные страницы индекса, что приводило к его повреждению. Поэтому рекомендуется перестроить все индексы GiST, в которые данные могли вставляться параллельным образом.

  • Добавление в CREATE INDEX CONCURRENTLY ожидания завершения подготовленных транзакций (Андрей Бородин)

    На этапе, когда команда CREATE INDEX CONCURRENTLY ждёт завершения всех выполняющихся в это время транзакций, чтобы она могла увидеть добавленные ими строки, она с той же целью должна дожидаться завершения и всех подготовленных транзакций. В противном случае строки, добавленные подготовленными транзакциями, могут не попасть в новый индекс, вследствие чего запросы, использующие этот индекс, не будут их видеть. В инсталляциях, где включены подготовленные транзакции (max_prepared_transactions > 0), рекомендуется перестроить все ранее построенные в неблокирующем режиме индексы, если их могла затронуть эта проблема.

  • Устранение сбоя при попытке пересканировать в плане выполнения узел агрегирования, в котором обрабатываются и хешированные, и сортированные наборы группирования (Джефф Дэвис)

  • Исправление ошибки при выполнении узла агрегирования по хешу, сопровождаемого вытеснением кортежей на диск, вследствие которой могли выдаваться некорректные результаты запросов (Том Лейн)

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

  • Устранение особого случая в реализации инкрементальной сортировки (Нейл Чен)

    Если последний кортеж сортируемой группы оказывался первым кортежем следующей группы уже отсортированных кортежей, код работал неправильно. Это могло проявляться в сообщениях «retrieved too many tuples in a bounded sort» (в ограниченной сортировке получено слишком много кортежей) или просто результаты сортировки оказывались неверными.

  • Устранение сбоя при выполнении оператора CALL или DO, осуществляющего откат транзакции, по расширенному протоколу запросов (Томас Манро, Том Лейн)

    В PostgreSQL 13 в этом случае гарантированно происходило обращение по нулевому указателю. В более ранних версиях эта ошибка не проявлялась, но уверенности в том, что в них исключены проблемы, нет.

  • Исключение необоснованных ошибок при выполнении триггеров BEFORE UPDATE с секционированными таблицами (Альваро Эррера)

    Триггер BEFORE UPDATE FOR EACH ROW, изменяющий строку каким-либо образом, препятствовал перемещению этой строки в другую секцию командой UPDATE, когда это требовалось; однако для этого ограничения больше нет никаких причин.

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

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

  • Недопущение ошибочных результатов при применении 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-сторонние соединения).

  • Рассмотрение неотсортированных вложенных путей при планировании операции Gather Merge (Джеймс Коулман)

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

  • Отказ от рассмотрения выражений ORDER BY, использующих функции с ограничениями параллельности или функции, возвращающие множества, при попытке распараллеливания сортировки (Джеймс Коулман)

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

  • Проверка поддержки пометки/восстановления позиций индексными методами доступа (Эндрю Гирт)

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

  • Исправление завышенной оценки объёма общей памяти, требующегося для параллельных запросов (Такаюки Цунакава)

  • Обеспечение корректной обработки в команде ALTER DEFAULT PRIVILEGES повторяющихся аргументов (Микаэль Пакье)

    Ранее в случае повторения имени роли или схемы в одной команде могли выдаваться ошибки «tuple already updated by self» (кортеж уже изменился сам собой) или нарушаться ограничения уникальности.

  • Осуществление сброса связанных с ACL кешей при изменениях в pg_authid (Ной Миш)

    Тем самым гарантируется, что решения, связанные с правами доступа, будут приниматься с учётом действия ALTER ROLE ... [NO] INHERIT.

  • Устранение дефекта в выявлении условий «snapshot too old» (снимок слишком стар) для таблиц, переписываемых в текущей транзакции (Кётаро Хоригути, Ной Миш)

    Дефект проявлялся, только если перезапись производилась командой ALTER TABLE SET TABLESPACE при wal_level равном minimal.

  • Устранение ложной ошибки при выполнении CREATE PUBLICATION для таблицы, созданной или перезаписанной в текущей транзакции (Кётаро Хоригути)

    Ошибка могла проявляться только при wal_level равном minimal.

  • Предотвращение некорректной обработки неоднозначных предложений CREATE TABLE LIKE (Том Лейн)

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

  • Изменение порядка действий в CREATE TABLE LIKE, чтобы индексы копировались до создания ограничений внешнего ключа (Том Лейн)

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

  • Запрет выполнения CREATE STATISTICS с системными каталогами (Томаш Вондра)

  • Недопущение преобразования наследуемой дочерней таблицы в представление (Том Лейн)

  • Обеспечение корректного освобождения дискового пространства, выделенного для удаляемого отношения, при фиксировании транзакции (Томас Манро)

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

  • Недопущение удаления табличного пространства, на которое ссылается секционированное отношение, но не хранит в нём свои данные (Альваро Эррера)

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

  • Исправление расчёта прогресса при выполнении CLUSTER (Маттиас ван де Меент)

  • Исправление обработки многобайтовых символов, экранированных обратной косой чертой, в COPY FROM (Хейкки Линнакангас)

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

  • Отказ от ненужного создания хеш-таблиц для исполнителя при выполнении EXPLAIN без ANALYZE (Алексей Баштанов)

  • Устранение недавно привнесённых условий гонки при обработке очереди LISTEN/NOTIFY (Том Лейн)

    Только что подключившийся к очереди процесс-приёмник уведомлений мог попытаться прочитать страницы SLRU, которые в этот момент обрезались, что могло привести к ошибке.

  • Реализация поддержки всех возможных сочетаний типов JSON оператором конкатенации jsonb (Том Лейн)

    До этого поддерживалась конкатенация двух объектов или двух массивов JSON. Теперь обрабатываются и другие случаи — отличные от массивов аргументы помещаются в одноэлементные массивы, которые затем складываются. Ранее некоторые сочетания аргументов обрабатывались по этому принципу, а с другими возникали ошибки.

  • Исправление ошибки обращения к неинициализированному значению при разборе квантификатора * в регулярном выражении в режиме BRE (Том Лейн)

    В результате ошибки этот квантификатор мог работать как «нежадный», то есть как квантификатор *? в расширенных регулярных выражениях.

  • Исправления поведения power() со значением numeric, равным INT_MIN (-2147483648) (Дин Рашид)

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

  • Устранение целочисленного переполнения в функциях substring() (Том Лейн. Павел Стехуле)

    Когда сумма заданной начальной позиции и длины выходила за границы целого, поведение функции substring() было некорректным — она либо выдавала ошибку «negative substring length» (отрицательная длина подстроки), тогда как должна была успешно отработать, либо игнорировала действительно отрицательную длину (и в большинстве случаев возвращала всю строку).

  • Предотвращение возможной потери данных вследствие некорректного определения позиции зацикливания в журнале SLRU (Ной Миш)

    Позиция зацикливания обычно оказывается в середине страницы и должна округляться до границы страницы, однако это делалось неправильно. Негативные последствия это могло иметь, только если SLRU-кеш переполнялся в пределах одной страницы, что маловероятно в правильно функционирующей системе. Проявляться это могло в последующих ошибках «apparent wraparound» (видимо, произошло зацикливание) и «could not access status of transaction» (не удалось получить состояние транзакции).

  • Исправление логики чтения WAL при переключениях линий времени (Кётаро Хоригути, Фудзии Масао)

    Ранее при включённом архивировании WAL ведомый сервер мог не переключиться на новую линию времени вслед за ведущим, остановившись с ошибками «requested WAL segment has already been removed» (запрошенный сегмент WAL уже удалён).

  • Устранение утечек памяти в процессах walsender при передаче новых снимков для логического декодирования (Амит Капила)

  • Устранение утечки в кеше отношений, имевшей место в процессах 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).

  • Недопущение параллельного построения индексов при работе сервера в однопользовательском режиме (Юлинь Пей)

  • Наделение индексных МД возможностью поддерживать неключевые столбцы и при этом поддерживать только один ключевой столбец (Том Лейн)

  • Устранение обращений к коду SHA256 при создании базовой резервной копии в случаях, когда манифест копии не нужен (Микаэль Пакье)

    При использовании OpenSSL, работающего в режиме FIPS, вызов функций хеширования SHA256 запрещается, что приводит к ошибке. В результате данного изменения на такой платформе теперь всё же можно выгрузить данные, добавив ключ --no-manifest.

  • Устранения сбоя утверждения истинности при параллельном агрегировании с нестрогой функцией десериализации (Эндрю Гирт)

    Таких агрегатных функций нет в ядре PostgreSQL, но они есть в некоторых расширениях, например, в PostGIS. В сборках без утверждений истинности эта ошибка в любом случае была безвредна.

  • Устранение сбоя утверждения истинности в pg_get_functiondef() при анализе функции с указанием TRANSFORM (Том Лейн)

  • Исправление ошибочного выделения структуры данных в операторе CALL языка PL/pgSQL (Том Лейн)

    Команда CALL, вызывающая из одной процедуры PL/pgSQL другую, имеющую параметры OUT, прерывалась ошибкой, если вызываемая процедура выполняла COMMIT или ROLLBACK.

  • Добавление в libpq возможности перейти к SSL-шифрованию в случае неудачи с GSS (Том Лейн)

    Ранее, если зашифрованное GSS соединение было установлено успешно, но затем произошла ошибка в процессе аутентификации, вместо перехода к SSL устанавливалось незашифрованное соединение. В результате либо могли иметь место неожиданные ошибки соединений, либо незаметно использовалось незащищённое соединение, тогда как ожидалось именно защищённое. Благо GSS-шифрование могло включиться успешно, только если и клиент, и сервер имели действительные билеты в одной инфраструктуре Kerberos. Кажется маловероятным, что в таком окружении будет обязательным использование SSL-шифрования.

  • Обеспечение в функции libpq PQconndefaults() вывода правильного значения переменной channel_binding по умолчанию (Даниэле Вараццо)

  • Восстановление в 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/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 и ненужным.