E.14. Выпуск 11.9
Дата выпуска: 2020-08-13
В этот выпуск вошли различные исправления, внесённые после версии 11.8. За информацией о нововведениях версии 11 обратитесь к Разделу E.23.
E.14.1. Миграция на версию 11.9
Если используется версия 11.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 11.6, см. также Раздел E.17.
E.14.2. Изменения
- Назначение безопасного значения - search_pathв процессах, применяющих изменения, и процессах-передатчиках WAL, участвующих в логической репликации (Ной Миш)- Злонамеренный пользователь, подключённый к базе подписчика или публикации, имел возможность запустить произвольный SQL-код от имени роли, осуществляющей репликацию (обычно это суперпользователь). Некоторые риски аналогичны ранее описанным в CVE-2018-1058, и в данном исправлении для их ликвидации приёмник и передатчик, участвующие в логической репликации, теперь устанавливают пустое значение - search_path. (Как и с CVE-2018-1058, это изменение может вызывать проблемы при использовании неполных имён в определениях реплицируемых таблиц.) Другие риски связаны с реплицированием объектов, принадлежащих недоверенным ролям; лучшее, что с этим можно сделать, — описать эти угрозы в документации. (CVE-2020-14349)
- Повышение уровня безопасности в установочных скриптах дополнительных модулей (Том Лейн) - Атаки, подобные описанным в CVE-2018-1058, могли осуществляться и через установочный скрипт расширения, если злоумышленник мог создавать объекты либо в целевой схеме расширения, либо в схеме другого расширения, от которого зависит первое. Так как для установки расширения требуются права суперпользователя, это направление открывало для обычного пользователя возможность получения прав суперпользователя. Для устранения этого риска в установочных скриптах назначен безопасный путь - search_path, отключён параметр- check_function_bodiesи исправлены имеющиеся в некоторых модулях в contrib запросы, модифицирующие каталог, в соответствии с требованиями безопасности. В документацию добавлена информация для разработчиков сторонних расширений, которая должна помочь им сделать свои установочные скрипты безопасными. Однако описанных мер может быть недостаточно — расширения, зависящие от других расширений, подвержены риску атаки при неосторожной установке. (CVE-2020-14350)
- Исправление поведения в особых случаях при устранении секций (Эцуро Фудзита, Дмитрий Долгов) - С ключами секционирования, состоящими из нескольких столбцов, при формировании условий устранения секций могли возникать ошибки, если для каких-либо из этих столбцов отсутствовало ограничение в - WHEREили наоборот, ограничений было несколько. В результате могли быть получены неверные результаты запроса, также мог произойти крах сервера или сбой проверочного утверждения.
- Корректировка планирования параметризованного индексного сканирования (узлов BitmapAnd и BitmapOr) с внутренней стороны соединения секционированных таблиц, реализуемого вложенным циклом (Том Лейн) - При выполнении плана, в котором при таком сканировании требовалось получать значение с внешней стороны соединения, обычно происходил сбой. 
- Ликвидация ошибки в передатчике WAL, в результате которой он переставал передавать сообщения обратной связи после передачи сообщения об активности (Альваро Эррера) - Это не создавало больших проблем в случае использования встроенной логической репликации, так как встроенный приёмник WAL всё равно достаточно часто посылает ответные сообщения (и тем самым сбрасывает некорректное состояние). Но с некоторыми другими системами репликации, например pglogical, последствия были более серьёзными. 
- Исправление срабатывания триггеров - UPDATE, привязанных к определённым столбцам, на стороне подписчиков логической репликации (Том Лейн)- В прежней реализации не было учтено, что номера столбцов на стороне публикации и на стороне подписчика могут быть разными, и если они действительно различались, триггеры срабатывали некорректно. 
- Обновление значений старейших xmin и LSN во время - pg_replication_slot_advance()(Микаэль Пакье)- Ранее данная функция эти значения не пересчитывала, что могло препятствовать очистке ресурсов (например, мешало удалять ставшие ненужными сегменты WAL) после продвижения слота репликации вручную. 
- Устранение замедления - ts_headline()(Том Лейн)- Добавленное в предыдущем наборе корректирующих выпусков исправление фразового поиска могло провоцировать катастрофическое замедлению - ts_headline()при обработке больших документов; мало того, запрос, выполнение которого заходило в проблематичный цикл, нельзя было отменить.
- Обеспечение возможности прерывания функции - repeat()при отмене запроса (Джо Конвей)
- Добавление в - pg_current_logfile()символа возврата каретки (- \r) в результат, выдаваемый в Windows (Том Лейн)
- Чтение в - pg_read_file()(и связанных функциях) входного файла до достижения EOF (Джо Конвей)- Ранее, в отсутствие явного указания длины, эти функции выполняли чтение до размера файла, полученного от функции - stat(). Однако этот вариант не подходит для каналов и разного рода виртуальных файлов.
- Корректировка обработки значений - NaNпри параллельном агрегировании данных по столбцам типа- numeric(Том Лейн)- Если некоторые рабочие процессы, выполняющие частичное агрегирование, находили в своих данных только - NaN, а другие наоборот,- NaNне находили, их результаты объединялись некорректно, вследствие чего мог быть некорректным и общий результат (то есть это не было ожидаемое значение- NaN).
- Недопущение указания в качестве времени дня значений, превышающих 24 часа (Том Лейн) - Код ввода даты/времени был намеренно написан так, чтобы этот тип принимал время «24:00:00» или равнозначное ему «23:59:60», но не большие значения. Однако проверка интервала была не очень точной, и в результате также допускались значения «23:59:60. - nnn» с ненулевой дробной частью секунд- nnn. Таким образом, результирующее значение даты/времени оказывалось в первой секунде следующего дня. С типами же- timeи- timetzсохранённые значения фактически выходили за 24 часа, вследствие чего могли иметь место проблемы при выгрузке/восстановлении данных и другие нежелательные эффекты.
- Отказ от заключения в двойные кавычки имён индексов в выходных форматах - EXPLAIN, отличных от текстового (Том Лейн, Эйлер Тавейра)
- Исправление в - EXPLAINучёта использования ресурсов, в частности, обращений к буферам в параллельных исполнителях при выполнении плана с узлами- Gather Merge(Жеан-Гийом де Рорте)
- Выбор другого момента для перепроверки ограничения в процедуре - ALTER TABLE(Дэвид Роули)- В некоторых случаях, когда при выполнении - ALTER TABLEнеобходимо полностью переписать содержимое таблицы (например, потому что изменился тип данных столбца) и при этом просканировать таблицу, чтобы перепроверить внешние ключи или ограничения- CHECK, действия выполнялись в неправильном порядке, что могло проявляться в странных ошибках вида «could not read block 0 in file "base/nnnnn/nnnnn": read only 0 of 8192 bytes» (не удалось прочитать блок 0 в файле "base/nnnnn/nnnnn" (прочитано байт: 0 из 8192)).
- Косвенное исправление некорректной пометки полей - pg_subscription.- subslotnameи- pg_subscription_rel.- srsublsnкак NOT NULL (Том Лейн)- В данных начальной загрузки каталога эти два поля в каталоге были некорректно помечены как не принимающие NULL. В существующих инсталляциях исправить эту ошибку простым способом нельзя (тогда как для версии 13 и последующих пометка скорректирована). Корректность этих пометок оказалась важна прежде всего в JIT-процедуре разбора кортежей, в неё и пришлось добавить явное переопределение пометок для этих двух столбцов. Также скорректирован код на C, который обращался к - srsublsn, не проверяя отличие этого значения от null; сбой в этом месте был маловероятен, но всё же не исключён.
- Исправление обработки ссылок - LATERALв условиях, связанных с неразворачиваемым вложенным- SELECTв предложении- FROM(Том Лейн)- Следствием исправленного теперь упущения мог быть крах сервера или сбой проверочного утверждения во время выполнения соответствующего запроса. 
- Отказ от предположения об отсутствии кортежей в сторонних таблицах, которые ещё не анализировались (Том Лейн) - Ошибочное предположение, прежде всего, сказывалось на оценке планировщиком количества групп, которое должно быть получено с - GROUP BY.
- Удаление ненужного предупреждения об «оставшемся кортеже-местозаполнителе» при сбросе обобщения индекса BRIN (Альваро Эррера) - Эта ситуация вполне возможна и ожидаема после отмены очистки, поэтому данное предупреждение было скорее лишним шумом. 
- Корректировка выбора табличных пространств для временных файлов из «общего набора» (Магнус Хагандер, Том Лейн) - В случаях, когда параметр - temp_tablespacesне задавался или содержал имя первичного табличного пространства базы, такие файлы оказывались в табличном пространстве- pg_default, тогда как должны были размещаться в первичном пространстве.
- Устранение дефекта, проявлявшегося в особом случае, при маскировании страниц индекса SP-GiST во время проверок целостности WAL (Александр Коротков) - Вследствие этого дефекта могли выдаваться некорректные сообщения об ошибках при включённом параметре - wal_consistency_checking.
- Улучшение обработки ошибок в серверном модуле - buffile(Томас Манро)- Исправлено поведение в некоторых случаях, когда ошибки ввода/вывода не считались отличными от достижения конца файла или вообще игнорировались. Также в те сообщения, где это уместно, добавлены детали: номера блоков и количества байтов. 
- Устранение аномалий при проверке конфликтов в режиме изоляции - SERIALIZABLE(Питер Гейган)- Когда добавляемый параллельно кортеж изменяется ещё одной параллельной транзакцией и ни одна версия кортежа не видна в снимке текущей транзакции, при проверке конфликта сериализации могло возникнуть неверное представление о том, как этот кортеж соотносится с результатами текущей транзакции. В итоге сериализуемая транзакция могла успешно зафиксироваться, тогда как она должна отменяться с ошибкой сериализации. 
- Предотвращение многократной пометки «мёртвых» элементов в индексе btree, уже имеющих такую пометку (Масахико Савада) - Хотя это никак не вредило функциональности, в режиме включённых контрольных сумм или при включении - wal_log_hintsв журнал WAL вносились ненужные записи.
- Устранение проблемы во время завершения немонопольного резервного копирования в случае включения JIT-компиляции во время копирования (Роберт Хаас) 
- Окружение блокировками операций с файлом - pg_controlв тех местах кода, где таких блокировок не хватало (Натан Боссарт, Фудзии Масао)- В результате упущения файл - pg_controlмог быть перезаписан с неверной контрольной суммой, что могло создать проблемы впоследствии, вплоть до невозможности запустить базу данных в случае сбоя сервера до следующего изменения- pg_control.
- Исправление ошибок в - currtid()и- currtid2()(Микаэль Пакье)- В этих функциях (недокументированных и используемых только старыми версиями драйвера ODBC) нашлись дефекты, которые могли приводить к краху сервера или к странным сообщениям вида «could not open file» (не удалось открыть файл) при попытке использования этих функций с отношениями, не хранящимися на диске. 
- Очистка кода от недопустимых конструкций, в которых - elog()или- palloc()вызываются при установленной циклической блокировке (Микаэль Пакье, Том Лейн)- В логике, связанной со слотами репликации, обнаружилось несколько подобных конструкций. Хотя вероятность проявления проблемы мала, ошибка в вызванной функции могла приводить к зависанию блокировки. 
- Исправление проверочного утверждения в подписчике логической репликации, не позволявшего использовать - REPLICA IDENTITY FULL(Эйлер Тавейра)- Ошибка была исключительно в проверочном утверждении, так что в обычных выпускаемых сборках она никак не проявлялась. 
- Исправление сообщений об ошибках при нехватке места, выдаваемых программами pg_dump и pg_basebackup (Джастин Призби, Том Лейн, Альваро Эррера) - В некоторых местах кода выдавались нелепые сообщения вида «could not write file: Success» (не удалось записать файл: Успех). 
- Исправление параллельного восстановления таблиц, для которых заданы права доступа и на уровне таблицы, и на уровне столбцов (Том Лейн) - Назначения прав на уровне таблицы должны применяться в первую очередь, но при параллельном восстановлении порядок назначения прав не гарантировался, и поэтому могли возникать ошибки «tuple concurrently updated» (кортеж изменён параллельно) или исчезали некоторые назначения прав на уровне столбцов. Это исправление заключается в добавлении зависимостей между такими элементами в файле архива; это означает, что для предотвращения проблемы необходимо сделать новую копию базы с применением исправленного pg_dump. 
- Установка при выполнении pg_upgrade нулевого значения - vacuum_defer_cleanup_ageв целевом кластере (Брюс Момджян)- Если конфигурация целевого кластера была изменена и параметру - vacuum_defer_cleanup_ageбыло присвоено ненулевое значение, это мешало корректно заморозить кортежи в системных каталогах, вследствие чего обновление могло прерваться странным образом. Теперь гарантируется, что данный параметр получает подходящее значение на время обновления.
- Добавление в pg_recvlogical цикла чтения всех ожидающих обработки сообщений перед штатным завершением (Ной Миш) - Если эти сообщения не получить, передатчик данных репликации может обнаружить сбой при передаче и завершиться, не установив нужную позицию LSN для слота репликации. Вследствие этого, данные повторно передавались при следующем подключении. Также могли быть пропущены сообщения об ошибках, переданные после последних данных, подлежащих обработке программой pg_recvlogical. 
- Исправление в pg_rewind реакции на исчезновение файлов в исходном каталоге данных (Джастин Призби, Микаэль Пакье) - Когда в качестве исходной используется работающая база данных, удаления файлов возможны в любой момент времени, но программа pg_rewind приходила в замешательство, вызывая - stat()для файла, который исчезал после того, как был просканирован содержащий его каталог.
- Переключение pg_test_fsync в двоичный режим ввода/вывода в Windows (Микаэль Пакье) - Ранее эта утилита записывала тестовый файл в текстовом режиме, что не соответствует фактическому поведению PostgreSQL. 
- Ликвидация в - contrib/amcheckошибок при обнаружении удалённых индексных страниц, которые оказываются пустыми (Александр Коротков)- Такое состояние дел является обычным при воспроизведении WAL. 
- Исправление дефекта при инициализации локального состояния в - contrib/dblink(Джо Конвей)- При определённых обстоятельствах он мог приводить к тому, что функция - dblink_close(), вопреки ожиданиям, выполняла на удалённой стороне- COMMIT.
- Исправление в - contrib/pgcryptoошибочного использования- deflate()(Том Лейн)- Функции - pgp_sym_encryptмогли выдавать неправильные сжатые данные вследствие нарушения требований API zlib. Нам не сообщали о проявлениях этой ошибки со стандартной библиотекой zlib, но они определённо наблюдаются с библиотекой zlibNX, разработанной IBM.
- Устранение ошибки в алгоритме распаковки данных в функциях - pgp_sym_decryptмодуля- contrib/pgcrypto, проявлявшейся в особом случае (Кётаро Хоригути, Микаэль Пакье)- Поток сжатых данных вполне может заканчиваться пустым пакетом, но функция распаковки не принимала это и выдавала сообщение об испорченных данных. 
- Переход к использованию соответствующей стандарту POSIX функции - strsignal()вместо- sys_siglist[]из BSD (Том Лейн)- Тем самым решена проблема сборки с самыми последними версиями glibc. 
- Обеспечение поддержки нашего кода NLS с Microsoft Visual Studio 2015 или новее (Хуан Хосе Сантамария Флеча, Давиндер Сингх, Амит Капила) 
- Предупреждение возможного сбоя в нашем установочном скрипте для MSVC в случае наличия файла - configureна несколько уровней выше каталога с исходным кодом (Арнольд Мюллер)- В таком случае логика поиска файла - configureмогла принять каталог с найденным выше файлом за верхний уровень дерева исходных кодов.