E.23. Выпуск 14.16

Дата выпуска: 2025-02-13

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

E.23.1. Миграция на версию 14.16

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

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

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

  • Усиление PQescapeString и родственных функций для защиты от некорректно закодированных входных строк (Андрес Фройнд, Ной Миш) § § § § § §

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

    Цель этого изменения — защита от возможных атак методом SQL-инъекций, если одна из этих функций используется для экранирования специально сконструированного входного значения. Если полученная строка отправляется напрямую на сервер PostgreSQL (который в любом случае проверит её кодировку), опасности нет. Однако риск возникает, если строка проходит через psql или другой код на стороне клиента. Ранее такой код не проверял кодировку достаточно тщательно, и во многих случаях оставалось неясно, как следовало бы реагировать на обнаруженные ошибки.

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

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

    Проект PostgreSQL благодарит Стивена Фьюэра за сообщение об этой проблеме. (CVE-2025-1094)

  • Исключение параллельных рабочих процессов из проверок и ограничений прав подключения (Том Лейн) §

    Теперь при запуске параллельного рабочего процесса не проверяются привилегии datalowconn, rolcanlogin и ACL_CONNECT. Предполагается, что достаточно ведущему процессу пройти аналогичные проверки. Это позволяет избежать, например, неожиданных завершений параллельных запросов с ошибкой, если ведущий процесс выполнялся от имени роли без права входа. Кроме того, ограничения ReservedConnections, datconnlimit и rolconnlimit теперь применяются только к обычным обслуживающим процессам, и только они учитываются при подсчёте количества подключений. Эти ограничения предназначены для предотвращения чрезмерного потребления слотов подключений для обычных процессов, но у параллельных рабочих процессов и других специальных процессов есть собственные пулы слотов с собственными проверками ограничений.

  • Поддержка синхронизации TransactionXmin с MyProc->xmin (Хейкки Линнакангас) §

    Ранее процесс мог попытаться получить доступ к уже удалённым данным. Одним из известных последствий являлись временные ошибки типа «could not access status of transaction» (не удалось получить состояние транзакции).

  • Устранение условий гонки, которые могли привести к ошибке при добавлении новой записи каталога в список кеша каталога (Хейкки Линнакангас) §

    Это могло приводить, например, к тому, что в текущем сеансе не могла использоваться только что созданная функция.

  • Предотвращение возможного повреждения каталога при очистке системного каталога одновременно с его изменением (Ной Миш) §

  • Устранение повреждения данных при возникновении ошибки во время усечения отношений (Томас Манро) § § §

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

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

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

  • Использование функции rename() вместо link()/unlink() для переименования файлов (Натан Боссарт) §

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

  • Исключение возможной потери изменений pg_database.datfrozenxid в случае выполнения VACUUM одновременно с командой REASSIGN OWNED, которая изменяет владельца этой базы данных (Кирилл Решке) §

  • Исправление передачи некорректных значений tg_updatedcols триггерам AFTER UPDATE (Том Лейн) §

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

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

  • Исправление обработки кодов формата FFn функцией to_timestamp (Том Лейн)

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

  • Реализация проверки заключения имён пространств имён XML в двойные кавычки при разборе выражения XMLTABLE() (Дин Рашид) §

  • Добавление параметра ldapscheme в вывод функции pg_hba_file_rules() (Лауренц Альбе) § §

  • Исключение объединения операций UNION, если их правила сортировки столбцов не согласованы (Том Лейн) §

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

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

    Это упущение могло приводить к ошибкам вида «unrecognized node type» (нераспознанный тип узла) и потенциально к другим проблемам при выполнении запросов к секционированным таблицам.

  • Снятие ограничения размера таблиц dshash в 1 ГБ (Маттиас ван де Меент) §

    Это позволяет избежать ошибок типа «invalid DSA memory alloc request size» (недопустимый запрошенный размер разделяемой памяти DSA). Такая ситуация могла возникнуть, например, в транзакциях, обрабатывающих несколько миллионов таблиц.

  • Предотвращение возможного целочисленного переполнения в функции bringetbitmap() (Джеймс Хантер, Евгений Горбанёв) §

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

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

    Это могло произойти, если запись продолжалась на странице, которую необходимо было прочитать из другого источника WAL.

  • Улучшение производительности процесса архивации с большим количеством файлов состояния (Натан Боссарт) §

    Это изменение отменяет исправление, изначально внесённое в версию 15 в ответ на сообщения о крайне низкой производительности архивации и приводившее к простоям или потере реплик.

  • Устранение непреднамеренного повышения уровня ошибок FATAL до PANIC в начале запуска процессов (Ной Миш) §

    Это исключает некоторые маловероятные случаи, которые могли привести к ошибкам вида «PANIC: proc_exit() called in child process» (ПАНИКА: в дочернем процессе вызван proc_exit()).

  • Исключение случаев, в которых оператор семейства операторов или опорная процедура могли стать недействительными (Том Лейн) § §

    В некоторых случаях тип данных мог быть удалён, а ссылки на его OID по-прежнему оставались в pg_amop или pg_amproc. Это могло приводить к проблемам в будущем, так как попытка удалить владеющее оператором семейство завершалась ошибкой, и pg_dump генерировал некорректный вывод при выгрузке семейства операторов. В указанном исправлении при создании и изменении семейств/классов операторов добавляются необходимые зависимости, так что при удалении типа данных также удаляются любые зависимые элементы семейства операторов. Однако на уже существующие семейства операторов это исправление не распространяется, поэтому в DROP OPERATOR FAMILY также было добавлено временное решение, чтобы предотвратить сбой при удалении семейства, в котором есть недействительные члены.

  • Устранение множественных утечек памяти в выводе логического декодирования (Вигнеш Си, Масахико Савада, Боюй Янг) § §

  • Устранение маловероятного сбоя при нехватке памяти из-за отсутствия проверок корректности результатов функции malloc() (Карина Лицкевич)

  • Предотвращение целочисленного переполнения при проверке условия 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, но обработка атомарных операций по умолчанию различается.

  • Исправление обработки точек соединения в Windows, созданных не PostgreSQL (Томас Манро) § §

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

  • Устранение сбоев проверочных утверждений в запросах 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_basebackup для корректной обработки файлов pg_wal.tar, размер которых превышает 2 ГБ в Windows (Давиндер Сингх, Томас Манро) § §

  • Изменение проверок конфигурации, определяющих переключатели компилятора, необходимые для доступа к инструкциям ARM CRC (Том Лейн) §

    На платформах ARM, где базовый процессор не поддерживает инструкции CRC, необходимо использовать переключатель -march, чтобы заставить компилятор скомпилировать такие инструкции. В последних версиях gcc отклоняет ранее используемое значение, что приводило к возврату к программному CRC без уведомления об этом.

  • Попытка переключиться на компилятор C17 при обнаружении C23 во время configure (Томас Манро) §

    Версии PostgreSQL ниже 16 не компилируются по правилам C23. Если выбранный компилятор по умолчанию использует C23 или выше, попробуйте добавить ключ -std=gnu17. (Если это не сработает для вашего компилятора, вручную укажите CFLAGS с подходящим ключом.)

  • Обновление данных часовых поясов до версии tzdata 2025a, включающее изменение правил перехода на летнее время в Парагвае, а также корректировку исторических данных для Филиппин (Том Лейн) §