E.50. Выпуск 10.2

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

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

E.50.1. Миграция на версию 10.2

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

Однако если вы используете оператор ~> расширения contrib/cube, прочитайте ниже запись о нём.

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

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

  • Исправление обработки ключей секционирования, содержащих несколько выражений (Альваро Эррера. Дэвид Роули)

    Эта ошибка приводила к сбоям или, со специально сконструированными данными, к раскрытию произвольного содержимого памяти обслуживающего процесса. (CVE-2018-1052)

  • Временные файлы, создаваемые программой pg_upgrade, должны быть недоступны для чтения всеми пользователями (Том Лейн, Ной Миш)

    Программа pg_upgrade обычно ограничивает доступ к своим временным файлам, чтобы их мог читать и записывать только запускающий её пользователь. Но временные файлы, содержащие вывод pg_dumpall -g могли быть доступны для чтения группе или всем пользователям, а возможно и для записи, если это допускало значение umask этого пользователя. При типичном использовании в многопользовательских системах umask и/или разрешения в рабочем каталоге достаточно жёсткие и эта проблема неактуальна; но pg_upgrade может использоваться и в сценариях, где это упущение могло привести, например, к утечке паролей баз данных. (CVE-2018-1053)

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

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

  • Исправление упущения, когда метастраница хеш-индекса не помечалась как «грязная» после добавления новой страницы переполнения, что могло приводить к порче индекса (Лисянь Цзоу, Амит Капила)

  • Осуществление очистки очереди добавлений индекса GIN при выполнении VACUUM (Масахико Савада)

    Это необходимо для гарантированного удаления неактуальных записей индекса. Прежний код делал это в другом порядке, позволяя операции VACUUM пропускать очистку, если какие-то другие процессы производили очистку параллельно. Однако при этом в индексе могли оставаться некорректные записи.

  • Исправление неправильной блокировки буфера при некоторых чтениях LSN (Якоб Чемпион, Асим Правин, Ашвин Агравал)

    Эти ошибки могли приводит к некорректному поведению при многопоточной нагрузке. Потенциальные последствия не были характеризованы полностью.

  • Исправление некорректных результатов запросов в случаях, когда происходило упрощение подзапросов, результаты которых использовались в GROUPING SETS (Хейкки Линнакангас)

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

  • Исключение неоправданной ошибки в запросе с деревом наследования, который выполнялся одновременно с тем, как некоторая дочерняя таблица удалялась из этого дерева командой ALTER TABLE NO INHERIT (Том Лейн)

  • Устранение разнообразных ошибок взаимоблокировки при выполнении в нескольких сеансах команды CREATE INDEX CONCURRENTLY (Джефф Джейнс)

  • Изменение полей размера таблицы в процессе VACUUM FULL на более раннем этапе (Амит Капила)

    Это предупреждает неоптимальное поведение при перестраивании хеш-индексов таблицы, так как для расчёта начального размера хеша используется статистика pg_class.

  • Исправление работы UNION/INTERSECT/EXCEPT с нулём столбцов (Том Лейн)

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

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

  • Исправление разнообразных ошибок, когда в столбец идентификации при добавлении записи не вставлялось правильное значение по умолчанию (Микаэль Пакье, Питер Эйзентраут)

    В некоторых контекстах, а именно в COPY и ALTER TABLE ADD COLUMN, ожидаемое значение по умолчанию не применялось, а вместо него вставлялось значение NULL.

  • Устранение ошибок в ситуациях, когда дерево наследования содержит дочерние сторонние таблицы (Эцуро Фудзита)

    Комбинация обычных и сторонних таблиц в дереве наследования провоцировала построение некорректных планов в запросах UPDATE и DELETE. Это приводило к видимым ошибкам в некоторых случаях, особенно когда в дочерней сторонней таблице присутствовали триггеры уровня строк.

  • Исправление дефекта со связанным подзапросом SELECT внутри VALUES в подзапросе LATERAL (Том Лейн)

  • Устранение ошибки планировщика «could not devise a query plan for the given query» (не удалось выработать план для данного запроса) в некоторых случаях, включая вложенные UNION ALL в подзапросе LATERAL (Том Лейн)

  • Реализована возможность использовать статистику функциональной зависимости для логических столбцов (Том Лейн)

    Ранее, хотя расширенную статистику можно было объявить и собирать по логическим столбцам, планировщик не мог её применить.

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

    В случаях, подобных SELECT DISTINCT unnest(foo), в версии 10.0 приблизительная оценка количества строк стала давать меньшее число по сравнению с предыдущими версиями, что могло приводить к выбору неоптимальных планов. Теперь восстановлен предыдущий алгоритм оценивания.

  • Исправление работы триггеров в процессах логической репликации (Петр Желинек)

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

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

  • Исправление тайм-аута в процессе walsender и реакции на прерывания при обработке большой транзакции (Петр Желинек)

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

  • Предоставление членам роли pg_read_all_stats возможности видеть статистику walsender в представлении pg_stat_replication (Фейке Стинберген)

  • Отображение процессов walsender, передающих базовые резервные копии, как активные в представлении pg_stat_activity (Магнус Хагандер)

  • Исправление обозначения метода аутентификации scram-sha-256 в представлении pg_hba_file_rules (Микаэль Пакье)

    Ранее его название выводилось как scram-sha256, что могло смущать пользователей некорректным написанием.

  • Добавление в has_sequence_privilege() поддержки проверок WITH GRANT OPTION, как это сделано в других функциях проверки прав (Джо Конвей)

  • В базах данных с кодировкой UTF8 любые XML-объявления, выбирающие другую кодировку, должны игнорироваться (Павел Стехуле, Ной Миш)

    Мы всегда храним документы XML в кодировке базы данных, так что позволяя libxml обрабатывать объявления с другой кодировкой, мы получим ошибочные результаты. Если кодировка базы — не UTF8, мы в любом случае не обещали поддерживать XML-данные с не ASCII-кодировкой, так что предыдущее поведение сохранено для совместимости ошибок. Это изменение затрагивает только xpath() и связанные функции; другой код и ранее работал так.

  • Обеспечение прямой совместимости с будущими изменениями младших версий протокола (Роберт Хаас, Бадрул Чоудхури)

    Ранее серверы PostgreSQL просто отклоняли запросы на использование версий протокола новее 3.0, так что никакого функционального отличия старших номеров от младших не было. Теперь клиенты могут запрашивать версии 3.x и получать в ответ не отказ, а сообщение, говорящее, что сервер поддерживает только версию 3.0. В данный момент от этого ничего не меняется, но перенос этого изменения в предыдущие версии должен ускорить внедрение небольших усовершенствований протокола в будущем.

  • Предоставление возможности клиенту, поддерживающему привязку канала SCRAM, (в частности libpq v11 или новее) подключаться к серверу v10 (Микаэль Пакье)

    Версия 10 не реализует такую функциональность, и согласование её использования производилось некорректно.

  • Предотвращение долгоживущих циклов в ConditionVariableBroadcast() (Том Лейн, Томас Мунро)

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

  • Корректный сброс ожиданий условных переменных при прерывании подтранзакции (Роберт Хаас)

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

  • Устранение сбоев параллельных процессов при использовании более чем одного узла Gather (Томас Мунро)

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

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

  • Исправление реакции на сбой при запуске параллельного рабочего процесса (Амит Капила, Роберт Хаас)

    Ранее параллельный запрос мог зависнуть на неопределённое время, если не удавалось запустить рабочий процесс, вследствие ошибки в fork() или других редких проблем.

  • Исключение неоправданной ошибки, которая выдавалась, когда не удавалось получить параллельные исполнители при запуске параллельного запроса (Роберт Хаас)

  • Исправление сбора статистики EXPLAIN, получаемой от параллельных исполнителей (Амит Капила, Томас Мунро)

  • Строки запросов, передаваемые параллельным исполнителям, всегда должны завершаться нулём (Томас Мунро)

    Это предотвращает вывод мусора в журнал главного процесса от таких исполнителей.

  • Устранение небезопасного предположения о выравнивании при работе с типом __int128 (Том Лейн)

    Обычно компиляторы полагают, что переменные __int128 выравниваются по 16-байтовым границам, но наша инфраструктура выделения памяти не готова гарантировать это, а увеличение MAXALIGN кажется неподходящим по множеству причин. В качестве решения код был изменён так, чтобы тип __int128 можно было использовать только когда мы можем сказать компилятору, что предполагается не такое крупное выравнивание. Единственный замеченный симптом этой проблемы — сбои в некоторых параллельных запросах с агрегированием.

  • Предотвращение сбоев с переполнением стека при планировании операций со множествами с крайне большой вложенностью (UNION/INTERSECT/EXCEPT) (Том Лейн)

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

    Это могло происходить только при изменении или выборке SELECT FOR UPDATE данных соединения, когда одновременно изменялись некоторые выбранные строки.

  • Устранение ошибки в процессе автоочистки, когда расширенная статистика для таблицы определена, но не может быть вычислена (Альваро Эррера)

  • Ликвидация обращений по нулевому указателю для некоторых типов адресов LDAP, задаваемых в файле pg_hba.conf (Томас Мунро)

  • Предотвращение исчерпания памяти из-за разрастания простых хеш-таблиц (Томаш Вондра, Андрес Фройнд)

  • Исправление демонстрационных функций INSTR() в документации по PL/pgSQL (Юго Нагата, Том Лейн)

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

    Код этого примера был изменён для большего соответствия поведению Oracle. Пользователям, которые скопировали этот код в свои приложения, возможно, имеет смысл обновить свои копии.

  • Исправление поведения pg_dump, чтобы ACL (разрешения), комментарии и метки безопасности можно было надёжно идентифицировать в архивных выходных форматах (Том Лейн)

    Компонент «метка» записи ACL в архиве обычно представлял собой просто имя целевого объекта. В его начало теперь добавляется тип объекта, чтобы записи ACL соответствовали соглашениям, уже принятым для записей комментариев и меток безопасности. Кроме того, обозначения комментариев и меток безопасности, заданных для собственно базы данных, теперь должны начинаться с DATABASE, чтобы они соответствовали тому же соглашению. Это предупреждает ложные срабатывания в коде, который пытается найти записи больших объектов по строкам, начинающимся со слов LARGE OBJECT. Прежнее поведение могло приводить к неправильной классификации записей как данные и нежелательным результатам при восстановлении выгруженной только схемы или только данных.

    Заметьте, что следствием этого стало изменение видимого пользователями вывода pg_restore --list.

  • Переименование функции copy_file_range в pg_rewind во избежание конфликта с новым системным вызовом Linux с таким же именем (Андрес Фройнд)

    Это изменение предотвращает ошибки при сборке с новыми версиями glibc.

  • В ecpg добавлено выявление массивов индикаторов с неправильной длиной и сообщение об ошибке (Дэвид Рейдер)

  • Изменение поведения оператора cube ~> int в расширении contrib/cube для обеспечения его совместимости с поиском kNN (Александр Коротков)

    Смысл второго аргумента (выбирающего размерность) был изменён, чтобы можно было определённо сказать, какое именно значение выбирается в кубах переменных размерностей.

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

  • Предотвращение срабатывания проверки истинности внутри libc в расширении contrib/hstore из-за использования memcpy() с равными указателями источника и получателя (Томаш Вондра)

  • Исправление некорректного отображения битовых карт NULL для кортежей в contrib/pageinspect (Максим Милютин)

  • Исправление некорректного вывода функции hash_page_items() расширения contrib/pageinspect (Масахико Савада)

  • В расширении contrib/postgres_fdw ликвидирована ошибка планировщика «outer pathkeys do not match mergeclauses» (внешние ключи пути не соответствуют предложениям слияния) при построении плана, включающего удалённое соединение (Роберт Хаас)

  • В contrib/postgres_fdw предотвращён сбой планировщика при дублировании элементов GROUP BY (Дживан Чок)

  • Добавление современных примеров настройки автозапуска Postgres в macOS (Том Лейн)

    Скрипты в contrib/start-scripts/osx используют инфраструктуру, которая устарела десять лет назад, и абсолютно неработоспособны во всех версиях macOS, выпущенных в последние два года. Добавлен новый подкаталог contrib/start-scripts/macos со скриптами, использующими новую инфраструктуру launchd.

  • Исправление некорректного выбора зависящих от конфигурации библиотек OpenSSL в Windows (Эндрю Дунстан)

  • Поддержка компоновки с версиями libperl, собранными компилятором MinGW (Ной Миш)

    Это позволяет собирать PL/Perl с некоторыми распространёнными дистрибутивами Perl для Windows.

  • Исправление в сборке MSVC проверки, требуется ли 32-битной libperl определение -D_USE_32BIT_TIME_T (Ной Миш)

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

  • В Windows обработчик аварийного завершения должен устанавливаться на более раннем этапе запуска главного процесса (Такаюки Цунакава)

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

  • В Windows устранены сбои, связанные с преобразованием кодировок при выводе сообщений на самых ранних стадиях запуска процесса postmaster (Такаюки Цунакава)

  • Использование нашего ранее написанного кода циклических блокировок для Motorola 68K во OpenBSD, а также в NetBSD (Давид Карлье)

  • Добавление поддержки циклических блокировок для Motorola 88K (Давид Карлье)

  • Обновление данных часовых поясов до версии tzdata 2018c, включающее изменения правил перехода на летнее время в Бразилии, в Сан-Томе и Принсипи, а также корректировки исторических данных для Боливии, Японии и Южного Судана. Был удалён часовой пояс US/Pacific-New (это был просто псевдоним для пояса America/Los_Angeles).