Перейти к основному содержимому

PostgreSQL 18: изменения в ядре

Примечание

В этом разделе представлены изменения ядра PostgreSQL 18, включенные в СУБД Pangolin версии 8.1.0.

Миграция на версию 18

ИзменениеОписание
Переход на 18 версию с любой из предыдущих предполагает перенос данных через pg_dumpall или логическую репликацию, либо мажорное обновление через pg_upgrade
Изменение поведения initdb, чтобы по умолчанию включить расчет контрольных сумм данных (Грег Сабино Маллейн) §Расчет контрольных сумм можно отключить при помощи нового параметра конфигурации initdb --no-data-checksums. Он может быть полезен при обновлении старых кластеров без включенного расчета контрольных сумм, для этого pg_upgrade требует, чтобы параметры контрольных сумм кластеров совпадали
Изменение обработки аббревиатур часовых поясов (Том Лейн) §Теперь система проверяет аббревиатуры часовых поясов текущего сеанса до проверки параметра конфигурации timezone_abbreviations. Ранее он проверялся первым
Объявление устаревшей аутентификации по паролю, зашифрованному алгоритмом MD5 (Натан Боссарт) §Шифрование паролей алгоритмом MD5 перестанет поддерживаться в следующей основной версии. Команды CREATE ROLE и ALTER ROLE теперь выводят предупреждение об устаревании при установлении параметров паролей MD5. Эти предупреждения можно отключить, установив значение off для параметра md5_password_warnings
Изменение обработки потомков родительской таблицы командами VACUUM и ANALYZE (Майкл Харрис) §Предыдущее поведение можно включить при помощи нового параметра ONLY
Запрет COPY FROM обрабатывать \. как маркер конца файла при чтении файлов CSV (Даниэль Верите, Том Лейн) § §psql все еще обрабатывает \. как маркер конца файла при чтении файлов CSV из STDIN. Старые клиенты psql, подключающиеся к серверам PostgreSQL 18, могут сталкиваться с проблемами \copy. Кроме того, в этом выпуске проверяется размещение \. отдельно на новой строке
Запрет нежурналируемых секционированных таблиц (Микаэль Пакье) §Ранее команда ALTER TABLE SET [UN]LOGGED не делала ничего, и при создании нежурналируемой секционированной таблицы ее потомки все равно оставались журналируемыми
Выполнение триггеров AFTER от имени роли, которая была активна при постановке триггеров в очередь (Лауренц Альбе) §Ранее такие триггеры срабатывали от имени роли, которая была активна на момент выполнения триггера (например, при выполнении команды COMMIT). Это важное изменение для случаев, когда роль меняется в момент между постановкой триггера в очередь и фиксацией транзакции
Прекращение поддержки неработающих прав RULE в GRANT / REVOKE (Фудзии Масао) §Они не работают, начиная с PostgreSQL 8.2
Удаление столбца pg_backend_memory_contexts.parent (Мелих Мутлу) §После добавления столбца pg_backend_memory_contexts.path он стал ненужным
Изменение принципа нумерации pg_backend_memory_contexts.level и pg_log_backend_memory_contexts(), которая теперь начинается с 1 (Мелих Мутлу, Атсуши Торикоши, Дэвид Роули, Фудзии Масао) § § §Ранее нумерация начиналась с нуля
Использование провайдера правил сортировки по умолчанию вместо libc для полнотекстового поиска при чтении файлов конфигурации и словарей (Питер Эйзентраут) §Кластеры, по умолчанию использующие отличный от libc провайдер правил сортировки (например, ICU, builtin), поведение которого отличается от поведения libc в части обработки символов параметром LC_CTYPE, могут столкнуться с изменением поведения модуля pg_trgm и некоторых функций полнотекстового поиска. При обновлении таких кластеров при помощи pg_upgrade рекомендуется перестроить все индексы, связанные с полнотекстовым поиском и pg_trgm, после завершения обновления
При обновлении может потребоваться ручное изменение файлов конфигурацииПараметр alternative_extension_control_directory необходимо закомментировать. Сконфигурировать параметр extension_control_path, перенеся значения из alternative_extension_control_directory, заменив разделитель , на : и убрав суффикс /extension из всех путей. Также необходимо добавить путь поиска .control-файлов по умолчанию в виде макроса $system или абсолютного пути

Изменения в версии 18

Устаревшие объекты и функции сервера, изменения поведения

ИзменениеЧто недоступноЧем заменить
По умолчанию initdb включает контрольные суммы (data checksums) §Создание кластера баз без контрольных сумм при отсутствии опцийИспользовать новую опцию --no-data-checksums. Не рекомендуется!
Если название часового пояса есть в активной timezone сессии, то к вводимым значениям datetime будут применены правила из активной timezone §В этом случае больше не применится описание часового пояса из timezone_abbreviations, даже если оно там естьПерекрыть правила timezone сессии больше не получится. Можно только увидеть в представлении pg_timezone_abbrevs, что применились именно они
Хеш MD5 для паролей признан устаревшим, CREATE ROLE и ALTER ROLE теперь выдают предупреждения вида MD5 password support is deprecated and will be removed in a future release of PostgreSQL. §В следующих версиях алгоритм MD5 будет удаленПерейти на SCRAM-SHA-256.
На время перехода можно установить md5_password_warnings = off, чтобы избавиться от предупреждений. Но перейти все равно придется
Команды VACUUM и ANALYZE на родительской таблице теперь по умолчанию включают обработку таблиц-наследниковЧтобы выполнять команды «как раньше» (без обработки потомков), можно использовать новый ключ ONLY:
ANALYZE ONLY only_inh_parent;
VACUUM ONLY only_inh_parent;
Для секционированных таблиц поведение не изменилось, т.к. их обработка и раньше включала секции. Здесь ANALYZE ONLY применима, а вот VACUUM ONLY ничего не делает
COPY FROM больше не считает \. концом файла при чтении файла CSV § §
Старое поведение сохранено для совместимости при чтении STDIN и в psql
Загрузка файла CSV с окончанием \. на сервереСогласно RFC 4180, файл специально завершать не нужно. Последняя строка может (не обязательно) завершаться CRLF
Запрещено объявлять секционированные таблицы нежурналируемыми §
Команды:
ALTER TABLE SET [UN]LOGGED;
CREATE UNLOGGED TABLE;
теперь возвращают ошибку partitioned tables cannot be unlogged.
pg_dump и pgbench тоже исправили
Две команды, которые и раньше не работали — в результате секции все равно оставались/добавлялись журналируемыми
Отложенные триггеры (AFTER) выполняются от роли, которая была активной на момент срабатывания триггера, а не от роли, активной на момент проверки (COMMIT) §Выполнение отложенного триггера от новой роли, включенной между срабатыванием триггера и COMMITЕсли это важно, перевести функцию триггера на SECURITY DEFINER
В GRANT/REVOKE и функциях has_table_privilege() удалена привилегия RULE, которая была неактивна с PG 8.2 §
В pg_backend_memory_contexts убрали поле parent §
Наименования контекстов в общем случае не уникальны, поэтому запросы по иерархии сбоили
Запросы и объекты pg_backend_memory_contexts.parent придется убрать из мониторингов, если естьИспользовать новое поле pg_backend_memory_contexts.path
В pg_backend_memory_contexts нумерация уровней level теперь начинается с 1 § § §
Функция pg_log_backend_memory_contexts() исправлена соответственно
Уровня 0 больше нетИспользовать массив path. Новая нумерация позволяет обходить его, не запутываясь в идентификаторах: path[level] — заданный уровень дерева контекстов. Идентификаторы на уровне раздаются обходом в порядке прохода поиска в ширину (алгоритм BFS). Контексты ниже TopLevelMemoryContext нестабильны, но близкие к нему верхние уровни с меньшей вероятностью изменяются между запросами и во время выполнения запросов
Из pg_stat_wal перенесены в pg_stat_io поля § §:
wal_write, wal_sync, wal_write_time и wal_sync_time
Поля pg_stat_wal.wal_write, pg_stat_wal.wal_sync, pg_stat_wal.wal_write_time, pg_stat_wal.wal_sync_timeИспользовать соответствующие поля pg_stat_io
Удалено поле pg_attribute.attcacheoff §Поле pg_attribute.attcacheoffВ этом поле СУБД всегда сохраняла на диске -1, а в памяти (в дескрипторе записи) оно использовалось как место для кэширования смещения атрибута в записи.
• Запросы, представления: убрать поле.
• Внутренний код: пользоваться новой структурой CompactAttribute
Полнотекстовый поиск (to_tsvector, to_tsquery, pg_trgm, .. ) теперь пользуется той библиотекой-провайдером локалей, которая задана в системе. Если это ICU или builtin — они и будут использоваться §Больше нет фиксированного использования libc в полнотекстовом поискеПользоваться выбранной для кластера библиотекой.
Если библиотека отличается от libc — рекомендуется перестроить все индексы, связанные с полнотекстовым поиском и pg_trgm, после завершения обновления
Смена названия параметра ssl_ecdh_curve на ssl_groups
Старое название параметра еще работает для совместимости.
Пользоваться параметром ssl_groups, в котором можно указывать несколько эллиптических кривых, ECDH
В EXPLAIN ANALYZE по умолчанию будет включена опция BUFFERSEXPLAIN ANALYZE (BUFFERS FALSE)
initdb без опций создает кластер с контрольными суммамиinitdb --no-data-checksums
Ограничения больше не копируются в секцию, отсоединяемую DETACH PARTITION CONCURRENTLY от таблицы, секционированной по хешу (с 18.1 §)Последующий ATTACH этой таблицы будет включать последовательное сканированиеДобавить такие же независимые ограничения вручную

Оптимизатор

ИзменениеОписание
Автоматическое удаление ненужных замкнутых соединений таблиц (Андрей Лепихов, Александр Кузьменков, Александр Коротков, Алена Рыбакина) §Эту оптимизацию можно отключить при помощи параметра конфигурации enable_self_join_elimination
Преобразование некоторых выражений IN (VALUES ...) в x = ANY ... для улучшения статистики оптимизатора (Алена Рыбакина, Андрей Лепихов) §
Возможность преобразования предложений OR в массивы для ускорения обработки индексов (Александр Коротков, Андрей Лепихов) §
Ускорение обработки предложений INTERSECT и EXCEPT, оконных агрегатных функций, а также псевдонимов столбцов представлений (Том Лейн, Дэвид Роули) § § § §
Возможность внутреннего переупорядочивания ключей команды SELECT DISTINCT, чтобы избежать сортировки (Ричард Гуо) §Эту оптимизацию можно отключить при помощи параметра конфигурации enable_distinct_reordering
Игнорирование столбцов GROUP BY, которые функционально зависят от других столбцов (Чжан Минли, Цзянь Хи, Дэвид Роули) §Если предложение GROUP BY включает все столбцы уникального индекса и другие столбцы той же таблицы, эти другие столбцы считаются избыточными и исключаются из группировки. Такое поведение уже демонстрировалось для неотложенных первичных ключей
Возможность перемещать некоторые предложения HAVING для GROUPING SETS в предложения WHERE (Ричард Гуо) § § § §Теперь фильтрация строк начинается раньше. В этом выпуске также исправлены некоторые запросы с предложением GROUPING SETS, которые раньше выводили некорректные результаты
Улучшение оценки количества строк для функции generate_series(), которой передаются значения типов numeric и timestamp (Дэвид Роули, Сун Цзиньчжоу) § §
Возможность оптимизатора использовать планы с правыми неполными соединениями (Ричард Гуо) §Неполные соединения используются для поиска как минимум одного совпадения
Возможность использовать инкрементальную сортировку при соединении слиянием (Ричард Гуо) §
Повышение эффективности планирования запросов, обращающихся к большому количеству секций (Ашутош Бапат, Юя Ватари, Дэвид Роули) § §
Возможность чаще использовать соединения с учетом секционирования и сокращение использования памяти такими соединениями (Ричард Гуо, Том Лейн, Ашутош Бапат) § §
Улучшение оценки стоимости запросов к секционированным таблицам (Никита Малахов, Андрей Лепихов) §
Улучшение кеширования планов для функций SQL (Александр Пыхалов, Том Лейн) § §
Улучшение обработки отключенной функциональности оптимизатора (Роберт Хаас) §

