E.12. Выпуск 11.6

Дата выпуска: 2019-11-14

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

E.12.1. Миграция на версию 11.6

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

Однако если вы используете расширение contrib/intarray с индексом GiST и применяете оператор <@ для поиска по индексу, примите к сведению соответствующее замечание в списке изменений.

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

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

  • Устранение сбоя команды ALTER TABLE SET с нестандартным параметром отношения (Микаэль Пакье)

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

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

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

  • Исключение попыток заморозить в ходе VACUUM идентификатор старой мультитранзакции, включающей всё ещё выполняющуюся транзакцию (Натан Боссарт, Джереми Шнайдер)

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

  • Устранение ошибки при выполнении SET CONSTRAINTS ... DEFERRED с секционированными таблицами, сопровождаемой некорректным сообщением об отсутствии триггеров (Альваро Эррера)

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

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

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

  • Реализация должной обработки выражений смещения в предложениях WINDOW при манипуляциях с выражениями запросов (Эндрю Гирт)

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

  • Исправление обработки переменных-кортежей в выражениях WITH CHECK OPTION и выражениях политик защиты на уровне строк (Андрес Фройнд)

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

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

  • Предотвращение двойного освобождения памяти в случае, когда триггер BEFORE UPDATE возвращает старый кортеж «как есть» и такой триггер не последний (Томас Мунро)

  • Устранение сбоя при проверке условия x = ANY (массив) или при подобной операции, где в качестве массива выступает константа NULL (Том Лейн)

  • Устранение ошибки «unexpected relkind» (неожиданный вид отношения) при попытке обращения запроса к таблице TOAST (Джон Сюй, Микаэль Пакье, Том Лейн)

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

  • Передача ожидаемого контекста ошибки в случае возникновения ошибки при изменении параметров GUC в ходе запуска параллельного исполнителя (Томас Мунро)

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

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

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

    В некоторых местах кода были попытки вызывать эту функцию и для файлов, открываемых только для чтения, но на некоторых платформах при этом возникают ошибки вида «bad file descriptor» (плохой дескриптор файла).

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

    Ранее существовало жёсткое ограничение размера входной строки в 0.25 ГБ, но сейчас преобразование будет успешным, если результат преобразования умещается в 1 ГБ.

  • Исключение ненужного поиска в каталоге при зачистке страницы кучи (Томас Мунро)

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

  • Выбор по возможности более компактных хранилищ кортежей для оконных функций (Эндрю Гирт)

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

  • Устранение запрета на выполнение JIT-компиляции операций сравнения для группировки хеш-таблиц, приводившего к потере производительности (Андрес Фройнд)

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

  • Обеспечение удаления временных файлов WAL и истории по завершении восстановления архива (Савада Масахико)

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

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

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

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

  • Недопущение нежелательной задержки при отключении процесса walsender, участвующего в логической репликации (Крейг Рингер, Альваро Эррера)

  • Исправление обработки тайм-аута в процессах walreceiver, участвующих в логической репликации (Жюльен Руо)

    Ошибочная логика препятствовала использованию wal_receiver_timeout при логической репликации.

  • Исправление передачи меток времени в сообщениях репликации для логического декодирования (Джефф Джейнс)

    В частности, в результате допущенной ошибки поле pg_stat_subscription.last_msg_send_time обычно содержало NULL.

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

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

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

  • Исправление поведения ALTER SYSTEM при дублировании переменных в postgresql.auto.conf (Иэн Барвик)

    Сама команда ALTER SYSTEM не может привести файл postgresql.auto.conf в такое состояние, но это могут сделать внешние программы. Теперь дублирующиеся назначения переменных будут удаляться, а новое значение (если оно назначается) будет добавляться в конце файла.

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

  • Ликвидация сообщений о брошенных соединениях при использовании аутентификации PAM (Том Лейн)

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

  • Исправление разбора входной строки time with time zone, содержащей неполную дату (Александр Лахин)

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

  • Исправление некорректного поведения bitshiftright() (Том Лейн)

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

    Если в ваших таблицах могли сохраниться некорректные данные в результате выполнения bitshiftright(), их можно исправить примерно так:

    UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
  • Восстановление возможности получения информации о типах из предложения AS в json[b]_populate_record() и json[b]_populate_recordset() (Том Лейн)

    Если в качестве аргумента функции передаётся NULL и объявление составного типа отсутствует, информация о типах может извлекаться из предложения AS. Этот вариант записи не является рекомендуемым, но раньше он работал, и теперь будет работать снова.

  • Устранение сбоя при выборе узла пространства имён в XMLTABLE (Чепмен Флэк)

  • Исправление проверки целочисленного переполнения при умножении интервалов в особых случаях (Юя Ватари)

  • Ликвидация утечек памяти в функциях lower(), upper() и initcap() при использовании правил сортировки ICU (Константин Книжник)

  • Устранение сбоев при обработке некорректных данных аффиксов в словарях текстового поиска ispell (Артур Закиров)

  • Исправление некорректной логики сжатия для списков идентификаторов GIN (Хейкки Линнакангас)

    Для одного элемента в списке идентификаторов может требоваться 7 байт, если расстояние между соседними идентификаторами проиндексированных кортежей превышает 16 ТБ. В одном месте логика обработки этого списка не учитывала это, и значение могло записываться в 6-байтный буфер. В принципе это могло приводить и к выходу за границы стека, но на большинстве архитектур следующий байт оказывался в блоке выравнивания, так что это не причиняло вреда. В любом случае вызвать эту ошибку было очень сложно.

  • Исправление обработки значений infinity, NaN и NULL в KNN-GiST (Александр Коротков)

    Порядок результатов запроса мог быть некорректным (отличаться от порядка простой сортировки результатов), если для отличных от NULL значений столбцов получались расстояния infinity или NaN.

  • Исправление поиска NULL в KNN-SP-GiST (Никита Глухов)

  • Поддержка ещё одного варианта названия локали норвежского букмола «Norwegian (Bokmål)» в Windows (Том Лейн)

  • Устранение ошибки компиляции клиентского кода ECPG, включающего заголовочный файл ecpglib.h, при определённом макросе ENABLE_NLS (Том Лейн)

    Этот дефект стал следствием некорректного размещения объявления функции ecpg_gettext() — она не должна быть видна в клиентском коде.

  • Обновление внутренней информации о сервере в psql после неожиданной потери соединения и успешного переподключения (Петер Биллен, Том Лейн)

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

  • Ликвидация в коде psql обращения по нулевому указателю, которое наблюдалось на некоторых платформах (Квентин Рамо)

  • Обеспечение ожидаемого порядка в выводе pg_dump одинаково названных триггеров и объектов политики защиты на уровне строк (Бенджи Гиллам)

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

  • Восстановление совместимости pg_dump с серверами старее версии 8.3 (Том Лейн)

    После одного из предыдущих исправлений pg_dump всегда пытался обратиться к каталогу pg_opfamily, который появился только в версии 8.3.

  • Реализация в pg_restore прочтения указания -f - как «выводить в stdout» (Альваро Эррера)

    Тем самым поведение pg_restore синхронизируется с поведением других приложений, и в частности, в версиях до 12 это теперь работает так же, как и в pg_restore в 12-ой версии, что упрощает создание скриптов выгрузки/восстановления, работающих с разными версиями PostgreSQL. До этого изменения программа pg_restore интерпретировала это указание как «выводить в файл с именем -», но такое поведение мало кому нужно.

  • Улучшение в pg_upgrade проверок использования типа данных, представление которого изменилось, например line (Томаш Вондра)

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

  • Выявление ошибок чтения файлов в процессе работы pg_basebackup (Дживан Чок)

  • Устранение в pg_basebackup излишних вызовов fsync() для выходных файлов; выполнение этого вызова только в конце резервного копирования (Микаэль Пакье)

    Ранее в случае медленной синхронизации файлов были возможны сбои из-за тайм-аутов.

  • Отключение тайм-аутов в pg_rewind при подключении к работающему кластеру, по подобию pg_dump (Александр Кукушкин)

  • Исправление ошибки при работе pg_waldump с ключом -s, когда запись продолжения WAL заканчивается ровно на границе страницы (Андрей Лепихов)

  • Включение в pg_waldump поля newitemoff в записи разделения страниц btree (Питер Гейган)

  • Устранение ненужного перевода строк в выводе pg_waldump с ключом --bkp-details при описании WAL-записей, отражающих запись полных страниц (Андрес Фройнд)

  • Устранение небольшой утечки памяти в pg_waldump (Андрес Фройнд)

  • Улучшение поведения vacuumdb с большим значением --jobs в случае нехватки файловых дескрипторов (Michael Paquier)

  • Исправление в PL/pgSQL обработки подмены составных типов (Том Лейн)

    Теперь корректно обрабатывается случай, когда между вызовами одной функции на PL/pgSQL составной тип полностью удаляется и создаётся новый тип с тем же именем. Переменные составного типа теперь будут приводится в соответствие с новым определением.

  • Игнорирование в contrib/amcheck нежурналируемых индексов при работе в режиме горячего резерва (Андрей Бородин, Питер Гейган)

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

  • Исправление в contrib/intarray классов операторов GiST для корректной работы оператора <@ с пустыми массивами (Том Лейн)

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

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

    Для приложений, производительность которых значительно пострадает от этого изменения, можно предложить два выхода: переключиться на индексы GIN, в которых нет такого дефекта, или заменить конструкцию столбец_массив <@ константный_массив на столбец_массив <@ константный_массив AND столбец_массив && константный_массив. Таким образом будет получена примерно та же производительность, что и раньше, и будут найдены все непустые подмножества данного константного массива, чего и можно было ранее ожидать от изначального запроса.

  • Исправление в configure проверки наличия libperl для совместимости с последними выпусками Red Hat (Том Лейн)

    Ранее проверка могла не работать, когда пользователь устанавливал в CFLAGS значение -O0.

  • Обеспечение корректной генерации кода циклических блокировок (spinlock) на PowerPC (Ной Миш)

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

  • Ликвидация зависимости от функции компилятора xlc, __fetch_and_add() на PowerPC (Ной Миш)

    Компилятор xlc версии 13 и новее интерпретирует эту функцию не так, как мы рассчитываем, в результате чего сборка PostgreSQL оказывается нерабочей. Для исправления был написан специальный ассемблерный код.

  • Отказ от использования ключа компилятора -qsrcmsg в AIX (Ной Миш)

    Таким образом удалось обойти внутреннюю ошибку компилятора xlc v16.1.0, и это повлияло лишь на формат выдаваемых компилятором сообщений об ошибках.

  • Исправление процедуры сборки MSVC для корректной обработки пробелов в пути к OpenSSL (Эндрю Дунстан)

  • Обновление данных часовых поясов до версии tzdata 2019c, включающее изменения правил перевода на летнее время на Фиджи и острове Норфолк, а также корректировку исторических данных для Альберты, Австрии, Бельгии, Британской Колумбии, Камбоджи, Гонконга, штата Индиана (графства Перри), Калининграда, штатов Кентукки и Мичиган, острова Норфолк, Южной Кореи и Турции.