E.34. Выпуск 9.6.23
Дата выпуска: 2021-08-12
В этот выпуск вошли различные исправления, внесённые после версии 9.6.22. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.
Сообщество PostgreSQL прекратит выпуск обновлений для версии 9.6.X в ноябре 2021 г. Поэтому пользователям не следует медлить с переходом на более новую основную версию.
E.34.1. Миграция на версию 9.6.23
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако если вы обновляете сервер с более ранней версии, чем 9.6.21, см. Раздел E.36.
E.34.2. Изменения
- Полное отключение повторного согласования SSL (Микаэль Пакье) - Собственно повторное согласование SSL было отключено довольно давно, но сервер всё же мог продолжать взаимодействие с клиентом, получив от него запрос повторного согласования. При этом злонамеренно сконструированный запрос повторного согласования мог вызвать крах сервера (см. описание проблемы OpenSSL CVE-2021-3449). Теперь эта функциональность полностью отключена во всех версиях OpenSSL, где это возможно, а именно, в версии 1.1.0h и новее. 
- Запрещение конструкции - 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, что могло вызвать сбой или повреждение записей в каталоге.
- Предупреждение конфликтов псевдонимов в запросах, генерируемых командами - REFRESH MATERIALIZED VIEW CONCURRENTLY(Том Лейн, Бхарат Рупиредди)- Ранее эта команда выдавала ошибку с материализованными представлениями, содержащими столбцы с определёнными именами, в частности, - mvи- newdata.
- Исправление в - PREPARE TRANSACTIONпроверки конфликтующих блокировок, существующих в рамках сеанса и в рамках транзакции (Том Лейн)- Транзакция не может быть подготовленной, если в ней существуют рекомендательные блокировки одного ID и на уровне сеанса, и на уровне транзакции. Ранее это ограничение не проверялось в полной мере, вследствие чего во время - PREPARE TRANSACTIONмогло возникнуть состояние ПАНИКА.
- Исправление некорректного поведения - DROP OWNED BYв случае множественного указания целевой роли в политике RLS (Том Лейн)
- Устранение ненужных проверок корректности при удалении роли из политики RLS командой - DROP OWNED BY(Том Лейн)- В частности, ранее в некоторых случаях безосновательно требовалось, чтобы - DROP OWNED BYвыполнял только суперпользователь.
- Транзакционное изменение флагов состояния индекса (Микаэль Пакье, Андрей Лепихов) - Данное исправление устраняет ошибки при вычислении в индексах таких предикатов, которые фактически не являются постоянными. Хотя подобное использование не считается поддерживаемым, первоначальная причина изменения этих флагов не транзакционным образом давно неактуальна, поэтому можно исправить и вытекающее из неё решение. 
- Недопущение повреждения записей в кеше планов в случаях, когда в кешированном плане оказывается команда - CREATE DOMAINили- ALTER DOMAIN(Том Лейн)
- Отображение в поле - pg_settings.- pending_restartзначения true в случае удаления соответствующей записи из- postgresql.conf(Альваро Эррера)- Ранее поле - pending_restartкорректно отражало ситуацию, когда изменяется запись, задающая параметр, который вступает в силу только после перезапуска сервера, но не ситуацию, когда такая запись полностью удаляется.
- Устранение ошибки в особом случае, когда новый ведомый не мог начать работу с новым ведущим (Дилип Кумар, Роберт Хаас) - При редком стечении ряда обстоятельств ведомый сервер мог застопориться при попытке нагнать неправильную линию времени в WAL. 
- Корректировка минимальной точки восстановления в ситуации, когда при воспроизведении из WAL прерывания транзакции происходит усечение файла (Фудзии Масао) - Усечение файла невозможно отменить, поэтому остановить восстановление в точке, предшествующей данной записи, в общем случае нельзя. Подобная ситуация с фиксированием транзакции была урегулирована много лет назад, но данная была упущена. 
- Обеспечение корректной реакции ведомого сервера, при запуске ожидающего поступления WAL, на команду отключения (Фудзии Масао, Соумйадип Чакраборти) 
- Добавление блокировки во избежание чтения некорректных данных из файла relmapper при одновременной записи в него со стороны другого процесса (Хейкки Линнакангас) 
- Ликвидация дефектов и утечек памяти при логическом декодировании спекулятивного добавления (Дилип Кумар) 
- Предотвращение смещения в счётчике использований плана в кеше при возникновении определённых ошибок в - CREATE TABLE ... AS EXECUTE(Том Лейн)
- Устранение условий гонки, возможных при освобождении структур BackgroundWorkerSlot (Том Лейн) - По всей вероятности, это не было причиной какой-либо из наблюдаемых ошибок на платформе Intel, но на платформах с менее строгими правилами обращений к памяти могли быть проблемы. 
- Устранение возможности краха в коде сортировки (Ронан Данклау) - Один путь в коде допускал попытку освободить нулевой указатель. При использовании сортировки ядром сервера этот путь был закрыт, но не исключено, что его могли открыть расширения. 
- Предотвращение бесконечного цикла при добавлении данных в индекс 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, хотя конкретно эти случаи не должны иметь интересных проявлений с точки зрения безопасности. 
- Устранение предупреждений «invalid creation date in header» (неправильная дата создания в заголовке), возникающих при выполнении pg_restore с архивом, созданным в другом часовом поясе (Том Лейн) 
- Добавление в pg_upgrade переноса значения - oldestXIDиз старой инсталляции (Бертран Друво)- Ранее в новых инсталляциях значение - oldestXIDобычно оказывалось достаточно старым для того, чтобы вызвать безусловную немедленную автоочистку для предотвращения зацикливания. Это нежелательно с точки зрения производительности, но что ещё хуже, инсталляции с большими значениями- autovacuum_freeze_max_ageмогли экстренно останавливаться вскоре после обновления.
- Усовершенствование pg_upgrade для выявления расширений, которые следует обновить, и предложения дальнейших действий (Брюс Момджян) - Теперь формируется скрипт, содержащий команды - ALTER EXTENSION UPDATEдля обновления расширений до версий, которые устанавливаются по умолчанию в новой инсталляции.
- Пресечение попыток поиска в каталоге при возникновении ошибки в - contrib/postgres_fdw(Том Лейн)- Хотя обычно это работало, такой поиск может быть опасным, так как ошибке могла сопутствовать и потеря функциональности доступа к каталогу. В качестве побочного эффекта исправления теперь в сообщениях об ошибках преобразования данных упоминаются псевдонимы (если они заданы) столбцов и таблицы, фигурирующие в запросе, а не фактические имена нижележащей сторонней таблицы или столбцов. 
- Устранение в - contrib/pgcryptoконфликта имён символов с OpenSSL (Том Лейн)- При тестировании под контролем valgrind в операциях хеширования SHA224 выявлялись ошибки. По всей видимости, проблема заключалась только в обращении к байтам выравнивания и не имела реальных последствий, но чтобы исключить их наверняка, лучше её устранить. 
- Улучшение инфраструктуры изоляционных тестов (Том Лейн, Микаэль Пакье) - Добавлена возможность дополнить описание шагов в тесте указаниями ожидаемого порядка их выполнения. Это позволяет получать стабильные результаты (ранее результаты могли меняться в условиях гонки), не добавляя для исключения гонки длительные задержки, которые мы вставляли ранее (не вполне успешно). В качестве имён шагов/сеансов в тесте теперь допускаются идентификаторы без кавычек (ранее все такие имена должны были заключаться в кавычки). Также улучшен вывод результатов запросов в изоляционных тестах. Помимо этого, ликвидирован режим «dry-run» программы isolationtester. Наконец, в ней устранены утечки памяти. 
- Уменьшение издержек при тестировании с затиранием кеша (Tom Lane) 
- Исправление регрессионных тестов PL/Python для совместимости с Python 3.10 (Хонза Хорак) 
- Изменение поведения вызова - printf("%s", NULL), который теперь должен выдавать- (null), а не останавливать сервер (Том Лейн)- Это должно повысить устойчивость сервера в особых случаях, и при этом поведение - printfв нашей реализации становится таким же, как в распространённых библиотеках.
- Исправление ошибочного сообщения в журнале, выдаваемого, когда восстановление на момент времени (PITR) останавливается на записи - ROLLBACK PREPARED(Саймон Риггс)
- Уточнение в сообщениях об ошибках формулировки «неотрицательные значения» (Бхарат Рупиредди) 
- Усовершенствование configure для работы с OpenLDAP версии 2.5, в которой теперь нет отдельной библиотеки - libldap_r(Адриан Хо, Том Лейн)- В случае отсутствия библиотеки - libldap_rтеперь неявно предполагается, что библиотека- libldapявляется потокобезопасной.
- Добавление новых целей сборки - world-binи- install-world-bin(Эндрю Дунстан)- Эти цели действуют так же, как - worldи- install-world, соответственно, за исключением того, что они не собирают и не устанавливают документацию.
- Исправление правила make для TAP-тестов ( - prove_installcheck) с целью обеспечения их использования в PGXS (Эндрю Дунстан)
- Отказ от предположения, что строки, возвращаемые библиотеками GSSAPI, завершаются нулевым символом (Том Лейн) - В спецификации GSSAPI строка задаётся указателем и длиной. На практике следующий за концом строки байт обычно нулевой, поэтому наш код раньше не сталкивался с проблемами; однако нам сообщили, что на это среагировал AddressSanitizer. 
- Обеспечение возможности сборки с GSSAPI в среде MSVC (Микаэль Пакье) - Устранение разнообразных несовместимостей с современными сборками Kerberos. 
- Добавление для сборок MSVC параметра - --with-pgportв набор параметров configure, которые выдаёт pg_config, в случае использования данного параметра (Эндрю Дунстан)