Индексы

ИзменениеОписание
Возможность выполнять сканирование с пропуском (skip scan) индексов btree (Питер Гейган) § §Это позволяет чаще использовать составные индексы типа btree, например в случаях, когда отсутствуют ограничения на первый столбец или индексируемые раньше столбцы (или если есть условия неравенства) и есть полезные ограничения на столбцы, индексируемые позднее
Возможность использовать уникальные индексы, отличные от B-дерева, в качестве ключей секционирования и в материализованных представлениях (Марк Дилгер) § §Тип индексов должен поддерживать сравнение на равенство
Возможность параллельного создания индексов GIN (Томаш Вондра, Маттиас ван де Меент) §
Возможность сортировки значений для ускорения построения индексов диапазонных типов GiST и btree (Бернд Хелмле) §

Общая производительность

ИзменениеОписание
Добавление подсистемы асинхронного ввода-вывода (Андрес Фройнд, Томас Манро, Назир Билал Явуз, Мелани Плейгман) § § § § § § § § § § §Благодаря этой функциональности обслуживающие процессы могут ставить в очередь несколько запросов на чтение, что позволяет повысить производительность последовательного сканирования, сканирования кучи по битовой карте, процесса очистки и других операций. Эта функциональность включается при помощи параметра конфигурации io_method и управляется параметрами io_combine_limit и io_max_combine_limit. Она также позволяет использовать параметры effective_io_concurrency и maintenance_io_concurrency со значениями больше нуля для систем без поддержки функции fadvise(). В новом представлении pg_aios показываются дескрипторы, используемые для асинхронного ввода-вывода
Увеличение производительности блокировок запросов, обращающихся к большому числу отношений (Томаш Вондра) §
Увеличение производительности и сокращение использования памяти соединениями по хешу и предложениями GROUP BY (Дэвид Роули, Джефф Дэвис) § § § § §Кроме того, улучшена производительность операций с набором хешей, используемых предложениями EXCEPT, и поиск по хешу значений подплана
Возможность заморозки отдельных даже полностью видимых страниц при обычных операциях очистки (Мелани Плейгман) § §Таким образом снижаются издержки последующей заморозки всего отношения. Агрессивность этой функциональности управляется параметром конфигурации на уровне таблиц vacuum_max_eager_freeze_failure_rate. Ранее процесс очистки обрабатывал полностью видимые страницы только тогда, когда требовалась заморозка
Добавление параметра конфигурации vacuum_truncate, который управляет усечением файлов во время VACUUM (Натан Боссарт, Гуржит Сингх) §Параметр уровня хранения с таким именем и поведением уже существовал
Увеличение значения по умолчанию до 16 для параметров конфигурации effective_io_concurrency и maintenance_io_concurrency (Мелани Плейгман) § §Это изменение более точно отражает требования современного аппаратного обеспечения

Мониторинг

ИзменениеОписание
Реализация более подробного протоколирования серверной переменной log_connections (Мелани Плейгман) §Ранее переменная принимала только логическое значение, что все еще поддерживается
Добавление нового значения log_connections, которое позволяет протоколировать длительность этапов установления соединения (Мелани Плейгман) §
Добавление спецсимвола %L для параметра конфигурации log_line_prefix, что позволяет выводить IP-адрес клиента (Грег Сабино Маллейн) §
Добавление серверной переменной log_lock_failures, обеспечивающей протоколирование ошибок получения блокировок (Юки Сэйно, Фудзии Масао) § §В частности, протоколируются ошибки блокировки SELECT ... NOWAIT
Отображение времени, затраченного при VACUUM, ANALYZE и их автоматизированных вариантах, в представлении pg_stat_all_tables и его вариантах (Сами Имсейх) §Представления теперь содержат следующие новые столбцы: total_vacuum_time, total_autovacuum_time, total_analyze_time и total_autoanalyze_time
Добавление протоколирования времени задержки при выполнении VACUUM и ANALYZE (Бертран Друво, Натан Боссарт) § §Эта информация появляется в журнале сервера, системных представлениях pg_stat_progress_vacuum и pg_stat_progress_analyze, а также выводе команд VACUUM и ANALYZE в режиме VERBOSE. Замер времени задержки включается при помощи серверной переменной track_cost_delay_timing
Добавление статистики использования WAL и процессора, а также статистики чтения в вывод команды ANALYZE VERBOSE (Антонин Боннефой) § §
Добавление количества переполненных буферов WAL в вывод команд VACUUM / ANALYZE (VERBOSE) и в журнал процесса автоочистки (Бертран Друво) §
Добавление выдачи статистики ввода-вывода для каждого обслуживающего процесса (Бертран Друво) § §Обращение к статистике выполняется вызовом функции pg_stat_get_backend_io(). Очистить статистику ввода-вывода для каждого обслуживающего процесса можно, вызвав функцию pg_stat_reset_backend_stats()
Добавление столбцов в представление pg_stat_io, в которых показывается активность ввода-вывода в байтах (Назир Билал Явуз) §Представление теперь содержит следующие новые столбцы: read_bytes, write_bytes и extend_bytes. Столбец op_bytes, который всегда равнялся BLCKSZ, из представления удален
Добавление строк активности ввода-вывода WAL в представление pg_stat_io (Назир Билал Явуз, Бертран Друво, Микаэль Пакье) § § §Теперь представление показывает активность процесса-приемника WAL и событие ожидания для таких операций записи
Изменение серверной переменной track_wal_io_timing, теперь управляющей замером времени ожидания ввода-вывода WAL в представлении pg_stat_io вместо представления pg_stat_wal (Бертран Друво) §
Удаление столбцов, связанных с записью/синхронизацией, из представления pg_stat_wal (Бертран Друво) § §Из представления удаляются следующие столбцы: wal_write, wal_sync, wal_write_time и wal_sync_time
Добавление функции pg_stat_get_backend_wal(), которая возвращает статистику WAL для каждого обслуживающего процесса (Бертран Друво) §Очистить статистику WAL для каждого обслуживающего процесса можно, вызвав функцию pg_stat_reset_backend_stats()
Добавление функции pg_ls_summariesdir(), которая выводит информацию о файлах каталога PGDATA/pg_wal/summaries (Юси Огивара) §
Добавление столбца pg_stat_checkpointer.num_done, в котором показывается количество выполненных контрольных точек (Антон Мельников) §Сейчас в столбцах num_timed и num_requested показывается количество как выполненных, так и пропущенных контрольных точек
Добавление столбца pg_stat_checkpointer.slru_written, в котором показываются записанные SLRU-буферы (Нитин Ядав) §Кроме того, в сообщении журнала сервера о контрольных точках теперь выводятся отдельные значения для разделяемого буфера и SLRU-буфера
Добавление столбцов в представление pg_stat_database, в которых показывается активность параллельных рабочих процессов (Бенуа Лобро) §Представление теперь содержит новые столбцы parallel_workers_to_launch и parallel_workers_launched
Вычисление идентификатора запроса на основе только первой и последней константы из списка констант (Дмитрий Долгов, Сами Имсейх) § § §Генерирование нормализованного запроса используется модулем pg_stat_statements
Группировка запросов, использующих одно имя отношения, при вычислении идентификаторов запросов (Микаэль Пакье, Сами Имсейх) §Это работает, даже если у таблиц в разных схемах разные имена столбцов
Добавление столбца pg_backend_memory_contexts.type, в котором показывается тип контекста памяти (Дэвид Роули) §
Добавление столбца pg_backend_memory_contexts.path, в котором показываются родительские контексты памяти (Мелих Мутлу) §

Права

ИзменениеОписание
Добавление функции pg_get_acl(), которая возвращает подробную информацию о контроле доступа к базе данных (Джоэл Джейкобсон) § §
Добавление функции has_largeobject_privilege(), которая проверяет права на большие объекты (Юго Нагата) §
Возможность команды ALTER DEFAULT PRIVILEGES определять права по умолчанию для больших объектов (Харука Такацука, Юго Нагата, Лауренц Альбе) §
Добавление предопределенной роли pg_signal_autovacuum_worker (Кирилл Решке) §Она используется для отправки сигналов рабочим процессам автоочистки

Конфигурация сервера

ИзменениеОписание
Обеспечение поддержки метода аутентификации по OAuth (Джейкоб Чемпион, Даниэль Густафссон, Томас Манро) §В этом выпуске добавляется метод аутентификации oauth в pg_hba.conf, параметры OAuth в libpq, параметр конфигурации oauth_validator_libraries, который позволяет загружать библиотеки для проверки токенов, и параметр скрипта configure --with-libcurl, который добавляет необходимые библиотеки во время компиляции
Добавление серверной переменной ssl_tls13_ciphers, которая позволяет задавать несколько комплектов шифров TLS версии 1.3 в виде списка, разделенного двоеточиями (Эрика Чжан, Даниэль Густафссон) §
Изменение значения по умолчанию параметра конфигурации ssl_groups, которое теперь включает эллиптическую кривую X25519 (Даниэль Густафссон, Джейкоб Чемпион) §
Переименование параметра конфигурации ssl_ecdh_curve в ssl_groups, а также добавление возможности указывать несколько кривых ECDH через двоеточие (Эрика Чжан, Даниэль Густафссон) §Старое название параметра по-прежнему можно указывать
Увеличение максимальной длины ключей отмены запроса до 256 бит (Хейкки Линнакангас, Йелте Феннема-Нио) § §Это изменение работает, только если и сервер, и клиент используют протокол передачи данных версии 3.2, представленный в этом выпуске
Добавление серверной переменной autovacuum_worker_slots, которая позволяет указывать максимальное количество фоновых рабочих процессов (Натан Боссарт) §Если переменная задана, значение параметра autovacuum_max_workers можно изменить до максимального значения этой переменной во время выполнения без перезапуска сервера
Возможность указывать фиксированное количество мертвых кортежей, по достижении которого запускается автоочистка (Натан Боссарт, Фредерик Юэль) §Для этого используется серверная переменная autovacuum_vacuum_max_threshold. В качестве порогового значения срабатывания автоочистки проценты по-прежнему используются
Изменение серверной переменной max_files_per_process, которая теперь ограничивает только количество файлов, открываемых обслуживающим процессом (Андрес Фройнд) §Ранее в этом ограничении также учитывались файлы, открываемые процессом postmaster
Добавление серверной переменной num_os_semaphores, которая сообщает количество требуемых семафоров (Натан Боссарт) §Это полезно для конфигурации операционной системы
Добавление серверной переменной extension_control_path, которая позволяет указывать расположение управляющих файлов расширений (Питер Эйзентраут, Матеус Алькантара) § §extension_control_path = '/usr/local/share/postgresql:/home/my_project/share:$system'

