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, в случае использования данного параметра (Эндрю Дунстан)