E.73. Выпуск 9.5.7

Дата выпуска: 2017-05-11

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

E.73.1. Миграция на версию 9.5.7

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

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

А если вы используете сторонние средства репликации, основанные на «логическом декодировании», обратите внимание на четвёртую запись в списке изменений.

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

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

  • Ограничение видимости pg_user_mappings.umoptions для защиты паролей, сохранённых в свойствах сопоставлений пользователей (Микаэль Пакье, Фейке Стинберген)

    Предыдущая реализация позволяла владельцу объекта стороннего сервера или любому, кто получил право USAGE, видеть свойства всех сопоставлений, связанных с этим сервером. В том числе это могли быть и пароли других пользователей. Теперь определение данного представления изменено для соответствия поведению information_schema.user_mapping_options, так что эти свойства может прочитать только собственно пользователь сопоставления либо, если это сопоставление роли PUBLIC, владелец сервера, либо суперпользователь. (CVE-2017-7486)

    Само по себе это исправление корректирует поведение только в новых базах данных, создаваемых initdb. Если вы хотите применить это исправление к существующей базе данных, следуйте исправленной процедуре в списке изменений, относящейся к CVE-2017-7547, в Разделе E.72.

  • Предотвращение утечки статистической информации через негерметичные операторы (Питер Эйзентраут)

    Некоторые функции оценки избирательности в планировщике применяют пользовательские операторы к значениям, получаемым из pg_statistic, например, к наиболее частым значениям и элементам гистограммы. Это происходит до проверки прав доступа к таблице, так что злонамеренный пользователь может воспользоваться этим и получить подобные значения из столбцов таблицы, чтение которых ему запрещено. Для устранения этой уязвимости следует переходить к общим оценкам, если функция, реализующая оператор, не считается герметичной и вызывающий её пользователь не имеет права на чтение столбца, статистика по которому требуется планировщику. На практике в большинстве случаев одно из этих условий выполняется. (CVE-2017-7484)

  • Восстановление восприятия библиотекой libpq переменной окружения PGREQUIRESSL (Даниэль Густафссон)

    Поддержка этой переменной окружения была непреднамеренно ликвидирована в PostgreSQL 9.3, но в документации она осталась. Это создало угрозу безопасности, так как пользователи могли рассчитывать на то, что она будет требовать SSL-шифрования подключений, но на самом деле этого не происходило. Теперь эта переменная воспринимается как и раньше, но имеет меньший приоритет, чем PGSSLMODE, во избежание нарушения конфигураций, работающих корректно с версиями после 9.3. (CVE-2017-7485)

  • Исправление потенциально некорректного начального снимка при логическом декодировании (Петр Желинек, Андрес Фройнд)

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

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

  • Исправление потенциального повреждения «слоёв инициализации» нежурналируемых индексов (Роберт Хаас, Микаэль Пакье)

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

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

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

  • Предотвращение возможного сбоя в walsender при ошибке инициализации буфера строки (Стас Кельвич, Фудзии Масао)

  • Предупреждение возможного сбоя при повторном сканировании индекса GiST с использованием только индекса и поиском ближайших соседей (Том Лейн)

  • Исправление поведения postmaster при обработке сбоя fork() для фонового рабочего процесса (Том Лейн)

    Ранее postmaster модифицировал элементы своего состояния так, как будто процесс был запущен успешно, что впоследствии приводило к замешательству.

  • Устранение сбоев или неверных ответов в случаях, когда тип данных столбца в GROUPING SETS является хешируемым, но не сортируемым (Паван Деоласи)

  • Исключение применения оптимизации «физического целевого списка» к нестандартным сканированиям (Дмитрий Иванов, Том Лейн)

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

  • Использование правильного подвыражения при применении политики защиты на уровне строк FOR ALL (Стивен Фрост)

    В некоторых случаях применялось ограничение WITH CHECK, хотя более уместным было бы ограничение USING.

  • Обеспечение видимости результатов непосредственно предшествующих DDL при разборе запросов в скриптах расширений (Жульен Рухо, Том Лейн)

    Из-за того, что кеш между командами в скрипте расширения не сбрасывался, запрос к данным мог не наблюдать эффектов непосредственно предшествующего ему изменения каталога, например результатов ALTER TABLE ... RENAME.

  • Ликвидация проверки прав доступа к табличному пространству при перестроении существующего индекса командой ALTER TABLE ... ALTER COLUMN TYPE (Ной Миш)

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

  • Предотвращение рекурсивного обращения команды ALTER TABLE ... VALIDATE CONSTRAINT к дочерним таблицам когда ограничение помечено как NO INHERIT (Амит Ланготе)

    Это предупреждает нежелательные сбои типа «constraint does not exist» (ограничение не существует) в случаях, когда в дочерних таблицах нет соответствующего ограничения.

  • Устранение потери указателя в COPY ... TO когда для исходной таблицы активна защита на уровне строк (Том Лейн)

    Обычно это не имело болезненных последствий, но иногда всё же приводило к неожиданным ошибкам и сбоям.

  • Предупреждение обращения к уже закрытому элементу relcache в CLUSTER и VACUUM FULL (Том Лейн)

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

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

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

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

  • Исправление проблем с переполнением целочисленных значений при сравнении типов interval (Кётаро Хоригути, Том Лейн)

    Операторы сравнения для типа interval могли выдавать неверные ответы для интервалов, превышающих 296000 лет. Индексы по столбцам с такими большими значениями следует перестроить, так как они могут быть испорчены.

  • Исправление функции cursor_to_xml(), чтобы она выдавала правильный результат с tableforest = false (Томас Мунро, Питер Эйзентраут)

    Ранее она не добавляла внешний элемент <table>.

  • Устранение проблем с округлением в функциях float8_timestamptz() и make_interval() (Том Лейн)

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

  • Исправление функции pg_get_object_address() для членов семейств операторов (Альваро Эррера)

  • Улучшение производительности представления pg_timezone_names (Том Лейн, Дэвид Роули)

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

  • Исправление неаккуратной обработки редких ошибок в lseek() и close() (Том Лейн)

    В типичных ситуациях эти системные вызовы отрабатывают без ошибок, но в случае ошибки код fd.c мог повести себя некорректно.

  • Исправление некорректной проверки факта работы postmaster в виде службы Windows (Микаэль Пакье)

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

  • Исправление в ecpg поддержки COMMIT PREPARED и ROLLBACK PREPARED (Масахико Савада)

  • Исправление ошибки двойного освобождения при обработке строковых констант, заключённых в доллары, в ecpg (Михаэль Мескес)

  • В pg_dump исправлена пометка схемы и владельца для комментариев и меток безопасности некоторых типов объектов БД (Джузеппе Брокколо, Том Лейн)

    В простых случаях это не проявлялось никак, но например, при восстановлении с выбором схемы, могли потеряться комментарии, которые в ней должны быть, из-за того, что они не были помечены как принадлежащие схеме своего объекта.

  • Предотвращение вывода командой pg_restore -l некорректного файла со списком объектов, когда имена объектов SQL содержат символы перевода строки (Том Лейн)

    Символы перевода строки заменяются пробелами, что достаточно для того, чтобы этот список корректно обработала команда pg_restore -L.

  • Исправление поведения pg_upgrade для корректного переноса комментариев и меток безопасности, связанных с «большими объектами» (BLOB) (Стивен Фрост)

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

  • Улучшение обработки ошибок в функции pg_file_write() из contrib/adminpack (Ной Миш)

    В частности, она не реагировала на ошибки в вызове fclose().

  • Предупреждение утечки предыдущего безымянного соединения при установлении нового безымянного соединения в contrib/dblink (Джо Конвей)

  • Исправление извлечения триграмм из регулярных выражений в contrib/pg_trgm (Том Лейн)

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

  • В contrib/postgres_fdw реализована передача требования отмены запроса удалённому серверу (Микаэль Пакье, Эцуро Фудзита)

    Ранее требование на отмену локального запроса не влекло за собой досрочную отмену удалённого запроса, уже переданного на выполнение. Это доработка ранее была реализована в 9.6 и теперь перенесена в 9.5.

  • Поддержка Tcl 8.6 в сборках с MSVC (Альваро Эррера)

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

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

  • Обновление данных часовых поясов до версии tzdata 2017b, включающее изменение правил перехода на летнее время в Чили, Монголии и на Гаити, а также исторические изменения для Эквадора, Казахстана, Либерии и Испании. Переход к числовым аббревиатурам для ряда часовых поясов в Южной Америке, в Тихом и Индийском океанах, а также в некоторых азиатских и ближневосточных странах.

    Ранее в базе данных часовых поясов IANA предоставлялись текстовые аббревиатуры для всех часовых поясов и иногда при этом указывались аббревиатуры, которые практически не употреблялись местным населением. Сейчас происходит процесс ухода от этой практики в пользу использования числовых смещений UTC в тех часовых поясах, где нет никаких свидетельств реального использования английской аббревиатуры. Как минимум на данном этапе, PostgreSQL продолжит принимать подобные удалённые аббревиатуры при вводе дат/времени. Но они не будут видны при просмотре представления pg_timezone_names и не будут выводиться с датами/временем.

  • Использование корректных правил перехода на летнее время для названий часовых поясов в стиле POSIX при сборке с MSVC (Дэвид Роули)

    Сборочные скрипты для MSVC не устанавливали корректно файл posixrules в дерево каталогов timezone. Это приводило к тому, что код timezone переходил к использованию встроенных представлений о том, какой вариант перехода на летнее время применим для названия пояса в стиле POSIX. По историческим причинам это соответствует правилам, которые действовали в США до 2007 г. (то есть переход на летнее время происходил в первое воскресенье апреля, а на зимнее — в последнее воскресенье октября). С этим исправлением для часового пояса с названием в стиле POSIX будут использоваться текущие и исторические даты перехода для пояса US/Eastern. Если для вас это нежелательно, удалите файл posixrules или замените его файлом другого часового пояса (см. Подраздел 8.5.3). Учтите, что вследствие кеширования вам потребуется перезапустить сервер, чтобы подобные изменения вступили в силу.