E.57. Выпуск 9.6.7

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

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

E.57.1. Миграция на версию 9.6.7

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

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

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

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

  • Временные файлы, создаваемые программой 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 (Джефф Джейнс)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Ликвидация обращений по нулевому указателю для некоторых типов адресов 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 (Максим Милютин)

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

  • Добавление современных примеров настройки автозапуска 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).