E.42. Выпуск 13.4

Дата выпуска: 2021-08-12

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

E.42.1. Миграция на версию 13.4

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

Если вы обновляете сервер с более ранней версии, чем 13.2, см. также Раздел E.44.

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

  • Корректировка неправильного планирования повторного выполнения этапа проекции (Том Лейн)

    Планировщик мог построить неправильный план в случаях, когда два узла ProjectionPath оказывались один над другим. Известно, что такая ситуация возникала при использовании параллельных операций сортировки, но подобные ситуации не исключены и при других условиях. В результате мог произойти сбой сервера или выдавались некорректные результаты запросов. Также это могло повлечь раскрытие содержимого памяти сервера. (CVE-2021-3677)

  • Полное отключение повторного согласования SSL (Микаэль Пакье) §

    Собственно повторное согласование SSL было отключено довольно давно, но сервер всё же мог продолжать взаимодействие с клиентом, получив от него запрос повторного согласования. При этом злонамеренно сконструированный запрос повторного согласования мог вызвать крах сервера (см. описание проблемы OpenSSL CVE-2021-3449). Теперь эта функциональность полностью отключена во всех версиях OpenSSL, где это возможно, а именно, в версии 1.1.0h и новее.

  • Восстановление снимка на уровне портала после COMMIT или ROLLBACK в процедуре (Том Лейн) § § § § §

    В результате исправлено поведение в случаях, когда попытка извлечь TOAST-значение сразу после COMMIT/ROLLBACK завершалась ошибкой «no known snapshots» (нет известных снимков) или «missing chunk number 0 for toast value» (отсутствует порция номер 0 для TOAST-значения).

    Некоторые расширения могут попытаться выполнить SQL-код вне какого-либо портала. Прежде чем делать это, они сами должны обеспечить наличие внешнего портала. Ранее, если портал отсутствовал, запрос мог выполниться, а мог не выполниться; теперь же гарантированно будет выдаваться ошибка «cannot execute SQL without an outer snapshot or portal» (выполнить SQL без внешнего снимка или портала нельзя).

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

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

    Также режим NO SCROLL принудительно включается для неявного курсора, используемого в цикле FOR по результатам запроса в PL/pgSQL, чтобы исключить подобные проблемы при сохранении курсора во время фиксации внутри процедуры.

  • Запрещение конструкции SELECT ... GROUP BY GROUPING SETS (()) FOR UPDATE (Том Лейн) §

    Эта конструкция не должна допускаться, так же как не допускается FOR UPDATE с простым GROUP BY, но в соответствующей проверке пустые наборы группирования не обрабатывались корректно. В конечном итоге это могло привести к обращению по нулевому указателю в коде исполнителя.

  • Недопущение случаев, когда запрос в WITH в результате переписывания сводится к просто NOTIFY (Том Лейн) §

    Ранее в таких случаях происходило падение сервера.

  • Округление результата умножения numeric, когда в нём оказывается больше 16383 знаков после точки, что раньше вызывало переполнение (Дин Рашид) §

  • Устранение ошибок и потери точности в особых случаях при возведении значений numeric в очень большую степень (Дин Рашид) § §

  • Ликвидация ошибки деления на ноль в функции to_char() с форматом EEEE и входным значением numeric меньше 10^(-1001) (Дин Рашид) §

  • Реализация в pg_size_pretty(bigint) округления отрицательных значений в соответствии с округлением положительных (и с округлением, производимым версией с numeric) (Дин Рашид, Дэвид Роули) § §

  • Устранение ошибки при вызове pg_filenode_relation(0, 0) — теперь при таком вызове выдаётся NULL (Джастин Призби) §

  • Блокирование расширения в ALTER EXTENSION при удалении или добавлении объекта, относящегося к этому расширению (Том Лейн) §

    Предыдущая реализация позволяла выполнить ALTER EXTENSION ADD/DROP одновременно с DROP EXTENSION, что могло вызвать сбой или повреждение записей в каталоге.

  • Недопущение пустого имени слота в ALTER SUBSCRIPTION (Ли Япинь) §

  • Копирование признака включения триггера при копировании триггеров секционированной таблицы в новую секцию (Альваро Эррера) §

  • Предупреждение конфликтов псевдонимов в запросах, генерируемых командами REFRESH MATERIALIZED VIEW CONCURRENTLY (Том Лейн, Бхарат Рупиредди) §

    Ранее эта команда выдавала ошибку с материализованными представлениями, содержащими столбцы с определёнными именами, в частности, mv и newdata.

  • Исправление в PREPARE TRANSACTION проверки конфликтующих блокировок, существующих в рамках сеанса и в рамках транзакции (Том Лейн)

    Транзакция не может быть подготовленной, если в ней существуют рекомендательные блокировки одного ID и на уровне сеанса, и на уровне транзакции. Ранее это ограничение не проверялось в полной мере, вследствие чего во время PREPARE TRANSACTION могло возникнуть состояние ПАНИКА.

  • Исправление некорректного поведения DROP OWNED BY в случае множественного указания целевой роли в политике RLS (Том Лейн) §

  • Устранение ненужных проверок корректности при удалении роли из политики RLS командой DROP OWNED BY (Том Лейн) §

    В частности, ранее в некоторых случаях безосновательно требовалось, чтобы DROP OWNED BY выполнял только суперпользователь.

  • Возвращение возможности использовать в командах CREATE COLLATION имена локалей Windows в старом стиле (Томас Манро) §

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

  • Запрещение переменных «вся строка» в генерирующих выражениях (Том Лейн) §

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

  • Исправление использования tableoid в генерирующих выражениях (Том Лейн) §

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

  • Отказ от сохранения «горячего значения по умолчанию» при добавлении столбца в стороннюю таблицу (Эндрю Дунстан) §

    Это «горячее значение» бесполезно, так как для таких таблиц данные кучи не хранятся локально, а кроме того, с ним возникала путаница при последующих операциях. Помимо подавления создания таких записей в каталоге при выполнении команд ALTER TABLE, в код добавлена обработка ситуации, когда подобное некорректное значение уже присутствует.

  • Транзакционное изменение флагов состояния индекса (Микаэль Пакье, Андрей Лепихов) § §

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

  • Недопущение повреждения записей в кеше планов в случаях, когда в кешированном плане оказывается команда CREATE DOMAIN или ALTER DOMAIN (Том Лейн) §

  • Отображение последних команд репликации, выполняемых передатчиками WAL, в представлении pg_stat_activity (Том Лейн) §

    Ранее процесс walsender показывал свою последнюю SQL-команду, что вводило в заблуждение, если фактически он выполнял репликационную операцию. Теперь на том же основании, что и команды SQL, выводятся команды протокола репликации.

  • Отображение в поле pg_settings.pending_restart значения true в случае удаления соответствующей записи из postgresql.conf (Альваро Эррера) §

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

  • Снятие в 64-битной Windows ограничения наибольшего произведения действующего значения work_mem и hash_mem_multiplier значением 2 ГБ (Том Лейн) §

    Это позволяет использовать hash_mem_multiplier по прямому предназначению, а именно не допускать вытеснения на диск при агрегировании большого объёма данных, даже если под «большим объёмом» понимается несколько гигабайт.

  • Корректировка неправильного планирования запросов, обращающихся к обычным таблицам, являющимся потомками в иерархии наследования сторонних таблиц (Амит Ланготе) §

    В таких случаях при выполнении SELECT FOR UPDATE и подобных команд возникали сбои проверочных утверждений и ошибки «could not find junk column» (не удалось найти отбросовый столбец).

  • Исправление использования результатов постоянной функции во FROM, когда данный элемент FROM помечен как LATERAL (Том Лейн) §

  • Устранение ошибки в особом случае, когда новый ведомый не мог начать работу с новым ведущим (Дилип Кумар, Роберт Хаас) § § § § § §

    При редком стечении ряда обстоятельств ведомый сервер мог застопориться при попытке нагнать неправильную линию времени в WAL.

  • Корректировка минимальной точки восстановления в ситуации, когда при воспроизведении из WAL прерывания транзакции происходит усечение файла (Фудзии Масао) §

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

  • Продвижение горизонта старейшего требуемого сегмента WAL после аннулирования слота репликации (Кётаро Хоригути) § § § §

    В случае аннулирования всех слотов горизонт больше не двигался, вследствие чего файлы WAL на сервере в конце концов могли занять всё свободное место.

  • Пресечение попыток поиска в каталоге при возникновении ошибки в приёмнике WAL (Масахико Савада, Бхарат Рупиредди) §

  • Обеспечение корректной реакции ведомого сервера, при запуске ожидающего поступления WAL, на команду отключения (Фудзии Масао, Соумйадип Чакраборти) §

  • Очистка разделяемого состояния в случае, когда процесс не смог стать членом группы процессов, фиксирующих транзакции (Амит Капила) §

    При удачном наложении событий по времени в последующем сеансе при попытке использовать тот же объект PGPROC мог произойти сбой проверочного утверждения.

  • Добавление блокировки во избежание чтения некорректных данных из файла relmapper при одновременной записи в него со стороны другого процесса (Хейкки Линнакангас) § §

  • Улучшение информирования о прогрессе на этапе сортировки во время параллельного построения индекса btree (Маттиас ван де Меент) §

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

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

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

  • Устранение риска падения рабочего процесса логической репликации при срабатывании триггеров AFTER для секционированных таблиц (Том Лейн) §

  • Устранение взаимоблокировки при попытке усечения одной таблицы несколькими рабочими процессами логической репликации (Питер Смит, Хайин Тан) §

  • Ликвидация дефектов и утечек памяти при логическом декодировании спекулятивного добавления (Дилип Кумар) § §

  • Устранение утечки памяти в модуле вывода информации логической репликации (Амит Ланготе) § §

  • Недопущение сохранения в хеш-таблице записи с неправильным типом после возникновения ошибки (Саит Талха Нишанджы) §

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

  • Предотвращение смещения в счётчике использований плана в кеше при возникновении определённых ошибок в CREATE TABLE ... AS EXECUTE (Том Лейн) §

  • Устранение условий гонки в коде совместного использования дескрипторов кортежей параллельными исполнителями (Томас Манро) §

    При определённом стечении событий мог произойти крах сервера.

  • Исключение условий гонки при аннулировании устаревшего слота репликации одновременно с попыткой удалить или изменить его (Андрес Фройнд, Альваро Эррера) §

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

    По всей вероятности, это не было причиной какой-либо из наблюдаемых ошибок на платформе Intel, но на платформах с менее строгими правилами обращений к памяти могли быть проблемы.

  • Устранение возможности краха в коде сортировки (Ронан Данклау) § §

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

  • Усовершенствование обработки повреждённых данных в коде разделения списка идентификаторов (Питер Гейган) §

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

  • Предотвращение бесконечного цикла при добавлении данных в индекс SP-GiST (Том Лейн) §

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

  • Обеспечение возможности прервать добавление данных в индекс SP-GiST сигналом отмены запроса (Том Лейн, Альваро Эррера) § §

  • Ликвидация использования неинициализированной переменной, в результате которого реализация PL/pgSQL могла ошибочно полагать, что с предложением INTO указывалось STRICT (Том Лейн) §

  • Отказ от аварийного прерывания процесса в случае нехватки памяти в функции печати строк в libpq (Том Лейн) §

  • Допущение в ecpg возможности приведения значения numeric, равного INT_MIN (обычно -2147483648), к int (Джон Нейлор) §

  • Предотвращение в psql и других клиентских программах выхода за конец строки при обработке некорректно кодированных данных (Том Лейн) §

    В случае нахождения у конца строки многобайтового символа, не соответствующего кодировке, различные циклы обработки могли выйти за завершающий строку NUL, что могло обойтись без последствий либо привести к краху программы, в зависимости от следующего содержимого памяти. Это отголоски CVE-2006-2313, хотя конкретно эти случаи не должны иметь интересных проявлений с точки зрения безопасности.

  • Исправление в pg_dump обработки триггеров секционированных таблиц, состояние включения которых отличается от состояния, установленного для родительских триггеров (Джастин Призби, Альваро Эррера) §

  • Устранение предупреждений «invalid creation date in header» (неправильная дата создания в заголовке), возникающих при выполнении pg_restore с архивом, созданным в другом часовом поясе (Том Лейн) §

  • Добавление в pg_upgrade переноса значения oldestXID из старой инсталляции (Бертран Друво)

    Ранее в новых инсталляциях значение oldestXID обычно оказывалось достаточно старым для того, чтобы вызвать безусловную немедленную автоочистку для предотвращения зацикливания. Это нежелательно с точки зрения производительности, но что ещё хуже, инсталляции с большими значениями autovacuum_freeze_max_age могли экстренно останавливаться вскоре после обновления.

  • Усовершенствование pg_upgrade для выявления расширений, которые следует обновить, и предложения дальнейших действий (Брюс Момджян) § §

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

  • Предупреждение проблем при переключении pg_receivewal между сжатым и несжатым форматом WAL (Микаэль Пакье) § §

  • Реализация в contrib/postgres_fdw полезного поведения генерируемых столбцов (Эцуро Фудзита) §

    Теперь postgres_fdw будет обрабатывать генерируемые столбцы разумным образом, если генерируемый столбец в сторонней таблице представляет генерируемый столбец удалённой таблицы. Именно в таком ключе по умолчанию будет импортировать генерируемые столбцы команда IMPORT FOREIGN SCHEMA.

  • Пресечение попыток поиска в каталоге при возникновении ошибки в contrib/postgres_fdw (Том Лейн) §

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

  • Улучшение инфраструктуры изоляционных тестов (Том Лейн, Микаэль Пакье) § § § § § §

    Добавлена возможность дополнить описание шагов в тесте указаниями ожидаемого порядка их выполнения. Это позволяет получать стабильные результаты (ранее результаты могли меняться в условиях гонки), не добавляя для исключения гонки длительные задержки, которые мы вставляли ранее (не вполне успешно). В качестве имён шагов/сеансов в тесте теперь допускаются идентификаторы без кавычек (ранее все такие имена должны были заключаться в кавычки). Также улучшен вывод результатов запросов в изоляционных тестах. Помимо этого, ликвидирован режим «dry-run» программы isolationtester. Наконец, в ней устранены утечки памяти.

  • Уменьшение издержек при тестировании с затиранием кеша (Tom Lane) § §

  • Исправление регрессионных тестов PL/Python для совместимости с Python 3.10 (Хонза Хорак) §

  • Изменение поведения вызова printf("%s", NULL), который теперь должен выдавать (null), а не останавливать сервер (Том Лейн) §

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

  • Исправление ошибочного сообщения в журнале, выдаваемого, когда восстановление на момент времени (PITR) останавливается на записи ROLLBACK PREPARED (Саймон Риггс) §

  • Улучшение сообщений, выдаваемых командой ALTER TABLE в случае ошибок вида «неправильный тип отношения» (Кётаро Хоригути) §

  • Уточнение в сообщениях об ошибках формулировки «неотрицательные значения» (Бхарат Рупиредди) §

  • Усовершенствование configure для работы с OpenLDAP версии 2.5, в которой теперь нет отдельной библиотеки libldap_r (Адриан Хо, Том Лейн) § § § §

    В случае отсутствия библиотеки libldap_r теперь неявно предполагается, что библиотека libldap является потокобезопасной.

  • Добавление новых целей сборки world-bin и install-world-bin (Эндрю Дунстан) § §

    Эти цели действуют так же, как world и install-world, соответственно, за исключением того, что они не собирают и не устанавливают документацию.

  • Исправление правила make для TAP-тестов (prove_installcheck) с целью обеспечения их использования в PGXS (Эндрю Дунстан) §

  • Модификация кода JIT в рамках подготовки к предстоящему изменению API LLVM (Томас Манро, Андрес Фройнд) §

    В LLVM 13 внесены несовместимые изменения API, приводящие к падению предыдущей версии нашего JIT-компилятора.

  • Отказ от предположения, что строки, возвращаемые библиотеками GSSAPI, завершаются нулевым символом (Том Лейн) §

    В спецификации GSSAPI строка задаётся указателем и длиной. На практике следующий за концом строки байт обычно нулевой, поэтому наш код раньше не сталкивался с проблемами; однако нам сообщили, что на это среагировал AddressSanitizer.

  • Обеспечение возможности сборки с GSSAPI в среде MSVC (Микаэль Пакье) § § §

    Устранение разнообразных несовместимостей с современными сборками Kerberos.

  • Добавление для сборок MSVC параметра --with-pgport в набор параметров configure, которые выдаёт pg_config, в случае использования данного параметра (Эндрю Дунстан) § §