E.45. Выпуск 10.5

Дата выпуска: 2018-08-09

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

E.45.1. Миграция на версию 10.5

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

Если вы обновляете сервер с более ранней версии, чем 10.4, см. также Раздел E.46.

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

  • Осуществление полного сброса состояния libpq между попытками соединения (Том Лейн)

    Непривилегированный пользователь dblink или postgres_fdw мог обойти проверки, предназначенные для предотвращения использования учётных данных на стороне сервера, например, файла ~/.pgpass, принадлежащего пользователю ОС, от имени которого работает сервер. В частности, уязвимость затрагивает серверы, принимающие локальные подключения с методом peer. Возможны были и другие атаки, например, SQL-инъекции в сеансе postgres_fdw. Для атаки на postgres_fdw через эту уязвимость пользователь должен был иметь возможность создавать объект стороннего сервера с нужными параметрами подключения, но атаку на dblink мог произвести любой пользователь, имеющий к нему доступ. Вообще любой пользователь, имеющий возможность менять параметры подключения для приложения на базе libpq, мог производить непредусмотренные действия, но другие эффективные сценарии эксплуатации этого сложно придумать. Мы благодарим Андрея Красичкова за сообщение о данном дефекте. (CVE-2018-10915)

  • Исправление поведения INSERT ... ON CONFLICT UPDATE с более сложным представлением, чем просто SELECT * FROM ... (Дин Рашид, Амит Ланготе)

    Ошибочное развёртывание изменяемого представления могло приводить к сбоям или ошибкам «attribute ... has the wrong type» (атрибут ... имеет неверный тип), если список SELECT представления не соответствовал в точности списку столбцов нижележащей таблицы. Более того, развив атаку через эту уязвимость, злоумышленник мог изменять столбцы, не имея для них права UPDATE, но имея права INSERT и UPDATE для некоторых других столбцов в таблице. Любой пользователь также мог эксплуатировать её для раскрытия содержимого памяти сервера. (CVE-2018-10925)

  • Обеспечение своевременного изменения полей relfrozenxid и relminmxid в «зафиксированных» системных каталогах (Андрес Фройнд)

    Из-за чрезмерно оптимистичного кеширования эти изменения могли оказаться невидимыми для других сеансов, что приводило к случайным ошибкам и/или разрушению данных. Для общих каталогов, таких как pg_authid, проблема была ещё острее, так как устаревшие кешированные данные могли попадать в новые сеансы и оставаться в существующих.

  • Исправление поведения в ситуации, когда недавно повышенный сервер аварийно завершается до окончания обработки первой контрольной точки после восстановления (Микаэль Пакье, Кётаро Хоригути, Паван Деоласи, Альваро Эррера)

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

  • Исключение выдачи фантомной записи WAL при переработке полностью нулевой страницы индекса btree (Амит Капила)

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

  • При воспроизведении WAL добавлена защита от некорректной длины записи, превышающей 1 ГБ (Микаэль Пакье)

    Подобные данные должны считаться некорректными. Ранее код пытался выделить такой объём и получал критическую ошибку, что делало восстановление невозможным.

  • При завершении восстановления запись в файл истории линии времени должна откладываться, насколько это возможно (Хейкки Линнакангас)

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

  • Увеличение скорости воспроизведения WAL для транзакций, удаляющих множество отношений (Фудзии Масао)

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

  • Увеличение скорости освобождения блокировки при воспроизведении WAL ведомым сервером (Томас Манро)

  • Обеспечение согласованной передачи состояния логической трансляции передатчиками WAL (Саймон Риггс, Савада Масахико)

    Ранее код не мог правильно определить, удалось ли нагнать вышестоящий сервер.

  • Обеспечение наличия снимка при выполнении функций ввода типа данных в подписчиках логической репликации (Мин-Цюань Тран, Альваро Эррера)

    Отсутствие снимка в некоторых случаях приводило к сбоям, например, при вводе доменов с ограничениями, определяемыми функциями на языке SQL.

  • Устранение дефектов в процедуре обработки снимков при логическом декодировании, приводивших к ошибкам декодирования в редких случаях (Арсений Шер, Альваро Эррера)

  • Добавление обработки подтранзакций в рабочих процессах синхронизации таблиц при логической репликации (Амит Хандекар, Роберт Хаас)

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

  • Обеспечение корректного сброса кешированного списка индексов таблицы после сбоя при создания индекса (Питер Гейган)

    Ранее в этом списке могли оставаться OID нерабочих индексов, что могло приводить к проблемам в том же сеансе.

  • Исправление некорректной обработки пустых несжатых страниц списка идентификаторов в индексах GIN (Шивасубраманьян Рамасубраманьян, Александр Коротков)

    Это могло привести к сбою проверочного утверждения после выполнения pg_upgrade для индексов GIN версии до 9.4 (в 9.4 и последующих версиях такие страницы не создаются).

  • Выравнивание массивов безымянных семафоров POSIX для уменьшения разделения линий кеша (Томас Манро)

    Это снижает конкуренцию в многопроцессорных системах и устраняет падение производительности (наблюдаемое в сравнении с предыдущими выпусками) в Linux и FreeBSD.

  • Обеспечение реакции на сигналы в процессе, производящем параллельное сканирование индекса (Амит Капила)

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

  • Обеспечение реакции на сигналы в процессе VACUUM в цикле удаления страниц B-дерева (Андрес Фройнд)

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

  • Исправление ошибки с оценкой стоимости соединения по хешу при оптимизации inner_unique (Дэвид Роули)

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

  • Исправление некорректной оптимизации классов эквивалентности со столбцами составного типа (Том Лейн)

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

  • Исправление планировщика с целью устранения ошибок «ORDER/GROUP BY expression not found in targetlist» (выражение ORDER/GROUP BY не найдено в целевом списке) при выполнении некоторых запросов с функциями, возвращающими множества (Том Лейн)

  • Исправление обработки ключей секционирования с типами данных, которые используют полиморфный класс операторов btree; например, это касается массивов (Амит Ланготе, Альваро Эррера)

  • Исправление синтаксиса конструкции SQL-стандарта FETCH FIRST, чтобы она принимала ($n), как того требует стандарт (Эндрю Гирт)

  • Удаление недокументированного ограничения, не допускающего дублирования столбцов в ключах разбиения (Юго Нагата)

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

    Ранее такое использование разрешалось, но работало ненадёжно.

  • Исправление в EXPLAIN учёта использования ресурсов, в частности, обращений к буферам (Амит Капила, Томас Манро)

  • Исправление поведения SHOW ALL, чтобы эта команда показывала все параметры членам роли pg_read_all_settings и позволяла этим пользователям видеть имя файла и номер строки в представлении pg_settings (Лоренц Альбе, Альваро Эррера)

  • Корректное добавление схемы к именам ряда объектов в выводе getObjectDescription и getObjectIdentity (Кётаро Хоригути, Том Лейн)

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

  • Исправление проверки типа CREATE AGGREGATE с тем, чтобы к агрегатам с переменными аргументами можно было присоединять функции поддержки распараллеливания (Алексей Баштанов)

  • Расширение счётчика строк в команде COPY FROM с 32 до 64 бит (Дэвид Роули)

    Тем самым были решены две проблемы с входными данными, содержащими более 4G строк: COPY FROM WITH HEADER терял одну строку на каждые 4G строк (не только первую), а в сообщениях об ошибках выводилось неверное количество строк.

  • Восстановление возможности удаления слотов репликации в однопользовательском режиме (Альваро Эррера)

    Она была непреднамеренно утрачена в выпуске 10.0.

  • Исправление некорректных результатов функции variance(int4) и связанных агрегатов при работе в параллельном режиме агрегирования (Дэвид Роули)

  • Внесение корректив в обработку узлов TEXT и CDATA в выражениях столбцов xmltable() (Маркус Винанд)

  • Защита от возможной ошибки в функции OpenSSL RAND_bytes() (Дин Рашид, Микаэль Пакье)

    При редких обстоятельствах это упущение могло приводить к отказам с сообщением «could not generate random cancel key» (не удалось сгенерировать случайный ключ отмены), устранить которые можно было, только перезапустив главный процесс.

  • Исправление поведения libpq в некоторых случаях, когда задаётся hostaddr (Хари Бабу, Том Лейн, Роберт Хаас)

    Функция PQhost() в некоторых случаях выдавала некорректные или вводящие в заблуждение результаты. Теперь она единообразно возвращает имя узла (если оно указано), или адрес узла (если указан только он), или имя узла по умолчанию (обычно /tmp либо localhost, если опущены оба параметра).

    Также при проверке сертификата SSL с именем сервера могло сравниваться неправильное значение.

    Кроме того, поле с именем узла в ~/.pgpass могло сравниваться с неправильным значением. Теперь это поле сравнивается с именем сервера (если оно указано), либо с его адресом (если указан только он), либо с localhost (если опущены оба параметра).

    Помимо этого, когда значение hostaddr нельзя было разобрать, выдавалось неправильное сообщение об ошибке.

    А когда параметры host, hostaddr или port содержат списки через запятую, libpq теперь аккуратнее обрабатывает пустые элементы списков (воспринимая их как значения по умолчанию).

  • Добавление в библиотеку ecpg pgtypes функции освобождения строк для исключения проблем с управлением памятью в разных модулях (Такаюки Цунакава)

    В Windows могут происходить сбои, если вызов free для некоторого блока памяти производится не из той DLL, которая выделила память (с помощью malloc). Библиотека pgtypes иногда возвращает строки, которые должен освободить вызывающий код, и сделать это корректно оказывается невозможно. Добавленная функция PGTYPESchar_free() является просто обёрткой free, позволяющей приложениям произвести освобождение по правилам.

  • Исправление поддержки в ecpg переменных long long в Windows, а также на других платформах, где strtoll/strtoull объявлены нестандартно или не объявлены вовсе (Хыонг Дангминь, Том Лейн)

  • Исправление ошибки с определением типа SQL-оператора в PL/pgSQL, когда изменение правила приводило к изменению семантики оператора в рамках сеанса (Том Лейн)

    Эта ошибка приводила к сбоям проверочных утверждений или, в редких случаях, к тому, что указание INTO STRICT не работало должным образом.

  • Исправление запроса пароля в клиентских программах, чтобы отображение корректно отключалось в Windows, когда stdin — не терминал (Мэтью Стикни)

  • Доработка исправления некорректного заключения в кавычки значений для переменных GUC со списками при формировании дампа (Том Лейн)

    Предыдущее исправление для заключения в кавычки значения search_path и других переменных со списками в выводе pg_dump, как оказалось, привело к ошибкам со списками с пустыми элементами и риску потери части длинных файловых путей.

  • В pg_dump устранено упущение, когда свойства REPLICA IDENTITY для индексов ограничений не выгружались (Том Лейн)

    Уникальные индексы, созданные вручную, помечались корректно, а индексы, созданные ограничениями UNIQUE или PRIMARY KEY — нет.

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

    Ранее проверка могла сработать некорректно при выключении сервера в незамедлительном режиме.

  • Исправление в contrib/hstore_plperl просмотра скалярных ссылок Perl и предотвращение сбоя в случае, если не удаётся найти хеш-ссылку там, где она ожидается (Том Лейн)

  • Устранение сбоя в функции модуля contrib/ltree при получении на вход пустого массива (Пьер Дюкроке)

  • Исправление обработки ошибок в ряде мест, где мог выдаваться некорректный код ошибки (Микаэль Пакье, Том Лейн, Магнус Хагандер)

  • Переоформление скриптов Makefile для обеспечения компоновки программ с собранными в том же дереве библиотеками (например, libpq.so), а не с теми, что могут уже находиться в системных каталогах библиотек (Том Лейн)

    Это позволяет избежать проблем при сборке на платформах, где представлены старые версии библиотек PostgreSQL.

  • Обновление данных часовых поясов до версии tzdata 2018e, включающее изменение правил перехода на летнее время в Северной Корее, а также корректировку исторических данных для Чехословакии.

    В это обновление вошло переопределение «летнего времени», которое действует в Ирландии, а также действовало в прошлом в Намибии и в Чехословакии. В этих юрисдикциях стандартное время действует летом, а время для экономии света — зимой, поэтому при переходе на это время сдвиг производится на час назад, а не на час вперёд. Это не влияет ни на фактическое смещение от UTC, ни на используемое сокращение часового пояса; эта особенность проявляется лишь в том, что в таких случаях столбец is_dst в представлении pg_timezone_names будет содержать true для зимнего периода, и false для летнего.