E.30. Выпуск 9.5.15

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

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

E.30.1. Миграция на версию 9.5.15

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

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

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

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

    Эти функции должны возвращать NULL, а не выдавать ошибку при получении неверного OID. Некоторые из этих функций делали это и прежде, но не все. Кроме того, в функции has_column_privilege() на некоторых платформах могли иметь место и другие сбои.

  • Недопущение замедления порядка O(N^2) в функциях match/split с регулярными выражениями при обработке длинных строк (Эндрю Гирт)

  • Исправление дефекта в обработке стандартных многосимвольных операторов, следующих непосредственно за комментарием или символами + и - (Эндрю Гирт)

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

  • Недопущение замедления порядка O(N^3) при обработке лексическим анализатором длинных строк из символов + или - (Эндрю Гирт)

  • Исправление некорректного выполнения подчинённых планов при сканировании внешнего запроса в обратном направлении (Эндрю Гирт)

  • Исправление ошибочного поведения UPDATE/DELETE ... WHERE CURRENT OF ... после перемещения курсора (Том Лейн)

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

  • Исправление в функции EvalPlanQual обработки узлов InitPlan, которые выполняются по условию (Эндрю Гирт, Том Лейн)

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

  • Исправление проверок классов символов для корректной поддержки в Windows символов Unicode выше U+FFFF (Том Лейн, Кэндзи Уно)

    Эта ошибка проявлялась в операциях полнотекстового поиска, а также в работе модулей contrib/ltree и contrib/pg_trgm.

  • Смена владельца последовательности, принадлежащей сторонней таблице, при выполнении ALTER OWNER для этой таблицы (Питер Эйзентраут)

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

  • Обеспечение обработки сервером уже полученных прерываний NOTIFY и SIGTERM до начала ожидания данных от клиента (Джефф Джейнс, Том Лейн)

  • Устранение ошибки, приводившей к выделению лишней памяти для строки результатов array_out() (Кэйити Хиробэ)

  • Ликвидация утечки памяти при сканировании индекса SP-GiST (Том Лейн)

    Сколько-нибудь значительное проявление этой утечки наблюдалось, только когда для ограничения-исключения, использующего SP-GiST, в индекс поступало много записей.

  • Закрытие файла сопоставлений в ApplyLogicalMappingFile() после завершения его использования (Томаш Вондра)

    Ранее дескриптор файла терялся, что могло в итоге приводить к сбоям при логическом декодировании.

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

  • Предотвращение запуска сервера со значением wal_level, недостаточно большим для поддержки существующего слота репликации (Андрес Фройнд)

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

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

  • Исправление поведения событийных триггеров при обработке вложенных команд ALTER TABLE (Микаэль Пакье, Альваро Эррера)

  • Передача параллельным исполнителям времени начала оператора и транзакции от родительского процесса (Константин Книжник)

    Тем самым исправлено поведение таких функций, как transaction_timestamp(), выполняющихся в параллельном исполнителе.

  • Исправление логики переработки файла WAL для правильного выполнения этой операции на ведомых серверах (Микаэль Пакье)

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

  • Исправление обработки времени фиксации транзакций в процессе восстановления (Масахико Савада, Микаэль Пакье)

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

  • Использование случайной затравки для random() в initdb, а также в сервере, запускаемом в режиме начальной загрузки и в монопольном режиме (Ной Миш)

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

  • Возможность прерывания операции выделения памяти в DSM (Крис Трэверс)

  • Исправление поведения при динамическом включении параметра full_page_writes (Кётаро Хоригути)

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

  • Выполнение операции fsync, ранее упущенной, для каталога слотов репликации (Константин Книжник, Микаэль Пакье)

  • Устранение неожиданных тайм-аутов при использовании wal_sender_timeout на медленном сервере (Ной Миш)

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

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

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

  • Отказ от вызова обработчиков atexit при обработке SIGQUIT (Хейкки Линнакангас)

  • Исключение сопоставлений пользователей для сторонних серверов из состава расширений (Том Лейн)

    При выполнении CREATE USER MAPPING в скрипте расширения для создаваемого сопоставления добавлялась зависимость, чего не должно быть. Сопоставления пользователей, как и роли, не могут быть членами расширений.

  • Исправление поведения syslogger в случае ошибок при попытке открыть файлы CSV (Том Лейн)

  • Исправление кода psql, а также примеров в документации, чтобы функция PQconsumeInput() вызывалась перед PQnotifies() (Том Лейн)

    Тем самым решена проблема, когда psql не выдавал полученное сообщение NOTIFY до следующей команды.

  • Устранение возможной несогласованности при сортировке различных имён объектов в pg_dump (Джейкоб Чемпион)

  • Исправление pg_restore, чтобы при выдаче команд DISABLE/ENABLE TRIGGER имя таблицы дополнялось схемой (Том Лейн)

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

  • В pg_upgrade исправлена обработка событийных триггеров в расширениях (Харибабу Комми)

    Ранее pg_upgrade не сохранял связь событийных триггеров с расширениями.

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

  • Ограничение числа размерностей в значениях cube во всех функциях contrib/cube (Андрей Бородин)

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

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

    Ранее она пыталась найти словарь по пути поиска, но могла не обнаружить его, если путь поиска был ограничен.

  • Устранение проблем при сборке в macOS 10.14 (Mojave) (Том Лейн)

    Усовершенствование скрипта configure, чтобы в CPPFLAGS добавлялся ключ -isysroot; без этого PL/Perl и PL/Tcl нельзя сконфигурировать или собрать в macOS 10.14. Значение sysroot можно переопределить во время конфигурирования или сборки, установив переменную PG_SYSROOT в аргументах configure или make.

    Теперь рекомендуется, чтобы для связанных с Perl расширений во флагах компилятора указывалось $(perl_includespec), а не -I$(perl_archlibexp)/CORE. Второй вариант по-прежнему будет работать на большинстве платформ, но не в последних macOS.

    Также теперь не требуется указывать вручную ключ --with-tclconfig, чтобы собрать PL/Tcl в последних версиях macOS.

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

    Это изменение вызвано тем, что Perl теперь по умолчанию не включает текущий каталог в свой путь поиска.

  • Реализована возможность запускать регрессионные тесты в Windows с учётной записью администратора (Эндрю Дунстан)

    Чтобы это было безопасно, pg_regress теперь лишает себя расширенных прав при запуске.

  • Поддержка сборки в Windows с Visual Studio 2015 и Visual Studio 2017 (Микаэль Пакье, Харибабу Комми)

  • Снятие запрета на возврат из функций сравнения btree значений INT_MIN (Том Лейн)

    До настоящего времени мы не позволяли типозависимым функциям сравнения возвращать INT_MIN, благодаря чему вызывающий код мог сменить порядок сортировки, просто изменив знак результата сравнения. Однако это могло вызывать проблемы с функциями сравнения, возвращающими непосредственно результат memcmp(), strcmp() и подобных функций, так как POSIX не накладывает на него никаких ограничений. Как минимум некоторые последние версии memcmp() могут возвращать INT_MIN, что приводило к нарушению порядка сортировки. В связи с этим мы убрали это ограничение. Там же, где требуется поменять порядок сортировки на противоположный, теперь нужно использовать макрос INVERT_COMPARE_RESULT().

  • Устранение риска рекурсии при обработке сообщений об аннулировании общего кеша (Том Лейн)

    Эта ошибка могла привести, например, к сбою при обращении к системному каталогу или индексу, который был только что обработан командой VACUUM FULL.

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

  • Сохранение и восстановление глобальных переменных SPI в SPI_connect() и SPI_finish() (Чепмен Флэк, Том Лейн)

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

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

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

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

    Добавлены новые типы-объединения PGAlignedBlock и PGAlignedXLogBlock, которые должны использоваться вместо простых массивов char, чтобы компилятор гарантированно выравнивал адрес начала буфера. В результате устраняется риск аварийного сбоя на платформах, чувствительных к выравниванию, и может увеличиться быстродействие даже на тех платформах, где выравнивание не требуется.

  • Приведение в src/port/snprintf.c значения результата snprintf() в соответствие со стандартом C99 (Том Лейн)

    На платформах, где этот код используется (в основном в Windows), его несовременное поведение (не соответствующие C99) могло препятствовать выявлению переполнения буфера, если вызывающий код рассчитывал на семантику C99.

  • Требование обязательного использования -msse2 при сборке компилятором clang для i386 (Андрес Фройнд)

    Тем самым решается проблема отсутствия проверок переполнения при операциях с плавающей точкой.

  • Исправление в configure проверки, определяющей, результат какого типа возвращает strerror_r() (Том Лейн)

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

  • Обновление данных часовых поясов до версии tzdata 2018g, включающее изменения правил перехода на летнее время в России (Волгограде), Чили, Марокко и на Фиджи, а также корректировку исторических данных для Китая, Гавайев, Японии, Макао и Северной Кореи.