E.43. Выпуск 9.5.2

Дата выпуска: 2016-03-31

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

E.43.1. Миграция на версию 9.5.2

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

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

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

  • Отключены сокращённые ключи при сортировке строк в локалях, отличных от C (Роберт Хаас)

    В PostgreSQL 9.5 появилась логика ускорения сравнения строковых типов данных с применением стандартной функции библиотеки C strxfrm() вместо strcoll(). Сейчас обнаружилось, что в большинстве версий glibc (реализации библиотеки С для Linux) функция strxfrm() реализована с ошибками, то есть для некоторых локалей с ней получаются результаты сравнения строк, отличающиеся от strcoll(). Пока эта проблема не будет изучена глубже, такая оптимизация для всех локалей, отличных от C, отключается. (Локаль C от этого не зависит, так как она не использует ни strcoll(), ни strxfrm().)

    К сожалению, данная проблема затрагивает не только сортировку, но и упорядочивание записей в B-деревьях, а значит, индексы-B-деревья по столбцам типов text, varchar или char могут оказаться испорченными, если они сортировались с проблемной локалью и были построены или модифицированы версией PostgreSQL 9.5.0 или 9.5.1. Индексы, которые могли пострадать вследствие этой проблемы, следует перестроить (выполнив REINDEX) .

    В данный момент невозможно определить исчерпывающий список проблемных локалей. Известно, что с локалью C всё в порядке, и с локалями английского языка, например, en_US, тоже не замечено никаких проблем, но с некоторыми другими популярными локалями, например de_DE, поведение некорректно в большинстве версий glibc.

  • Корректное сохранение статуса защиты на уровне строк в кешируемых планах (Стивен Фрост)

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

  • В некоторые новые функции contrib/pageinspect добавлены проверки суперпользователя (Андреас Зельтенрейх)

    Большинство функций в расширении pageinspect, исследующие значения bytea, не допускают вызова обычными пользователями, но в brin_page_type() и brin_metapage_info() такие ограничения отсутствуют. Однако, передав им изощрённо сформированные значения bytea, можно вызвать крах сервера или прочитать несколько байт памяти сервера. Поэтому были добавлены недостающие проверки во избежание подобных злоупотреблений. (CVE-2016-3065)

  • Исправлено некорректное сравнение ROW() с применением индексов (Саймон Риггс)

    Ошибки в небольшой оптимизации, введённой в 9.5, приводили к некорректным результатам, если при сравнении ROW() имело место частичное соответствие индексу, но не точное (например, когда порядок столбцов другой или в индексе есть столбцы с сортировкой и ASC, и DESC). Пока лучшее решение не найдено, эта оптимизация отключена.

  • Исправлена некорректная обработка NULL в сравнениях ROW() с применением индексов (Том Лейн)

    Поиск по индексу со сравнением строк вида ROW(a, b) > ROW('x', 'y') останавливался, доходя до элемента NULL в столбце b, игнорируя тот факт, что с последующими значениями a могут быть связаны значения b, отличные от NULL.

  • Предотвращение маловероятных сценариев потери данных в случае переименования файлов без соответствующих вызовов fsync() до и после (Микаэль Пакье, Томаш Вондра, Андрес Фройнд)

  • Исправлено некорректное поведение при перепроверке только что изменённой строки в запросе, выполняющем SELECT FOR UPDATE/SHARE и обращающемся к отношениям, которые не нужно блокировать (Том Лейн)

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

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

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

  • Исправлено некорректное поведение в jsonb_set() при преобразовании элемента массива путей в целое значение для использования в качестве индекса массива (Микаэль Пакье)

  • Исправлено некорректное форматирование отрицательных смещений часовых поясов в функции to_char() с применением кода формата OF (Томас Мунро, Том Лейн)

  • Исправлена некорректное протоколирование событий ожидания, имеющих место в INSERT ... ON CONFLICT (Питер Гейган)

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

  • Параметр recovery_min_apply_delay игнорируется, пока восстановление не достигло согласованного состояния (Микаэль Пакье)

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

  • Корректная обработка ситуаций, когда pg_subtrans на грани зацикливания XID при запуске сервера (Джефф Джейнс)

  • Исправление разнообразных ошибок в логическом декодировании (Андрес Фройнд)

    Проблемы возникали с кортежами больше одной страницы с вариантом идентификации реплики FULL, при выполнении команд UPDATE, изменяющих первичный ключ в транзакции, достаточно большой для выгрузки на диск, а также с некорректными ошибками «subxact logged without previous toplevel record» (транзакция внесена в журнал без предыдущей записи верхнего уровня) и с некорректным выводом времени фиксирования транзакций.

  • Исправлена ошибка планировщика, возникавшая с вложенными представлениями с барьерами безопасности, когда внешнее представление содержит предложение WHERE с коррелирующим подзапросом (Дин Рашид)

  • Ликвидирована утечка памяти при поиске по индексу GIN (Том Лейн)

  • Предотвращён крах в исключительной ситуации при попытке повторно освободить строки, выводимые localeconv() (Том Лейн)

  • Исправлен разбор файлов аффиксов для словарей ispell (Том Лейн)

    Код разбора мог работать неправильно, если файл аффиксов содержит символы, которые могут менять размер в байтах при преобразовании регистра, как например, символ I в турецких локалях UTF8.

  • Исключено использование sscanf() при разборе файлов словарей ispell (Артур Закиров)

    Это устраняет проблему переносимости на платформы на базе FreeBSD (включая macOS).

  • Исправление кода атомарных операций, генерируемого на PPC компилятором IBM xlc (Ной Миш)

    Эта ошибка приводила к редким сбоям при параллельных операциях на этой платформе.

  • Предотвращение сбоя на старых версиях Windows (до 7SP1/2008R2SP1) с процессором с поддержкой AVX2 и с Postgres, собранным компилятором Visual Studio 2013 (Кристиан Ульрих)

    Это обходное решение проблемы в библиотеки выполнения Visual Studio 2013, которая, как заявили в Microsoft, не будет исправляться в этой версии.

  • В psql исправлена логика завершения команд табуляцией с учётом особенностей многобайтных символов (Кётаро Хоригути, Роберт Хаас)

  • В psql исправлено завершение табуляцией команды SECURITY LABEL (Том Лейн)

    При нажатии TAB после ввода SECURITY LABEL мог произойти сбой или выдавались посторонние ключевые слова.

  • Команда pg_ctl теперь принимает тайм-аут ожидания из переменной среды PGCTLTIMEOUT, если этот тайм-аут не задан в командной строке (Ной Миш)

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

  • Исправление ошибочной проверки состояния службы Windows в pg_ctl (Мануэль Матар)

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

  • Исправлено поведение pgbench, чтобы сочетание параметров -C и -M prepared обрабатывалось корректно (Том Лейн)

  • В pg_upgrade теперь пропускается создание скрипта удаления, когда новый каталог данных находится внутри старого (Брюс Момджян)

    Выполнение этого скрипта «вслепую» в таких случаях приводило к потере нового каталога данных.

  • В PL/Perl пустые массивы Postgres стали корректно переводиться в пустые массивы Perl (Алекс Хансакер)

  • Код PL/Python адаптирован для работы с именами функций, не подходящими для идентификаторов Python (Джим Нэсби)

  • Исправление ряда ошибок в статистике, возвращаемой функцией pgstatindex() из contrib/pgstattuple (Том Лейн)

  • Ликвидация зависимости от psed в сборках с MSVC, так как ядро Perl больше не предоставляет её (Микаэль Пакье, Эндрю Дунстан)

  • Обновление данных часовых поясов до версии tzdata 2016c, включающее изменения правил перехода на летнее время в Азербайджане, Чили, на Гаити, в Палестине и России (в Алтайском крае, Астраханской, Кировской и Ульяновской областях, а также на Сахалине), плюс корректировку исторических данных для Литвы, Молдавии и России (для Калининграда, Самары и Волгограда).