E.2. Выпуск 16.7 #
Дата выпуска: 2025-02-13
В этот выпуск вошли различные исправления, внесённые после версии 16.6. За информацией о нововведениях версии 16 обратитесь к Разделу E.9.
E.2.1. Миграция на версию 16.7 #
Если используется версия 16.X, выгрузка/восстановление базы не требуется.
Также, если вы обновляете сервер с более ранней версии, чем 16.5, см. Раздел E.4.
E.2.2. Изменения #
Усиление
PQescapeString
и родственных функций для защиты от некорректно закодированных входных строк (Андрес Фройнд, Ной Миш) § § § § § §Функции с обработкой экранирования, предоставляемые libpq, теперь полностью проверяют допустимость кодировки входных данных. При обнаружении недопустимых символов выдаётся ошибка, если это возможно. Для функций, не возвращающих ошибки, выходная строка корректируется, чтобы гарантировать, что сервер распознает недопустимую кодировку, и при промежуточной обработке ошибочный байт не будут принят за одинарную кавычку, обратную косую черту и т. д.
Цель этого изменения — защита от возможных атак методом SQL-инъекций, если одна из этих функций используется для экранирования специально сконструированного входного значения. Если полученная строка отправляется напрямую на сервер PostgreSQL (который в любом случае проверит её кодировку), опасности нет. Однако риск возникает, если строка проходит через psql или другой код на стороне клиента. Ранее такой код не проверял кодировку достаточно тщательно, и во многих случаях оставалось неясно, как следовало бы реагировать на обнаруженные ошибки.
Это исправление эффективно только в том случае, если функция с обработкой экранирования, сервер и любые промежуточные процессы используют одну и ту же кодировку. Особенно важно следить за использованием одной кодировки приложениям, которые вставляют недоверенные входные данные в SQL-запросы.
Приложения и драйверы, экранирующие недоверенные входные данные без использования функций libpq, могут столкнуться с подобными проблемами. Сначала им следует проверять, что входные данные соответствуют ожидаемой сервером кодировке.
Проект PostgreSQL благодарит Стивена Фьюэра за сообщение об этой проблеме. (CVE-20245-109784)
Исключение параллельных рабочих процессов из проверок и ограничений прав подключения (Том Лейн) §
Теперь при запуске параллельного рабочего процесса не проверяются привилегии
datalowconn
,rolcanlogin
иACL_CONNECT
. Предполагается, что достаточно ведущему процессу пройти аналогичные проверки. Это позволяет избежать, например, неожиданных завершений параллельных запросов с ошибкой, если ведущий процесс выполнялся от имени роли без права входа. Кроме того, ограниченияReservedConnections
,datconnlimit
иrolconnlimit
теперь применяются только к обычным обслуживающим процессам, и только они учитываются при подсчёте количества подключений. Эти ограничения предназначены для предотвращения чрезмерного потребления слотов подключений для обычных процессов, но у параллельных рабочих процессов и других специальных процессов есть собственные пулы слотов с собственными проверками ограничений.Исправление возможной проблемы с повторным использованием устаревших результатов в оконных агрегатных функциях (Дэвид Роули)
Оконная агрегатная функция с ограничивающим условием выполнения и результатом типа, передаваемого по ссылке, могла ошибочно возвращать результат из предыдущей секции вместо выполнения нового вычисления.
Поддержка синхронизации
TransactionXmin
сMyProc->xmin
(Хейкки Линнакангас) §Ранее процесс мог попытаться получить доступ к уже удалённым данным. Одним из известных последствий являлись временные ошибки типа «could not access status of transaction» (не удалось получить состояние транзакции).
Устранение условий гонки, которые могли привести к ошибке при добавлении новой записи каталога в список кеша каталога (Хейкки Линнакангас) §
Это могло приводить, например, к тому, что в текущем сеансе не могла использоваться только что созданная функция.
Предотвращение возможного повреждения каталога при очистке системного каталога одновременно с его изменением (Ной Миш) §
Устранение повреждения данных при возникновении ошибки во время усечения отношений (Томас Манро) § § §
Файловые операции, необходимые для усечения отношений, могли завершиться ошибкой, оставив несогласованное состояние на диске (например, фактически восстанавливая удалённые данные). Это невозможно предотвратить полностью, но теперь ошибки такого рода получили уровень PANIC, так что после их появления можно запустить восстановление согласованности данных путём повторного воспроизведения WAL до момента, непосредственно предшествующего попытке усечения. Это не лучшее решение, но такие ошибки возникают достаточно редко, чтобы считать такой подход приемлемым.
Предотвращение запуска контрольных точек во время усечения отношений (Роберт Хаас)
Это позволяет избежать условий гонки, при которых изменённый файл мог не сохраниться на диске до завершения контрольной точки, что создавало риск повреждения данных, если вскоре после этого происходил сбой операционной системы.
Исключение возможной потери изменений
pg_database
.datfrozenxid
в случае выполненияVACUUM
одновременно с командойREASSIGN OWNED
, которая изменяет владельца этой базы данных (Кирилл Решке) §Исправление передачи некорректных значений
tg_updatedcols
триггерамAFTER UPDATE
(Том Лейн) §В некоторых случаях битовая карта
tg_updatedcols
могла описывать набор столбцов, изменённых предшествующей командой в той же транзакции, что заставляло неверно срабатывать триггер.Кроме того, предотвращено увеличение используемого объёма памяти, вызванное созданием слишком большого количества копий битовой карты
tg_updatedcols
.Исключение отсоединения секции, если у неё есть собственное ограничение внешнего ключа, ссылающееся на секционированную таблицу (Амул Сул) §
В обычных случаях внешние ключи определяются на верхнем уровне секционированной таблицы. Ранее, если один из ключей определялся на уровне секции и ссылался на секционированную таблицу, при отсоединении такой секции соответствующие записи
pg_constraint
изменялись некорректно. Это приводило к ошибкам вида «could not find ON INSERT check triggers of foreign key constraint» (не удалось найти триггеры проверки ON INSERT ограничения внешнего ключа).Исправление обработки кодов формата
FF
функциейn
to_timestamp
(Том Лейн)Ранее, если непосредственно перед
FF
находился код целочисленного формата, могли использоваться все доступные цифры, оставляяn
FF
без значений.n
Реализация проверки заключения имён пространств имён XML в двойные кавычки при разборе выражения
XMLTABLE()
(Дин Рашид) §Добавление параметра
ldapscheme
в вывод функцииpg_hba_file_rules()
(Лауренц Альбе) § §Исключение объединения операций
UNION
, если их правила сортировки столбцов не согласованы (Том Лейн) §Ранее правила сортировки игнорировались при принятии решения о том, безопасно ли объединять шаги
UNION
в одну многократную операциюUNION
. Это могло быть допустимо до введения недетерминированных правил сортировки, но теперь ситуация изменилась, поскольку используемая сортировка может влиять на определение уникальности.Предотвращение ошибок планировщика вида «wrong varnullingrels» (неправильные varnullingrel) после «подтягивания» подзапроса, который находится под внешним соединением (Том Лейн) § §
Игнорирование маркировки отношений для обнуления при поиске статистики (Ричард Гуо) §
Это упущение могло приводить к невозможности использования соответствующей статистики по выражениям или к ошибкам вида «corrupt MVNDistinct entry» (повреждённая запись MVNDistinct).
Исправление обработки пропущенных выражений в логике отсечения секций (Том Лейн)
Это упущение могло приводить к ошибкам вида «unrecognized node type» (нераспознанный тип узла) и потенциально к другим проблемам при выполнении запросов к секционированным таблицам.
Снятие ограничения размера таблиц dshash в 1 ГБ (Маттиас ван де Меент) §
Это позволяет избежать ошибок типа «invalid DSA memory alloc request size» (недопустимый запрошенный размер разделяемой памяти DSA). Такая ситуация могла возникнуть, например, в транзакциях, обрабатывающих несколько миллионов таблиц.
Предотвращение возможного целочисленного переполнения в функции
bringetbitmap()
(Джеймс Хантер, Евгений Горбанёв) §Поскольку результат используется только в статистических целях, последствия этой ошибки были в основном косметическими.
Исключение поведения, при котором уже установленная блокировка процесса мешала процессу postmaster обрабатывать события сокета (Томас Манро) §
Чрезвычайно большая нагрузка на серверы, запускающие и завершающие работу процессов, могла помешать процессу postmaster своевременно реагировать на входящие клиентские подключения.
Предотвращение зацикливания резервных серверов потоковой репликации при чтении записей WAL, переходящих на другую страницу (Кётаро Хоригути, Александр Кукушкин)
Это могло произойти, если запись продолжалась на странице, которую необходимо было прочитать из другого источника WAL.
Устранение непреднамеренного повышения уровня ошибок FATAL до PANIC в начале запуска процессов (Ной Миш) §
Это исключает некоторые маловероятные случаи, которые могли привести к ошибкам вида «PANIC: proc_exit() called in child process» (ПАНИКА: в дочернем процессе вызван proc_exit()).
Исключение случаев, в которых оператор семейства операторов или опорная процедура могли стать недействительными (Том Лейн) § §
В некоторых случаях тип данных мог быть удалён, а ссылки на его OID по-прежнему оставались в
pg_amop
илиpg_amproc
. Это могло приводить к проблемам в будущем, так как попытка удалить владеющее оператором семейство завершалась ошибкой, и pg_dump генерировал некорректный вывод при выгрузке семейства операторов. В указанном исправлении при создании и изменении семейств/классов операторов добавляются необходимые зависимости, так что при удалении типа данных также удаляются любые зависимые элементы семейства операторов. Однако на уже существующие семейства операторов это исправление не распространяется, поэтому вDROP OPERATOR FAMILY
также было добавлено временное решение, чтобы предотвратить сбой при удалении семейства, в котором есть недействительные члены.Устранение множественных утечек памяти в выводе логического декодирования (Вигнеш Си, Масахико Савада, Боюй Янг) § § §
Устранение небольшой утечки памяти при изменении параметра
application_name
илиcluster_name
(Тофиг Алиев) §Предотвращение целочисленного переполнения при проверке условия
wal_skip_threshold
(Том Лейн) §Транзакция, которая создавала очень большое отношение, могла по ошибке решить обеспечить надёжность путём копирования отношения в WAL вместо того, чтобы синхронизировать его с помощью fsync, тем самым лишая смысла
wal_skip_threshold
. (Это имеет значение только в случае, когда дляwal_level
установлено значениеminimal
, в противном случае всё равно требуется копия WAL.)Исключение небезопасного порядка операций во время поиска в кеше (Ной Миш) §
Единственным известным последствием такого порядка было обычно безобидное предупреждение «you don't own a lock of type ExclusiveLock» (нет блокировки типа ExclusiveLock) при вызове команды
GRANT TABLESPACE
.Устранение возможных ошибок вида «failed to resolve name» (не удалось разрешить имя) при использовании JIT на старых платформах ARM (Томас Манро) §
Они могли появляться из-за несоответствия значения по умолчанию для
-moutline-atomics
между компиляторами gcc и clang. В Debian и Ubuntu поставляются компиляторы gcc и clang, ориентированные на armv8-a, но обработка атомарных операций по умолчанию различается.Устранение сбоев проверочных утверждений в запросах
WITH RECURSIVE ... UNION
(Дэвид Роули) §Предотвращение сбоев проверочных утверждений при разборе правил в случаях, когда конечный запрос содержит операции с множествами (Ман Цзэн, Том Лейн) §
Предотвращение сбоев проверочных утверждений в особых случаях при запуске параллельных запросов (Том Лейн)
Устранение сбоев проверочных утверждений во время завершения работы при записи файла статистики (Микаэль Пакье) §
Предотвращение в функции
NULLIF()
передачи указателя на развёрнутый объект для чтения и записи в функцию равенства для типа данных (Том Лейн) §Если функция равенства изменяла или удаляла объект, для которого передан указатель на чтение-запись, могли возникать ошибки, если функция
NULLIF()
возвращала этот объект. Встроенные функции равенства не вызывали проблем, но в функциях на PL/pgSQL происходил сбой.Обеспечение применения предварительной обработки выражения к значению по умолчанию null в
INSERT
(Том Лейн) §Если целевой столбец типа домен, планировщик должен добавлять шаг приведения к типу домен, а не просто константу null. Ранее для этого выражения пропускались некоторые требуемые шаги обработки. Для доменов, основанных на встроенных типах данных, о последствиях не сообщалось, но теоретически могла возникнуть ошибка с доменами, основанными на типах из расширений.
Устранение утечек памяти в PL/Python (Мэт Арье, Том Лейн) §
Многократное использование
PLyPlan.execute
илиplpy.cursor
приводило к утечке памяти во время вызова функции PL/Python.Исправление PL/Tcl для корректной компиляции с Tcl 9 (Питер Эйзентраут) §
Исключение в препроцессоре ecpg возможной некорректной обработки курсоров, ссылающихся на переменные вне текущей области (Том Лейн)
Корректная выдача предупреждений в ecpg об отсутствии поддержки
COPY ... FROM STDIN
(Рё Канбаяши)Ранее предупреждение не выдавалось из-за опечатки.
Обеспечение корректной обработки имён путей к файлам, закодированных в SJIS, в psql (Том Лейн) §
У некоторых двухбайтовых символов в SJIS второй байт равнозначен обратному слешу в ASCII (
\
). Эти символы повреждались при нормализации имени пути, из-за чего файлы с такими символами в именах становились недоступны.Исключение использования неправильной версии
pqsignal()
в pgbench и psql (Фудзии Масао, Том Лейн) §Эта ошибка могла приводить к неправильному поведению при использовании параметра
-T
в pgbench или команды\watch
в psql из-за того, что прерванные системные вызовы не возобновлялись должным образом.Исправление некорректного выполнения некоторых вложенных конструкций
\if
в pgbench (Михаил Николаев) §Команда
\if
в не той (не выполнявшейся) ветви\if
ошибочно обрабатывалась так же, как\elif
.Исправление возможного некорректного отображения сообщений о прогрессе выполнения во время инициализации таблицы в pgbench (Юси Огивара, Тацуо Исии, Фудзии Масао) § §
Повышение устойчивости pg_controldata к повреждённым файлам
pg_control
(Ян Ильясов, Антон Волошин) §Поскольку pg_controldata пытается выводить содержимое
pg_control
, даже если не пройдена проверка CRC, должно быть предусмотрено корректное поведение при недопустимых значениях полей. Это исправление исключает некоторые проблемы, вызываемые недопустимыми метками времени и отрицательными размерами сегментов WAL.Устранение возможного сбоя в pg_dump из-за последовательностей идентификаторов, которые связаны с таблицами, принадлежащими расширениям (Том Лейн) §
Устранение утечки памяти в pg_restore при работе с данными, сжатыми с использованием zstd (Том Лейн) §
Утечка происходила во время каждой операции распаковки, поэтому она была наиболее заметна в выгрузках, содержащих много таблиц или больших объектов.
Исправление pg_basebackup для корректной обработки файлов
pg_wal.tar
, размер которых превышает 2 ГБ в Windows (Давиндер Сингх, Томас Манро) § §Использование соответствующих SQL-стандарту тел функций в объявлениях SQL-функций расширения
contrib/earthdistance
(Том Лейн, Ронан Данклау) §Это изменение позволяет разрешать ссылки на
contrib/cube
во время создания расширения, что снижает риск связанных с путями поиска сбоев и возможных атак.В частности, это восстанавливает удобство использования этих функций в контекстах сгенерированных столбцов, для которых PostgreSQL версии 17 ограничивает путь поиска по соображениям безопасности. Были получены сообщения о неудачных попытках обновления баз данных до версии 17 из-за этой проблемы. Это исправление было включено в версию 16 для предоставления обходного решения: предварительное обновление расширения
earthdistance
до этой версии должно позволить успешно выполнить обновление.Изменение проверок конфигурации, определяющих переключатели компилятора, необходимые для доступа к инструкциям ARM CRC (Том Лейн) §
На платформах ARM, где базовый процессор не поддерживает инструкции CRC, необходимо использовать переключатель
-march
, чтобы заставить компилятор скомпилировать такие инструкции. В последних версиях gcc отклоняет ранее используемое значение, что приводило к возврату к программному CRC без уведомления об этом.Исправление системы сборки meson для поддержки старых библиотек OpenSSL в Windows (Дарек Слюсарчик) §
Добавление поддержки имён устаревших библиотек
ssleay32
иlibeay32
.Обеспечение экспорта всех функций libcommon и libpgport в сборках Windows с использованием meson (Владлен Пополитов, Хейкки Линнакангас) § §
Это исправляет ошибки сборки вида «unresolved external symbol» (неразрешённый внешний символ) для расширений.
Исправление процесса конфигурации meson для корректного определения заголовочного файла OSSP
uuid.h
в MSVC (Эндрю Дунстан) §Установка
pgevent
вpkglibdir
, а не вbindir
при сборке с помощью meson (Питер Эйзентраут) §Это соответствует поведению системы сборки на основе make и старой системы сборки MSVC.
Установка
sepgsql.sql
вshare/contrib/
, а не вshare/extension/
при сборке с помощью meson (Питер Эйзентраут) §Это соответствует поведению системы сборки на основе make.
Обновление данных часовых поясов до версии tzdata 2025a, включающее изменение правил перехода на летнее время в Парагвае, а также корректировку исторических данных для Филиппин (Том Лейн) §