E.48. Выпуск 11.7

Дата выпуска: 2020-02-13

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

E.48.1. Миграция на версию 11.7

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

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

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

  • Добавление отсутствовавших проверок прав для ALTER ... DEPENDS ON EXTENSION (Альваро Эррера)

    При обозначении объекта зависимым от расширения никакие проверки прав доступа не выполнялись. В результате этого упущения любой пользователь мог сделать так, чтобы процедуры, триггеры, матпредставления или индексы можно было удалить, имея право удалить какое-либо расширение. Теперь требуется, чтобы выполняющий эту команду пользователь был владельцем целевого объекта (это значит, что он сам может удалить этот объект). (CVE-2020-1720)

  • Обеспечение корректного переноса триггеров уровня строк во вложенные секции секционированных таблиц (Альваро Эррера)

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

  • Исправление кода подписчика логической репликации, чтобы должны образом вызывались триггеры UPDATE, связанные со столбцами (Питер Эйзентраут)

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

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

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

  • Устранение в коде подписчика логической репликации сбоя, возникавшего после изменений структуры отношений, входящих в подписку (Жеан-Гийом де Рорте, Вигнеш Си)

  • Ликвидация сбоя, возникавшего в подписчике логической репликации после отказа и перезапуска базы данных (Вигнеш Си)

  • Обеспечение сохранности результата pg_replication_slot_advance() со слотом физической репликации после перезагрузки сервера (Алексей Кондратов, Микаэль Пакье)

  • Увеличение эффективности логической репликации с применением REPLICA IDENTITY FULL (Константин Книжник)

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

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

    Исправленное теперь упущение проявлялось в предупреждениях «temporary file leak» (утечка временных файлов), появляющихся при выполнении соединений по хешу в параллельном режиме.

  • Предотвращение преждевременного отключения узлов плана Gather или GatherMerge, находящихся под узлом Limit (Амит Капила)

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

  • Увеличение эффективности параллельного выполнения соединений по хешу многоядерными процессорами (Ган Дэн, Томас Манро)

  • Ликвидация сбоя при параллельном выполнении CREATE INDEX в случае нехватки свободных слотов динамической общей памяти (Томас Манро)

    В этом случае должен происходить переход к непараллельному построению индекса.

  • Устранение утечки памяти, возникавшей при нехватке свободных слотов динамической общей памяти (Томас Манро)

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

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

  • Устранение ошибки, возникавшей при сбросе индексов по выражениям во временных таблицах с характеристикой ON COMMIT DELETE ROWS (Том Лейн)

  • Ликвидация возможности сбоя при операциях с индексом BRIN, в котором используются типы данных box, range и inet (Хейкки Линнакангас)

  • Исправление обработки удалённых страниц в индексах GIN (Александр Коротков)

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

  • Предотвращение сбоя, возможного при выполнении вложенного SELECT (узла SubPlan) в списке VALUES, выдающем несколько строк (Том Лейн)

  • Устранение сбоя при добавлении значений по умолчанию для «отсутствующих» атрибутов в ходе преобразования кортежей (Вик Фиринг, Эндрю Гирт)

    Ранее значения столбцов, добавленных командой ALTER TABLE ADD COLUMN с константным значением по умолчанию, могли считываться как NULL.

  • Устранения сбоя, возможного после ошибки в FileClose() (Ной Миш)

    Эту проблему можно было наблюдать, только если был включён параметр data_sync_retry, так как в противном случае ошибка в FileClose() приводит к аварийной остановке сервера (PANIC).

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

  • Улучшение вывода ошибок в функциях to_date() и to_timestamp() (Том Лейн, Альваро Эррера)

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

  • Устранение ошибочного сдвига на 1 результата функции EXTRACT(ISOYEAR FROM timestamp) с датами до нашей эры (Том Лейн)

  • Недопущение переполнения стека при обращении к представлениям information_schema в случае существования в системных каталогах представлений, которые ссылаются на себя же (Том Лейн)

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

  • Вывод NULL в качестве времени начала транзакции для процессов walsender в pg_stat_activity (Альваро Эррера)

    Ранее в столбце xact_start иногда могло отображаться время запуска процесса.

  • Увеличение производительности соединений по хешу с очень большими внутренними отношениями (Томас Манро)

  • Исправление расположения поля «Subplans Removed» (Подпланов удалено) в выводе EXPLAIN (Даниэль Густафссон, Том Лейн)

    В нетекстовых форматах это поле выдавалось внутри подгруппы «Plans», что приводило к нарушению синтаксиса. Теперь оно будет присоединяться к родительскому узлу плана (Append или MergeAppend), где и должно быть. В результате это поле переместится и в текстовом формате: если к тому же узлу плана присоединены ещё какие либо узлы InitPlan, поле «Subplans Removed» будет выводиться перед ними.

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

    В результате была ликвидирована проблема с производительностью, возникшая после исправления уязвимости CVE-2017-7484. Тогда исправление состояло во введении запрета на применение негерметичных операторов к статистике столбцов, которые не разрешено читать пользователю. Однако достаточно часто пользователям даются разрешения только для родительской секционированной таблицы, а не для каждой её секции в отдельности. В таких случаях пользователь может прочитать столбец через родительскую таблицу, поэтому описанная защитная мера не имеет смысла; её результатом было лишь ухудшение оценок планировщика.

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

  • Исключение из рассмотрения системных столбцов при обращении к расширенной статистике по самым частым значениям (Томаш Вондра)

    Тем самым предотвращаются ошибки планировщика «negative bitmapset member not allowed» (отрицательный элемент в битовой карте не допускается) при выполнении запросов с системными столбцами.

  • Исправление логики индексов BRIN для поддержки гипотетических индексов BRIN (Жюльен Руо, Хейкки Линнакангас)

    Ранее, если расширение, «помогающее выбрать индекс», подталкивало планировщик к плану с гипотетическим индексом BRIN, это приводило к ошибке, так как код оценки стоимости BRIN всегда пытался физически прочитать метастраницу индекса. Теперь добавлена проверка, является ли индекс гипотетическим; и в этом случае считается, что индекс имеет параметры по умолчанию.

  • Улучшено информирование об ошибках при попытках использовать автоматическое обновление представлений с правилами INSTEAD по условию (Дин Рашид)

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

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

  • Запрет на использование в ключе разбиения выражений, возвращающих псевдотипы, такие как record (Том Лейн)

  • Корректировка сообщения об ошибке при попытке создать индекс по выражению с недопустимыми типами (Амит Ланготе)

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

  • Рассмотрение типов данных и правил сортировки в конструкциях XMLTABLE при вычислении зависимостей представления или правила (Том Лейн)

    Ранее было возможно нарушить работу представления с XMLTABLE, удалив тип, который не фигурировал нигде больше в представлении. Данное исправление не корректирует зависимости ранее существовавших представлений, но повлияет на зависимости будущих.

  • Предотвращение нежелательного понижения регистра символов и сокращения параметров аутентификации RADIUS (Маркос Давид)

    Ранее при разборе pg_hba.conf эти поля воспринимались как идентификаторы SQL, но это некорректно в общем случае.

  • Исправление поведения NOTIFY, чтобы поступающие уведомления передавались клиенту до ReadyForQuery, а не после (Том Лейн)

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

  • Реализация в libpq возможности разобрать все связанные с GSS параметры подключения даже при компиляции кода без поддержки GSSAPI (Том Лейн)

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

  • Исправление некорректной обработки кодов формата %b и %B в функции ecpg PGTYPEStimestamp_fmt_asc() (Томаш Вондра)

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

  • Исправление поведения pg_dump/pg_restore в параллельном режиме в случае ошибки создания рабочих процессов (Том Лейн)

  • Предотвращение сбоя или блокировки при попытке завершить выполнение pg_dump/pg_restore сигналом (Том Лейн)

  • Рассмотрение подтипов массивов и диапазонов в поиске типов данных, не поддерживающих обновление, в pg_upgrade (Том Лейн)

  • Исправление проверки синтаксиса параметра createuser --connection-limit (Альваро Эррера)

  • Реализация корректного поведения при изменении типа, используемого переменной составного типа PL/pgSQL, в большем числе случаев (Ашутош Шарма, Том Лейн)

    Ранее, если составной тип удалялся и пересоздавался, при обращении к переменной PL/pgSQL, имеющей такой тип, могли выдаваться ошибки «could not open relation with OID NNNN» (не удалось открыть отношение с OID NNNN).

  • Устранение сбоя в postgres_fdw при попытке передать удалённому серверу команду вида UPDATE remote_tab SET (x,y) = (SELECT ...) (Том Лейн)

  • Ограничение в contrib/dict_int минимально допустимого значения maxlen числом 1 (Томаш Вондра)

    Тем самым предотвращаются сбои с бессмысленными значениями данного параметра.

  • Введение в реализованной в contrib/tablefunc функции crosstab() запрета на значения NULL в категориях (Джо Конвей)

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

  • Исправление в configure проверки функции OpenSSL SSL_clear_options(), чтобы она работала и с версиями OpenSSL ниже 1.1.0 (Микаэль Пакье, Даниэль Густафссон)

    Устранённая теперь проблема мешала установить желаемые параметры сжатия SSL при сборке PostgreSQL со старой версией OpenSSL.

  • Добавление пометки PGDLLIMPORT для некоторых переменных GUC, связанных с тайм-аутами и статистикой, чтобы их могли использовать расширения в Windows (Паскаль Легран)

    Это изменение затронуло переменные idle_in_transaction_session_timeout, lock_timeout, statement_timeout, track_activities, track_counts и track_functions.

  • Устранение утечки памяти в коде проверки целостности контекстов памяти «slab» (Томаш Вондра)

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

  • Устранение дублирования статистических записей, выдаваемых механизмом сбора статистики LWLock (Фудзии Масао)

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

  • Устранение условий гонки, при которых могла задерживаться доставка межпроцессорных сигналов в Windows (Амит Капила)

    В частности, это проявлялось в странных нарушениях синхронизации сообщений NOTIFY.

  • Добавление нескольких повторений для операции открытия файла в случае получения ошибки ERROR_ACCESS_DENIED в Windows (Александр Лахин, Том Лейн)

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