Потоковая репликация и восстановление

ИзменениеОписание
Возможность автоматического аннулирования неактивных слотов репликации при помощи серверной переменной idle_replication_slot_timeout (Ниша Мунд, Бхарат Рупиредди) §
Добавление серверной переменной max_active_replication_origins, которая позволяет управлять максимальным количеством активных источников репликации (Эйлер Тавейра) §Ранее управление происходило при помощи параметра max_replication_slots, однако новый параметр допускает более высокое значение количества источников репликации в случаях, когда требуется меньшее количество слотов

Логическая репликация

ИзменениеОписание
Возможность логической репликации значений генерируемых столбцов (Шубхам Ханна, Вигнеш Си, Хоу Чжицзе, Шлок Кьял, Питер Смит) § § § §Если в публикации указывается список столбцов, публикуются все указанные столбцы, будь то генерируемые или негенерируемые. Если список столбцов не указан, параметр публикации publish_generated_columns управляет публикацией генерируемых столбцов. Ранее генерируемые столбцы не реплицировались, и подписчику приходилось вычислять значения, если это было возможно. Это особенно полезно для подписчиков, не относящихся к PostgreSQL, у которых нет такой функциональности
Изменение значения по умолчанию параметра streaming команды CREATE SUBSCRIPTION с off на parallel (Вигнеш Си) §
Возможность команды ALTER SUBSCRIPTION изменять поведение слота репликации в отношении двухфазной фиксации (Хайато Курода, Аджин Чериан, Амит Капила, Хоу Чжицзе) § §
Протоколирование конфликтов во время применения изменений логической репликации (Хоу Чжицзе, Ниша Мунд) § § § § §Такие конфликты теперь также отображаются в новых столбцах представления pg_stat_subscription_stats

Служебные команды

ИзменениеОписание
Добавление виртуальных генерируемых столбцов, которые теперь используются по умолчанию (Питер Эйзентраут, Цзянь Хи, Ричард Гуо, Дин Рашид) § § §Виртуальные генерируемые столбцы генерируют свои значения во время чтения, а не записи. Поведение при записи можно по-прежнему задавать при помощи параметра STORED
Добавление поддержки псевдонимов OLD / NEW в предложениях RETURNING запросов DML (Дин Рашид) §Ранее предложение RETURNING возвращало только новые значения для команд INSERT и UPDATE и старые значения для команды DELETE. Команда MERGE возвращала соответствующее значение для выполняемого внутреннего запроса. Новый синтаксис позволяет явным образом указать, старые или новые значения должно возвращать предложение RETURNING команд INSERT / UPDATE / DELETE / MERGE, используя специальные псевдонимы old и new. Во избежание конфликтов идентификаторов эти псевдонимы можно переименовать
Возможность создавать сторонние таблицы как существующие локальные таблицы (Чжан Минли) §Используется следующий синтаксис: CREATE FOREIGN TABLE ... LIKE
Возможность использовать предложение LIKE с недетерминированными правилами сортировки (Питер Эйзентраут) §
Возможность использовать функции поиска положения в тексте с недетерминированными правилами сортировки (Питер Эйзентраут) §Ранее в этих случаях выводилась ошибка
Добавление встроенного провайдера правил сортировки PG_UNICODE_FAST (Джефф Дэвис) §Эта локаль поддерживает преобразование регистра, но выполняет сортировку в порядке кодов символов, а не естественного языка
Возможность команд VACUUM и ANALYZE обрабатывать секционированные таблицы без обработки их потомков (Майкл Харрис) §Эта функциональность включается при помощи нового параметра ONLY. Она полезна, поскольку процесс автоочистки обрабатывает только потомков секционированных таблиц, а не сами таблицы
Добавление функций изменения статистики оптимизатора для отдельных отношений и столбцов (Кори Хинкер) § § §Добавлены следующие функции: pg_restore_relation_stats(), pg_restore_attribute_stats(), pg_clear_relation_stats() и pg_clear_attribute_stats()
Добавление серверной переменной file_copy_method, которая управляет методом копирования файлов (Назир Билал Явуз) §Она позволяет указать, что используют команды CREATE DATABASE ... STRATEGY=FILE_COPY и ALTER DATABASE ... SET TABLESPACE — копию файла или его клон
Возможность указывать неперекрывающиеся ограничения PRIMARY KEY, UNIQUE, а также ограничения внешнего ключа (Пол А. Юнгвирт) § §Это можно сделать, указав WITHOUT OVERLAPS для ограничений PRIMARY KEY и UNIQUE или PERIOD для внешних ключей. Все ограничения применяются к последнему указанному столбцу
Возможность указывать ограничение CHECK и ограничение внешнего ключа как NOT ENFORCED (Амул Сул) § §Кроме того, добавлен столбец pg_constraint.conenforced
Требование для отношений первичный/внешний ключ использовать детерминированные или такие же недетерминированные правила сортировки (Питер Эйзентраут) §Если требования не выполняются, восстановление при помощи pg_dump или pg_upgrade будет завершаться с ошибкой. Для успешного использования методов обновления необходимо изменить схему
Хранение ограничений NOT NULL столбца в каталоге pg_constraint (Альваро Эррера, Бернд Хелмле) § §Это изменение позволяет указывать имена для ограничений NOT NULL. Кроме того, добавлена возможность указывать ограничение NOT NULL для сторонних таблиц и управлять наследованием этого ограничения для локальных таблиц
Возможность команды ALTER TABLE задавать указание NOT VALID для ограничения NOT NULL (Рушаб Латиа, Цзянь Хи) §
Возможность изменять наследуемость ограничений NOT NULL (Сурадж Хараге, Альваро Эррера) § §Используется следующий синтаксис: ALTER TABLE ... ALTER CONSTRAINT ... [NO] INHERIT
Возможность использовать ограничения внешнего ключа с указанием NOT VALID с секционированными таблицами (Амул Сул) §
Возможность удалять ограничения только для секционированных таблиц (Альваро Эррера) §Ранее по ошибке это было делать запрещено
Добавление параметра REJECT_LIMIT, управляющего количеством недействительных строк, которые команда COPY FROM может игнорировать (Атсуши Торикоши) §Параметр работает при условии ON_ERROR = 'ignore'
Возможность команды COPY TO копировать строки из наполненных данными материализованных представлений (Цзянь Хи) §
Добавление нового значения silent параметра LOG_VERBOSITY команды COPY, которое исключает сообщения журнала об игнорируемых строках (Атсуши Торикоши) §Новый уровень детализации журнала позволяет подавлять сообщения об игнорируемых входящих строках при условии on_error = 'ignore'
Запрет использования команды COPY FREEZE со сторонними таблицами (Натан Боссарт) §Ранее команда COPY работала, но параметр FREEZE игнорировался, поэтому теперь этой командой пользоваться запрещено
Автоматическое включение вывода BUFFERS в EXPLAIN ANALYZE (Гийом Леларж, Дэвид Роули) §
Добавление количества переполненных буферов WAL в вывод команды EXPLAIN (WAL) (Бертран Друво) §
Добавление количества поисков по индексу, выполненных каждым узлом Index Scan, в вывод команды EXPLAIN ANALYZE (Питер Гейган) §
Вывод количества строк с точностью до двух цифр после десятичной точки в EXPLAIN (Ибрар Ахмед, Илья Евдокимов, Роберт Хаас) § §
Добавление подробной информации об использовании памяти и дискового пространства узлами Material и Window Aggregate, а также узлами общих табличных выражений в вывод команды EXPLAIN (Дэвид Роули, Тацуо Исии) § § § §
Добавление подробной информации об аргументах оконных функций в вывод команды EXPLAIN (Том Лейн) §
Добавление статистики по кешу рабочего процесса Parallel Bitmap Heap Scan в вывод команды EXPLAIN ANALYZE (Давид Гайер, Хейкки Линнакангас, Дунхан Линь, Алена Рыбакина, Дэвид Роули) §
Добавление количества отключенных узлов в вывод команды EXPLAIN ANALYZE (Роберт Хаас, Дэвид Роули, Лауренц Альбе) § § §

Типы данных

ИзменениеОписание
Улучшение полного преобразования регистра Unicode (Джефф Дэвис) § §Таким образом добавляется возможность выполнять преобразование регистра по условию, первых букв слов из строчных в заглавные, а также одного символа в несколько символов
Возможность приводить значения null типа данных jsonb к NULL скалярных типов данных (Том Лейн) §Ранее при попытке такого приведения типов выводилась ошибка
Добавление необязательного аргумента функции json_strip_nulls() / jsonb_strip_nulls(), который позволяет удалять равные NULL элементы массива (Флоренц Целай) §
Добавление функции array_sort(), которая сортирует элементы первой размерности массива (Цзюньван Жао, Цзянь Хи) §
Добавление функции array_reverse(), которая переставляет элементы первой размерности массива в обратном порядке (Александр Алексеев) §
Добавление функции reverse(), которая переставляет байты в двоичной строке в обратном порядке (Александр Алексеев) §
Возможность приводить целочисленные типы данных к bytea и обратно (Александр Алексеев) §Целые значения хранятся как тип bytea с байтами, которые формируются в дополнительном коде
Обновление Unicode до версии 16.0.0 (Питер Эйзентраут) §
Добавление стеммера полнотекстового поиска для эстонского языка (Том Лейн) §
Улучшение кодов ошибок XML для более точного соответствия стандарту SQL (Том Лейн) §Ошибки выводятся с SQLSTATE

Функции

