E.42. Выпуск 10.8

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

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

E.42.1. Миграция на версию 10.8

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

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

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

  • Устранение возможности обойти политики защиты на уровне строк (RLS), используя оценки избирательности (Дин Рашид)

    При вычислении оценок избирательности планировщик применяет пользовательские операторы к значениям, находящимся в pg_statistic (то есть к самым частым значениям). Таким образом, негерметичный оператор может раскрыть некоторые данные в столбце таблицы, даже если пользователь не имеет доступа к этому столбцу. В CVE-2017-7484 мы добавили ограничения для предотвращения этой утечки, но не учли особенности защиты на уровне строк. Пользователь, которому в SQL дано право чтения столбца, но политикой RLS запрещён доступ к некоторым строкам, тем не менее мог получить некоторые сведения об их содержимом через негерметичный оператор. Это исправление усиливает ограничения, разрешая применение негерметичных операторов к статистическим данным только при отсутствии политики RLS. (CVE-2019-10130)

  • Предупреждение повреждения каталога при создании в транзакции, состоящей из одного оператора, и временной таблицы с ON COMMIT DROP, и столбца идентификации (Питер Эйзентраут)

    Возможность повреждения здесь была не замечена ранее ввиду бессмысленности такой транзакции, так как временная таблица в ней должна удаляться сразу после создания.

  • Предотвращение краха сервера при выполнении перепроверки EPQ для результирующего отношения запроса с секционированием (Амит Ланготе)

    Он происходил, когда использовался уровень изоляции READ COMMITTED и в другом сеансе параллельно изменялись какие-либо целевые строки.

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

    Ранее в подобных условиях такие запросы не выдавали корректный набор выходных столбцов с предложением RETURNING. Помимо этого, в этих запросах также не срабатывали никакие триггеры уровня операторов.

  • Устранение выдаваемых при наличии публикации FOR ALL TABLES некорректных ошибок при внесении изменений во временные и нежурналируемые таблицы (Питер Эйзентраут)

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

  • Исправление обработки явных элементов DEFAULT в команде INSERT ... VALUES с несколькими строками VALUES, целевым отношением для которой является обновляемое представление (Амит Ланготе, Дин Рашид)

    Когда в обновляемом представлении для столбца не задано значение по умолчанию, но оно задано в нижележащей таблице, команда INSERT ... VALUES с одной строкой вставит в столбец это значение по умолчанию. Однако при выполнении этой команды с несколькими строками вместо этого значения всегда вставлялся NULL. Теперь это исправлено, и такая команда выполняется так же, как и команда с одной строкой.

  • Исправление CREATE VIEW, позволяющее создавать представления с нулём столбцов (Ашутош Шарма)

    Мы должны разрешить это для согласованности с возможностью создавать таблицы с нулём столбцов. Так как таблицу можно преобразовать в представление, ранее такое представление можно было получить даже при существовавшем ограничении, что приводило к сбоям при выгрузке/загрузке базы данных.

  • Добавление поддержки CREATE TABLE IF NOT EXISTS ... AS EXECUTE ... (Андреас Карлссон)

    Сочетание предложений IF NOT EXISTS и EXECUTE должно поддерживаться, но в грамматике отсутствовало соответствующее правило.

  • Использование прав корректного пользователя при выполнении вложенных SELECT в выражениях политик защиты на уровне строк (Дин Рашид)

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

  • Теперь при значении xml параметра xmloption XML-документы считаются допустимыми значениями типа xml согласно требованию, появившемуся в стандарте SQL:2006 (Чепмен Флэк)

    Ранее PostgreSQL следовал определению стандарта SQL:2003, в котором это не допускалось. Но это создавало серьёзную проблему при выгрузке/восстановлении данных: ни одно из значений xmloption не позволяло принять все допустимые XML-данные. В связи с этим решено перейти к определению 2006.

    Также модифицирована утилита pg_dump, чтобы при восстановлении данных выполнялась команда SET xmloption = content. Это гарантирует, что выгрузка/восстановление сработает, даже если в данных преобладает вариант document.

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

    Теперь главный процесс (postmaster) будет более надёжно определять активные процессы, оставшиеся от предыдущего воплощения сервера, даже в случае удаления файла postmaster.pid.

  • Исключение транзакций параллельных исполнителей из числа отдельных транзакций.

  • Устранение несовместимости записей GIN-индекса в WAL (Александр Коротков)

    Исправление, вошедшее в февральский корректирующий выпуск, не учитывало все тонкости обратной совместимости. Ведущий сервер этого выпуска формировал в WAL такие записи об удалении страниц GIN, которые не мог корректно воспринять ведомый более старой версии.

  • Устранение возможности сбоя при выполнении команды SHOW через соединение репликации (Микаэль Пакье)

  • Устранение утечки памяти при пересоздании в кеше структур, связанных с секционированными отношениями (Амит Ланготе, Том Лейн)

  • Допущение кодов ошибок EINVAL и ENOSYS в результатах функций fsync и sync_file_range там, где это приемлемо (Томас Манро, Джеймс Сьюэлл)

    Предыдущее изменение, приводящее к панической остановке при ошибках файловой синхронизации, оказалось излишне параноидальным в ряде случаев, где сбой предсказуем и по сути означает «операция не поддерживается».

  • Вывод в представлении pg_stat_activity правильного имени отношения при вычислении сводных данных BRIN в процессе автоочистки (Альваро Эррера)

  • Устранение ошибок планировщика «failed to build any N-way joins» (не удалось построить никакие N-сторонние соединения) с подзапросами LATERAL снаружи полных внешних соединений (Том Лейн)

  • Исправлено некорректное планирование запросов, в которых возвращающая множество функция применяется к заведомо пустому отношению (Том Лейн, Жюльен Руо)

    В 10 версии следствием этого упущения могли быть только чуть менее эффективные планы, тогда как в 11 могли выдаваться ошибки «set-valued function called in context that cannot accept a set» (функция, возвращающая множество, вызвана в контексте, где ему нет места).

  • Проверка прав корректного пользователя при применении правил, позволяющих негерметичным операторам обращаться к данным pg_statistic (Дин Рашид)

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

  • Ускорение планирования запросов со множеством условий равенства и множеством возможно связанных с ними ограничений внешнего ключа (Дэвид Роули)

  • Оптимизация неэффективных операций сложности O(N^2) при отмене транзакции, создавшей множество таблиц (Томаш Вондра)

  • Предупреждение краха сервера в особых случаях при выделении динамической общей памяти (Томас Манро, Роберт Хаас)

  • Устранение условий гонки при управлении динамической общей памятью (Томас Манро)

    В этих условиях могли возникать ошибки «dsa_area could not attach to segment» (не удалось подключить dsa_area к сегменту) или «cannot unpin a segment that is not pinned» (нельзя открепить сегмент, который не закреплён).

  • Устранение условий гонки, при которых сервер горячего резерва мог не отключиться, получив запрос на постепенное отключение (Том Лейн)

  • Устранение возможности краха при получении в параметрах pg_identify_object_as_address() неправильных данных (Альваро Эррера)

  • Ликвидация возможности ошибок «could not access status of transaction» (не удалось получить статус транзакции) в txid_status() (Томас Манро)

  • Улучшение правил проверки паролей, зашифрованных алгоритмами SCRAM-SHA-256 и MD5 (Джонатан С. Кац)

    Строка пароля с определёнными начальными символами могла по ошибке приниматься за строку, закодированную в формате SCRAM-SHA-256 или MD5. Такой пароль можно было установить, но нельзя было использовать.

  • Исправление обработки значений lc_time, подразумевающих кодировку, отличающуюся от кодировки базы (Хуан Хосе Сантамария Флеча, Том Лейн)

    С локализованными названиями дней или месяцев, включающими не ASCII-символы, в таких локалях ранее выдавались неожиданные ошибки или некорректные строки.

  • Исправление ошибочных проверок operator_precedence_warning с унарным оператором «минус» (Рикард Фалькеборн)

  • Недопущение NaN в качестве значения серверных параметров, принимающих числа с плавающей точкой (Том Лейн)

  • Реорганизация работы REINDEX для предотвращения сбоев проверочных утверждений при переиндексировании отдельных индексов pg_class (Андрес Фройнд, Том Лейн)

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

  • Добавление нужной функции проверки в результат, выдаваемый функцией SnapBuildInitialSnapshot() (Антонин Хоуска)

    Для кода ядра это не важно, но важно для некоторых расширений.

  • Устранение периодических ошибок «could not reattach to shared memory» (не удалось переподключиться к общей памяти) при запуске сеансов в Windows (Ной Миш)

    Невыявленным ранее источником таких проблем было создание стеков потоков в пуле потоков по умолчанию. Теперь такие стеки размещаются в другой области памяти.

  • Исправлена обработка ошибок при сканировании каталога в Windows (Константин Книжник)

    Такие ошибки, как отсутствие прав для чтения каталога, не обнаруживались и не выдавались корректно; вместо этого поведение кода было таким же, как и с пустым каталогом.

  • Исправление грамматических дефектов в ecpg (Том Лейн)

    Из-за пропущенной точки с запятой конструкция SET переменная = DEFAULT (но не SET переменная TO DEFAULT) в программах ecpg обрабатывалась некорректно, и в результате получался синтаксически некорректный код, не воспринимаемый сервером. Кроме того, в командах DROP TYPE и DROP DOMAIN, в которых перечислялось несколько имён типов, фактически обрабатывалось только первое имя.

  • Согласование синтаксиса CREATE TABLE AS в ecpg с принятым на стороне сервера (Дайсукэ Хигути)

  • Ликвидация возможности переполнения буфера при обработке в ecpg имён включаемых файлов (Лю Хуайлин, Фей Ву)

  • Недопущение краха в contrib/postgres_fdw при наличии в запросе, использующем удалённую группировку или агрегирование, элемента списка SELECT, не связанного с вложенным запросом, внешней ссылкой или символом параметра (Том Лейн)

  • Предупреждение краха в contrib/vacuumlo при ошибке в lo_unlink() (Том Лейн)

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

    При этом устранён небольшой дефект в zic, в результате которого выдавались данные о некорректном переходе в 2440 г. для часового пояса Africa/Casablanca, и добавлена поддержка нового параметра zic -r.

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

    Часовой пояс Etc/UCT теперь является ссылкой на Etc/UTC (добавленной для обратной совместимости), а не отдельным поясом, генерирующем аббревиатуру UCT, которая теперь, как правило, просто опечатка. PostgreSQL по-прежнему принимает на вход такую аббревиатуру, но уже не выдаёт её.