Замечания к релизам PostgreSQL
В замечаниях к релизам описываются значительные изменения, происходящие в каждом релизе PostgreSQL. Замечания к релизам не содержат изменения, затрагивающие всего нескольких пользователей, или внутренние изменения, которые пользователи не видят. К примеру, оптимизатор усовершенствуется почти в каждом релизе, но пользователи при этом замечают просто ускорение запросов.
Релиз 16
Обзор
В PostgreSQL 16 было включено место много новых функциональных возможностей и улучшений, в том числе:
-
Возможность параллелизации полных (FULL) и внутренних правых (OUTER) соединений по хешу
-
Возможность логической репликации с резервных серверов
-
Возможность подписчикам логической репликации применять большие транзакции параллельно
-
Возможность мониторинга статистики ввода/вывода с помощью нового представления pg_stat_io
-
Добавление функций-конструкторов и функций тождества SQL/JSON
-
Улучшение производительности заморозки при очистке
-
Добавление поддержки регулярных выражений при сопоставлении имен пользователей и баз данных в qhb_hba.conf и имен пользователей в qhb_ident.conf
Вышеперечисленные пункты и другой функционал PostgreSQL 16 более подробно описываются в разделах ниже.
Изменения
Ниже вы найдете подробное описание изменений, отличающих PostgreSQL 16 от предыдущего основного релиза.
Сервер
Оптимизатор
-
Возможность инкрементальной сортировки во многих случаях, включая DISTINCT.
-
Агрегатам с ORDER BY или DISTINCT добавлена возможность использования предварительно отсортированных данных.
Для отключения этого функционала можно использовать новую серверную переменную enable_presorted_aggregate. -
Возможность мемоизации поверх UNION ALL.
-
Возможность выполнения анти-соединений с отличными от NULL входными данными в качестве внутреннего отношения.
-
Возможность параллелизации полных (FULL) и внутренних правых (OUTER) соединений по хешу.
-
Повышение точности оценки оптимизатором стоимости доступа для индексов GIN.
Общая производительность
-
Возможность более эффективного добавления страниц кучи и индекса.
-
При необходимости выполнение заморозки страниц во время операций, не связанных с заморозкой.
Благодаря этому снижается потребность в полной очистке таблиц с заморозкой. -
Возможность оконным функциям внутренне использовать более быстрый режим ROWS, когда режим RANGE активен, но в нем нет необходимости.
-
Возможность оптимизации постоянно увеличивающихся оконных функций ntile(), cume_dist() и percent_rank().
-
Возможность параллелизации агрегатных функций string_agg() и array_agg().
-
Повышение производительности путем кеширования поисков партиций RANGE и LIST.
-
Возможность управления использованием разделяемых буферов при очистке и анализе.
В командах VACUUM/ANALYZE это параметр BUFFER_USAGE_LIMIT, а в модуле vacuumdb — --buffer-usage-limit. Значение по умолчанию устанавливается серверной переменной vacuum_buffer_usage_limit, которая также управляет автоочисткой. -
Поддержка wal_sync_method=fdatasync в Windows.
-
Возможность изменений HOT только при изменении столбцов с индексами BRIN.
-
Увеличение скорости изменения заголовка процесса.
-
Возможность использования векторных операций при поиске xid/subxid и определения строк ASCII.
Определение ASCII особенно полезно для команды COPY FROM. Векторные операции также используются для некоторых поисков в массивах C. -
Уменьшение издержек выделения памяти.
Мониторинг
-
Добавление системного представления pg_stat_io для отслеживания статистики ввода/вывода.
-
Запись статистики о последнем последовательном сканировании таблиц и сканировании индексов.
Эта информация находится в представлениях pg_stat_all_tables и pg_stat_all_indexes. -
Запись статистики о количестве измененных строк, перенесенных на новые страницы.
Эта информация выводится в столбце n_tup_newpage_upd представления pg_stat_all_tables. -
Добавление информации о блокировках спекулятивного добавления в системное представление pg_locks.
Идентификатор транзакции отображается в столбце transactionid, а маркер спекулятивного добавления — в столбце objid. -
Добавление отображения результирующих типов подготовленных операторов в представление pg_prepared_statements.
-
Создание статистических записей о подписке в момент ее создания, чтобы обеспечить точность stats_reset.
Ранее записи создавались только при первом выведении статистики. -
Корректировка учета операций ввода/вывода для записывания временных отношений, отображаемых в представлении pg_stat_database.
-
Добавление функции pg_stat_get_backend_subxact() для вывода информации о кеше субтранзакций сеанса.
-
Использование неизменяемого идентификатора обслуживающего процесса pg_stat_get_backend_idset(), pg_stat_get_backend_activity() и связанными функциями.
Ранее значения индекса могли изменяться на протяжении существования сеанса. -
Выведение информации о независимых обслуживающих процессах со специальным типом процессов.
-
Добавление события ожидания SpinDelay для отображения задержек из-за бездействия циклических блокировок.
-
Создание нового события ожидания DSMAllocate для отображения ожидания выделения динамической разделяемой памяти.
Ранее этот тип ожидания выводился как DSMFillZeroWrite и использовался также при выделении памяти функцией mmap(). -
Добавление имени базы данных в заголовок процесса логической репликации отправителями WAL.
При физической репликации отправители WAL не отображают имя базы данных. -
Добавление информации о контрольной точке и REDO LSN в сообщения log_checkpoints.
-
Предоставление дополнительной информации при ошибках, относящихся к клиентским сертификатам.
Права
-
Добавление предопределенной роли pg_create_subscription с правом создания подписок.
-
Разрешение подпискам не требовать пароли.
Это достигается при помощи параметра password_required=false. -
Упрощение прав для LOCK TABLE.
Ранее возможность пользователя выполнятьLOCK TABLEна различных уровнях блокировки ограничивалась уровнями, требуемыми командами, на выполнение которых для таблицы пользователь имел право. Например, некто с правом UPDATE мог выполнять блокировку всех уровней, кроме ACCESS SHARE, несмотря на то что этот уровень блокировки ниже остальных. Теперь пользователи могут устанавливать блокировки на более низких уровнях, если они уже имеют право на более высокие уровни. -
Возможность выполнять ALTER GROUP имя_группы ADD USER имя_пользователя с правом ADMIN OPTION.
Ранее требовалось право CREATEROLE. -
Возможность использовать в команде GRANT синтаксис WITH ADMIN TRUE/FALSE.
Ранее поддерживался только синтаксис WITH ADMIN OPTION. -
Ролям, создающим другие роли, разрешается автоматически наследовать права новой роли или выполнять для нее SET ROLE.
Этот функционал управляется серверной переменной createrole_self_grant. -
Запрет пользователям изменять права по умолчанию для ролей без наследования.
Теперь это разрешено только для ролей с наследованием. -
При предоставлении членства в ролях у роли-праводателя должны быть соответствующие права.
Это требуется, даже когда членство в роли предоставляет не начальный суперпользователь. -
Обычным пользователям разрешено предоставлять права от имени праводателя, не являющегося текущим пользователем.
У текущего пользователя по-прежнему должны быть необходимые права, выданные указанным пользователем-праводателем. -
Добавление в GRANT управления правами с помощью SET ROLE.
Это обеспечивается новым параметромGRANT ... SET. -
Добавление отслеживания зависимостей для ролей с предоставленными правами.
Например, удалить ADMIN OPTION не удастся, если имеются права, использующие этот параметр; для отзыва зависимых прав нужно использовать CASCADE. -
Добавление отслеживания зависимостей праводателей для записей GRANT.
Это гарантирует, что значения столбца pg_auth_members.grantor всегда корректны. -
Разрешены многократные записи членства в роли.
Ранее новое назначение членства удаляло предыдущее соответствующее назначение, даже если другие аспекты этого назначения не совпадали. -
Предотвращение удаления прав суперпользователя для начального пользователя.
Восстановление таких пользователей могло приводить к ошибкам. -
Функции makeaclitem() разрешено принимать несколько имен прав.
Ранее принималось только одно имя права, например SELECT.
Конфигурация сервера
-
Добавлена поддержка делегирования учетных данных Kerberos.
Этот функционал включается серверной переменной gss_accept_delegation и параметром подключения libpq gssdelegation. -
Разрешено устанавливать число итераций SCRAM с помощью серверной переменной scram_iterations.
-
Улучшение производительности управления серверными переменными.
-
Усиление ограничений на то, какие серверные переменные можно сбросить.
Ранее на некоторые переменные, например transaction_isolation, не действовала команда RESET ALL, их можно было сбросить по отдельности в неподходящих случаях. -
Перемещение различных элементов qhb.conf в новые категории.
Это действует также на категории, отображенные в представлении pg_settings. -
Запрет на рекурсию файла конфигурации более 10 раз.
-
При автоочистке возможно чаще учитывать изменения параметров задержки.
Изменения учитываются в начале каждого блока, а не только в начале каждого отношения. -
Удаление ограничений, направленных на долговременное переименование архивных файлов.
Теперь команда, указанная в archive_command, будет чаще вызываться после сбоя для уже заархивированных файлов. -
Запрет на одновременную установку параметров archive_library и archive_command.
Ранее archive_library переопределял archive_command. -
Возможность qhbmaster прекращать дочерние процессы по сигналу прерывания.
Это позволяет собрать дамп ядра для зависшего дочернего процесса. Этот функционал управляется параметрами send_abort_for_crash и send_abort_for_kill. Ключ -T процесса qhbmaster теперь работает так же, как параметр send_abort_for_crash. -
Удаление нефункционального параметра -n процесса qhbmaster.
-
Серверу разрешено резервировать слоты обслуживающих процессов для ролей с членством в pg_use_reserved_connections.
Количество зарезервированных слотов устанавливается серверной переменной reserved_connections. -
Возможность огромным страницам работать в более новых версиях Windows 10.
Для этого добавлена специальная возможность, требуемая для включения огромных страниц в более новых версиях Windows 10. -
Добавление параметра debug_io_direct для использования разработчиками.
Тогда как ранее для разработчиков был модифицирован параметр wal_sync_method=open_sync/open_datasync, чтобы не использовать прямой ввод/вывод при wal_level=minimal, теперь эта возможность включается параметром debug_io_direct=wal. -
Добавление функции pg_split_walfile_name() для отображения значений сегмента и временной шкалы из имени файла WAL.
qhb_hba.conf
Подробную информацию см. в разделе Файл qhb_hba.conf.
-
Добавление поддержки регулярных выражений при сопоставлении имен баз данных и записей ролей в qhb_hba.conf.
Шаблоны регулярных выражений начинаются со слэша. Имена баз данных и ролей, начинающиеся со слэша, нужно заключать в кавычки, если они указаны в qhb_hba.conf. -
Улучшение обработки пользовательских столбцов в qhb_ident.conf для соответствия qhb_hba.conf.
В частности, добавление поддержки значения all, проверки членства в роли с помощью знака + и регулярных выражений, начинающихся со слэша. Любое имя пользователя, соответствующее этим шаблонам, должно быть заключено в кавычки. -
Возможность включать файлы в qhb_hba.conf и qhb_ident.conf.
Это управляется директивами include, include_if_exists и include_dir. Системные представления pg_hba_file_rules и pg_ident_file_mappings теперь отображают это имя. -
Маркеры в qhb_hba.conf могут иметь неограниченную длину.
-
Добавление количества правил и сопоставлений в системное представление pg_hba_file_rules.
Локализация
Подробную информацию см. в главе Локализация.
-
Определение кодировки по умолчанию из локали при использовании ICU.
Ранее кодировкой по умолчанию всегда была UTF-8. -
Управление провайдерами правил сортировки, не относящихся к libc, с помощью параметра LOCALE команд CREATE DATABASE и CREATE COLLATION и параметра --locale в initdb и createdb.
Ранее они управляли только провайдерами libc. -
Добавление предопределенных правил сортировки unicode и ucs_basic.
Они работают, только если включена поддержка ICU. -
Возможность создания пользовательских правил сортировки ICU.
Это выполняется с помощью нового предложения RULES команды CREATE COLLATION, а также новых параметров для CREATE DATABASE, createdb и initdb. -
Windows разрешено автоматически импортировать системные локали.
Ранее в Windows можно было импортировать только локали ICU.
Логическая репликация
Подробную информацию см. в главе Логическая репликация.
-
Возможность логического декодирования на резервных серверах.
Для создания слота логической репликации требуются записи снимков состояния WAL, но их нельзя создать на резервных серверах. Во избежание задержек создание таких записей возможно новой функцией pg_log_standby_snapshot(). -
Добавление серверной переменной для управления тем, как при логическом декодировании публикаторы передают изменения и как их применяют подписчики.
Это переменная debug_logical_replication_streaming. -
Возможность копирования строк в двоичном формате при начальной синхронизации таблиц во время логической репликации.
Это возможно только для подписок, помеченных как двоичные. -
Возможность параллельного применения логической репликации.
Теперь параметр STREAMING команды CREATE SUBSCRIPTION поддерживает значение parallel, которое включает применение больших транзакций параллельными рабочими процессами. Количество параллельных рабочих процессов управляется новой серверной переменной max_parallel_apply_workers_per_subscription. Также были добавлены события ожидания LogicalParallelApplyMain, LogicalParallelApplyStateChange и LogicalApplySendData. Для отслеживания параллельной активности в системное представление pg_stat_subscription был добавлен столбец leader_pid. -
Улучшение производительности применения логической репликации без первичного ключа.
В частности, теперь при поиске совпадений REPLICA IDENTITY FULL может вместо последовательного сканирования использовать индексы B-деревья. -
Подписчики логической репликации имеют возможность обрабатывать только изменения, не имеющие источника.
Это можно использовать, чтобы избежать зацикливания репликации. Этот функционал управляется новым параметромCREATE SUBSCRIPTION ... ORIGIN. -
Выполнение операций SELECT и DML от имени владельца таблицы при логической репликации.
Это повышает безопасность: теперь владельцы подписки должны либо быть суперпользователями, либо иметь право SET ROLE для всех ролей, владеющих таблицами в наборе репликации. Прежнее поведение, когда все операции выполнялись от имени владельца подписки, можно включить параметром подписки run_as_owner. -
Параметр wal_retrieve_retry_interval может действовать на уровне подписки.
Ранее интервал между повторными попытками применялся глобально. Кроме того, добавлены события ожидания LogicalRepLauncherDSA и LogicalRepLauncherHash.
Служебные команды
-
Добавление в команду EXPLAIN параметра GENERIC_PLAN, который позволяет отображать типовой план для параметризованного запроса.
-
Возможность использования в качестве значения команды COPY FROM значение столбца по умолчанию (DEFAULT).
-
Команде COPY разрешено партиями добавлять строки в сторонние таблицы.
Это управляется параметром batch_size модуля postgres_fdw. -
Возможность указывать в команде CREATE TABLE тип STORAGE.
Ранее это было возможно только в команде ALTER TABLE. -
Разрешено использовать триггеры усечения для сторонних таблиц.
-
Возможность для VACUUM и vacuumdb обрабатывать только таблицы TOAST.
Это достигается путем отключения PROCESS_MAIN командойVACUUMили использованием параметра --no-process-main в vacuumdb. -
Добавление в VACUUM параметров для пропуска или изменения всех статистик по заморозке.
Это параметры SKIP_DATABASE_STATS и ONLY_DATABASE_STATS. -
Изменение REINDEX DATABASE и REINDEX SYSTEM, чтобы им больше не требовался аргумент.
Ранее нужно было указывать имя базы данных. -
Команда CREATE STATISTICS может генерировать имя статистики, если оно не было указано.
Типы данных
-
Поддержка недесятичных целочисленных литералов.
Например, 0x42F, 0o273 и 0b100101. -
Возможность для NUMERIC обрабатывать шестнадцатеричные, восьмеричные и двоичные целые числа любого размера.
Ранее с этими недесятичными основаниями поддерживались только восьмибайтные целые числа без кавычек. -
В целочисленных и числовых константах допускаются подчеркивания.
Это может улучшить читаемость длинных строк цифр. -
Принятие значения +infinity при вводе даты и времени.
-
Запрет на указание epoch и infinity вместе с другими полями в строках даты и времени.
-
Удаление недокументированной поддержки ввода даты в форме YгодMмесяцDдень.
-
Добавление функций pg_input_is_valid() и pg_input_error_info() для проверки преобразований типов.
Общие запросы
-
В предложении FROM для подзапросов разрешено опускать псевдонимы.
-
Добавление поддержки расширенных числовых литералов в путях SQL/JSON.
Например, допускаются шестнадцатеричные, восьмеричные и двоичные целые числа, а также подчеркивания между цифрами.
Функции
-
Добавление конструкторов SQL/JSON.
Новые функции JSON_ARRAY(), JSON_ARRAYAGG(), JSON_OBJECT() и JSON_OBJECTAGG() являются частью стандарта SQL. -
Добавление проверок объектов SQL/JSON.
Проверки IS JSON включают в себя проверки для значений, массивов, объектов, скалярных значений и уникальных ключей. -
Возможность использования векторных операций при синтаксическом анализе строк JSON.
-
Улучшена обработка выражений OR и NOT функцией полнотекстового выделения ts_headline().
-
Добавление функций для прибавления, вычитания и генерирования значений timestamptz в указанном часовом поясе.
Это функции date_add(), date_subtract() и generate_series(). -
Изменение функции date_trunc(unit, timestamptz, time_zone) на неизменяемую.
Это позволяет создавать с помощью этой функции индексы выражения. -
Добавление серверной переменной SYSTEM_USER.
Она выводит метод аутентификации и аутентифицированного им пользователя. -
Добавление функций array_sample() и array_shuffle().
-
Добавление агрегатной функции ANY_VALUE(), которая возвращает любое значение из множества.
-
Добавление функции random_normal() для генерации случайных значений с нормальным распределением.
-
Добавление функции ошибок erf() и дополняющей ее erfc().
-
Увеличение точности функции power() для чисел с целыми показателями степеней.
-
Добавление параметра INDENT в функцию XMLSERIALIZE() для визуальной структуризации ее вывода.
-
Изменение функции pg_collation_actual_version(), чтобы она возвращала подходящее значение для правила сортировки по умолчанию.
Ранее она возвращала NULL. -
Функциям pg_read_file() и pg_read_binary_file() можно игнорировать отсутствующие файлы.
-
Добавление спецификации байтов (B) в функцию pg_size_bytes().
-
Функциям to_reg* разрешено принимать на вход числовые OID.
PL/pgSQL
Подробную информацию см. в главе PL/pgSQL — процедурный язык SQL.
- Добавление способности получать OID текущей функции в PL/pgSQL.
Это достигается командой GET DIAGNOSTICS переменная = PG_ROUTINE_OID.
libpq
Подробную информацию см. в главе libpq — библиотека для языка C.
-
Добавление в libpq параметра подключения require_auth для указания списка допустимых методов аутентификации.
Этот параметр также можно использовать для запрета определенных методов аутентификации. -
Возможность случайного выбора нескольких выделяемых для libpq хостов.
Этот функционал включается параметром load_balance_hosts=random и может использоваться для балансировки нагрузки. -
Добавление в libpq параметра sslcertmode для управления передачей клиентского сертификата.
Значения параметра: disable, allow и require. -
Возможность использования в libpq пула системных сертификатов для верификации сертификата.
Этот функционал включается параметром sslrootcert=system, который также включает значение sslmode=verify-full.
Клиентские приложения
- Возможность при объявлении переменных в ECPG использовать имена объявлений
типов, совпадающие с незарезервированными ключевыми словами SQL.
Это изменение не дает обрабатывать ключевые слова, совпадающие с именами объявлений типов C, как ключевые слова в последующих блоках EXEC SQL.
psql
Подробную информацию см. на справочной странице psql.
-
Возможность psql управлять максимальной шириной строк заголовка в расширенном формате.
Этим функционалом управляет параметр xheader_width. -
Добавление в psql команды \drg, выводящей подробную информацию о членстве в ролях.
Так как новая команда отображает эту информацию более подробно, из вывода команд\duи\dgбыл удален столбец Member. -
Команды psql, отображающие права доступа, могут показывать системные объекты.
Варианты команд: \dpS и \zS. -
Добавление в команду psql \d+ признака FOREIGN для партиций и потомков сторонних таблиц.
-
Запрет для команды \df+ выводить исходный код функции.
Тела функций гораздо проще просмотреть командой \sf. -
Возможность для psql отправлять запросы посредством расширенного протокола запросов.
Передача аргументов в такие запросы осуществляется с помощью новой команды psql \bind. -
Возможность ограничивать количество выполнений команды psql \watch.
Теперь в\watchможно указывать именованные параметры. -
Выявление недопустимых значений для команды psql \watch и возможность отключать задержки, указав ноль.
-
Скрипты psql могут получать коды завершения команд оболочки и запросов.
Новые управляющие переменные psql: SHELL_ERROR и SHELL_EXIT_CODE. -
Разнообразные улучшения заполнения табуляцией в psql.
qhb_dump
Подробную информацию см. на справочной странице qhb_dump.
-
Добавление в qhb_dump управления выгрузкой дочерних таблиц и партиций.
Новые параметры: --table-and-children, --exclude-table-and-children, и --exclude-table-data-and-children. -
Добавление в qhb_dump сжатия LZ4 и Zstandard.
-
Возможность qhb_dump и qhb_basebackup использовать режим сжатия long.
-
Улучшение qhb_dump, чтобы оно принимало более согласованный синтаксис сжатия.
Принимаются такие параметры, как --compress=gzip:5.
Серверные приложения
-
Добавление параметра в initdb для установки серверных переменных на время выполнения initdb и всех последующих запусков сервера.
Пример параметра: -c имя=значение. -
Добавление в createuser параметров для управления большим числом характеристик пользователей.
В частности, новые параметры управляют сроком действия роли, обходом политик защиты на уровне строк и членством в ролях. -
Объявление в createuser устаревшим параметра --role.
Этот параметр можно легко перепутать с новыми параметрами createuser, касающимися членства в ролях, поэтому был добавлен параметр --member-of с той же функциональностью. Параметр --role по-прежнему можно использовать. -
Возможность управления обработкой схем в vacuumdb.
Этот функционал управляется параметрами --schema и --exclude-schema. -
Использование новых параметров команды VACUUM для улучшения производительности vacuumdb.
-
При выполнении qhb_upgrade устанавливаются локаль и кодировка нового кластера.
Это убирает требование, согласно которому новый кластер создавался со старыми локалью и кодировкой. -
Добавление в qhb_upgrade параметра, задающего режим передачи по умолчанию.
Это параметр --copy. -
Улучшение qhb_basebackup, чтобы оно принимало числовые параметры при определении сжатия.
Теперь поддерживаются такие параметры, как --compress=server-5. -
Исправление qhb_basebackup, чтобы оно обрабатывало табличные пространства, хранящиеся в каталоге PGDATA.
-
Добавление в qhb_waldump параметра --save-fullpage для выгрузки образов полных страниц.
-
В qhb_waldump параметрам -t/--timeline можно принимать шестнадцатеричные значения.
-
Добавление поддержки отображения прогресса выполнения в qhb_verifybackup.
-
Возможность qhb_rewind корректно отслеживать смены временной шкалы.
Ранее если qhb_rewind запускалось после смены временной шкалы, но до выполнения контрольной точки, оно могло некорректно определять отсутствие необходимости в синхронизации. -
Приложения qhb_receivewal и qhb_recvlogical штатно завершают работу по сигналу SIGTERM.
Этот сигнал часто используется systemd.
Исходный код
-
Поддержка сборки с ICU по умолчанию.
При этом был удален флаг сборки --with-icu и добавлен флаг --without-icu. -
Добавление поддержки векторных операций SSE2 (Streaming SIMD Extensions 2, потоковые расширения SIMD 2) для архитектур x86-64.
-
Добавление поддержки расширенных инструкций SIMD (Single Instruction Multiple Data, один поток команд, множество потоков данных) (NEON) для архитектур ARM.
-
Исполняемые файлы Windows, собираемые с MSVC, используют RandomizedBaseAddress (ASLR).
Ранее это уже было включено для сборок с MinGW. -
Запрет для библиотек расширений на экспорт их символов по умолчанию.
Теперь функции, которые нужно вызывать из обслуживающего процесса ядра или других расширений, должны быть явно помечены как PGDLLEXPORT. -
Требование Windows версии 10 или выше.
Ранее поддерживались Windows Vista и Windows XP. -
Требование Perl версии 5.14 или выше.
-
Требование Bison версии 2.3 или выше.
-
Требование Flex версии 2.5.35 или выше.
-
Требование MIT Kerberos для поддержки GSSAPI.
-
Прекращение поддержки Visual Studio 2013.
-
Прекращение поддержки HP-UX.
-
Прекращение поддержки HP/Intel Itanium.
-
Прекращение поддержки архитектур M68K, M88K, M32R и SuperH CPU.
-
Прекращение в libpq поддержки подтверждения аутентификации с SCM.
Серверная поддержка этого метода аутентификации была прекращена в PostgreSQL 9.1. -
Добавление системы сборки meson.
В итоге она заменит системы сборки Autoconf и MSVC для Windows. -
Возможность управлять расположением исполняемого файла openssl, используемого системой сборки.
Теперь поиск программы openssl является параметром configure или meson. -
Добавление параметра сборки, позволяющего тестировать сегменты таблицы небольшого размера.
Это параметры сборки --with-segsize-blocks и -Dsegsize_blocks. -
Добавление параметров pgindent.
Новые параметры: --show-diff, --silent-diff, --commit и --help, а также возможность многократно указывать --exclude. Кроме того, требуется явно указать файл определения типа. Также были удалены параметры --code-base и --build. -
Добавление исходного кода pg_bsd_indent в основное дерево кода.
-
Улучшение
make_ctagsиmake_etags. -
Корректировка столбцов pg_attribute для повышения эффективности.
Дополнительные модули
-
Улучшение использования индексов из расширений по логическим столбцам.
-
Добавление поддержки Daitch-Mokotoff Soundex в fuzzystrmatch.
-
auto_explain разрешено протоколировать значения, передаваемые параметризованным операторам.
Это затрагивает запросы, использующие PREPARE/EXECUTE на стороне сервера и синтаксический анализ/привязку на стороне клиента. Протоколирование управляется параметром auto_explain.log_parameter_max_length; по умолчанию параметры запросов будут протоколироваться без ограничения длины. -
В auto_explain в режиме log_verbose учитывается значение параметра compute_query_id.
Ранее даже при включенном compute_query_id в режиме log_verbose не отображался идентификатор запроса. -
Изменение максимальной длины меток ltree с 256 до 1000 символов и возможность использования дефисов.
-
pg_stat_statements нормализует константы, используемые в служебных командах.
Ранее константы присутствовали вместо местозаполнителей, например $1. -
Добавление в pg_walinspect функции pg_get_wal_block_info() для выведения информации о блоке WAL.
-
Изменение в pg_walinspect того, как функции pg_get_wal_records_info() и pg_get_wal_stats() интерпретируют завершающие LSN.
Ранее завершающие LSN, представляющие несуществующие позиции WAL, сгенерировали бы ошибку, тогда как теперь они будут интерпретироваться как конец WAL. -
Добавление подробных описаний записей WAL в pg_walinspect и qhb_waldump.
-
Добавление в pageinspect функции bt_multi_page_stats() для выведения статистики по нескольким страницам.
Эта функция схожа с bt_page_stats() за исключением того, что может отображать информацию по диапазону страниц. -
Добавление выходного столбца для пустых диапазонов в функцию brin_page_items() модуля pageinspect.
-
Переработка модулей архивирования для повышения гибкости.
Изменения инициализации потребуют обновления модулей, написанных для предыдущих версий PostgreSQL. -
Корректировка неточного отслеживания строк для операторов запросов, передаваемых по расширенному протоколу, в pg_stat_statements.
-
Добавление в pg_buffercache функции pg_buffercache_usage_counts() для выведения суммарной информации по счетчикам использования.
-
Добавление в pg_buffercache функции pg_buffercache_summary() для выведения сводной статистики по буферному кешу.
-
Возможность ссылаться на схемы требуемых расширений в скриптах расширений, используя новый синтаксис
@extschema:имя_ссылочного_расширения@. -
Возможность помечать требуемые расширения как неперемещаемые с помощью no_relocate.
Это позволяет воспринимать@extschema:имя_ссылочного_расширения@как константу на протяжении существования расширения.
postgres_fdw
Подробную информацию см. на справочной странице postgres_fdw.
-
postgres_fdw может параллельно прерывать транзакции.
Этот функционал включается в postgres_fdw параметром parallel_abort. -
Повышение эффективности ANALYZE для сторонних таблиц postgres_fdw.
Метод выборки в postgres_fdw выбирается параметром analyze_sampling. -
Ограничение передачи констант типа reg* в postgres_fdw теми константами, которые ссылаются на встроенные объекты или расширения, помеченные как передаваемые.
-
Модули postgres_fdw и dblink теперь обрабатывают прерывания во время установки подключений.
Релиз 16.9
Этот релиз содержит различные исправления, внесенные после версии 16.8. Информацию о нововведениях в основной версии 16 см. в разделе Релиз 16.
Изменения
-
Предотвращение чтения на один байт за границей буфера при проверке неверно закодированных строк, кодировкой которых якобы является GB18030.
Хотя это маловероятно, сбой SIGSEGV мог возникать, если на пределе памяти появлялся неполный многобайтовый символ. Такое явление было возможно на сервере и в приложениях, использующих libpq. (CVE-2025-4207) -
Исправление обработки ссылающихся на себя внешних ключей в партиционированных таблицах.
При создании или присоединении партиций не создавались требуемые записи каталога для ограничения внешнего ключа, если это ограничение ссылалось на ту же самую партиционированную таблицу. В результате ограничение не могло применяться в полную силу.
Чтобы исправить это, нужно удалить и пересоздать все ссылающиеся на себя внешние ключи в партиционированных таблицах, если партиции были созданы или присоединены после создания ограничения. Учтите, что строки, нарушающие ограничение, уже могут там присутствовать, и в этом случае пересоздать ограничение не удастся, поэтому перед повторной попыткой потребуется исправить эти строки. -
Предотвращение потери данных при слиянии сжатых сводок BRIN в brin_bloom_union().
В коде не учитывалось, что результаты распаковки не идентичны входным данным, в результате чего некоторые данные могли не попадать в объединенную сводку, приводя к пропуску строк при поиске по индексу.
Эта ошибка присутствовала еще в PostgreSQL 14, где для индексов BRIN были добавлены фильтры Блума, но тогда этот участок кода задействовался редко. В PostgreSQL 17 вероятность наткнуться на эту ошибку существенно возросла, поскольку этот код используется при параллельном построении индексов. -
Устранение непредвиденных ошибок «attribute has wrong type» (атрибут имеет неверный тип) в запросах
UPDATE,DELETEиMERGE, использующих в предложении FROM полностроковые ссылки таблиц на представления и функции. -
Исправление слияния (
MERGE) с партиционированной таблицей с действиями DO NOTHING.
В некоторых случаях возникали ошибки «unknown action inMERGE WHENclause» (неизвестное действие в предложенииMERGE WHEN). -
Предотвращение сбоя в командах
INSERTв случаях, если у таблицы был столбец GENERATED с типом данных домена и ограничения домена запрещали значения NULL.
Об ошибке ограничения сообщалось, даже если генерирующее выражение выдавало совершенно нормальный результат. -
Исправление обработки ссылок на имена внешних CTE, находящихся внутри предложения WITH, присоединенного к команде
INSERT/UPDATE/DELETE/MERGE, которая сама находится внутри WITH.
Синтаксический анализатор не мог выявить недопустимые случаи рекурсии и не учитывал такие ссылки при сортировке CTE в пригодном для использования порядке. -
Запрет на попытки параллельных вызовов array_agg(), если ее аргумент имеет тип анонимной записи.
Протокол взаимодействия с параллельными рабочими процессами не поддерживает идентификацию конкретного типа записи, возвращаемой рабочим процессом. -
Исправление конструкций ARRAY(подзапрос) и ARRAY[выражение, ...], чтобы они выдавали адекватные результаты при передаче на вход данных типа int2vector или oidvector.
Этот патч восстанавливает поведение, существовавшее до версии PostgreSQL 9.5: типом результата является int2vector[] или oidvector[]. -
Исправление возможных ошибочных сообщений о недействительных аффиксах при синтаксическом анализе словарей Ispell.
-
Исправление команды
ALTER TABLE ADD COLUMNдля корректной обработки типа домена, имеющего значение по умолчанию.
Если у типа домена есть значение по умолчанию, при добавлении столбца этого типа (без явного предложения DEFAULT) в существующие строки значение домена по умолчанию не вставлялось, а вместо этого в новом столбце появлялось значение NULL. -
Исправление некорректного поведения при дублировании имен столбцов в действии ON DELETE SET DEFAULT или SET NULL ограничения внешнего ключа.
-
Улучшение сообщения об ошибке, выводимого при недопустимых попытках изменить свойства ограничения внешнего ключа.
-
Предотвращение ошибки при сбросе флага relhassubclass временной таблицы, помеченной как ON COMMIT DELETE ROWS.
-
Добавление недостающего синтаксического анализа параметра INDENT функции XMLSERIALIZE().
Ранее представления или правила, использующие XMLSERIALIZE(... INDENT), выгружались без предложения INDENT, что приводило к некорректным результатам после восстановления. -
Предотвращение преждевременного вычисления аргументов агрегатной функции, одновременно имеющей параметры FILTER и ORDER BY (или DISTINCT).
При передаче ORDER BY или DISTINCT предполагается предварительная сортировка входных значений агрегата, а не сортировка внутри узла плана Agg. Но это становится проблемой, если на вход агрегату передаются выражения, которые могут привести к ошибке (например, деление, когда некоторые из делителей могут равняться нулю) и имеется предложение FILTER, предназначенное для предотвращения подобных ошибок. Из-за предварительной сортировки вычисление выражений может произойти до проверки FILTER, и в итоге такие ошибки все равно случаются. Чтобы избежать этого, теперь, если имеется предложение FILTER и входные выражения сложнее, чем простые переменные или константы, предварительная сортировка не используется. -
Исправление ошибки планировщика при определении более одного хешируемого подвыражения ScalarArrayOpExpr внутри выражения верхнего уровня.
Это приводило к излишне неэффективному выполнению всех дополнительных подвыражений, которые могли быть обработаны с помощью хеш-таблицы (то есть предложения IN, NOT IN или = ANY, содержащие с правой стороны только константы). -
Отключение оптимизации «пропуск выборки» при сканировании кучи по битовой карте.
Оказалось, что эта оптимизация может приводить к возврату нерабочих кортежей, когда параллельная очистка помечает страницу как полностью видимую. -
Исправление проблем с производительностью при запуске поиска по индексу GIN с большим количеством поисковых ключей.
Поиск по индексируемому предложению с большим числом ключей (например,jsonbcol ?| array[...]с десятками тысяч элементов массива) запускался через O(N^2) времени, и в течение этого интервала его нельзя было отменить. -
Выявление недостающих вспомогательных процедур в класс операторов индекса BRIN и вывод сообщения об ошибке вместо сбоя.
-
Реагирование на прерывания (такие как отмена запроса) во время ожидания асинхронных подпланов узла плана Append.
Ранее ничего не происходило, пока один из подпланов не был готов. -
Более частый вывод статистики ввода/вывода активных передатчиков WAL.
Ранее представление pg_stat_io не могло собирать статистику ввода/вывода, выполняемого передатчиком WAL, до завершения этого процесса. Теперь подобная статистика будет выводиться максимум с секундной задержкой. -
Исправление условия гонки при обработке параметра synchronous_standby_names сразу после запуска сервера.
В течение короткого периода после запуска системы обслуживающие процессы могли не дождаться синхронной фиксации даже при включенном параметре synchronous_standby_names. -
Устранение бесконечного цикла, если параметр scram_iterations установлен в значение INT_MAX.
-
Предотвращение возможных сбоев вследствие двойного преобразования подзапроса функции json_array().
-
Устранение сбоя функции pg_strtof() при передаче NULL в endptr.
-
Устранение сбоя из-за нехватки памяти при установке значений для определенных GUC.
-
Предотвращение сбоя при нехватке памяти в стеммере Snowball.
-
Запрет копирования недействительных слотов репликации.
Это исключает проблемы, когда недействительный слот указывает на WAL, который уже был удален. -
Запрет восстановления слотов логической репликации на резервных серверах, не находящихся в режиме горячего резерва.
Это исключает сценарий, при котором слот может остаться действительным после повышения резервного сервера до основного даже при слишком низком значении wal_level. -
Предотвращение чрезмерного продвижения транзакции catalog_xmin в «ускоренном» режиме логического декодирования.
Эта ошибка могла приводить к очистке удаленных записей каталога, несмотря на то что они потенциально могли еще понадобиться процессу чтения WAL. -
Предотвращение потери данных при выполнении DDL-операций, не устанавливающих сильную блокировку на таблицы, задействованные в логической репликации.
Изменения каталога, вызванные командой DDL, не отражались в процессах декодирования WAL, позволяя тем декодировать последующие изменения с использованием устаревших данных каталога. Это потенциально могло привести к повреждению данных. -
Предотвращение некорректного сброса источника репликации, когда в рабочем процессе применения изменений возникает ошибка, но эта ошибка перехватывается и не вызывает завершение рабочего процесса.
Эта ошибка могла приводить к применению дублирующихся данных. -
Предотвращение создания дубликата снимка во время поисков по индексу при логической репликации.
-
Улучшение выявления подписок на смешанные источники.
Если для таблицы, на которую создается подписка, уже имеются подписки в других публикациях, при создании этой подписки выводится предупреждение, поскольку это может привести к получению дублирующихся данных. Это изменение улучшает данную логику, позволяя выявлять случаи, когда в другой публикации имеется подписка на родительскую партицию или дочернюю таблицу. -
Исправление неверной информации о контрольной точке в сообщении об ошибке при некорректном выборе временной шкалы для восстановления.
Если запрошенная временная шкала восстановления недостижима, значения выводимых контрольной точки и временной шкалы должны считываться из файла backup_label, если таковой имеется. Ранее в этом сообщении выводились значения из управляющего файла, что корректно при восстановлении из управляющего файла без файла backup_label, но неверно при наличии backup_label. -
Удаление некорректного проверочного утверждения в функции pgstat_report_stat().
-
Исправление излишне строгого проверочного утверждения в функции gistFindCorrectParent().
-
Исправление редкого сбоя проверочного утверждения на резервных серверах при перезапуске основного сервера.
-
Предотвращение ошибки «unexpected plan node type» (неожиданный тип плана узла) в PL/pgSQL при определение прокручиваемого курсора для простого запроса
SELECT выражение. -
Запрет попыток удаления отдельных партиций индекса в режиме --clean утилиты qhb_dump.
Сервер отклоняет подобные командыDROP. Это не приводит к реальным последствиям, поскольку партиции все равно удалятся при последующем удалении командамиDROPих родительских таблиц или партиционированного индекса. Однако выводимая ошибка о попытке удаления вызывает проблемы при восстановлении в режиме --single-transaction. -
Предотвращение генерирования недопустимых команд
GRANTдля ролей в утилите qhb_dumpall, если каталог pg_auth_members содержит недопустимые OID ролей.
Вместо этого выводится предупреждение, и запись пропускается. Этот способ лучше справляется с повреждением каталога, которое временами случалось в ветвях более ранних версий в результате условий гонки междуGRANTиDROP ROLE. -
Использование в qhb_amcheck и pg_upgrade корректной функции для высвобождения памяти, выделенной libpq.
Эти недоработки могли привести к сбоям в некоторых конфигурациях сборок Windows, например, в отладочной сборке libpq, используемой неотладочной сборкой вызывающего приложения. -
Возможность прерывать запросы contrib/dblink операцией отмены запроса.
Это изменение переносит правки кода из версии 17. Оно предотвращает возможные зависания командCREATE DATABASEиDROP DATABASEвследствие неудачи при определении взаимоблокировок. -
Предотвращение сбоя при передаче поврежденных входных данных функции heap_page_items() модуля contrib/pageinspect.
-
Предотвращение сбоя проверочного утверждения в функции pg_freespacemap() модуля contrib/pg_freespacemap.
Применение pg_freespacemap() для отношения без хранилища (например, для представления) вызывало сбой проверочного утверждения, хотя на сборки без проверочных утверждений это отрицательно не влияло. Теперь во избежание подобных случаев добавлена проверка ошибок. -
Исправление ошибки сборки в macOS 15.4.
Это обновление macOS повредило зонд конфигурации для функции strchrnul(). -
Обновление файлов данных часовых поясов до версии tzdata 2025b, выключающее изменения правил перехода на летнее время в Чили и корректировки исторических данных для Ирана.
Теперь существует новый часовой пояс America/Coyhaique для области Айсен в Чили, который позволяет учитывать для нее смену часового пояса на UTC-03 без перехода на летнее время и, как следствие, расхождение с поясом America/Santiago.