ИзменениеОписание
Добавление функции casefold(), которая позволяет выполнять более сложное регистронезависимое сопоставление (Джефф Дэвис) §Она позволяет выполнять более точное сопоставление, например, когда у символа может быть несколько эквивалентов в верхнем и нижнем регистре или когда при приведении регистра меняется количество символов
Возможность использовать агрегатные функции MIN() и MAX() с массивами и составными типами (Александр Алексеев, Марат Бухаров) § §
Добавление аргумента WEEK в функцию EXTRACT() (Том Лейн) §
Улучшение вывода EXTRACT(QUARTER ...) для отрицательных значений (Том Лейн) §
Обеспечение поддержки римских цифр в функции to_number() (Хунаид Сохаил) §Для этого используется шаблон RN
Добавление функции uuidv7(), которая генерирует UUID версии 7 (Андрей Бородин) §Это значение UUID подлежит сортировке по времени. Для явного генерирования UUID версии 4 создана функция-псевдоним uuidv4()
Добавление функций crc32() и crc32c() для вычисления значений CRC (Александр Алексеев) §
Добавление математических функций gamma() и lgamma() (Дин Рашид) §
Возможность использовать синтаксис => в именной нотации для аргументов курсоров в PL/pgSQL (Павел Стехуле) §Раньше можно было указывать только :=
Возможность использования аргументов в именной нотации для функций regexp_match(), regexp_matches(), regexp_like(), regexp_replace(), regexp_count(), regexp_instr(), regexp_substr(), regexp_split_to_table() и regexp_split_to_array() (Цзянь Хи) §

libpq

ИзменениеОписание
Добавление функции PQfullProtocolVersion(), которая возвращает полную версию протокола взаимодействия между клиентом и сервером, включая номер корректирующей версии (Джейкоб Чемпион, Йелте Феннема-Нио) §
Добавление параметров подключения и переменных окружения libpq для указания минимальной и максимальной допустимых версий протокола подключения (Йелте Феннема-Нио) § §
Вывод изменений search_path клиенту (Александр Кукушкин, Йелте Феннема-Нио, Томаш Вондра) § §
Добавление вывода функции PQtrace() для всех типов сообщений, включая сообщения об аутентификации (Йелте Феннема-Нио) § § § § §
Добавление параметра подключения libpq sslkeylogfile, который позволяет журналировать SSL-ключи (Абхишек Чанда, Даниэль Густафссон) §Этот параметр полезен для целей отладки
Изменение сигнатур некоторых функций libpq для использования типа данных int64_t (Томас Манро) §Ранее использовался тип pg_int64, теперь он считается устаревшим

psql

ИзменениеОписание
Возможность psql разбирать, связывать и закрывать именованные подготовленные операторы (Антонин Боннефой, Микаэль Пакье) § §Это возможно благодаря новым командам \parse, \bind_named и \close_prepared
Добавление в psql начинающихся с \ команд, которые позволяют отправлять запросы к конвейерам (Антонин Боннефой) § § §Добавлены следующие команды: \startpipeline, \syncpipeline, \sendpipeline, \endpipeline, \flushrequest, \flush и \getresults
Возможность добавлять статус конвейера в приглашение psql, а также добавление связанных переменных состояния (Антонин Боннефой) §Новый символ приглашения — %P, а новые переменные psqlPIPELINE_SYNC_COUNT, PIPELINE_COMMAND_COUNT и PIPELINE_RESULT_COUNT
Возможность добавлять имя службы подключения в приглашение psql или обращаться к нему через переменную psql (Михаэль Банк) §
Добавление параметра psql для использования расширенного режима во всех командах выведения списка (Дин Рашид) §Функциональность включается добавлением суффикса x к команде
Изменение команды \conninfo psql, которая теперь использует табличный формат и выводит больше информации (Альваро Эррера, Майквел Грасси, Хунаид Сохаил) §
Добавление индикатора герметичности функции в вывод метакоманд psql \df+, \do+, \dAo+ и \dC+ (Юго Нагата) §
Добавление подробной информации о методе доступа к секционированным отношениям в вывод команды \dP+ (Джастин Призби) §
Добавление версии расширения по умолчанию в вывод команды psql \dx (Магнус Хагандер) §
Добавление переменной psql WATCH_INTERVAL, которая задает время ожидания по умолчанию для команды \watch (Даниэль Густафссон) §

Серверные приложения

ИзменениеОписание
Включение расчета контрольных сумм по умолчанию в initdb (Грег Сабино Маллейн) § §Новый параметр initdb --no-data-checksums отключает расчет контрольных сумм
Добавление параметра initdb --no-sync-data-files, который позволяет пропускать синхронизацию файлов кучи/индекса (Натан Боссарт) §Для пропуска синхронизации любых файлов по-прежнему доступен параметр initdb --no-sync
Добавление функции vacuumdb --missing-stats-only, которая вычисляет только недостающую статистику оптимизатора (Кори Хинкер, Натан Боссарт) § §Этот параметр могут задавать только суперпользователи и только в сочетании с параметрами --analyze-only и --analyze-in-stages
Добавление параметра pg_combinebackup -k / --link, который задает использование жестких ссылок (Израэл Барт, Роберт Хаас) §Жесткие ссылки можно задать лишь для некоторых файлов. Этот параметр не следует задавать, если резервные копии будут использоваться независимо
Возможность pg_verifybackup проверять резервные копии в формате tar (Амул Сул) §
Добавление имени базы данных в вывод --write-recovery-conf, если это имя указано в параметре pg_rewind --source-server (Масахико Савада) §
Добавление параметра pg_resetwal --char-signedness, который меняет знаковость типа char по умолчанию (Масахико Савада) §

pg_dump/pg_dumpall/pg_restore

ИзменениеОписание
Добавление параметра pg_dump --statistics (Джефф Дэвис) § §
Добавление параметра --sequence-data в утилиты pg_dump и pg_dumpall, добавляющего в выгрузку данные последовательностей, которые обычно в нее не включаются (Натан Боссарт) § §
Добавление параметров --statistics-only, --no-statistics, --no-data и --no-schema в утилиты pg_dump, pg_dumpall и pg_restore (Кори Хинкер, Джефф Дэвис) §
Добавление параметра --no-policies, который отключает обработку политики защиты на уровне строк, в утилиты pg_dump, pg_dumpall и pg_restore (Николай Самохвалов) §Это полезно при миграции на системы с другими политиками

pg_upgrade

ИзменениеОписание
Возможность pg_upgrade сохранять статистику оптимизатора (Кори Хинкер, Джефф Дэвис, Натан Боссарт) § § § §Расширенная статистика не сохраняется. Также добавлен параметр pg_upgrade --no-statistics, который отключает сохранение статистики
Возможность pg_upgrade обрабатывать проверки баз данных в параллельном режиме (Натан Боссарт) § § § § § § § § § § §Управление этой функциональностью выполняется при помощи существующего параметра --jobs
Добавление параметра pg_upgrade --swap, который позволяет переносить каталоги между кластерами вместо копирования, клонирования или связывания файлов (Натан Боссарт) §Этот режим является потенциально самым быстрым
Добавление параметра pg_upgrade --set-char-signedness, который задает знаковость типа char по умолчанию для нового кластера (Масахико Савада) § §Он необходим в тех случаях, когда в кластере PostgreSQL версии ниже 18 знаковость по умолчанию не совпадает со знаковостью в новом кластере

Приложения логической репликации

ИзменениеОписание
Добавление параметра pg_createsubscriber --all, который позволяет создавать логические реплики для всех баз данных (Шубхам Ханна) §
Добавление параметра pg_createsubscriber --clean, который позволяет удалять подписки (Шубхам Ханна) § §
Добавление параметра pg_createsubscriber --enable-two-phase, который позволяет включать подготовленные транзакции (Шубхам Ханна) §
Добавление параметра pg_recvlogical --enable-failover, который позволяет указывать слоты отработки отказа (Хайато Курода) §Кроме того, добавлен параметр --enable-two-phase как синоним параметра --two-phase, а последний признан устаревшим
Возможность параметра pg_recvlogical --drop-slot работать без параметра --dbname (Хайато Курода) §

Исходный код

ИзменениеОписание
Разграничение загрузки и запуска точек внедрения (Микаэль Пакье, Хейкки Линнакангас) § §Теперь точки внедрения можно создавать без запуска при помощи функции INJECTION_POINT_LOAD(), а запускать, вызывая функцию INJECTION_POINT_CACHED()
Обеспечение поддержки аргументов, задаваемых во время выполнения, в точках внедрения (Микаэль Пакье) §
Возможность использовать встроенные тесты точек внедрения при помощи макроса IS_INJECTION_POINT_ATTACHED() (Хейкки Линнакангас) §
Улучшение эффективности обработки длинных строк JSON, используя принцип SIMD (Single Instruction Multiple Data, Одиночный поток команд, множественный поток данных) (Дэвид Роули) §
Ускорение вычислений CRC32C с использованием инструкций x86 AVX-512 (Рагхувир Девулапалли, Пол Амонсон) §
Добавление встроенных функций ARM Neon и SVE для вычисления количества бит в двоичной строке (Чиранмой Бхаттачарья, Деванга Сусмита, Рама Маллади) § §
Повышение скорости умножения и деления значений типа numeric (Джоэл Джейкобсон, Дин Рашид) § § § §
Добавление параметра скрипта configure --with-libnuma, который активирует сборку под архитектуру NUMA (Якуб Вартак, Бертран Друво) § § §Функция pg_numa_available() сообщает, что сервер был скомпилирован с поддержкой NUMA, а в системных представлениях pg_shmem_allocations_numa и pg_buffercache_numa показывается распределение общей памяти между узлами NUMA
Добавление TOAST-таблиц в pg_index для поддержки очень больших выражений индексов (Натан Боссарт) §
Удаление столбца pg_attribute.attcacheoff (Дэвид Роули) §
Добавление столбца pg_class.relallfrozen (Мелани Плейгман) §
Добавление процедуры amgettreeheight, а также свойств amconsistentequality и amconsistentordering в API индексных методов доступа (Марк Дилгер) § §
Добавление опорной функции GiST stratnum() (Пол А. Юнгвирт) §
Регистрация знаковости типа char по умолчанию в pg_controldata (Масахико Савада) §
Обеспечение поддержки Python Limited API (ограниченный API) в PL/Python (Питер Эйзентраут) § §Это позволяет избежать проблем с несовпадением версий Python 3.x
Изменение минимальной поддерживаемой версии Python до 3.6.8 (Джейкоб Чемпион) §
Прекращение поддержки версий OpenSSL до версии 1.1.1 (Даниэль Густафссон) § §
Повышение минимальной требуемой версии LLVM, при наличии, до 14 или новее (Томас Манро) §
Добавление макроса PG_MODULE_MAGIC_EXT, который позволяет расширениям выводить свое имя и версию (Андрей Лепихов) §Эту информацию можно запросить, вызвав новую функцию pg_get_loaded_modules()
Документирование того, что функции SPI_connect() и SPI_connect_ext() всегда возвращают успешный результат (SPI_OK_CONNECT) (Степан Неретин) §Сообщения об ошибках всегда создаются при помощи функции ereport()
Добавление раздела документации о совместимости API и ABI (Дэвид Уилер, Питер Эйзентраут) §
Удаление параметров скрипта configure --disable-spinlocks и configure --disable-atomics (Томас Манро) § §Использование 32-битных атомарных операций теперь обязательно

Доп. модули

