E.25. Выпуск 9.5.20

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

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

E.25.1. Миграция на версию 9.5.20

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    В частности, в результате допущенной ошибки поле 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);
  • Исправление проверки целочисленного переполнения при умножении интервалов в особых случаях (Юя Ватари)

  • Исправление некорректной логики сжатия для списков идентификаторов 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 обработки циклических зависимостей в представлениях (Том Лейн)

    В некоторых случаях представление может зависеть от объекта, который программа pg_dump должна выгружать после представления; например, запрос, использующий группировку по столбцу первичного ключа, может быть по сути некорректным без первичного ключа. Для решения этой проблемы теперь выдаётся пустая команда CREATE VIEW, призванная лишь определить имена и типы столбцов представления, а затем выдаётся CREATE OR REPLACE VIEW с полноценным определением представления. Ранее предварительное определение создавалось командой CREATE TABLE, а затем созданная таблица автомагически преобразовывалась в представление командой CREATE RULE. Новый подход уже подтвердил свою состоятельность в PostgreSQL версии 10 и более новых. Теперь мы решили перенести изменение в старые версии, так как поступила жалоба на провоцируемые предыдущим подходом неуместные ошибки с сообщениями об идентификаторе реплики в представлении. Также новый метод позволяет предупредить проблемы, возникавшие при попытке восстановления подобных представлений с ключом --clean.

  • Обеспечение ожидаемого порядка в выводе 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_rewind при подключении к работающему кластеру, по подобию pg_dump (Александр Кукушкин)

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

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

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

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

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

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

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

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

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

  • Предоставление возможности выполнения configure --with-python в конфигурациях, где обнаруживается только python3 или python2 (Питер Эйзентраут, Том Лейн)

    Изменение порядка поиска на "python, python3, python2", чтобы configure можно было выполнять в ситуациях (встречающихся всё чаще), когда в системе не находится исполняемая программа с именем python. При этом по-прежнему сохраняется возможность переопределить выбор версии python с помощью переменной окружения PYTHON.

  • Исправление в 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, включающее изменения правил перевода на летнее время на Фиджи и острове Норфолк, а также корректировку исторических данных для Альберты, Австрии, Бельгии, Британской Колумбии, Камбоджи, Гонконга, штата Индиана (графства Перри), Калининграда, штатов Кентукки и Мичиган, острова Норфолк, Южной Кореи и Турции.