E.18. Выпуск 11.5

Дата выпуска: 2019-08-08

В этот выпуск вошли различные исправления, внесённые после версии 11.4. За информацией о нововведениях версии 11 обратитесь к Разделу E.23.

E.18.1. Миграция на версию 11.5

Если используется версия 11.X, выгрузка/восстановление базы не требуется.

Если вы обновляете сервер с более ранней версии, чем 11.1, см. также Раздел E.22.

E.18.2. Изменения

  • Требование указания схемы при приведении к временному типу с использованием синтаксиса вызова функции (Ной Миш)

    Мы давно требуем, чтобы вызов временных функций записывался с явным указанием временной схемы, примерно так: pg_temp.имя_функции(аргументы). Теперь её необходимо указывать и в приведении к временным типам с использованием функциональной записи: pg_temp.имя_типа(аргумент). В противном случае имеется возможность перехватить вызов функции, используя временный объект, что позволит повысить привилегии примерно тем же способом, который мы блокировали в CVE-2007-2138. (CVE-2019-10208)

  • Исправление объединения вложенных планов по хешу, требующего межтипового сравнения (Том Лейн, Андреас Зельтенрейх)

    Во вложенных планах, объединяемых по хешу, для сравнения элементов хеш-таблицы использовался оператор сравнения для внешнего запроса. Но это может быть некорректно для межтипового оператора, так как на самом деле все элементы таблицы будут иметь выходной тип подзапроса. Для набора межтиповых операторов сравнения хешей, встроенных в ядро PostgreSQL, в 64-битных системах эта ошибка практически безобидна, но в 32-битных она могла приводить к краху или неавторизованному доступу к памяти сервера. Расширения могли создавать межтиповые операторы сравнения, несущие ещё большую угрозу. (CVE-2019-10209)

  • Устранение сбоя в ALTER TABLE ... ALTER COLUMN TYPE при изменении типов нескольких столбцов в одной команде (Том Лейн)

    Тем самым устранена регрессия, которая появилась в предыдущих корректирующих выпусках: индексы, построенные по модифицируемым столбцам, обрабатывались неправильно, что приводило к странным ошибкам в процессе ALTER TABLE.

  • Недопущение удаления триггера секционированной таблицы, если имеются события из дочерних таблиц, ожидающие обработки триггером (Альваро Эррера)

    Прежде всего это касается ограничений внешних ключей, так как они реализуются триггерами.

  • Сохранение определённых пользователем аргументов триггера при копировании определения триггера из секционированной таблицы в её секцию (Патрик Макхарди)

  • Корректировка зависимостей с целью недопущения удаления столбцов в ключе секционирования (Том Лейн)

    Команда ALTER TABLE ... DROP COLUMN не позволяет непосредственно удалить столбец, входящий в ключ разбиения. Однако при косвенном удалении (например, при каскадном удалении, начиная с типа данных этого столбца) необходимая проверка не выполнялась, что позволяло удалить ключевой столбец. В результате секционированная таблица приходила в негодность — обратиться к ней было нельзя и удалить её тоже.

    В результате этого исправления в pg_depend добавляются записи, гарантирующие, что при каскадном удалении ключевого столбца будет удалён не только он, но и вся секционированная таблица. Заметьте, что такие записи будут добавляться только при создании секционированной таблицы; то есть данное исправление не устраняет риск повреждения уже существующих секционированных таблиц. Однако проблема может возникнуть только со столбцами в ключе разбиения, которые имеют пользовательские типы данных, поэтому это не должно представлять угрозы для большинства пользователей.

  • Исправление соответствия номеров столбцов между секционированной таблицей и её секцией по умолчанию (Амит Ланготе)

    Некоторые операции выполнялись некорректно, если точное соответствие нарушалось, например, когда какие-либо столбцы удалялись в одной таблице, но оставались в другой.

  • Исключение из рассмотрения сторонних таблиц при создании индексов в секционированных таблицах (Альваро Эррера)

    Ранее, если во время этой операции встречалась сторонняя таблица, выдавалась ошибка, что, однако, не решало никакие реальные проблемы.

  • Устранение секции по умолчанию в запросах к секционированной таблице в большем количестве случаев (Юзуко Хосоя)

  • Исправление ошибки, мешавшей корректно устранять секции при наличии в ключе разбиения множества столбцов типа boolean (Дэвид Роули)

  • Сохранение в GROUP BY значимости столбцов таблицы-родителя в иерархии наследования (Дэвид Роули)

    Обычно когда в предложении GROUP BY фигурируют столбцы первичного ключа таблицы, все остальные группирующие столбцы можно считать незначащими, так как первых вполне достаточно для получения уникальных групп. Но такая оптимизация некорректна, если запрос также обращается к дочерним таблицам — уникальность в родительской таблице не распространяется на дочерние.

  • Исправление ошибки при выполнении параллельного соединения по хешу в запросах с неполным соединением (Томас Манро)

    Вследствие этой ошибки в результатах некоторых запросов с EXISTS могли задваиваться строки.

  • Устранение ненужных этапов сортировки в некоторых запросах с предложением GROUPING SETS (Эндрю Гирт, Ричард Гуо)

  • Исправление ошибки при определении планировщиком крайних значений в индексе (Том Лейн)

    При использовании только что созданного индекса для определения минимального или максимального значения в столбце планировщик мог выбрать кортеж, который потерял актуальность и на самом деле не содержит граничное значение. В худшем случае этот кортеж мог содержать NULL, что приводило к явной ошибке «found unexpected null value in index» (в индексе найдено неожиданное значение NULL), хотя с большей вероятностью всё заканчивалось выбором неверного значения, приводящим к ухудшению оценок планировщика.

  • Устранение сбоя при обращении к переходным таблицам триггера в процессе перепроверок EvalPlanQual (Александр Акципетров)

    Триггеры, работающие с переходными таблицами, иногда могли ломаться при одновременном изменении таблиц.

  • Исправление поведения внешних ключей, содержащих несколько столбцов, при перестроении ограничения внешнего ключа (Том Лейн)

    Команда ALTER TABLE могла неправильно определять, нужно ли перепроверять внешний ключ, если столбцы в ключе имели разные типы. По всей видимости проявлялось это всегда консервативным образом, то есть перепроверка производилась и тогда, когда это не требовалось.

  • Отключение сбора расширенной статистики в деревьях наследования (Томаш Вондра)

    Это устраняет ошибку с сообщением «tuple already updated by self» (кортеж уже изменился сам) в процессе ANALYZE.

  • Устранение неоправданных взаимоблокировок при повышении уровня блокировки кортежа (Алексей Клюкин)

    Когда две или более транзакций ждут, пока транзакция T1 освободит блокировку на уровне кортежа, а T1 при этом повышает уровень блокировки, по завершении T1 между этими ожидающими транзакциями может возникнуть неоправданная взаимоблокировка.

  • Устранение проблемы при разрешении взаимоблокировок, в которых задействовано несколько параллельных исполнителей (Жуй Хай Цзян)

    Маловероятно, что эту ошибку можно было получить не синтетическими запросами, но в этом исключительном случае запросы, попавшие в ситуацию взаимоблокировки (в идеале разрешаемую автоматически), потребовалось бы отменить вручную.

  • Исправление преобразования диапазонов дат с бесконечными границами infinity с приведением их к канонической форме (Лауренц Альбе)

    Если граница диапазона —­­ бесконечность, пытаться преобразовать открытый диапазон в закрытый и наоборот путём увеличения или уменьшения граничного значения нельзя. Поэтому в подобных случаях диапазон не должен изменяться.

  • Ликвидирована потеря дробных цифр при приведении очень больших значений типа money к типу numeric (Том Лейн)

  • Исправление печатного представления WAL-записей BTREE_META_CLEANUP (Микаэль Пакье)

  • Устранение сбоев проверок истинности в результате некорректной обработки метастраниц индекса btree версии 2 (Питер Гейган)

  • Исправление ассемблерного кода циклических блокировок для процессоров MIPS, чтобы он корректно работал на MIPS r6 (ЮньЦян Су)

  • Назначение записи или кортежу, возвращаемым функцией PL/pgSQL, составного типа результата функции (Том Лейн)

    Тем самым устраняются проблемы, возникавшие при сохранении результата непосредственно в таблице.

  • Игнорирование символа перевода каретки (\r) при разборе файлов описаний служб в libpq (Том Лейн, Микаэль Пакье)

    В некоторых случаях такие файлы с переводами строк в стиле Windows могли разбираться неправильно, что проявлялось в ошибках при подключении.

  • Исключение некорректных вариантов дополнения табуляцией, предлагаемых после SET переменная = в psql (Том Лейн)

  • Устранение небольшой утечки памяти в psql при выполнении команды \d (Том Лейн)

  • Исправление в pg_dump порядка вывода пользовательских классов операторов (Том Лейн)

    Если пользовательский класс операторов оказывался классом операторов подтипа для пользовательского диапазонного типа, связанные объекты выводились в неправильном порядке; в результате выгруженные данные нельзя было восстановить. (Нижележащая ошибка в обработке зависимости классов операторов могла проявляться и в других случаях, но зафиксирован только этот.)

  • Устранение возможности зависания pgbench при использовании ключа -R (Фабьен Коэльо)

  • Повышена надёжность проверки индексов в contrib/amcheck (Питер Гейган)

  • Исправлена обработка значений Perl undef в contrib/jsonb_plperl (Иван Панченко)

  • Обеспечение в contrib/passwordcheck возможности сосуществования с другими пользователями функции check_password_hook (Микаэль Пакье)

  • Исправление проверок contrib/sepgsql для поддержки последних версий SELinux (Майк Пальмиотто)

  • Улучшение стабильности регрессионных тестов src/test/kerberos и src/test/ldap (Томас Манро, Том Лейн)

  • Улучшение стабильности регрессионных тестов src/test/recovery (Микаэль Пакье)

  • Уменьшение объёма вывода в stderr в тестировочном скрипте pg_upgrade (Том Лейн)

  • Исправление регрессионных тестов pgbench в части поддержки Windows (Фабьен Коэльо)

  • Исправление TAP-тестов для совместимости с Perl из среды msys в случаях, когда каталог сборки находится не внутри точки монтирования корня msys (Ной Миш)

  • Обеспечение поддержки сборки Postgres с использованием Microsoft Visual Studio 2019 (Харибабу Комми)

  • При сборке проектов Visual Studio переменная окружения WindowsSDKVersion не должна игнорироваться, если она установлена (Пэйфэн Цю)

    Это исправление решает проблемы сборки в некоторых конфигурациях.

  • Поддержка в проектах Visual Studio библиотеки OpenSSL версии 1.1.0 и выше (Хуан Хосе Сантамария Флеча, Микаэль Пакье)

  • Возможность передачи параметров make нижележащей утилите gmake при вызове на верхнем уровне make не из комплекта GNU (Томас Манро)

  • Недопущение выбора вариантов localtime и posixrules в качестве значения TimeZone в процессе initdb (Том Лейн)

    В некоторых случаях программа initdb могла выбирать одно из таких имён несуществующих часовых поясов вместо имени «настоящего» часового пояса. Этим двум именам будет предпочитаться любое другое, представляющее часовой пояс на уровне C.

  • Изменение представления pg_timezone_names: часовой пояс Factory будет отображаться, только если он имеет короткую аббревиатуру (Том Лейн)

    В прошлом администрация IANA ввела этот искусственный пояс с «аббревиатурой» Local time zone must be set--see zic manual page (Должен быть задан местный часовой пояс -- см. страницу руководства zic). Современные версии базы данных tzdb содержат для него аббревиатуру -00, но на ряде платформ эта база модифицируется так, что из неё продолжают исходить подобные старинные написания. Поэтому решено показывать этот часовой пояс, только если его аббревиатура действительно кратка.

  • Синхронизация нашей копии библиотеки timezone с выпущенной IANA версией 2019b (Том Лейн)

    В результате была добавлена поддержка нового ключа -b slim программы zic, что позволяет уменьшить размер устанавливаемых файлов часовых поясов. Эта возможность может пригодиться нам в будущем.

  • Обновление данных часовых поясов до версии tzdata 2019b, включающее изменение правил перехода на летнее время в Бразилии, а также корректировку исторических данных для Гонконга, Италии и Палестины.