E.38. Выпуск 9.6.19
Дата выпуска: 2020-08-13
В этот выпуск вошли различные исправления, внесённые после версии 9.6.18. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.
E.38.1. Миграция на версию 9.6.19
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако если вы обновляете сервер с более ранней версии, чем 9.6.16, см. Раздел E.41.
E.38.2. Изменения
Повышение уровня безопасности в установочных скриптах дополнительных модулей (Том Лейн)
Атаки, подобные описанным в CVE-2018-1058, могли осуществляться и через установочный скрипт расширения, если злоумышленник мог создавать объекты либо в целевой схеме расширения, либо в схеме другого расширения, от которого зависит первое. Так как для установки расширения требуются права суперпользователя, это направление открывало для обычного пользователя возможность получения прав суперпользователя. Для устранения этого риска в установочных скриптах назначен безопасный путь
search_path
, отключён параметрcheck_function_bodies
и исправлены имеющиеся в некоторых модулях в contrib запросы, модифицирующие каталог, в соответствии с требованиями безопасности. В документацию добавлена информация для разработчиков сторонних расширений, которая должна помочь им сделать свои установочные скрипты безопасными. Однако описанных мер может быть недостаточно — расширения, зависящие от других расширений, подвержены риску атаки при неосторожной установке. (CVE-2020-14350)Ликвидация ошибки в передатчике WAL, в результате которой он переставал передавать сообщения обратной связи после передачи сообщения об активности (Альваро Эррера)
Это не создавало больших проблем в случае использования встроенной логической репликации, так как встроенный приёмник WAL всё равно достаточно часто посылает ответные сообщения (и тем самым сбрасывает некорректное состояние). Но с некоторыми другими системами репликации, например pglogical, последствия были более серьёзными.
Устранение замедления
ts_headline()
(Том Лейн)Добавленное в предыдущем наборе корректирующих выпусков исправление фразового поиска могло провоцировать катастрофическое замедлению
ts_headline()
при обработке больших документов; мало того, запрос, выполнение которого заходило в проблематичный цикл, нельзя было отменить.Обеспечение возможности прерывания функции
repeat()
при отмене запроса (Джо Конвей)Корректировка обработки значений
NaN
при параллельном агрегировании данных по столбцам типаnumeric
(Том Лейн)Если некоторые рабочие процессы, выполняющие частичное агрегирование, находили в своих данных только
NaN
, а другие наоборот,NaN
не находили, их результаты объединялись некорректно, вследствие чего мог быть некорректным и общий результат (то есть это не было ожидаемое значениеNaN
).Отказ от заключения в двойные кавычки имён индексов в выходных форматах
EXPLAIN
, отличных от текстового (Том Лейн, Эйлер Тавейра)Выбор другого момента для перепроверки ограничения в процедуре
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)).Исправление обработки ссылок
LATERAL
в условиях, связанных с неразворачиваемым вложеннымSELECT
в предложенииFROM
(Том Лейн)Следствием исправленного теперь упущения мог быть крах сервера или сбой проверочного утверждения во время выполнения соответствующего запроса.
Отказ от предположения об отсутствии кортежей в сторонних таблицах, которые ещё не анализировались (Том Лейн)
Ошибочное предположение, прежде всего, сказывалось на оценке планировщиком количества групп, которое должно быть получено с
GROUP BY
.Улучшение обработки ошибок в серверном модуле
buffile
(Томас Манро)Исправлено поведение в некоторых случаях, когда ошибки ввода/вывода не считались отличными от достижения конца файла или вообще игнорировались. Также в те сообщения, где это уместно, добавлены детали: номера блоков и количества байтов.
Устранение аномалий при проверке конфликтов в режиме изоляции
SERIALIZABLE
(Питер Гейган)Когда добавляемый параллельно кортеж изменяется ещё одной параллельной транзакцией и ни одна версия кортежа не видна в снимке текущей транзакции, при проверке конфликта сериализации могло возникнуть неверное представление о том, как этот кортеж соотносится с результатами текущей транзакции. В итоге сериализуемая транзакция могла успешно зафиксироваться, тогда как она должна отменяться с ошибкой сериализации.
Предотвращение многократной пометки «мёртвых» элементов в индексе btree, уже имеющих такую пометку (Масахико Савада)
Хотя это никак не вредило функциональности, в режиме включённых контрольных сумм или при включении
wal_log_hints
в журнал WAL вносились ненужные записи.Окружение блокировками операций с файлом
pg_control
в тех местах кода, где таких блокировок не хватало (Натан Боссарт, Фудзии Масао)В результате упущения файл
pg_control
мог быть перезаписан с неверной контрольной суммой, что могло создать проблемы впоследствии, вплоть до невозможности запустить базу данных в случае сбоя сервера до следующего измененияpg_control
.Исправление ошибок в
currtid()
иcurrtid2()
(Микаэль Пакье)В этих функциях (недокументированных и используемых только старыми версиями драйвера ODBC) нашлись дефекты, которые могли приводить к краху сервера или к странным сообщениям вида «could not open file» (не удалось открыть файл) при попытке использования этих функций с отношениями, не хранящимися на диске.
Очистка кода от недопустимых конструкций, в которых
elog()
илиpalloc()
вызываются при установленной циклической блокировке (Микаэль Пакье, Том Лейн)В логике, связанной со слотами репликации, обнаружилось несколько подобных конструкций. Хотя вероятность проявления проблемы мала, ошибка в вызванной функции могла приводить к зависанию блокировки.
Исправление сообщений об ошибках при нехватке места, выдаваемых программами 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/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
могла принять каталог с найденным выше файлом за верхний уровень дерева исходных кодов.