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 могла принять каталог с найденным выше файлом за верхний уровень дерева исходных кодов.