E.1. Выпуск 9.5.25

Дата выпуска: 2021-02-11

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

Этот выпуск PostgreSQL должен стать последним в серии 9.5.X. Пользователям следует поторопиться с переходом на более новую основную версию.

E.1.1. Миграция на версию 9.5.25

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

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

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

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

  • Добавление в CREATE INDEX CONCURRENTLY ожидания завершения подготовленных транзакций (Андрей Бородин)

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

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

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

  • Устранение сбоя при применении WHERE CURRENT OF к курсору, план выполнения которого содержит нестандартный узел сканирования (Дэвид Гейер)

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

    В результате данного упущения планировщик мог выдавать ошибки «failed to build any N-way joins» (не удалось построить никакие N-сторонние соединения).

  • Проверка поддержки пометки/восстановления позиций индексными методами доступа (Эндрю Гирт)

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

  • Обеспечение корректной обработки в команде ALTER DEFAULT PRIVILEGES повторяющихся аргументов (Микаэль Пакье)

    Ранее в случае повторения имени роли или схемы в одной команде могли выдаваться ошибки «tuple already updated by self» (кортеж уже изменился сам собой) или нарушаться ограничения уникальности.

  • Осуществление сброса связанных с ACL кешей при изменениях в pg_authid (Ной Миш)

    Тем самым гарантируется, что решения, связанные с правами доступа, будут приниматься с учётом действия ALTER ROLE ... [NO] INHERIT.

  • Предотвращение некорректной обработки неоднозначных предложений CREATE TABLE LIKE (Том Лейн)

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

  • Изменение порядка действий в CREATE TABLE LIKE, чтобы индексы копировались до создания ограничений внешнего ключа (Том Лейн)

    Теперь случай, когда ограничение внешнего ключа, объявленное на внешнем уровне CREATE TABLE и ссылающееся на саму таблицу, зависит от индекса, создаваемого предложением LIKE , обрабатывается корректно.

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

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

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

  • Исправление обработки многобайтовых символов, экранированных обратной косой чертой, в COPY FROM (Хейкки Линнакангас)

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

  • Отказ от ненужного создания хеш-таблиц для исполнителя при выполнении EXPLAIN без ANALYZE (Алексей Баштанов)

  • Устранение недавно привнесённых условий гонки при обработке очереди LISTEN/NOTIFY (Том Лейн)

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

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

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

    До этого поддерживалась конкатенация двух объектов или двух массивов JSON. Теперь обрабатываются и другие случаи — отличные от массивов аргументы помещаются в одноэлементные массивы, которые затем складываются. Ранее некоторые сочетания аргументов обрабатывались по этому принципу, а с другими возникали ошибки.

  • Исправление ошибки обращения к неинициализированному значению при разборе квантификатора * в регулярном выражении в режиме BRE (Том Лейн)

    В результате ошибки этот квантификатор мог работать как «нежадный», то есть как квантификатор *? в расширенных регулярных выражениях.

  • Предотвращение возможной потери данных вследствие некорректного определения позиции зацикливания в журнале SLRU (Ной Миш)

    Позиция зацикливания обычно оказывается в середине страницы и должна округляться до границы страницы, однако это делалось неправильно. Негативные последствия это могло иметь, только если SLRU-кеш переполнялся в пределах одной страницы, что маловероятно в правильно функционирующей системе. Проявляться это могло в последующих ошибках «apparent wraparound» (видимо, произошло зацикливание) и «could not access status of transaction» (не удалось получить состояние транзакции).

  • Устранение утечек памяти в процессах walsender при передаче новых снимков для логического декодирования (Амит Капила)

  • Исправление поведения walsender при получении дополнительных команд после завершения репликации (Джефф Девис)

  • Устранение сбоя утверждения истинности в pg_get_functiondef() при анализе функции с указанием TRANSFORM (Том Лейн)

  • Восстановление в psql возможности передавать пароль в аргументе строка_соединения команды \connect (Том Лейн)

    Это работало раньше, но в результате недавнего исправления этот пароль перестал восприниматься (и поэтому запрашивался дополнительно).

  • Устранение разнообразных дефектов в реализации команды psql \help (Кётаро Хоригути, Том Лейн)

    Команда \help с двумя словами в аргументах не могла найти описание команды только для первого слова. Например, команда \help reset all должна была показать справку по RESET, но она этого не делала. Кроме того, \help в ряде случаев не вызывала постраничник, тогда как должна была. Наконец, в прежней реализации имелись утечки памяти.

  • Рассмотрение в процедуре pg_rewind всех требующихся WAL-файлов при синхронизации резервного сервера (Иэн Барвик, Хейкки Линнакангас)

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

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

  • Устранение утечки памяти в contrib/auto_explain (Ли Япинь)

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

  • Устранение в contrib/postgres_fdw утечки открытых подключений к внешним серверам при удалении сопоставлений пользователей или объекта стороннего сервера (Бхарат Рупиредди)

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

  • Добавление в contrib/pgcrypto проверки кода возврата, выдаваемого функциями OpenSSL EVP (Микаэль Пакье)

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

  • Предотвращения сбоя в коде поддержки индексов GiST в модуле contrib/pg_trgm, происходившего в редком случае вызова функции picksplit для разделения ровно двух элементов (Эндрю Гирт, Александр Коротков)

  • Исправление расчёта тайм-аутов в contrib/pg_prewarm и contrib/postgres_fdw (Алексей Кондратов, Том Лейн)

    В основном цикле главного процесса contrib/pg_prewarm ошибочно вычислялась задержка в 1000 раз меньше ожидаемой, вследствие чего он создавал лишнюю нагрузку для процессора. Ожидая результата от удалённого сервера, модуль contrib/postgres_fdw устанавливал вместо желаемого тайм-аута в 1000 раз больший (хотя эта ошибка нивелировалась 60-секундным ограничением сверху).

    Обе эти ошибки были следствием неправильного пересчёта секунд с микросекундами в миллисекунды. Чтобы в будущем таких ошибок не было, добавлена удобная функция TimestampDifferenceMilliseconds().

  • Улучшение логики configure в части выбора PG_SYSROOT в macOS (Том Лейн)

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

  • Добавление при сборке в macOS ключа -isysroot на этапах компоновки и компиляции (Джеймс Хиллиард)

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

  • Обновление данных часовых поясов до версии tzdata 2021a, включающее изменение правил перехода на летнее время в России (смену часового пояса в Волгограде) и Южном Судане, а также корректировку исторических данных для Австралии, Багам, Белиза, Бермуд, Ганы, Израиля, Кении, Нигерии, Палестины, Сейшел и Вануату.

    В частности, часовой пояс Australia/Currie был признан равнозначным Australia/Hobart и ненужным.