ИзменениеОписание
Добавление расширения pg_logicalinspect для проверки снимков, полученных при логическом декодировании (Бертран Друво) §
Добавление расширения pg_overexplain, которое включает отладочную информацию в вывод команды EXPLAIN (Роберт Хаас) §
Добавление выходных столбцов в функцию postgres_fdw_get_connections() (Хайато Курода, Сагар Дилип Шедж) § § § §Новые столбцы показывают следующее: used_in_xact — используется ли обертка сторонних данных текущей транзакцией, closed — закрыто ли соединение, user_name — имя пользователя, remote_backend_pid — идентификатор удаленного обслуживающего процесса
Добавление сквозной аутентификации SCRAM между клиентом и сервером postgres_fdw (Матеус Алькантара, Питер Эйзентраут) §Эта функциональность включается при помощи параметра управления соединением postgres_fdw use_scram_passthrough и исключает необходимость хранить информацию об аутентификации postgres_fdw в базе данных. В libpq появились новые параметры соединения scram_client_key и scram_server_key
Возможность сквозной аутентификации SCRAM между клиентом и сервером dblink (Матеус Алькантара) §
Добавление параметров on_error и log_verbosity в модуль file_fdw (Атсуши Торикоши) §Они управляют тем, как file_fdw обрабатывает недействительные строки файла и сообщает о них
Добавление параметра reject_limit, управляющего количеством недействительных строк, которые может игнорировать модуль file_fdw (Атсуши Торикоши) §Он работает при условии ON_ERROR = 'ignore'
Добавление параметра конфигурации min_password_length в модуль passwordcheck (Эмануэле Музелла, Маурицио Бориани) §Он управляет минимальной длиной пароля
Возможность pgbench выводить количество неуспешных, повторно выполненных или пропущенных транзакций в отчетах по скриптам (Юго Нагата) §
Добавление параметра конфигурации isn.weak, который позволяет принимать значения ISN даже с некорректной проверочной цифрой (Виктор Хольмберг) §Ранее управлять этим поведением можно было только при помощи функции isn_weak()
Возможность сортировки значений для ускорения построения индексов btree_gist (Бернд Хелмле, Андрей Бородин) §
Добавление функции amcheck gin_index_check(), которая позволяет проверять индексы GIN (Григорий Крячко, Хейкки Линнакангас, Андрей Бородин) §
Добавление функций pg_buffercache_evict_relation() и pg_buffercache_evict_all(), которые позволяют вытеснять незакрепленные общие буферы (Назир Билал Явуз) §Существующая функция pg_buffercache_evict() теперь возвращает статус вытеснения буферов
Возможность расширений устанавливать нестандартные параметры EXPLAIN (Роберт Хаас, Сами Имсейх) § § §
Возможность расширений использовать API накопительной статистики сервера (Микаэль Пакье) § §

pg_stat_statements

ИзменениеОписание
Возможность отслеживать запросы CREATE TABLE AS и DECLARE модулем pg_stat_statements (Антонин Боннефой) §Теперь им также назначаются идентификаторы запросов
Возможность параметризации значений SET в модуле pg_stat_statements (Грег Сабино Маллейн, Микаэль Пакье) §Это позволяет сократить раздувание, которое возникает из-за операторов SET с разными константами
Добавление столбцов в представление pg_stat_statements, в которых показывается параллельная активность (Гийом Леларж) §Представление теперь содержит новые столбцы parallel_workers_to_launch и parallel_workers_launched
Добавление столбца pg_stat_statements.wal_buffers_full, в котором показываются переполненные буферы WAL (Бертран Друво) §

pgcrypto

ИзменениеОписание
Добавление алгоритмов pgcrypto sha256crypt и sha512crypt (Бернд Хелмле) §
Добавление режима CFB в расширение pgcrypto для защитного преобразования и обратного защитного преобразования (Умар Хайат) §
Добавление функции fips_mode(), которая сообщает о включенном режиме FIPS сервера (Даниэль Густафссон) §
Добавление параметра конфигурации pgcrypto.builtin_crypto_enabled, который позволяет отключать встроенные функции защитного преобразования не в режиме FIPS (Даниэль Густафссон, Джо Конвей) §Это полезно для обеспечения работы режима FIPS

Изменения в версии 18.1

ИзменениеОписание
Проверка прав CREATE для схемы при выполнении команды CREATE STATISTICS (Йелте Феннема-Нио) §Раньше из-за отсутствия такой проверки владельцы таблиц могли создавать объекты статистики в любой схеме, что могло приводить к неожиданным конфликтам с именами. Проект PostgreSQL благодарит Йелта Феннема-Нио за сообщение об этой проблеме. ([CVE-2025-12817](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2025-12817))
Предотвращение целочисленного переполнения в libpq при вычислении требуемого объема памяти (Джейкоб Чемпион) §При вычислении объема памяти, который необходимо выделить, некоторые функции libpq не учитывали все тонкости. Если на вход передавался значительный объем данных, могло возникнуть целочисленное переполнение. В результате выделялся недостаточный объем, и запись выполнялась за пределами буфера. Проект PostgreSQL благодарит Алексея Соловьева из Positive Technologies за сообщение об этой проблеме. ([CVE-2025-12818](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2025-12818))
Предотвращение ошибок «unrecognized node type» (нераспознанный тип узла), возникавших при наличии предложения DEFAULT с выражением COLLATE в функции SQL/JSON, например JSON_VALUE (Цзянь Хи) § §
Недопущение некорректных оптимизаций предложений HAVING без переменных при применении наборов группирования (Ричард Гуо) § §
Избегание параллелизма в правых неполных соединениях по хешу (Ричард Гуо) §Параллелизм не обеспечивал надежность, поскольку при обновлении общей хеш-таблицы соединения возникало условие гонки
Устранение возможности деления на ноль при создании упорядоченных планов Append (Ричард Гуо) §Эта возможность могла привести к некорректному выбору наиболее выгодного пути или к сбою проверочного утверждения в отладочных сборках
Устранение сбоя планировщика при использовании типов индексов, которые поддерживают упорядоченный доступ, но не поддерживают сканирование только индекса (Максим Схуманс) §В результате этого сбоя возникали ошибки типа «no data returned for index-only scan» (нет данных для сканирования только индекса). Проблема не возникала со встроенными типами индексов, но она коснулась некоторых расширений
Удаление ошибочного проверочного утверждения при очистке индексов btree (Питер Гейган) §
Предупреждение возможных сбоев из-за нехватки памяти или «invalid memory alloc request size» (недопустимый запрошенный размер памяти) при параллельном построении индексов GIN (Томаш Вондра) §
Предоставление снимка для выражений индексов в ходе автоматического расчета сводки для индексов BRIN, если это необходимо (Альваро Эррера) § §Раньше автоматический расчет сводки для таких индексов завершался ошибкой и оставлял после себя кортежи-местозаполнители, что со временем приводило к раздуванию индекса
Устранение угрозы целочисленного переполнения при сканировании индексов BRIN, если количество страниц в таблице приближается к 2³² (Сунил С) §Эта ошибка могла привести к бесконечному циклу сканирования или сканированию ненужных страниц таблицы
Исправление некорректного дополнения нулями хранимых значений в коде кортежей, обработанных JIT (Дэвид Роули) §Когда JIT-обработка не использовалась, корректно применялось расширение знака, что приводило к разному представлению небольших целочисленных типов данных. В большинстве случаев это несоответствие не проявлялось, но при использовании узлов плана Memoize фиксировались ошибки «could not find memoization table entry» (не удалось найти записи в таблице с мемоизацией). Были возможны и другие проявления
Устранение редкого случая сбоя при обработке хешированных запросов с GROUPING SETS (Дэвид Роули) §
Исправление неправильной логики выбора размера хеш-таблиц в соединениях по хешу (Томаш Вондра) §Иногда при соединениях по хешу использовалось больше памяти, чем предполагалось, или она распределялась неэффективно
Улучшение логики поиска с помощью функций управления статистикой для отношений (Натан Боссарт) § §Теперь функции pg_restore_relation_stats(), pg_clear_relation_stats(), pg_restore_attribute_stats() и pg_clear_attribute_stats() проверяют права до получения блокировки целевого отношения, а не после
Исправление неправильной логики кеширования информации о результирующем отношении для триггеров (Дэвид Роули, Амит Ланготе) §Раньше, если наборы столбцов секций физически не соответствовали наборам столбцов родительских секционированных таблиц, могли возникать сбои
Устранение сбоя при перепроверках EvalPlanQual для секционированных таблиц (Дэвид Роули, Амит Ланготе) §
Исправление обработки EvalPlanQual сторонних или нестандартных соединений, у которых нет альтернативного плана локального соединения, подготовленного для перепроверки EPQ (Масахико Савада, Эцуро Фудзита) §В этих случаях должны использоваться сторонние или нестандартные методы доступа. Этого не происходило, что, как правило, приводило к сбоям
Пропуск копирования ограничений при выполнении DETACH CONCURRENTLY для секционирования по хешу (Хайян Ли) §Раньше в рамках ALTER TABLE DETACH PARTITION CONCURRENTLY ограничения секционирования копировались в отсоединенную секцию. Это было необязательно отчасти из-за того, что копирование не выполнялось при DETACH в неблокирующем режиме. Однако основная причина в том, что в случае секционирования по хешу выражение ограничения содержит ссылки на OID родительской таблицы. Это мешает при выгрузке/восстановлении, а также в случаях, когда после выполнения DETACH родительская таблица удаляется. Начиная с версии 19, ограничения больше не будут копироваться. Чтобы минимизировать риски непредвиденных последствий, в выпущенных версиях копирование ограничения пропускается только для секционирования по хешу
Запрет на добавление генерируемых столбцов в ключи секционирования (Цзянь Хи, Ашутош Бапат) §Запрет уже был реализован, но в некоторых случаях проверки не срабатывали, например, когда ссылка на столбец неявно содержалась в ссылке на всю строку
Запрет на использование генерируемых столбцов в предложениях COPY ... FROM ... WHERE (Питер Эйзентраут, Цзянь Хи) §Раньше попытки сослаться на такой столбец приводили к некорректному поведению или странному сообщению об ошибке, поскольку на момент фильтрации WHERE такие генерируемые столбцы еще не были вычислены
Недопущение столбца идентификации с ограничением NOT NULL, помеченным как нерабочее (Цзянь Хи) §Столбцы идентификации должны быть NOT NULL, но проверка пропускала этот особый случай
Предотвращение потенциального использования освобожденной памяти при параллельной очистке (Кевин Омен Аниш) §Такое поведение не наблюдалось в стандартных сборках, но теоретически представляло опасность
Исправление проверки видимости для объектов статистики в pg_temp (Ной Миш) §В имени объекта статистики, расположенного во временной схеме, должно быть указание схемы, однако функция pg_statistics_obj_is_visible() игнорировала это правило и могла вернуть «true» для объекта, для которого схема не указана. В свою очередь такие функции, как pg_describe_object(), могли указать схему в имени объекта некорректно
Устранение незначительной утечки памяти при воспроизведении из WAL создания базы данных (Натан Боссарт) §
Исправление вывода информации о задержке репликации в представлении pg_stat_replication (Фудзии Масао) §Если при воспроизведении WAL на любом резервном сервере LSN переставал увеличиваться, обновление столбцов write_lag и flush_lag прекращалось
Устранение дублирования сообщений о некорректных значениях параметра primary_slot_name в журнале (Фудзии Масао) §
Устранение сбоев при указании в synchronized_standby_slots несуществующих слотов репликации (Шлок Кьял) §
Удаление незаконченного файла состояния слота после сбоя записи состояния слота репликации на диск (Микаэль Пакье) §Раньше после сбоя, например при нехватке места, временный файл state.tmp не удалялся. Это вызывало проблемы, поскольку все последующие попытки записать состояние блокировались, что требовало ручной очистки
Исправление неправильной обработки сигналов об истечении времени ожидания блокировки параллельными рабочими процессами в ходе логической репликации (Хайато Курода) §Один и тот же номер сигнала использовался при остановке рабочего процесса и при истечении времени ожидания блокировки, что вызывало путаницу
Предотвращение нежелательного останова WAL receiver при переключении с потока на архив WAL (Сюнэн Чжоу) §Во время смены линии времени WAL receiver резервного сервера должен продолжать работу, ожидая новую начальную точку потока WAL. Раньше он постоянно останавливался и сразу перезапускался, что могло запутать код, который мониторит его статус
Исправлена проблема использования освобожденной памяти при кешировании информации о синхронизации отношений модулем логического декодирования pgoutput (Вигнеш Си, Масахико Савада) §Ошибка в ходе логического декодирования могла приводить к сбоям последующих попыток логического декодирования в том же сеансе. Проблема возникала, только когда модуль pgoutput вызывался с помощью SQL-функций
Предотвращение ненужного аннулирования слотов логической репликации (Бертран Друво) §
Возвращение исключения в правило сортировки C при установке локали (Джефф Девис) §Исключение позволяет устранить регрессию доступа к общим каталогам на раннем этапе запуска обслуживающего процесса до того, как выбрана база данных. Проблема не затрагивала код ядра PostgreSQL, но вызывала сбои некоторых расширений
Устранение сбоя при попытке протестировать PostgreSQL, используя некоторые параметры libsanitizer (Эммануэль Сиби, Джейкоб Чемпион) §
Корректная обработка GROUP BY DISTINCT в операторах присваивания PL/pgSQL (Том Лейн) §Анализатор не распознавал параметр DISTINCT, поэтому команда выполнялась как будто с GROUP BY
Устранение утечки памяти при обработке ошибки SQL в PL/Python (Том Лейн) §Устранена утечка памяти в течение всего сеанса, появившаяся в предыдущих корректирующих выпусках
Исправление выгрузки ненаследуемых ограничений NOT NULL, установленных для наследуемых столбцов таблицы (Дилип Кумар) §Утилита pg_dump не сохраняла такие ограничения при выгрузке с сервера до версии 18
Исправление сортировки ограничений внешних ключей утилитой pg_dump (Альваро Эррера) §Исправление обеспечивает определенный порядок для этих объектов баз данных, что уже было сделано для других типов объектов
Исправление различных ошибок в логике сжатия данных pg_dump и pg_restore (Даниэль Густафссон, Том Лейн) § § §В некоторых местах проверка пропускалась или выполнялась неправильно. На компьютерах с порядком байт от старшего возникали вопросы переносимости. Сообщений об этих проблемах не поступало, так как код используется только для чтения сжатых файлов с перечнем больших объектов в рамках выгрузок каталогов. pg_dump не создает таких выгрузок; проблемы бы возникли в случае сжатия файла с перечнем больших объектов вручную, что возможно, но используется редко
Исправление поведения pgbench, чтобы программа завершалась штатно при запуске операции COPY (Антонин Боннефой) §Изначально не планировалось, что pgbench будет поддерживать такое поведение, но без него происходило зацикливание
Исправление вывода сообщений программой pgbench в случае нескольких ошибок (Юго Нагата) §В случаях, когда два последовательных вызова PQgetResult завершались ошибкой, pgbench могла вывести неправильное сообщение об ошибке
Исправление ошибочного утверждения об ошибках в pgbench в конвейерном режиме (Юго Нагата) §
Устранение утечки памяти в pg_combinebackup при обработке отдельных файлов (Том Лейн) §
Обеспечение возможности отменить функции contrib/pg_buffercache (Сатьянараяна Нарлапурам, Юйхан Цю) § §В некоторых случаях операции могли выполняться продолжительное время без проверок прерываний
Исправление проверки прав contrib/pg_prewarm для индексов (Аюш Ватса, Натан Боссарт) § §pg_prewarm() проверяет наличие права SELECT для отношений, которые необходимо разогреть. Однако, поскольку для индексов нет отдельных прав SQL, разогреть их могли только суперпользователи. Теперь будет проверяться право SELECT для таблицы индекса
Устранение сбоя contrib/pg_stat_statements, когда две или более константы помечались как занимающие одну и ту же позицию в тексте оператора SQL (Сами Имсейх, Дмитрий Долгов) §
Повышение устойчивости contrib/pgstattuple при обработке пустых или нерабочих страниц индекса (Нитин Мотиани) §Теперь все полностью нулевые страницы рассматриваются как свободное пространство, а страницы, помеченные как нерабочие в результате проверки размера особого пространства страницы, пропускаются. Для индексов btree полностью нулевые страницы уже рассматривались как свободное пространство, но для хеш-индексов и индексов GIST выводилась ошибка, что было сильно неудобно для пользователей. Также для всех трех типов индексов поврежденные страницы не вызывают ошибку, а пропускаются
Усиление барьеров для чтения и записи компилятором Clang (Томас Манро) §Предполагалось, что __atomic_thread_fence() создает достаточный барьер, чтобы компилятор C не менял порядок доступа к памяти, однако оказалось, что это ограничение не работало для компилятора Clang, позволяя ему генерировать неправильный код, как минимум, для процессоров RISC-V, MIPS и LoongArch. Чтобы это исправить, были добавлены явные барьеры для компилятора
Исправлена инфраструктура сборки PGXS, чтобы поддержать сборку файлов po для расширений с помощью NLS (Ре Мацумура) §

