E.41. Выпуск 9.5.4

Дата выпуска: 2016-08-11

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

E.41.1. Миграция на версию 9.5.4

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

Однако если вы обновляете сервер с более ранней версии, чем 9.5.2, см. Раздел E.43.

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

  • Исправление некорректного вычисления вложенных выражений CASE-WHEN (Хейкки Линнакангас, Микаэль Пакье, Том Лейн)

    Выражение CASE, фигурирующее в подвыражении проверки другого выражения CASE, могло некорректно оценивать, отличается ли его собственное проверяемое значение от NULL. Кроме того, встраивание SQL-функции, реализующей оператор равенства, который используется выражением CASE, может привести к передаче неправильного проверяемого значения функциям, вызываемым в выражении CASE в теле функции SQL. Если же проверяемые значения оказываются разных типов, возможен сбой; более того, это может эксплуатироваться для несанкционированного чтения областей памяти сервера. (CVE-2016-5423)

  • Корректировка в клиентских программах обработки специальных символов в именах ролей и баз данных (Ной Миш, Натан Боссарт, Микаэль Пакье)

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

    Приведение в соответствие с документацией правил обработки пар двойных кавычек в командах psql \connect и \password.

    Введение нового параметра -reuse-previous для команды psql \connect, позволяющего явно указывать, должны ли повторно использоваться параметры предыдущего подключения. (Без данного параметра это, как и раньше, зависит от того, похоже ли имя базы данных на строку подключения.) Это позволяет безопасно оперировать с именами баз данных, содержащими специальные символы, в скриптах pg_dumpall.

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

    Эти коррективы считаются исправлениями уязвимостей, так как, сконструировав имена объектов специальным образом (используя спецсимволы), можно было сформировать произвольные команды, которые выполнятся с правами суперпользователя, когда суперпользователь будет выполнять pg_dumpall или другие операции обслуживания базы. (CVE-2016-5424)

  • Исправление некорректного в особых случаях поведения проверок IS NULL/IS NOT NULL, применяемых к вложенным составным значениям (Эндрю Гирт, Том Лейн)

    В стандарте SQL говорится, что проверка IS NULL должна возвращать TRUE для строки со всеми значениями NULL (то есть ROW(NULL,NULL) IS NULL выдаёт TRUE), но это не должно действовать рекурсивно (то есть, ROW(NULL, ROW(NULL,NULL)) IS NULL выдаёт FALSE). В основном исполнителе это реализовано правильно, но при некоторых оптимизациях планировщика эта проверка рассматривалась как рекурсивная (и TRUE выдавалось в обоих случаях), кроме того, обёртка contrib/postgres_fdw тоже могла выдавать удалённые запросы с подобным некорректным поведением.

  • Исправление ошибки «unrecognized node type» (нераспознанный тип узла) при INSERT ... ON CONFLICT в рекурсивном CTE (элементе WITH) (Питер Гейган)

  • Исправление в INSERT ... ON CONFLICT сопоставления предикатов или выражений индексов, которые были упрощены планировщиком на стадии предобработки выражений (Том Лейн)

  • Правильная обработка нарушений ограничений-исключений, которые применяются к целевой таблице команды INSERT ... ON CONFLICT, но не являются решающими индексами (Том Лейн)

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

  • Исправление INSERT ... ON CONFLICT, чтобы при наличии в целевой таблице уникального индекса по OID не происходила ошибка (Том Лейн)

  • Недопущение для типов данных inet и cidr входных адресов IPv6 со слишком большим количеством разделённых двоеточиями полей (Том Лейн)

  • Предотвращение сбоя в close_ps() (операторе point ## lseg) для входных координат NaN (Том Лейн)

    В таких случаях должен просто возвращаться NULL.

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

  • Исправление в нескольких местах выхода на один байт за границу буфера в to_number() (Питер Эйзентраут)

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

  • Планировщик не должен запускаться для запроса, заданного в операторе CREATE MATERIALIZED VIEW или CREATE TABLE AS с указанием WITH NO DATA (Микаэль Пакье, Том Лейн)

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

  • Ликвидация небезопасного промежуточного состояния при выполнении heap_update() по сложному пути (Масахико Савада, Андрес Фройнд)

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

  • Исправление обновления вспомогательных битов при воспроизведении из WAL операций блокирования строк (Андрес Фройнд)

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

  • Предотвращение неоправданных ошибок «could not serialize access» (не удалось сериализовать доступ) при получении блокировок строк FOR KEY SHARE в сериализуемом режиме (Альваро Эррера)

  • «Развёрнутые» данные, возвращаемые узлом плана, должны быть доступны только для чтения (Том Лейн)

    Это предотвращает сбои в некоторых случаях, когда результат нижнего узла плана неоднократно задействуется в верхних узлах. Если говорить о ядре PostgreSQL, риску подвержены только значения массивов, возвращаемые функциями PL/pgSQL; но расширения могут использовать развёрнутые данные и для других целей.

  • Предупреждение сбоя в postgres -C, когда указанная переменная имеет пустое строковое значение (Микаэль Пакье)

  • Предотвращение незапланированного ожидания приёмника в процессах, передающих WAL (Кётаро Хоригути)

  • Исправление возможной потери больших подтранзакций при логическом декодировании (Петру-Флорин Миханча)

  • Исправление сбоя логического декодирования, когда подтранзакция не содержит фактических изменений (Марко Тииккая, Эндрю Гирт)

  • Предоставление обслуживающим процессам актуальной статистики по общим каталогам (Том Лейн)

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

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

  • Исключение потребления лишнего ID транзакции во время VACUUM (Александр Коротков)

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

  • Предотвращение риска сбоя при очистке идентификаторов мультитранзакций в инсталляции, обновлённой (с помощью pg_upgrade) с версии старее 9.3 (Эндрю Гирт, Альваро Эррера)

    Обычно этот дефект проявлялся в ошибках типа «MultiXactId NNN has not been created yet -- apparent wraparound» (MultiXactId %u ещё не был создан: видимо, произошло зацикливание).

  • Когда в запускаемой вручную команде ANALYZE задаётся список столбцов, не нужно сбрасывать счётчик changes_since_analyze целевой таблицы (Том Лейн)

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

  • Исправление ошибки в ANALYZE с завышением показателя n_distinct для столбца, содержащего уникальные или почти уникальные значениями и вместе с тем множество NULL (Том Лейн)

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

  • Недопущение запуска при автоочистке нескольких рабочих процессов для одного общего каталога (Альваро Эррера)

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

  • Исправление ошибки при обработке пометки/восстановления позиции в B-дереве (Кевин Гриттнер)

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

  • Предупреждение двойного освобождения блокировки буфера при отказе от попытки удаления страницы индекса-B-дерева (Том Лейн)

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

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

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

  • Предотвращение бесконечного цикла при построении индексов GiST для геометрических столбцов с составными значениями, содержащими NaN (Том Лейн)

  • Предупреждение сбоя при сканировании с поиском ближайших соседей (упорядоченного (ORDER BY) по расстоянию) по индексу contrib/btree_gist, построенному по столбцу interval (Питер Гейган)

  • Исправление ошибки «PANIC: failed to add BRIN tuple» (ПАНИКА: не удалось добавить кортеж BRIN), возникавшей при попытке изменить элемент индекса BRIN (Альваро Эррера)

  • Предупреждение возможных сбоев при остановке фонового рабочего процесса (Дмитрий Иванов)

  • Исправление поведения в PL/pgSQL предложения INTO внутри команд IMPORT FOREIGN SCHEMA (Том Лейн)

  • Исправление кода contrib/btree_gin, чтобы он корректно выдавал наименьшее возможное значение bigint (Питер Эйзентраут)

  • Наделение libpq способностью корректно декодировать версию сервера по схеме нумерации, которая вскоре будет принята (Питер Эйзентраут)

    Для выпусков после 9.6 планируется перейти на нумерацию версий по схеме с двумя, а не тремя компонентами. Поэтому нужно, чтобы PQserverVersion() возвращала правильное значение с такой нумерацией.

  • Исправление в ecpg кода обработки элементов массива unsigned long long (Михаэль Мескес)

  • В pg_dump с одновременно заданными ключами -c и -C не должна выдаваться команда CREATE SCHEMA public (Дэвид Джонсон, Том Лейн)

  • Улучшение обработки SIGTERM/control-C в параллельном режиме pg_dump и pg_restore (Том Лейн)

    Обеспечение своевременного завершения рабочих процессов и передачи команд отмены запросов в подключённые рабочие процессы, в случае, если они выполняют какие-либо длительные операции, например CREATE INDEX.

  • Корректировка выдачи ошибок в параллельном режиме pg_dump и pg_restore (Том Лейн)

    Ранее ошибки, выдаваемые рабочими процессами pg_dump или pg_restore, могли никогда не достигать консоли пользователя, так как они проходили через главный процесс, и были возможны различные сценарии взаимоблокировки, когда главный процесс не мог передавать сообщения. Теперь вместо этого всё будет просто выводиться в stderr. В некоторых случаях при этом возможны повторы сообщений (например, когда все рабочие процессы сообщают об отключении главного), но это представляется лучшим вариантом, чем терять сообщения.

  • Обеспечение корректного отключения параллельных процессов pg_dump и pg_restore в Windows в случае ошибки (Кётаро Хоригути)

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

  • Параллельный pg_dump должен завершаться штатно при попытке подключения к резервному серверу (Магнус Хагандер)

    Такое использование не поддерживается (если только не применяется --no-synchronized-snapshots), но эта ошибка не обрабатывалась должным образом.

  • Улучшение поведения pg_dump при сборке без поддержки zlib (Кётаро Хоригути)

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

  • Добавление для pg_basebackup параметра -Z 0, позволяющего отключить сжатие (Фудзии Масао)

  • Корректировка в makefile правила для безопасной сборки разделяемых библиотек AIX в параллельном режиме (Ной Миш)

  • Исправление тестов TAP и скриптов MSVC для работы с каталогом сборки, путь к которому содержит пробелы (Микаэль Пакье, Кётаро Хоригути)

  • Более предсказуемое поведение в выборе ошибки «statement timeout» (тайм-аут оператора) или «lock timeout» (тайм-аут блокировки) (Том Лейн)

    В сильно загруженных системах регрессионные тесты иногда выдавали ошибку «lock timeout» (тайм-аут блокировки), хотя прежде этого должен был случиться тайм-аут оператора.

  • Адаптация регрессионных тестов к датской и валлийской локалям (Джефф Джейнс, Том Лейн)

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

  • Приведение нашей копии кодов часовых поясов в соответствие с выпущенной IANA версией tzcode 2016c (Том Лейн)

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

  • Обновление данных часовых поясов до версии tzdata 2016f, включающее новые правила перехода на летнее время в Кемерове и Новосибирске, а также корректировку исторических данных для Азербайджана, Белоруссии и Марокко.