E.48. Выпуск 10.2
Дата выпуска: 2018-02-08
В этот выпуск вошли различные исправления, внесённые после версии 10.1. За информацией о нововведениях версии 10 обратитесь к Разделу E.50.
E.48.1. Миграция на версию 10.2
Если используется версия 10.X, выгрузка/восстановление базы не требуется.
Однако если вы используете оператор ~> расширения contrib/cube, прочитайте ниже запись о нём.
Также, если вы обновляете сервер с более ранней версии, чем 10.1, см. Раздел E.49.
E.48.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).