E.22. Выпуск 9.5.4
Дата выпуска: 2016-08-11
В этот выпуск вошли различные исправления, внесённые после версии 9.5.3. За информацией о нововведениях версии 9.5 обратитесь к Разделу E.26.
E.22.1. Миграция на версию 9.5.4
Если используется версия 9.5.X, выгрузка/восстановление базы не требуется.
Однако если вы обновляете сервер с более ранней версии, чем 9.5.2, см. Раздел E.24.
E.22.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 - NNNhas 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, включающее новые правила перехода на летнее время в Кемерове и Новосибирске, а также корректировку исторических данных для Азербайджана, Белоруссии и Марокко.