Изменения в версии 18.2

ИзменениеОписание
При переходе с 18.X выгрузка/восстановление базы не требуется. Если есть индексы на столбцах типа ltree, то может потребоваться переиндексировать их после обновления. См. седьмую запись журнала изменений ниже (выделена)
Защита от неожиданных измерений oidvector/int2vector (Том Лейн) §Эти типы данных должны представлять собой одномерные массивы, содержащие только ненулевые значения, но существуют пути преобразования типов, позволяющие нарушать эти ожидания. Добавление проверки в некоторые функции, которые зависели от этих ожиданий без их подтверждения и могли вести себя некорректно в результате. Проект PostgreSQL благодарит Альтана Бирлера за сообщение об этой проблеме. ([CVE-2026-2003](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2026-2003))
Усиление защиты функций-оценщиков селективности против подключения к операторам, принимающим непредвиденные типы данных (Том Лейн) § §contrib/intarray содержал функцию оценки селективности, которую можно было эксплуатировать для выполнения произвольного кода, поскольку она не проверяла входные данные на соответствие ожидаемому типу данных. Расширения сторонних разработчиков должны проверять наличие аналогичных угроз и добавлять средства защиты, используя методику, применяемую сейчас расширением intarray. Поскольку исправление таких расширений займет время, теперь мы требуем привилегий суперпользователя для привязки не встроенной функции оценки селективности к оператору. Проект PostgreSQL благодарит Дэниела Фирера из команды zeroday.cloud за сообщение об этой проблеме. ([CVE-2026-2004](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2026-2004))
Исправление ошибка переполнения буфера в функциях расшифровки PGP модуля contrib/pgcrypto (Майкл Пакье) §Расшифровка специально созданного сообщения с ключом сессии чрезмерной длины приводила к переполнению буфера с последствиями вплоть до выполнения произвольного кода. Проект PostgreSQL благодарит команду Xint Code из проекта zeroday.cloud за сообщение об этой проблеме. ([CVE-2026-2005](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2026-2005))
Исправления недостаточного подтверждения длин многобайтовых символов (Томас Манро, Ноа Миш) § § § § § §Различные ошибки позволяли злоумышленнику, способному выполнять специально подготовленные запросы SQL, вызывать переполнение строковых буферов с последствиями вплоть до выполнения произвольного кода. После внесения этих исправлений приложения могут получать ошибки вида invalid byte sequence for encoding, когда строковые функции обрабатывают испорченный текст, который был сохранен в СУБД. Проект PostgreSQL благодарит Пола Герсте и Моритца Санфта из проекта zeroday.cloud за сообщение об этой проблеме. ([CVE-2026-2006](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2026-2006))
Усиление защиты contrib/pg_trgm от изменений поведения при приведении букв к нижнему регистру (Хейки Линнакангас) § §Исправляем потенциальные переполнения буфера, возникающие по факту того, что в некоторых локалях преобразование строки к нижнему регистру может выдать больше символов (не байт), чем было в исходной строке. Такое поведение - новое в версии 18, как и сама ошибка. Проект PostgreSQL благодарит Хейки Линнакангаса за сообщение об этой проблеме. ([CVE-2026-2007](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2026-2007))
Исправление рассогласования нечувствительного к регистру поиска в contrib/ltree (Джефф Дэвис) § §Процедуры, связанные с индексацией в ltree, использовали нестандартную реализацию приведения регистра, отличную от реализации для основных операторов. Их поведение совпадало лишь в том случае, если поставщиком сортировки по умолчанию была libc, а кодировка была однобайтовой. Для устранения проблемы код изменен так, чтобы использовать приведение регистра с учетом стандартной сортировки базы данных. Это изменение потребует перестроения индексов на столбцах ltree (независимо от метода доступа индекса), если база данных не использует libc в качестве поставщика сортировки при однобайтовой кодировке. Без этого поиски по таким индексам не смогут найти соответствующие записи
Требование соответствия указанного имени с именем существующего ограничения при использовании ALTER TABLE ... ADD CONSTRAINT для добавления ограничения NOT NULL с явно указанным именем в том случае, если столбец уже отмечен как NOT NULL. (Альваро Эррера, Сринатх Редди Садипиралла) §
Запрет ссылкам на общие табличные выражения (CTE) в подзапросах задавать семантические уровни агрегатных функций (Том Лейн) §Это изменение отменяет изменение, сделанное два минорных выпуска назад, вместо этого генерируя ошибку, если подзапрос ссылается на CTE, который находится ниже семантического уровня, который стандартные правила SQL назначили бы агрегату на основе содержащихся в нем упоминаний колонок и агрегатов. Предпринятая попытка исправить ситуацию оказалась проблематичной и неясно, что делать взамен. Так как стандарт SQL вообще запрещает использование подзапросов внутри агрегатов, обработка подобных случаев как ошибок кажется достаточной
Исправление захвата в переходную таблицу триггера для MERGE в запросах CTE (Дин Рашид) §При выполнении запроса CTE, модифицирующего данные, содержащего как MERGE, так и другое действие DML над таблицей с триггерами AFTER уровня предложения, переданные триггерам переходные таблицы включали только строки, затронутые другим действием(ями), но не те, которые были затронуты этим MERGE
Исправление неверного отсечения меток строк, принадлежащих записям rangetable не из отношений (например, от подзапросов) (Дин Рашид) §Это вело к неверным результатам, если предложенное обновление строки требовалось изменить повторной проверкой EvalPlanQual (EPQ), что могло произойти, если имелось одновременное обновление для данной строки
Исправление сбоя при усечении (prune) всех дочерних элементов целевой секционированной таблицы UPDATE или DELETE (Амит Ланготе) §В таких случаях исполнитель мог выдавать ошибки вида «could not find junk ctid column», хотя ничего делать не нужно
Исправление ошибки вычисления выражений для подзапроса внутри индекса массива (Андрес Фройнд) §
Исправление поиска подстроки текста для недетерминированных правил сортировки (Лоренц Албе) §Если использовалась недетерминированное правило сортировки, то мы не могли обнаружить соответствие, возникающее в самом конце просматриваемой строки
Предотвращение возможной ошибки планировщика, когда запрос содержит дублирующие вызовы оконных функций (Менг Чжан, Дэвид Роули) §Запутанное понимание исключения дублей таких вызовов могло привести к ошибкам вида «WindowFunc with winref 2 assigned to WindowAgg with winref 1»
Исправление ошибки планировщика с функциями, возвращающими множество, и GROUPING SETS (Ричард Гво) §При создании узла плана ProjectSet планировщик не обнаруживал, что подвыражения, включающие выражения группировки, уже вычислялись во входном плане. Это приводило либо к неэффективным планам, либо к ошибкам наподобие «variable not found in subplan target list»
Предотвращение неправильной оптимизации для случая, когда предложение GROUP BY подзапроса содержит нестабильную или возвращающую множество функцию (Ричард Гво) §Планировщик предпочитал протолкнуть ограничения внешнего запроса, ссылающиеся на такую колонку группировки, что приводило к некорректному поведению из-за многократного вызова нестабильной функции или возникновению ошибок, вызванных добавлением функции, возвращающей множество, в разделы WHERE / HAVING подзапроса
Осмотр узлов PlaceHolderVar при поиске статистик по выражению (Ричард Гво) §Это изменение позволяет планировщику находить соответствующую статистику по выражениям, вытянутым из подзапросов или использованным в GROUP BY, избегая возврата к оценке по умолчанию. (Можно утверждать, что нам следовало бы корректировать любую найденную статистику, чтобы учесть повышенную вероятность того, что значение будет NULL, но мы никогда не делали подобного и для обычных Vars.) Хотя это ограничение старое, изменения в PostgreSQL 18 сделали PlaceHolderVars более распространенными, чем раньше. Поэтому делаем это изменение, чтобы избежать регрессий планов в затронутых случаях
Осмотр пустых узлов PlaceHolderVar при сопоставлении выражений с индексами (Ричард Гво) §Поскольку PostgreSQL 18 использует PlaceHolderVars чаще, чем раньше, некоторые запросы, которые ранее могли использовать индекс, перестали это делать. Добавляем логику, предотвращающую эту регрессию
Исправление преобразования планировщиком разделов OR в условия ScalarArrayOp для индекса (Тендер Ван, Том Лейн) §Код неправильно обрабатывал узлы RelabelType и мог генерировать недопустимые выражения или не выполнять допустимое преобразование
Разрешение Index Scan по частичным хэш-индексам даже тогда, когда предикат индекса подразумевает истинность условия WHERE (Том Лейн) §Обычно мы отбрасываем условие WHERE, которое подразумевается предикатом, так как бессмысленно его тестировать — оно должно выполняться для каждой записи индекса. Однако это может помешать созданию плана Index Scan, если индекс таков, что он требует условия WHERE на ведущем ключе индекса, как это получается у хэш-индексов. Не отбрасываем подразумеваемые условия при рассмотрении такого индекса
Отключение генерации WAL для индексов BRIN с пометкой UNLOGGED (Кирилл Решке) §Одна редко используемая ветвь кода ошибочно выдавала запись WAL, относящуюся к индексу BRIN, даже если индекс был помечен как UNLOGGED. Восстановление после сбоя затем не могло воспроизвести эту запись, жалуясь на то, что файл уже существует
Использование правильной функции упорядочивания в параллельном построении индекса GIN (Томаш Вондра) §Параллельный код использовал оператор упорядочивания по умолчанию (который определяется классом операций btree типа данных столбца), хотя следовало бы использовать функцию упорядочивания, указанную классом операций GIN, если такая имеется. Это приводило к отказу, если тип данных не имел класса операций btree, или к созданию некорректного индекса, если выбранный класс операций задавал функцию упорядочивания, несогласованную с классом операций btree
Предотвращение усечения CLOG, который еще нужен для необработанных сообщений NOTIFY (Джоэл Джейкобсон, Хейки Линнакангас) § § §Это исправление предотвращает возникновение ошибок вида «could not access status of transaction», когда бэкенду требуется больше времени для обработки сообщений NOTIFY
Повышение уровня ошибок, возникающих во время обработки сообщений NOTIFY, до FATAL, т.е. "разрывать соединение" (Хейки Линнакангас) §Ранее, если бэкенд получал ошибку при обработке сообщения NOTIFY, он пропускал это сообщение, сообщал клиенту об ошибке и продолжал работу. Однако такое поведение было чревато проблемами. Одна большая проблема заключалась в том, что клиент не имел хорошего способа узнать, что уведомление было потеряно, и уж тем более не мог понять, что именно в нем содержалось. В зависимости от логики приложения пропуск уведомления мог, к примеру, вызвать застревание приложения в ожидании. Кроме того, любые оставшиеся сообщения не обрабатывались до тех пор, пока кто-то не отправлял новое NOTIFY. Еще, если соединение простаивало в момент поступления сигнала NOTIFY, то любая ошибка уровня ERROR все равно повышалась до уровня FATAL по причинам, не связанным с этим вопросом. Поэтому мы решили сделать, чтобы то же происходило во всех случаях ради согласованности и предоставления четкого сигнала приложению о том, что оно могло пропустить некоторые уведомления
Рассмотрение выражений группировки при вычислении хеша-идентификатора запроса (Цзянь Хэ) §Ранее два запроса, одинаковых за исключением различий в выражениях раздела GROUP BY, объединялись бы и contrib/pg_stat_statements, и другими пользователями идентификаторов запросов
Исправление ошибочного подсчета обновлений в EXPLAIN ANALYZE MERGE при одновременном обновлении (Дин Рашид) §Эта ситуация приводила к неверному счетчику кортежей skipped в выводе EXPLAIN, либо к сбою утверждения в сборке с включенными проверками утверждений
Исправление ошибки в следовании по цепочке обновлений при блокировке кортежа (Яспер Смит) §Эта ветвь кода игнорировала проверку xmin первого нового кортежа в цепочке обновлений, что позволяло заблокировать не относящийся к делу кортеж, если исходный исполнитель UPDATE прерывал работу и это пространство было немедленно высвобождено VACUUM, а затем переиспользовано. Это могло привести к неожиданным задержкам транзакций или взаимоблокировкам. Также наблюдались ошибки, связанные с идентификацией неправильного кортежа
Исправление некорректной обработки инкрементальных резервных копий больших таблиц (Роберт Хаас, Олег Ткаченко) §Если таблица размером более 1 ГБ (или, в общем случае, заданного инсталляцией размера сегмента) была усечена VACUUM между базовой резервной копией и инкрементальной резервной копией, pg_combinebackup мог завершиться ошибкой «truncation block length in excess of segment size». Это препятствовало восстановлению инкрементальной резервной копии
Устранение потенциальной аварии бэкенда на завершении процесса из-за попытки освободить блокировку в уже отключенном сегменте разделяемой памяти (Рахила Сайед) §
Исправление условия гонки в коде асинхронного ввода-вывода (Андрес Фройнд) §Код возврата операции асинхронного ввода-вывода можно было перезаписать до его получения
Защита от неправильного усечения журнала статусов мультитранзакций после сбоя (Хейкки Линнакангас) §
Исправление возможного неправильного представления результата pg_stat_get_backend_activity() (Чао Ли) §Буфер разделяемой памяти, содержащий строку активности сеанса, может заканчиваться неполным многобайтовым символом. Предполагалось, что читатели должны отсекать любой такой неполный символ, но эта функция не выполняла это действие
Предотвращение рекурсивного логирования контекстов памяти (Фудзи Масао) §Постоянный поток вызовов, запрашивающих вывод в лог описаний контекстов памяти, мог вызвать рекурсивное выполнение кода логирования, теоретически способное привести к переполнению стека
Исправление использование контекста памяти при повторной инициализации параллельного контекста выполнения (Якуб Вартак, Дживан Чалке) §Это ошибка могла привести к сбою из-за того, что подчиненная структура данных имела меньший срок службы, чем параллельный контекст. Известно, что проблема не возникает при использовании только ядра PostgreSQL, однако имеются сообщения о проблемах в расширениях
Установка смещения следующего multixid при создании нового multixid для устранения цикла ожидания, который был необходим в особых случаях (Андрей Бородин) § §Предыдущая логика могла зависнуть в ожидании обновления, которое никогда не произошло бы
Предотвращение многократного переписывания изменяющих данные CTE (Бернис Саути, Дин Рашид) §Ранее, когда при обновлении автоматически обновляемого представления или отношения с правилами исходный запрос содержал какие-либо изменяющие данные CTE, модуль перезаписи многократно переписывал эти CTE из-за рекурсии. Это было неэффективно и могло приводить к ложным ошибкам, если CTE включало обновление всегда генерируемого столбца
Разрешение повторной попытки инициализации записи реестра DSM (Натан Боссар) §Если мы потерпели неудачу на полпути во время инициализации записи динамически разделяемой памяти, разрешить следующей попытке использования этой записи повторить инициализацию. Ранее запись оставалась необратимо испорченной
Предотвращение ошибок представлений статуса NUMA в случаях, когда страница выгружена (Томаш Вондра) §
Исключение ошибок «operation not permitted» при запросе статуса страницы NUMA со старыми версиями библиотеки libnuma (Томаш Вондра) §
Отказ от восстановления, если журнал WAL отсутствует вплоть до той отметки в прошлом, на которую указывает запись о контрольной точке (Нитин Джадхав) §Добавлена явная проверка наличия журнала до начала восстановления, чтобы избежать повреждений и предоставить полезное сообщение об ошибке. Ранее восстановление могло завершиться сбоем или повредить базу данных в этой ситуации
Запрет "помарок" на дереве исходного запроса во время ALTER PUBLICATION (Сунил С.) §Этой ошибке соответствовал видимый эффект: триггер события, сработавший для запроса, увидел бы только первый параметр publish, даже если было бы задано несколько параметров. Если такой запрос был настроен как подготовленное предложение, последующие выполнения тоже работали бы неправильно
Передача параметров подключения, указанных в CREATE SUBSCRIPTION ... CONNECTION, процессу walsender издателя (Фудзи Масао) §До этого исправления параметр подключения options (если был), игнорировался, тем самым, к примеру, не давая установить пользовательские значения серверных параметров в подключении к walsender. Изначально предполагалось, что это будет работать, и оно действительно работало до поломки при рефакторинге в PostgreSQL 15, так что восстановим прежнее поведение
Предотвращение аннулирования вновь созданных или вновь синхронизированных слотов репликации (Жижие Хоу) § § §Условие гонки с конкурирующей контрольной точкой могло позволить удалить журналы WAL, необходимые слоту репликации, что привело бы к немедленной пометке слота как недействительного
Исправление условия гонки в расчете требуемого xmin для слота репликации (Жижие Хоу) §Это могло привести к ошибке «cannot build an initial slot snapshot as oldest safe xid follows snapshot's xmin»
Фиксация добавления записи pg_replication_origin до начала копирования данных во время начальной синхронизации подписки логической репликации (Жижие Хоу) §Ранее, если шаг копирования завершался неудачей, новая запись в pg_replication_origin терялась из-за отката транзакции. Это приводило к несогласованному состоянию в общей памяти
Не продвигать прогресс логической репликации после сбоя параллельного обработчика применения (Жижие Хоу) §Прежнее поведение допускало потерю транзакций подписчиком
Исправление процессов-обработчиков синхронизации слотов логической репликации (slotsync) для корректной обработки сигналов LOCK_TIMEOUT (Жижие Хоу) §Ранее сигналы тайм-аута фактически игнорировались
Исправление возможной ошибки unexpected data beyond EOF во время перезагрузки потоковой физической реплики (Антонин Боннефой) §
Исправление сообщений об ошибках несоответствия типов путей SQL/JSON (Цзянь Хэ) §Код мог выдавать ошибку «cache lookup failed for type 0» вместо ожидаемого уведомления о неправильном типе выражения пути
Исправление ошибочного отслеживания позиции столбца при разборе границ диапазона секции (MyZhen) §Например, это могло привести к тому, что в сообщениях об ошибках преобразования значений границы секции в тип данных столбца указывалось неверное имя столбца
Исправление различных незначительных ошибок в сообщениях об ошибках (Ман Зэн, Тяньчэнь Чжанг) § § § § §Например, подробности ошибки рассогласования номера timeline в манифесте резервной копии показывали номер начальной timeline там, где должен был быть номер конечной timeline
Исправление отказа выполнять встраивание функций при выполнении JIT-компиляции с версией LLVM 17 или выше (Антонин Боннефой) §
Настройка кода JIT для работы с LLVM 21 (Хольгер Хоффштэтте) §Предыдущий код не компилировался на машинах архитектуры aarch64
Исправление специфичного для aarch64 кода для сборки со старыми системными заголовочными файлами (эпохи RHEL7) (Том Лейн) § §
Исправление некорректной проверки для io_uring_queue_init_mem() в configure (Масахико Савада) §Эта ошибка вела к невозможности оптимизации выделений буфера асинхронного ввода-вывода в сборках на основе autotools, хотя код работал при сборке с помощью meson. Основным следствием пропуска было замедление завершения процессов бэкенда больше необходимого
Добавление нового параметра сервера file_extend_method для управления использованием posix_fallocate() (Томас Мунро) §Версия PostgreSQL 16 и новее будет использовать для расширения файлов отношений posix_fallocate(), если платформа предоставляет это. Однако сообщалось, что это плохо взаимодействует с некоторыми файловыми системами: сжатие BTRFS отключается при использовании posix_fallocate(), а XFS может генерировать случайные ошибки ENOSPC в старых версиях ядра Linux. Чтобы обеспечить обход, вводим этот новый параметр сервера. Установка параметра file_extend_method во write_zeros заставит сервер вернуться к старому методу расширения файлов путем записи блоков нулей
Правка автоматического заполнения Tab в psql для значений опций VACUUM (Юго Нагата) §
В приглашениях psql не показываем значение для %P (состояние конвейера), если нет соединения с сервером (Чао Ли) §Это делает поведение %P похожим на поведение других последовательностей символов приглашения, чьи значения зависят от активного соединения
Правка логики сбора значений последовательностей pg_dump (Нейтан Боссарт) § §pg_dump сбоила, когда последовательность удаляли одновременно с выполнением дампа, даже если эта последовательность не входила в число объектов базы данных, подлежащих дампу. Кроме того, если у вызывающего пользователя отсутствовали права на чтение значения последовательности, pg_dump выдавал неверные значения вместо ожидаемого завершения с ошибкой
Исправление потенциально неправильного экранирования значений oauth_validator_libraries утилитой pg_dump (Чангао Чен) §Если pg_dump требовалось скопировать значение этой настройки, она применяла неправильное правило экранирования
Предотвращение ошибки утверждения при pg_dump в режиме binary-upgrade (Винеш С.) §Ошибка обработки объектов состояний реплицируемых отношениий по подпискам в коде сортировки объектов приводила к утверждению, хотя серьезных негативных последствий в производственных сборках не было
Исправление некорректной обработки ошибок в pgbench при наличии нескольких команд \syncpipeline в конвейерном режиме (Юго Нагата) §При получении нескольких команд \syncpipeline после ошибки запроса pgbench сообщал failed to exit pipeline mode или получал ошибку утверждения в сборке с включенными утверждениями
Добавление вывода обновленного значения при изменении OldestXID утилитой pg_resetwal (Хейкки Линнакангас) §Она уже делала это для всех остальных переменных, которые могла изменить
Разрешение утилите pg_resetwal устанавливать следующий идентификатор мультитранзакции в 0 или следующее смещение мультитранзакции в UINT32_MAX (Максим Орлов) §Это допустимые значения, поэтому отказ их устанавливать был неправильным. В худшем случае, если попытка pg_upgrade выполняется точно в момент переполнения счетчика мультитранзакций, обновление завершится неудачей
Использование верного снимка для проверки родителей индексов btree в contrib/amcheck (Михайл Никалайеу) § §Предыдущая реализация вызывала ложные ошибки при проверке индексов, созданных с помощью CREATE INDEX CONCURRENTLY
Исправление обработки "полуживых" страниц индекса btree в contrib/amcheck (Хейкки Линнакангас) §amcheck ожидал наличие ссылки вниз от родителя на такую страницу, но ее не было, что приводило к ложному сообщению об ошибке mismatch between parent key and child high key
Исправление обработки неполных разделений корневой страницы индекса btree в contrib/amcheck (Хейкки Линнакангас) §amcheck мог сообщить о ложной ошибке вида block is not true root
Устранение чрезмерного выделения памяти в contrib/pg_buffercache (Давид Геер) §Код выделял вдвое больше памяти, чем требовалось для статусов страниц NUMA
Правка крайнего случая целочисленного переполнения в оценщике селективности contrib/intarray для @@ (Чао Ли) §Это могло привести к получению плохих оценок селективности для случаев, связанных с максимальным значением целого числа
Исправление проблемы многобайтовой кодировки в contrib/ltree (Джефф Дэвис) §Ранее код мог передать незавершенный многобайтовый символ в lower(), возможно вызывая некорректное поведение
Исключение аварийного завершения в contrib/pg_stat_statements при наличии списка IN, содержащего как константы, так и выражения, не являющиеся константами (Сами Имсейх) §
Обновление файлов данных часовых поясов до версии tzdata 2025c (Том Лейн) §Единственное изменение касается исторических данных по Нижней Калифорнии до 1976 года

