E.46. Выпуск 10.6

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

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

E.46.1. Миграция на версию 10.6

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

Однако если вы используете расширение pg_stat_statements, прочитайте запись о нём в списке изменений.

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

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

  • Корректное заключение в кавычки имён переходных таблиц в командах CREATE TRIGGER ... REFERENCING, которые выдаёт pg_dump (Том Лейн)

    Отсутствием кавычек мог воспользоваться непривилегированный пользователь с целью получения прав суперпользователя при последующем восстановлении выгруженных данных или выполнении pg_upgrade. (CVE-2018-16850)

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

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

  • Исправление функции pg_get_partition_constraintdef(), чтобы при получении неверного OID отношения не происходил сбой, а выдавался NULL (Том Лейн)

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

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

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

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

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

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

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

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

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

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

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

  • Устранение проблем с применением ON COMMIT DELETE ROWS к секционированной временной таблице (Амит Ланготе)

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

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

  • Недопущение передачи вложенных SELECT с оконными функциями, а также с указаниями LIMIT или OFFSET, параллельным исполнителям (Амит Капила)

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

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

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

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

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

  • Предотвращение утечки памяти на время выполнения запроса при работе с XMLTABLE (Эндрю Гирт)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Предотвращение повреждения общей памяти в логике DSA (Томас Мунро)

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

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

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

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

  • Недопущение возможного сбоя в результате двойного освобождения памяти при повторном сканировании SP-GiST (Эндрю Гирт)

  • Предотвращение некорректной компоновки функций в src/port и src/common на платформах BSD, использующих формат ELF, а также в HP-UX и Solaris (Эндрю Гирт, Том Лейн)

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

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

  • Предотвращение переполнения метастраницы хеш-индекса в случаях, когда размер BLCKSZ меньше значения по умолчанию (Дилип Кумар)

  • Добавление ранее упущенного пересчёта контрольной суммы страницы в хеш-индексах (Амит Капила)

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

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

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

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

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

  • Обновление карты свободного пространства при воспроизведении из WAL изменений флагов замороженных/полностью видимых страниц (Альваро Эррера)

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

  • Предотвращение преждевременного освобождения ресурсов параллельных исполнителей по окончании запроса или при достижении предельного числа кортежей (Амит Капила)

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

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

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

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

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

  • При передаче в libpq нескольких имён узлов они должны разрешаться в DNS не все сразу, а каждое в свою очередь (Том Лейн)

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

  • Исправление поведения libpq, чтобы тайм-ауты при подключении корректно применялись для отдельного имени или IP-адреса узла (Том Лейн)

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

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

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

  • Исправление в pg_dump обработки ключа --no-publications, чтобы с ним также игнорировались таблицы публикации (Жиль Даролд)

  • Исключение из выгрузки pg_dump идентификационной последовательности при исключении её родительской таблицы (Дэвид Роули)

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

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

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

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

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

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

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

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

  • В contrib/pg_stat_statements роли pg_read_all_stats запрещено выполнение pg_stat_statements_reset() (Харибабу Комми)

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

    Чтобы это изменение вступило в силу, выполните ALTER EXTENSION pg_stat_statements UPDATE в каждой базе данных, где установлено расширение pg_stat_statements.

  • Недопущение передачи расширением contrib/postgres_fdw предложений ORDER BY, не содержащих переменных, на удалённый сервер (Эндрю Гирт)

  • Исправление функции 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 теперь лишает себя расширенных прав при запуске.

  • Снятие запрета на возврат из функций сравнения 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, другой такой функции.

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

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

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

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

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

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

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

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

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