E.54. Выпуск 9.6.3
Дата выпуска: 2017-05-11
В этот выпуск вошли различные исправления, внесённые после версии 9.6.2. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.
E.54.1. Миграция на версию 9.6.3
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако если вы используете сторонние серверы данных, на которых для проверки подлинности применяются пароли, прочитайте ниже первую запись в списке изменений.
А если вы используете сторонние средства репликации, основанные на «логическом декодировании», обратите внимание на четвёртую запись в списке изменений.
Также, если вы обновляете сервер с версии, более ранней, чем 9.6.2, см. Раздел E.55.
E.54.2. Изменения
Ограничение видимости
pg_user_mappings
.umoptions
для защиты паролей, сохранённых в свойствах сопоставлений пользователей (Микаэль Пакье, Фейке Стинберген)Предыдущая реализация позволяла владельцу объекта стороннего сервера или любому, кто получил право
USAGE
, видеть свойства всех сопоставлений, связанных с этим сервером. В том числе это могли быть и пароли других пользователей. Теперь определение данного представления изменено для соответствия поведениюinformation_schema.user_mapping_options
, так что эти свойства может прочитать только собственно пользователь сопоставления либо, если это сопоставление ролиPUBLIC
, владелец сервера, либо суперпользователь. (CVE-2017-7486)Само по себе это исправление корректирует поведение только в новых базах данных, создаваемых initdb. Если вы хотите применить это исправление к существующей базе данных, следуйте исправленной процедуре в списке изменений, относящейся к CVE-2017-7547, в Разделе E.53.
Предотвращение утечки статистической информации через негерметичные операторы (Питер Эйзентраут)
Некоторые функции оценки избирательности в планировщике применяют пользовательские операторы к значениям, получаемым из
pg_statistic
, например, к наиболее частым значениям и элементам гистограммы. Это происходит до проверки прав доступа к таблице, так что злонамеренный пользователь может воспользоваться этим и получить подобные значения из столбцов таблицы, чтение которых ему запрещено. Для устранения этой уязвимости следует переходить к общим оценкам, если функция, реализующая оператор, не считается герметичной и вызывающий её пользователь не имеет права на чтение столбца, статистика по которому требуется планировщику. На практике в большинстве случаев одно из этих условий выполняется. (CVE-2017-7484)Восстановление восприятия библиотекой libpq переменной окружения
PGREQUIRESSL
(Даниэль Густафссон)Поддержка этой переменной окружения была непреднамеренно ликвидирована в PostgreSQL 9.3, но в документации она осталась. Это создало угрозу безопасности, так как пользователи могли рассчитывать на то, что она будет требовать SSL-шифрования подключений, но на самом деле этого не происходило. Теперь эта переменная воспринимается как и раньше, но имеет меньший приоритет, чем
PGSSLMODE
, во избежание нарушения конфигураций, работающих корректно с версиями после 9.3. (CVE-2017-7485)Исправление потенциально некорректного начального снимка при логическом декодировании (Петр Желинек, Андрес Фройнд)
Изначальный снимок, создаваемый для слота репликации с логическим декодированием, мог быть некорректным. В результате сторонние средства, использующие логическое декодирование, могли получать неполные/несогласованные начальные данные. Вероятность такого сбоя увеличивалась, если при создании слота исходный сервер был загружен либо уже существовал другой логический слот.
Если вы используете средство репликации, основанное на логическом декодировании, и копировали непустой набор данных в начале репликации, имеет смысл пересоздать реплику после установления этого обновления либо сверить содержимое базы с исходным сервером.
Исправление потенциального повреждения «слоёв инициализации» нежурналируемых индексов (Роберт Хаас, Микаэль Пакье)
Это повреждение могло приводить к переходу нежурналируемого индекса в ошибочное состояние после сбоя и перезапуска сервера. Устранить возникшую проблему можно было, только удалив и перестроив индекс.
Исправление ошибочного восстановления записей
pg_subtrans
при воспроизведении резервным сервером подготовленных, но не зафиксированных двухфазных транзакций (Том Лейн)В большинстве случаев это не имело никаких болезненных последствий, но в особых ситуациях могло приводить к зацикливанию ссылок в
pg_subtrans
, что, в свою очередь, провоцировало бесконечные циклы в запросах, обращающимся к строкам, изменённым двухфазной транзакцией.Предотвращение возможного сбоя в walsender при ошибке инициализации буфера строки (Стас Кельвич, Фудзии Масао)
Предупреждение возможного сбоя при повторном сканировании индекса GiST с использованием только индекса и поиском ближайших соседей (Том Лейн)
Предотвращение задержек при запуске процессом postmaster нескольких параллельных рабочих процессов (Том Лейн)
Ранее была возможна значительная задержка (до нескольких десятков секунд), когда запросу требовалось более одного рабочего процесса, либо когда несколько запросов обращались за рабочими процессами одновременно. На большинстве платформ это происходило при редком стечении обстоятельств, но на некоторых наблюдалось регулярно.
Исправление поведения postmaster при обработке сбоя
fork()
для фонового рабочего процесса (Том Лейн)Ранее postmaster модифицировал элементы своего состояния так, как будто процесс был запущен успешно, что впоследствии приводило к замешательству.
Исправление потенциальной ошибки «no relation entry for relid 0» (нет записи отношения для relid 0) при планировании вложенных операций с множествами (Том Лейн)
Устранение разнообразных мелких дефектов в планировании параллельных запросов (Роберт Хаас)
Исключение применения оптимизации «физического целевого списка» к нестандартным сканированиям (Дмитрий Иванов, Том Лейн)
Эта оптимизация предполагала, что получить все столбцы кортежа можно недорого, что действительно верно для обычных кортежей 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
могла ошибочно сообщить, что таблица вовсе не содержит кортежей, что приводило к очень плохим решениям при планировании.Обеспечение возможности прерывания циклов массовой передачи кортежей в соединении по хешу при попытке отмены запроса (Том Лейн, Томас Манро)
Исправление ошибок в поддержке определённых операторов
box
в SP-GiST (Никита Глухов)Сканирование по индексу SP-GiST с использованием операторов
&<
&>
&<|
и|&>
выдавало некорректные ответы.Исправление проблем с переполнением целочисленных значений при сравнении типов
interval
(Кётаро Хоригути, Том Лейн)Операторы сравнения для типа
interval
могли выдавать неверные ответы для интервалов, превышающих 296000 лет. Индексы по столбцам с такими большими значениями следует перестроить, так как они могут быть испорчены.Исправление функции
cursor_to_xml()
, чтобы она выдавала правильный результат сtableforest
= false (Томас Манро, Питер Эйзентраут)Ранее она не добавляла внешний элемент
<table>
.Устранение проблем с округлением в функциях
float8_timestamptz()
иmake_interval()
(Том Лейн)Эти функции отбрасывали дробную часть, а не округляли числа при преобразовании значения с плавающей точкой к целому числу микросекунд; это могло приводить к неожиданным сдвигам результатов на единицу.
Исправление функции
pg_get_object_address()
для членов семейств операторов (Альваро Эррера)Исправление отмены
pg_stop_backup()
при попытке остановить немонопольное резервное копирование (Микаэль Пакье, Дэвид Стил)Когда функция
pg_stop_backup()
отменялась, ожидая завершения немонопольного резервного копирования, информация о состоянии оставалась неактуальной; запустить новое монопольное копирование было невозможно, возникали и другие небольшие проблемы.Улучшение производительности представления
pg_timezone_names
(Том Лейн, Дэвид Роули)Уменьшение издержек при управлении памятью для контекстов, содержащих множество больших блоков (Том Лейн)
Исправление неаккуратной обработки редких ошибок в
lseek()
иclose()
(Том Лейн)В типичных ситуациях эти системные вызовы отрабатывают без ошибок, но в случае ошибки код
fd.c
мог повести себя некорректно.Исправление некорректной проверки факта работы postmaster в виде службы Windows (Микаэль Пакье)
Вследствие ошибки для вывода сообщений мог выбираться системный журнал событий (там где его на самом деле не было), так что запись сообщений фактически не производилась.
Исправление в ecpg поддержки
COMMIT PREPARED
иROLLBACK PREPARED
(Масахико Савада)Исправление ошибки двойного освобождения при обработке строковых констант, заключённых в доллары, в ecpg (Михаэль Мескес)
Исправление поведения pgbench с сочетанием параметров
--connect
и--rate
(Фабьен Коэльо)Исправление в pgbench обработки развёрнутого написания параметра
--builtin
согласно документации (Том Лейн)Исправление поведения pg_dump/pg_restore для корректной обработки прав, назначенных для схемы
public
, при использовании параметра--clean
(Стивен Фрост)Другие схемы создаются без назначенных для них прав, но схема
public
представляет собой исключение; когда она удаляется и восстанавливается вследствие указания--clean
, её нужно обработать особым образом.В pg_dump исправлена пометка схемы и владельца для комментариев и меток безопасности некоторых типов объектов БД (Джузеппе Брокколо, Том Лейн)
В простых случаях это не проявлялось никак, но например, при восстановлении с выбором схемы, могли потеряться комментарии, которые в ней должны быть, из-за того, что они не были помечены как принадлежащие схеме своего объекта.
Исправление ошибки в запросе pg_dump, предназначенном для получения начальных прав, назначенных для процедурного языка (Питер Эйзентраут)
Вследствие этой ошибки 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
добавлена возможность вынесения на удалённый сервер условий соединения, содержащих функции из поставляемых расширений (Дэвид Роули, Ашутош Бапат)Поддержка 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). Учтите, что вследствие кеширования вам потребуется перезапустить сервер, чтобы подобные изменения вступили в силу.