Изменения в версии 18.3

ИзменениеОписание
Исправление сбоя при воспроизведении записи о мультитранзакциях из WAL, записанного более старой минорной версией (Heikki Linnakangas) §Исправлена ошибка, возникавшая после воспроизведения записи о мультитранзакциях (multixid truncation) из WAL, если она была создана более старой минорной версией. Некорректная логика обработки мультитранзакций приводила к сбою с сообщением could not access status of transaction. Обычно это происходило на резервном сервере новой версии, который потреблял WAL от основного сервера старой версии
Устранение ложной ошибки о некорректной кодировке при применении substring() к данным TOAST (Noah Misch) § § §Исправлена излишне строгая проверка, введенная для [CVE-2026-2006](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2026-2006), из-за которой функция substring() могла выдавать ошибку о незавершенном символе даже в валидных случаях
Исправление упущения в патче для [CVE-2026-2007](https://pangolin.sbertech.ru/cve-policy?cve=CVE-2026-2007) (Zsolt Parragi) §Если массив bounds требовал расширения (при вводе количества триграмм, превышающего начальную догадку), функция generate_trgm_only не возвращала вызывающему обновленный указатель массива. Это приводило к некорректным результатам strict_word_similarity() и связанных функций или, в редких случаях, к падению. Сбойный код достижим при удлинении входной строки во время преобразования в нижний регистр. Единственные известные проявления возникали при использовании локали из ICU с некоторыми однобайтовыми кодировками
Корректировка метки изменчивости для json_strip_nulls() и jsonb_strip_nulls() (Andrew Dunstan) §Эти функции всегда считались неизменяемыми (immutable), но при рефакторинге в версии 18.0 были ошибочно помечены как стабильные (stable). Это мешало их использованию в выражениях и индексов и приводило к лишним повторным вычислениям в запросах. Исправление действует только для вновь создаваемых кластеров баз (включая те, на которых выполнен pg_upgrade 18.3 и новее). Для существующих кластеров, созданных на 18.0 .. 18.2, потребуется ручное обновление каталога от суперпользователя: UPDATE pg_catalog.pg_proc SET provolatile = 'i' WHERE oid IN ('3261','3262');. Эту команду нужно выполнить в каждой затронутой базе данных. А также в template0 и template1, чтобы применить к базам, которые когда-то будут созданы
Исправление вычисления множества потенциально обнуляющих внешних соединений для результата подзапроса LATERAL UNION ALL (Richard Guo) §Ошибка могла приводить к пропуску проверок NOT NULL по ложному предположению об их избыточности, что вызывало неверные результаты запросов
Устранение конфликтов имен между описанными пользователем и автоматически поименованными ограничениями NOT NULL (Laurenz Albe) §С версии 18 ограничения NOT NULL получили полноценные записи в pg_constraint, которые требуют наименований. Логика генерации имени для неименованного ограничения не предотвращала конфликты с пользовательскими ограничениями где-то в том же операторе CREATE TABLE
Правка функций pg_stat_get_backend_wait_event() и pg_stat_get_backend_wait_event_type(), чтобы они возвращали значения для вспомогательных процессов (Heikki Linnakangas) §До этого они возвращали для вспомогательных процессов значения NULL, что расходилось с представлением pg_stat_activity
Исправление приведения переменной составного типа к доменному типу при возврате ее значения из функции PL/pgSQL (Tom Lane) §Если значение было NULL, то возникала ошибка cache lookup failed for type 0
Исправление потенциального разыменования нулевого указателя в функции ввода двоичных данных contrib/hstore (Michael Paquier) §Функция получения типа hstore падала при наличии дубликатов ключей во входных данных. Это не проявлялось на значениях hstore, созданных самим PostgreSQL, за отсутствием в них дубликатов ключей. Но могло быть вызвано вредоносными или поврежденными данными