E.39. Выпуск 13.1

Дата выпуска: 2020-11-12

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

E.39.1. Миграция на версию 13.1

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

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

  • Запрещение конструкции DECLARE CURSOR ... WITH HOLD и вызова отложенных триггеров в выражениях индексов и запросов матпредставлений (Ной Миш)

    Устранённая уязвимость по сути позволяла выйти из защищённой среды, в которой выполняются «операции с ограничениями безопасности». Злоумышленник, имеющий право создания не временных SQL-объектов, мог воспользоваться этой уязвимостью для выполнения произвольного SQL-кода от имени суперпользователя.

    Проект PostgreSQL благодарит Этьена Сталманса за сообщение об этой проблеме. (CVE-2020-25695)

  • Исправление обработки сложных параметров в строках подключений в программах pg_dump, pg_restore, clusterdb, reindexdb и vacuumdb (Том Лейн)

    В аргументе -d программ pg_dump и pg_restore, а также в аргументе --maintenance-db других перечисленных программ может задаваться «строка подключения», содержащая не просто имя базы данных, но и другие параметры подключений. В случаях, когда эти программы должны были устанавливать дополнительные соединения, например, для параллельной обработки или работы с несколькими базами, строка соединения терялась, и для дополнительных подключений использовались только основные параметры (адрес и порт сервера, имя базы данных и имя пользователя). Это могло приводить к сбоям подключений, если строка подключения дополнительно содержала существенную информацию, например, изменённые параметры SSL или GSS. Хуже того, успешно установленное соединение могло оказаться незашифрованным (тогда как должно было шифроваться) или подверженным атакам с посредником (которые предотвращались бы при использовании заданных параметров). (CVE-2020-25694)

  • Обеспечение использования всех не переопределённых параметров из предыдущей строки соединения при выполнении команды psql \connect (Том Лейн)

    Это исправление предотвращает ошибки переподключения, которые могли раньше возникать из-за упущения значимых параметров, например, параметров SSL или GSS. Хуже того, раньше переподключение могло произойти успешно, но при этом оказаться незашифрованным (тогда как должно было шифроваться) или подверженным атакам с посредником (которые предотвращались бы при использовании заданных параметров). По большому счёту это та же проблема, что и описанная выше проблема pg_dump и др., но в случае psql ситуация усложняется тем, что пользователь может намеренно переопределить некоторые параметры соединений. (CVE-2020-25694)

  • Недопущение изменения командой psql \gset специальных переменных (Ной Миш)

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

    Проект PostgreSQL благодарит Ника Клитона за сообщение об этой проблеме. (CVE-2020-25696)

  • Устранение непреднамеренного нарушения протокола репликации (Альваро Эррера)

    Процесс walsender передаёт два события при завершении команды START_REPLICATION. Это не было документировано и по-видимому так вышло непреднамеренно; а перед выпуском 13.0 мы не заметили, что одно из последних изменений удалило это повторяющееся событие. Однако выяснилось, что оно было нужно приёмникам wal в некоторых местах кода. С учётом этого самым практичным решением будет сохранить это дополнительное событие в протоколе и вновь передавать его.

  • Обеспечение должного сохранения каталогов SLRU на диске во время контрольных точек (Томас Манро)

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

  • Исправление поведения ALTER ROLE для пользователей, имеющих атрибут BYPASSRLS (Том Лейн, Стивен Фрост)

    Атрибут BYPASSRLS у ролей могут изменять только суперпользователи, но другие действия ALTER ROLE, например смена пароля, должны разрешаться и непривилегированным пользователям с учётом обычных ограничений. Предыдущая реализация разрешала любые операции с ролью, имеющей такой атрибут, только суперпользователям.

  • Запрещение операции ALTER TABLE ONLY ... DROP EXPRESSION в случае наличия дочерних таблиц (Питер Эйзентраут)

    На данный момент эта операция не обрабатывается корректно, поэтому она просто будет запрещена.

  • Предотвращение воздействия ALTER TABLE ONLY ... ENABLE/DISABLE TRIGGER на дочерние таблицы (Альваро Эррера)

    Ранее флаг ONLY не учитывался.

  • Устранение ошибки при выполнении LOCK TABLE с представлением, ссылающимся на себя (Том Лейн)

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

  • Сохранение статистики индекса в ходе REINDEX CONCURRENTLY (Микаэль Пакье, Фабрицио де Ройес Мелло)

    Такая статистика всегда сохранялась при блокирующем перестроении индексов.

  • Исправление процедуры информирования о прогрессе операции REINDEX CONCURRENTLY (Маттиас ван де Меент, Микаэль Пакье)

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

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

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

  • Поддержка хеширования текстовых массивов (Питер Эйзентраут)

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

  • Предотвращение внутреннего переполнения при межтиповых сравнениях даты/времени (Никита Глухов, Александр Коротков, Том Лейн)

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

  • Исправление ошибки со сдвигом на один отрицательных значений, соответствующих годам до н. э. в функциях to_date() и to_timestamp() (Дар Альатар-Йемен, Том Лейн)

    Кроме того, отрицательное значение года с явным указанием «BC» (до н. э.) теперь становится положительным, относящимся к н. э.

  • Поддержка в методе jsonpath .datetime() значений даты/времени, заданных в формате ISO 8601 (Никита Глухов)

    Этого не требует стандарт SQL, но такая возможность кажется уместной, так как наши функции to_json() используют этот формат для совместимости с Javascript.

  • Обеспечение архивирования файлов истории линий времени вместе с WAL на ведомых серверах при выбранном в archive_mode режиме always (Григорий Смолкин, Фудзии Масао)

    Вследствие устранённого теперь упущения можно было лишиться возможности восстановления на момент времени (PITR).

  • Исправление отслеживания нештатного отключения процесса postmaster на платформах, где используется kqueue() (Томас Манро)

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

  • Устранение возможности сбоя при рассмотрении GEQO-оптимизатором соединений с учётом секционирования (Том Лейн)

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

  • Исправление подсчёта количества элементов в индексах-B-деревьях при выполнении только уборки в ходе VACUUM (Питер Гейган)

  • Обеспечение распаковки данных перед добавлением их в индекс BRIN (Томаш Вондра)

    В элементах индексов не должны содержаться указатели на внешние данные TOAST, однако в реализации BRIN это не учли. Вследствие этого могли возникать ошибки «missing chunk number 0 for toast value NNN» (отсутствует порция номер 0 для TOAST-значения NNN). (Если вы столкнулись с такой ошибкой в существующем индексе, для устранения её должно быть достаточно выполнить REINDEX.)

  • Исправление буферизованного построения индексов GiST, содержащих неключевые столбцы (Павел Борисов)

  • Исправление непереносимого использования getnameinfo() в реализации представления pg_hba_file_rules (Том Лейн)

    Из-за ликвидированной теперь ошибки на FreeBSD 11 и возможно других платформах столбцы address и netmask в этом представлении всегда содержали null.

  • Предотвращение сбоя при запуске параллельных исполнителей, происходившего, когда переменная debug_query_string равна NULL (Ной Миш)

  • Предупреждение сбоев в ситуациях, когда триггер BEFORE ROW UPDATE просто возвращает «старую» строку таблицы с удалёнными или «отсутствующими» столбцами (Амит Ланготе, Том Лейн)

    При таком способе подавления изменений данных можно было получить сбои, неожиданные ошибки ограничений CHECK или неверные результаты с RETURNING, так как для этих целей «отсутствующие» столбцы воспринимаются как содержащие NULL. (В данном случае столбец считается «отсутствующим», если он был добавлен командой ALTER TABLE ADD COLUMN со значением по умолчанию, постоянным и отличным от NULL.) Также проблемы могли возникать с удалёнными столбцами.

  • Исправление в XML-выводе EXPLAIN вложения тегов для планов инкрементальной сортировки (Даниэль Густафссон)

  • Избавление от неоправданной ошибки при передаче очень большого объёма данных через очереди в разделяемой памяти (Маркус Ваннер)

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

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

  • Исправление некорректной обработки атрибутов шаблонных функций при генерировании JIT-кода (Андрес Фройнд)

    Сбои вследствие некорректной обработки наблюдались на платформе s390x, но вполне вероятно, что подобное могло иметь место и на других платформах.

  • Улучшение кода, генерируемого для операций compare_exchange и fetch_add на PPC (Ной Миш)

  • Устранение утечек памяти в кеше отношений при использовании политик RLS (Том Лейн)

  • Ликвидация утечки памяти в особых случаях в функции index_get_partition() (Джастин Призби)

  • Устранение небольшой утечки памяти при обработке сигнала SIGHUP, возникавшей с новыми значениями GUC-переменных, которые нельзя изменить без перезагрузки (Том Лейн)

  • Ликвидация утечек памяти при обработки команды CALL в PL/pgsql (Павел Стехуле, Том Лейн)

  • Отказ в libpq для Windows от вызовов WSACleanup() и сведение вызовов WSAStartup() к одному единственному для процесса (Том Лейн, Александр Лахин)

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

  • Исправление логики инициализации потоков в библиотеке ecpg для Windows (Том Лейн, Александр Лахин)

    Из-за некорректной установки блокировок многопоточные приложения ecpg при редком стечении обстоятельств могли работать некорректно.

  • Исправление некорректной обработки в ecpg строк B'...' и X'...' (Шеньхао Ван)

  • Смена в Windows режима чтения вывода команды «обратный апостроф» в psql с двоичного на текстовый (Том Лейн)

    Благодаря этому будут корректно обрабатываться символы новой строки.

  • Включение в pg_dump сбора информации о столбцах в таблицах конфигурации расширений (Фабрицио де Ройес Мелло, Том Лейн)

    Из-за отсутствия этой информации происходили сбои при загрузке данных таблицы, выгруженных с указанием --inserts или с неполными (хотя обычно корректными) командами COPY.

  • Добавление в pg_upgrade проверки существования каталогов табличных пространств в целевом кластере (Брюс Момджян)

  • Устранение возможности утечки памяти в contrib/pgcrypto (Микаэль Пакье)

  • Добавление проверки на случай маловероятной ошибки во время выполнения в contrib/pgcrypto (Даниэль Густафссон)

  • Исправление недавно добавленных в тесты проверок timetz, которые работали только когда в США действовало летнее время (Том Лейн)

  • Обновление данных часовых поясов до версии tzdata 2020d, включающее изменение правил перехода на летнее время на Фиджи, в Марокко, Палестине, канадском Юконе, на острове Маккуори и на станции Кейси (Антарктика), а также корректировку исторических данных для Франции, Венгрии, Монако и Палестины.

  • Синхронизация нашей копии библиотеки timezone с выпущенной IANA версией tzcode 2020d (Том Лейн)

    С этой версией к нам попало изменение выбираемого по умолчанию формата вывода zic с «fat» (расширенный) на «slim» (минимальный). Для наших целей это не имеет практического значения, так как мы продолжаем использовать формат «fat» в версиях ниже 13. Также теперь гарантируется, что strftime() будет менять значение errno, только если произойдёт ошибка.