E.30. Релиз 15#

E.30. Релиз 15

E.30. Релиз 15

Дата релиза:  2022-10-13

E.30.1. Обзор

PostgreSQL 15 содержит множество новых функций и улучшений, включая:

  • Поддержка команды SQL MERGE.

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

  • Больше вариантов сжатия, включая поддержку сжатия Zstandard (zstd). Это включает поддержку сжатия на стороне сервера во время pg_basebackup.

  • Поддержка структурированного вывода серверного журнала с использованием формата JSON.

  • Улучшение производительности, особенно для сортировки в памяти и на диске.

Вышеуказанные элементы и другие новые функции PostgreSQL 15 подробно объясняются в следующих разделах.

E.30.2. Миграция на версию 15

Чтобы перенести данные с предыдущей версии, требуется выполнить резервное копирование/восстановление с использованием pg_dumpall или использовать pg_upgrade, или логическую репликацию. См. Раздел 18.6 для общей информации о переходе на новые основные версии.

Версия 15 содержит ряд изменений, которые могут повлиять на совместимость с предыдущими релизами. Обратите внимание на следующие несовместимости:

  • Удалено разрешение на создание PUBLIC в public схеме (Ноа Миш) §

    Новое значение по умолчанию является одним из безопасных схематических шаблонов использования, которые рекомендованы (Раздел 5.9.6) с момента выпуска обновления безопасности для CVE-2018-1058. Изменение применяется к новым кластерам баз данных и к новым созданным базам данных в существующих кластерах. При обновлении кластера или восстановлении дампа базы данных будут сохранены существующие разрешения для public.

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

  • Владелец схемы public был изменён на новую роль pg_database_owner (Ноа Миш) §

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

    Это изменение применяется к новым кластерам баз данных и к вновь созданным базам данных в существующих кластерах. Обновление кластера или восстановление дампа базы данных сохранит существующую спецификацию владения для public.

  • Удален давно устаревший режим эксклюзивного резервного копирования (Дэвид Стил, Натан Боссарт) §

    Если сервер базы данных останавливается внезапно в этом режиме, сервер может не запуститься. Неисключительный режим резервного копирования считается предпочтительным для всех целей. Функции pg_start_backup()/pg_stop_backup() были переименованы в pg_backup_start()/pg_backup_stop(), а функции pg_backup_start_time() и pg_is_in_backup() были удалены.

  • Увеличено значение по умолчанию hash_mem_multiplier до 2.0 (Питер Геогеган) §

    Это позволяет операциям хеширования запросов использовать больше памяти work_mem, чем другие операции.

  • Удалён серверный язык plpython2u и универсальный язык Python plpythonu (Андрес Фройнд) §

    Python 2.x больше не поддерживается. В то время как первоначальная цель plpythonu заключалась в том, чтобы в конечном итоге она могла ссылаться на plpython3u, изменение этого сейчас, кажется, скорее вызовет проблемы, чем решит их, поэтому она была просто удалена.

  • Выдана ошибка, если array_to_tsvector() передан элемент массива с пустой строкой (Жан-Кристоф Арну) §

    Это запрещено, потому что лексемы никогда не должны быть пустыми. Пользователи предыдущих версий Postgres должны проверить, что не хранятся пустые лексемы, так как они могут привести к сбоям при экспорте/импорте и несогласованным результатам.

  • Выдана ошибка, когда chr() снабжен отрицательным аргументом (Петер Айзентраут) §

  • Предотвращено изменение CREATE OR REPLACE VIEW коллации выходного столбца (Tom Lane) §

  • Запрещены идентификаторы Unicode нулевой длины, например, U&"" (Петер Айзентраут) §

    Нулевые идентификаторы, не являющиеся Unicode, были запрещены ранее.

  • Предотвращено наличие у числовых литералов нечисловых завершающих символов (Петер Айзентраут) §

    Ранее, текст запроса вида 123abc интерпретировался как 123, за которым следовал отдельный компонент abc.

  • Настроена обработка числовых литералов JSON в соответствии со стандартом SQL/JSON (Петер Айзентраут) §

    Это принимает числовые форматы, такие как .1 и 1., и не разрешает наличие ненужных символов после числовых литералов, например, 1.type().

  • Когда interval ввод предоставлял дробное значение для единицы, превышающей месяцы, округление выполнялось до ближайшего месяца (Брюс Момджиан) §

    Например, 1.99 года преобразовывается в 2 года, а не в 1 год 11 месяцев, как раньше.

  • Улучшена согласованность разбора interval с завершающими точками (Tom Lane) §

    Числа с точками в конце были отклонены на некоторых платформах.

  • Отмечена функция вывода interval как стабильная, а не неизменяемая, так как она зависит от IntervalStyle (Tom Lane) §

    Это, например, приведет к тому, что создание индексов, основанных на текстовом выводе значений interval, завершится неудачей.

  • Обнаружено переполнение целого числа в функциях обоснования интервала (Джо Кошаков) §

    Затронуты функции justify_interval(), justify_hours() и justify_days().

  • Изменён формат ввода-вывода типа "char" для не-ASCII символов (Tom Lane) §

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

  • Удалено привилегию по умолчанию ADMIN OPTION, которую роль входа имела на собственное членство в роли (Роберт Хаас) §

    Ранее, роль входа могла добавлять/удалять членов своей собственной роли, даже без привилегии ADMIN OPTION.

  • Разрешено логическое реплицирование выполняться от имени владельца подписки (Марк Дилгер) §

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

  • Предотвращены операции UPDATE и DELETE логической репликации на таблицах, где владелец подписки не имеет разрешения SELECT на таблицу (Джефф Дэвис) §

    UPDATE и DELETE команды обычно также включают чтение таблицы, поэтому требуют наличия у владельца подписки разрешения на выполнение команды SELECT для таблицы.

  • Когда EXPLAIN ссылается на схему временного объекта сессии, она упоминается как pg_temp (Amul Sul) §

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

  • Исправлено pg_statio_all_tables для суммирования значений в редком случае таблиц TOAST с несколькими индексами (Андрей Зубков) §

    Ранее в таких случаях отображалась одна строка для каждого индекса.

  • Запрещена установка пользовательских опций, которые совпадают с именем установленного расширения, но не являются одной из объявленных переменных расширения (Флорин Ирион, Том Лейн) § § §

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

  • Удалена устаревшая серверная переменная stats_temp_directory (Андрес Фройнд, Кьотаро Хоригучи) §

  • Улучшен алгоритм, используемый для вычисления random() (Фабьен Коэльо) § §

    Это приведет к тому, что результаты функции random() будут отличаться от того, что было получено в предыдущих версиях, даже для одного и того же начального значения (seed).

  • libpq's PQsendQuery() функция больше не поддерживается в режиме конвейера (Álvaro Herrera) §

    Приложения, которые используют эту комбинацию, должны быть изменены для использования функции PQsendQueryParams() вместо этого.

  • На платформах, отличных от Windows, переменная окружения HOME используется для определения домашнего каталога пользователя (Anders Kaseorg) §

    Если переменная HOME пуста или не установлена, используется предыдущий метод проверки базы данных <pwd.h>. Это изменение затрагивает libpq (например, при поиске файла ~/.pgpass), а также различные клиентские приложения.

  • Удалена опция --no-synchronized-snapshots из pg_dump (Том Лейн) §

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

  • После обнаружения ошибки в режиме --single-transaction psql, финальная команда COMMIT изменена на ROLLBACK только если установлено ON_ERROR_STOP (Michael Paquier) §

  • Избегалось ненужное приведение типов констант в запросах, отправленных postgres_fdw (Dian Fay) §

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

  • Удалена функция xml_is_well_formed() из xml2 (Том Лейн) §

    Эта функция была реализована в основном ядре с версии Postgres 9.1.

  • Разрешено поставщикам пользовательского сканирования указывать, поддерживают ли они проекции (Свен Клемм) §

    Теперь по умолчанию предполагается, что пользовательские поставщики сканирования не поддерживают проекции; те, которые поддерживают, должны быть обновлены для этого релиза.

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

Ниже вы найдете подробное описание различий между PostgreSQL 15 и предыдущим мажорным релизом.

E.30.3.1. Сервер

  • Запись и проверка версии сортировки каждой базы данных (Петер Айзентраут) §

    Эта функция предназначена для обнаружения изменений версии сортировки для предотвращения повреждения индекса. Функция pg_database_collation_actual_version() сообщает версию сортировки операционной системы, а ALTER DATABASE ... REFRESH устанавливает записанную версию сортировки базы данных в соответствии с версией сортировки операционной системы.

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

    Ранее, только сортировки, основанные на libc, могли быть выбраны на уровне кластера и базы данных. Правила сортировки ICU могли использоваться только через явные предложения COLLATE.

  • Добавлено системное представление pg_ident_file_mappings для отчета информации из pg_ident.conf (Жюльен Рухауд) §

  • Улучшено время планирования для запросов, ссылающихся на секционированные таблицы (Дэвид Роули) §

    Это изменение полезно, когда только несколько из множества секций являются актуальными.

  • Разрешено упорядоченное сканирование разделов для избежания сортировки в большем количестве случаев (Дэвид Роули) §

    Ранее, таблица с секционированием, содержащая секцию DEFAULT или секцию LIST с несколькими значениями, не могла использоваться для упорядоченного сканирования секций. Теперь они могут использоваться, если такие секции удаляются во время планирования.

  • Улучшено поведение внешнего ключа при обновлениях в секционированных таблицах, которые перемещают строки между секциями (Amit Langote) §

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

  • Разрешено CLUSTER на секционированных таблицах (Джастин Пшибы) § §

  • Исправлено ALTER TRIGGER RENAME на секционированных таблицах для правильного переименования триггеров на всех секциях (Арне Роланд, Альваро Эррера) §

    Также запрещено переименовывание клонированных триггеров.

E.30.3.1.2. Индексы
  • Разрешены индексы btree на системных и TOAST таблицах для эффективного хранения дубликатов (Питер Геогеган) §

    Ранее дедупликация была отключена для этих типов индексов.

  • Улучшена производительность поиска индексов GiST, которые были построены с использованием сортировки (Александр Каленик, Сергей Шульбаков, Андрей Бородин) §

  • Разрешено уникальным ограничениям и индексам рассматривать NULL значения как неразличимые (Питер Айзентраут) §

    Ранее записи с NULL всегда рассматривались как отдельные значения, но теперь это можно изменить, создав ограничения и индексы с использованием UNIQUE NULLS NOT DISTINCT.

  • Разрешено оператору ^@ starts-with и функции starts_with() использовать btree индексы при использовании C коллации (Tom Lane) §

    Ранее они могли использовать только индексы SP-GiST.

E.30.3.1.3. Оптимизатор
  • Разрешено расширенной статистике записывать статистику для родителя со всеми его потомками (Томаш Вондра, Джастин Призби) §

    Стандартный инструмент статистики уже отслеживал статистику «только родитель» и статистику «родители плюс все дочерние элементы» по отдельности.

  • Добавлена серверная переменная recursive_worktable_factor для того, чтобы пользователю было позволено указать ожидаемый размер рабочей таблицы рекурсивного запроса (Саймон Риггс) §

E.30.3.1.4. Общая производительность
  • Разрешен хеш-поиск для NOT IN выражений с множеством констант (Дэвид Роули, Джеймс Коулман) §

    Ранее код всегда последовательно сканировал список значений.

  • Разрешено SELECT DISTINCT быть параллелизированным (David Rowley) §

  • Ускорена проверка кодировки текста UTF-8 за счет обработки 16 байт за раз (Джон Нейлор, Хейкки Линкангас) §

    Это улучшит операции с большим объемом текста, такие как COPY FROM.

  • Улучшена производительность для сортировок, которые превышают work_mem (Хейки Линкангас) § §

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

  • Улучшена производительность и снижено потребление памяти для сортировок в памяти (Ронан Данкло, Дэвид Роули, Томас Манро, Джон Нейлор) § § §

  • Разрешено WAL полное запись страниц использовать сжатие LZ4 и Zstandard (Андрей Бородин, Джастин Пшибы) § §

    Это контролируется настройкой сервера wal_compression.

  • Добавлена поддержка записи WAL с использованием прямого ввода-вывода на macOS (Томас Мунро) §

    Это работает только если max_wal_senders = 0 и wal_level = minimal.

  • Разрешено вакууму быть более агрессивным в установке самого старого замороженного и мульти-транзакционного идентификатора (Питер Геогеган) §

  • Разрешено запросу, ссылающемуся на несколько внешних таблиц, выполнять параллельные сканирования внешних таблиц в большем числе случаев (Андрей Лепихов, Эцуро Фуджита) §

  • Улучшена производительность оконных функций, которые используют row_number(), rank(), dense_rank() и count() (David Rowley) §

  • Улучшена производительность спинлоков на системах ARM64 с большим количеством ядер (Geoffrey Blake) §

E.30.3.1.5. Мониторинг
  • Включено логирование по умолчанию контрольных точек и медленных операций autovacuum (Бхарат Рупиредди) §

    Это изменяет значение по умолчанию для log_checkpoints на on и для log_autovacuum_min_duration на 10 минут. Это приведет к генерации некоторого журнального вывода даже на неактивном сервере, что может вызвать проблемы на серверах с ограниченными ресурсами без ротации журнальных файлов. В таких случаях следует изменить эти значения по умолчанию.

  • Генерация сообщений о прогрессе в журнале сервера во время медленных запусков сервера (Nitin Jadhav, Robert Haas) § §

    Сообщения сообщают о причине задержки. Интервал времени для уведомления контролируется новой переменной сервера log_startup_progress_interval.

  • Данные системы кумулятивной статистики хранились в общей памяти (Kyotaro Horiguchi, Andres Freund, Melanie Plageman) § §

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

  • Добавлена дополнительная информация в VACUUM VERBOSE и сообщения журналирования autovacuum (Питер Геогеган) § § §

  • Добавлен EXPLAIN (BUFFERS) вывод для ввода-вывода блоков временных файлов (Масахико Савада) §

  • Разрешен вывод логов в формате JSON (Сехропе Саркуни, Майкл Пакье) §

    Новое значение - log_destination = jsonlog.

  • Разрешено pg_stat_reset_single_table_counters() сбрасывать счетчики отношений, общих для всех баз данных (Sadhuprasad Patro) §

  • Добавлены события ожидания для локальных команд оболочки (Fujii Masao) §

    Новые события ожидания используются при вызове archive_command, archive_cleanup_command, restore_command и recovery_end_command.

E.30.3.1.6. Привилегии
  • Разрешены доступы к таблице, выполняемые представлением, которые могут быть опционально контролируемы привилегиями вызывающего представление (Кристоф Хайсс) §

    Ранее доступ к представлениям всегда рассматривался как выполненный владельцем представления. Это по-прежнему является значением по умолчанию.

  • Разрешено членам pg_write_server_files предопределенной роли выполнять серверные базовые резервные копии (Дагфинн Илмари Маннсокер) §

    Ранее только суперпользователи могли выполнять такие резервные копии.

  • Разрешено GRANT предоставление разрешений на изменение отдельных серверных переменных через SET и ALTER SYSTEM (Марк Дилгер) § §

    Новая функция has_parameter_privilege() сообщает о наличии этой привилегии.

  • Добавлена предопределенная роль pg_checkpoint, которая позволяет участникам выполнять CHECKPOINT (Джефф Дэвис) § §

    Ранее контрольные точки могли выполнять только суперпользователи.

  • Разрешено членам предопределенной роли pg_read_all_stats доступ к представлениям pg_backend_memory_contexts и pg_shmem_allocations (Бхаратх Рупиредди) §

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

  • Разрешено GRANT предоставлять разрешения на pg_log_backend_memory_contexts() (Джефф Дэвис) §

    Ранее эта функция могла быть запущена только суперпользователями.

E.30.3.1.7. Конфигурация сервера
  • Добавлена серверная переменная shared_memory_size для отчета о размере выделенной общей памяти (Натан Боссарт) § §

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

    Это поддерживается только в Linux.

  • Была учтена серверная переменная shared_preload_libraries в однопользовательском режиме (Джефф Дэвис) §

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

  • На Solaris, сделана настройка по умолчанию dynamic_shared_memory_type как sysv (Томас Мунро) §

    Предыдущий выбор по умолчанию, posix, может привести к ложным сбоям на этой платформе.

  • Разрешено postgres -C правильно сообщать вычисленные во время выполнения значения (Натан Боссарт) §

    Ранее вычисляемые значения data_checksums, wal_segment_size и data_directory_mode сообщали значения, которые не были точными на работающем сервере. Однако это не работает на работающем сервере.

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

  • Добавлена поддержка сжатия LZ4 и Zstandard для серверных базовых резервных копий (Дживан Ладхе, Роберт Хаас) § § §

  • Запуск процессов контрольной точки и фоновой записи во время аварийного восстановления (Томас Мунро) §

    Это помогает ускорить долгое восстановление после сбоев.

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

    Это контролируется переменной сервера recovery_prefetch.

  • Разрешено архивирование через загружаемые модули (Натан Боссарт) §

    Ранее архивирование выполнялось только путем вызова команд оболочки. Новая переменная сервера archive_library может быть установлена для указания библиотеки, которая будет вызываться для архивирования.

  • Больше не требуется, чтобы IDENTIFY_SYSTEM выполнялся перед START_REPLICATION (Джефф Дэвис) §

  • Разрешена публикация всех таблиц в схеме (Vignesh C, Hou Zhijie, Amit Kapila) § § §

    Например, теперь поддерживается такой синтаксис: CREATE PUBLICATION pub1 FOR TABLES IN SCHEMA s1,s2. ALTER PUBLICATION поддерживает аналогичный синтаксис. Таблицы, добавленные позже в перечисленные схемы, также будут тиражироваться.

  • Разрешено фильтрация содержимого публикации с использованием WHERE условия (Hou Zhijie, Euler Taveira, Peter Smith, Ajin Cherian, Tomas Vondra, Amit Kapila) § § §

    Строки, не удовлетворяющие условию WHERE, не публикуются.

  • Разрешено ограничение содержимого публикации до определенных столбцов (Томаш Вондра, Альваро Эррера, Рахила Сайед) §

  • Разрешено пропускать транзакции на подписчике с использованием ALTER SUBSCRIPTION ... SKIP (Масахико Савада) §

  • Добавлена поддержка подготовленных (двухфазных) транзакций для логической репликации (Питер Смит, Аджин Чериан, Амит Капила, Нихил Сонтакке, Стас Кельвич) § § §

    Новая опция CREATE_REPLICATION_SLOT называется TWO_PHASE. pg_recvlogical теперь поддерживает новую опцию --two-phase при создании слота.

  • Предотвращена логическая репликация пустых транзакций (Ajin Cherian, Hou Zhijie, Euler Taveira) §

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

  • Добавлены функции SQL для мониторинга содержимого каталогов слотов логической репликации (Бхарат Рупиредди) §

    Новые функции - pg_ls_logicalsnapdir(), pg_ls_logicalmapdir() и pg_ls_replslotdir(). Они могут быть запущены членами предопределенной роли pg_monitor.

  • Разрешено подписчикам останавливать применение изменений логической репликации при ошибке (Osumi Takamichi, Mark Dilger) §

    Это включается с помощью опции подписчика disable_on_error и предотвращает возможные бесконечные циклы ошибок во время применения потока.

  • Настроены переменные сервера подписчика в соответствии с издателем, чтобы значения datetime и float8 интерпретировались последовательно (Japin Li) §

    Некоторые издатели могут полагаться на несогласованное поведение.

  • Добавлено системное представление pg_stat_subscription_stats для отчета о активности подписчика (Masahiko Sawada) § §

    Новая функция pg_stat_reset_subscription_stats() позволяет сбросить эти счетчики статистики.

  • Подавлены дублирующиеся записи в системном представлении pg_publication_tables (Hou Zhijie) §

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

E.30.3.3. Утилиты

  • Добавлена команда SQL MERGE для приведения одной таблицы в соответствие с другой (Саймон Риггс, Паван Деоласе, Альваро Эррера, Амит Ланготе) §

    Это похоже на INSERT ... ON CONFLICT, но более ориентировано на пакетную обработку.

  • Добавлена поддержка опции HEADER в текстовом формате COPY (Реми Лапейр) § §

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

  • Добавлен новый метод с WAL-журналированием для создания базы данных (Dilip Kumar) §

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

  • Разрешено CREATE DATABASE устанавливать OID базы данных (Шрути Говда, Антонин Хоушка) §

  • Предотвращено случайное сбойное выполнение DROP DATABASE, DROP TABLESPACE и ALTER DATABASE SET TABLESPACE при одновременном использовании в Windows (Томас Мунро) §

  • Разрешены действия внешнего ключа ON DELETE SET для воздействия только на указанные столбцы (Пол Мартинес) §

    Ранее все столбцы внешнего ключа всегда затрагивались.

  • Разрешено ALTER TABLE изменять ACCESS METHOD таблицы (Джастин Призби, Джефф Дэвис) §

  • Правильный вызов хуков доступа к объектам, когда ALTER TABLE вызывает переписывание таблиц (Майкл Пакье) §

  • Разрешено создание незалогированных последовательностей (Питер Айзентраут) §

  • Отслеживание зависимостей от отдельных столбцов в результатах функций, возвращающих составные типы (Том Лейн) §

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

E.30.3.4. Типы данных

  • Разрешено, чтобы масштаб numeric значения был отрицательным или больше его точности (Дин Рашид, Том Лейн) §

    Это позволяет округлять значения слева от десятичной точки, например, '1234'::numeric(4, -2) возвращает 1200.

  • Улучшено обнаружение переполнения при приведении значений к интервалу (Джо Кошаков) §

  • Изменён формат ввода-вывода типа "char" для не-ASCII символов (Tom Lane) §

  • Обновлена информация о ширине отображения современных символов Unicode, таких как эмодзи (Джейкоб Чемпион) § §

    Также обновите с Unicode 5.0 до 14.0.0. Теперь есть автоматизированный способ поддерживать актуальность Postgres с релизами Unicode.

E.30.3.5. Функции

  • Добавлен ввод мультидиапазона в range_agg() (Пол Юнгвирт) §

  • Добавлены агрегаты MIN() и MAX() для типа данных xid8 (Ken Kato) §

  • Добавлены функции регулярных выражений для совместимости с другими реляционными системами (Жиль Дарольд, Том Лейн) §

    Новые функции - regexp_count(), regexp_instr(), regexp_like() и regexp_substr(). Кроме того, к функции regexp_replace() были добавлены новые необязательные аргументы.

  • Добавлена возможность вычисления расстояния между многоугольниками (Tom Lane) §

  • Добавлены коды формата to_char() of, tzh, и tzm (Nitin Jadhav) §

    Верхний регистр этих эквивалентов уже поддерживался.

  • При применении AT TIME ZONE к значению time with time zone, использовалось время начала транзакции, а не время настенных часов, для определения, применяется ли летнее время (Александр Алексеев, Том Лейн) §

    Это позволяет считать преобразование стабильным, а не изменчивым, и экономит вызов ядра для каждого вызова.

  • Игнорировались элементы массива NULL в ts_delete() и setweight() функциях с аргументами массива (Жан-Кристоф Арну) §

    Эти функции эффективно игнорируют элементы массива, содержащие пустые строки (поскольку они никогда не могут соответствовать допустимому лексему). Кажется логичным, чтобы они также игнорировали элементы NULL, вместо того чтобы вызывать ошибку.

  • Добавлена поддержка петабайтных единиц в pg_size_pretty() и pg_size_bytes() (Дэвид Кристенсен) §

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

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

E.30.3.6. PL/pgSQL

  • Исправлено соблюдение маркировок переменных PL/pgSQL CONSTANT (Tom Lane) §

    Ранее переменная могла использоваться в качестве выходного параметра CALL или переменной refcursor OPEN, даже если она была помечена как CONSTANT.

E.30.3.7. libpq

  • Разрешено сопоставление IP-адреса с альтернативным именем субъекта в сертификате сервера (Джейкоб Чемпион) §

  • Позволено PQsslAttribute() сообщать о типе библиотеки SSL без необходимости подключения libpq (Джейкоб Чемпион) §

  • Изменения отмены запросов, отправленных клиентом, чтобы использовать те же настройки TCP, что и обычные клиентские подключения (Jelte Fennema) §

    Это позволяет применять настроенные таймауты TCP к соединениям для отмены запросов.

  • Предотвращены сбои обратного вызова события libpq, приводящие к ошибочному результату (Tom Lane) § §

E.30.3.8. Клиентские приложения

  • Разрешено pgbench повторять попытки после сбоев сериализации и взаимоблокировок (Юго Нагата, Марина Полякова) §

E.30.3.8.1. psql
  • Улучшена производительность psql команды \copy, за счет отправки данных большими блоками (Хейкки Линнакангас) §

  • Добавлена команда \dconfig для отображения серверных переменных (Марк Дилгер, Том Лейн) § § §

    Это аналог команды сервера SHOW, но она может обрабатывать шаблоны для удобного отображения нескольких переменных.

  • Добавлена команда \getenv для присвоения значения переменной окружения переменной psql (Том Лейн) §

  • Добавлена опция + к командам \lo_list и \dl для отображения привилегий на большие объекты (Павел Лузанов) §

  • Добавлена опция пейджера для команды \watch (Павел Стехуле, Томас Мунро) §

    Это поддерживается только в Unix и контролируется переменной среды PSQL_WATCH_PAGER.

  • Сделано так, чтобы psql включал комментарии с двойным дефисом внутри запроса в запросы, отправляемые на сервер (Том Лейн, Грег Нанкарроу) § §

    Ранее такие комментарии удалялись из запроса перед отправкой. Комментарии с двойными дефисами, которые находятся перед любым текстом запроса, не отправляются и не записываются как отдельные записи истории psql.

  • Настроено psql так, чтобы команда meta-# в Readline вставляла маркер комментария с двойным дефисом (Tom Lane) §

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

  • Вывод psql всех результатов, когда несколько запросов передаются на сервер одновременно (Фабьен Коэльо) §

    Ранее отображался только последний результат запроса. Старое поведение можно восстановить, установив переменную SHOW_ALL_RESULTS приложения psql в значение off.

  • После обнаружения ошибки в режиме --single-transaction, изменить финальную команду COMMIT на ROLLBACK только если установлено ON_ERROR_STOP (Майкл Пакье) §

    Ранее, обнаружение ошибки в команде -c или в скриптовом файле -f приводило к выполнению команды ROLLBACK в конце, независимо от значения ON_ERROR_STOP.

  • Улучшено автодополнение в psql (Синья Като, Дагфинн Илмари Маннсокер, Питер Смит, Кою Танигава, Кен Като, Дэвид Феттер, Хайинг Танг, Питер Айзентраут, Альваро Эррера, Том Лейн, Масахико Савада) § § § § § § § § § § § § § § § § § § § §

  • Ограничена поддержка обратных слеш-команд psql для серверов, работающих на PostgreSQL 9.2 или более поздних версиях (Tom Lane) §

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

E.30.3.8.2. pg_dump
  • Сделано так, чтобы pg_dump сохранял изменения владельца схемы public и метки безопасности (Ноа Миш) § §

  • Улучшена производительность дампа баз данных с множеством объектов (Tom Lane) § § §

    Это также улучшит производительность pg_upgrade.

  • Улучшена производительность параллельного pg_dump для таблиц с большими таблицами TOAST (Tom Lane) §

  • Добавлена опция дампа/восстановления --no-table-access-method для принудительного использования только метода доступа к таблице по умолчанию при восстановлении (Джастин Пшибы) §

  • Ограничена поддержка pg_dump и pg_dumpall для серверов, работающих на PostgreSQL 9.2 или более поздних версиях (Tom Lane) §

E.30.3.9. Приложения сервера

  • Добавлена новая опция pg_basebackup --target для управления местоположением базового резервного копирования (Роберт Хаас) §

    Новые параметры - server для записи резервной копии локально и blackhole для отбрасывания резервной копии (для тестирования).

  • Разрешено pg_basebackup выполнять серверную компрессию gzip, LZ4 и Zstandard, а также клиентскую компрессию LZ4 и Zstandard для файлов базового резервного копирования (Dipesh Pandit, Jeevan Ladhe) § § §

    Поддержка сжатия gzip на стороне клиента уже была реализована.

  • Разрешено pg_basebackup сжимать на стороне сервера и распаковывать на стороне клиента перед хранением (Dipesh Pandit) §

    Это достигается путем указания сжатия на стороне сервера и формата вывода в виде обычного текста.

  • Разрешено pg_basebackup использовать --compress для управления местоположением сжатия (сервер или клиент), методом сжатия и параметрами сжатия (Майкл Пакье, Роберт Хаас) § § §

  • Добавлен метод сжатия LZ4 в pg_receivewal (Georgios Kokolatos) § §

    Это включается с помощью --compress=lz4 и требует сборки бинарных файлов с использованием --with-lz4.

  • Добавлены дополнительные возможности к pg_receivewal's --compress опции (Georgios Kokolatos) §

  • Улучшена способность pg_receivewal перезапускаться в правильном месте WAL (Ронан Данкло) §

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

  • Добавлена pg_rewind опция --config-file для упрощения использования, когда файлы конфигурации сервера хранятся вне каталога данных (Гуннар Блут) §

E.30.3.9.1. pg_upgrade
  • Логи и временные файлы pg_upgrade были сохранены в подкаталоге нового кластера под названием pg_upgrade_output.d (Джастин Призби) § § §

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

  • Отключена отчетность о состоянии по умолчанию во время pg_upgrade операции, если вывод не является терминалом (Андрес Фройнд) §

    Выходной отчет о состоянии может быть включен для использования без tty с помощью опции --verbose.

  • Сделано так, чтобы pg_upgrade сообщал обо всех базах данных с недопустимыми настройками подключения (Дживан Ладхе) §

    Ранее сообщалось только о первой базе данных с неверными настройками подключения.

  • Сделано так, чтобы pg_upgrade сохранял табличные пространства и OID базы данных, а также номера relfilenode отношений (Шрути Говда, Антонин Хоуска) § § §

  • Добавлена опция --no-sync в pg_upgrade (Майкл Пакье) §

    Это рекомендуется только для тестирования.

  • Поддержка ограничения pg_upgrade для старых серверов, работающих на PostgreSQL 9.2 или более поздней версии (Tom Lane) §

E.30.3.9.2. pg_waldump
  • Разрешен вывод pg_waldump фильтроваться по узлу файла отношения, номеру блока, номеру вилки и полным изображениям страниц (Дэвид Кристенсен, Томас Мунро) § §

  • Сделано так, чтобы pg_waldump сообщал статистику перед прерванным выходом (Бхарат Рупиредди) §

    Например, нажатие комбинации клавиш Control-C в терминале, запущенном с командой pg_waldump --stats --follow, приведет к выводу текущей статистики перед выходом. Это не работает в Windows.

  • Улучшены описания некоторых записей транзакций WAL, сообщаемых pg_waldump (Масахико Савада, Майкл Пакье) §

  • Разрешено pg_waldump выводить информацию о нескольких менеджерах ресурсов (Хейкки Линнакангас) §

    Это включается путем указания опции --rmgr несколько раз.

E.30.3.10. Документация

  • Добавлена документация для pg_encoding_to_char() и pg_char_to_encoding() (Иан Лоуренс Барвик) §

  • Документирован оператор ^@ starts-with (Том Лейн) §

E.30.3.11. Исходный код

  • Добавлена поддержка непрерывного тестирования интеграции с использованием cirrus-ci (Андрес Фройнд, Томас Мунро, Мелани Плэгеман) §

  • Добавлено поле идентификатора ABI в магический блок в загружаемых библиотеках, позволяющее некоммерческим дистрибуциям PostgreSQL идентифицировать библиотеки, которые не совместимы с другими сборками (Петер Айзентраут) §

    Несоответствие поля ABI вызовет ошибку при загрузке.

  • Создано новое значение pg_type.typcategory для "char" (Tom Lane) §

    Некоторые другие типы, предназначенные только для внутреннего использования, также были назначены этой категории.

  • Добавлено новое сообщение протокола TARGET для указания нового метода COPY, который будет использоваться для базовых резервных копий (Роберт Хаас) §

    pg_basebackup теперь использует этот метод.

  • Добавлено новое сообщение протокола COMPRESSION и COMPRESSION_DETAIL для указания метода и параметров сжатия (Роберт Хаас) § §

  • Удалена серверная поддержка старого синтаксиса команды BASE_BACKUP и протокола базового резервного копирования (Роберт Хаас) § §

  • Добавлена поддержка расширений для установки пользовательских целей резервного копирования (Роберт Хаас) §

  • Разрешено расширениям определять пользовательские менеджеры ресурсов WAL (Джефф Дэвис) §

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

  • На Windows все глобальные переменные сервера были экспортированы с использованием маркеров PGDLLIMPORT (Роберт Хаас) §

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

  • Требуется версия GNU make 3.81 или более поздняя для сборки PostgreSQL (Tom Lane) §

  • Для сборки расширения pgcrypto требовался OpenSSL (Петер Айзентраут) §

  • Требуется Perl версии 5.8.3 или более поздней (Dagfinn Ilmari Mannsåker) §

  • Требуется Python версии 3.2 или более поздней (Андрес Фройнд) §

E.30.3.12. Дополнительные модули

  • Разрешено amcheck проверять последовательности (Марк Дилгер) §

  • Улучшены проверки целостности amcheck для таблиц TOAST (Mark Dilger) §

  • Добавлен новый модуль basebackup_to_shell в качестве примера пользовательской цели резервного копирования (Роберт Хаас) § §

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

  • Разрешены btree_gist индексы на булевых столбцах (Эмре Хасегели) § § §

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

  • Исправлена pageinspect's page_header() для обработки размеров страниц в 32 килобайта (Quan Zongliang) §

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

  • Добавлены счетчики для ввода-вывода блоков временных файлов в pg_stat_statements (Масахико Савада) §

  • Добавлены счетчики JIT в pg_stat_statements (Магнус Хагандер) §

  • Добавлен новый модуль pg_walinspect (Бхарат Рупиредди) §

    Это дает вывод на уровне SQL, аналогичный pg_waldump.

  • Указано разрешающее/принудительное состояние в сообщениях журнала sepgsql (Дэйв Пейдж) §

E.30.3.12.1. postgres_fdw
  • Разрешено postgres_fdw выполнять передачу выражений CASE (Александр Пыхалов) §

  • Добавлена серверная переменная postgres_fdw.application_name для управления именем приложения соединений postgres_fdw (Хаято Курода) § § §

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

  • Разрешено параллельное подтверждение на серверах postgres_fdw (Etsuro Fujita) §

    Это включается с помощью опции CREATE SERVER parallel_commit.

E.30.4. Благодарности

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

Abhijit Menon-Sen
Adam Brusselback
Adam Mackler
Adrian Ho
Ahsan Hadi
Ajin Cherian
Alastair McKinley
Aleksander Alekseev
Ales Zeleny
Alex Kingsborough
Alex Kozhemyakin
Alexander Korotkov
Alexander Kukushkin
Alexander Lakhin
Alexander Nawratil
Alexander Pyhalov
Alexey Borzov
Alexey Ermakov
Аляксандр Каленік
Álvaro Herrera
Amit Kapila
Amit Khandekar
Amit Langote
Amul Sul
Anastasia Lubennikova
Anders Kaseorg
Andreas Dijkman
Andreas Grob
Andreas Seltenreich
Andrei Zubkov
Andres Freund
Andrew Alsup
Andrew Bille
Andrew Dunstan
Andrew Gierth
Andrew Kesper
Andrey Borodin
Andrey Lepikhov
Andrey Sokolov
Andy Fan
Anton Melnikov
Anton Voloshin
Antonin Houska)
Arjan van de Ven
Arne Roland
Arthur Zakirov
Ashutosh Bapat
Ashutosh Sharma
Ashwin Agrawal
Asif Rehman
Asim Praveen
Atsushi Torikoshi
Aya Iwata
Bauyrzhan Sakhariyev
Benoit Lobréau
Bernd Dorn
Bertrand Drouvot
Bharath Rupireddy
Björn Harrtell
Boris Kolpackov
Boris Korzun
Brad Nicholson
Brar Piening
Bruce Momjian
Bruno da Silva
Bryn Llewellyn
Carl Sopchak
Cary Huang
Chapman Flack
Chen Jiaoqian
Chris Bandy
Chris Lowder
Christian Quest
Christoph Berg
Christoph Heiss
Christophe Pettus
Christopher Painter-Wakefield
Claudio Freire
Clemens Zeidler
Corey Huinker
Dag Lem
Dagfinn Ilmari Mannsåker
Dan Kubb
Daniel Cherniy
Daniel Gustafsson
Daniel Polski
Daniel Vérité
Daniel Westermann
Daniele Varrazzo
Daniil Anisimov
Danny Shemesh
Darafei Praliaskouski
Daria Lepikhova
Dave Cramer
Dave Page
David Christensen
David Fetter
David G. Johnston
David Rowley
David Steele
David Zhang
Dean Rasheed
Dian Fay
Dilip Kumar
Dipesh Pandit
Dmitry Dolgov
Dmitry Koval
Dmitry Marakasov
Dominique Devienne
Dong Wook
Drew DeVault
Eduard Català
Egor Chindyaskin
Egor Rogov
Ekaterina Kiryanova
Elena Indrupskaya
Elvis Pranskevichus
Emmanuel Quincerot
Emre Hasegeli
Eric Mutta
Erica Zhang
Erik Rijkers
Erki Eessaar
Etsuro Fujita
Euler Taveira
Fabien Coelho
Fabrice Chapuis
Fabrice Fontaine
Fabrízio de Royes Mello
Фейке Стенберген
Filip Gospodinov
Florin Irion
Floris Van Nee
Frédéric Yhuel
Gabriela Serventi
Gaurab Dey
Geoff Winkless
Geoffrey Blake
Georgios Kokolatos
Gilles Darold
Greg Nancarrow
Greg Rychlewski
Greg Sabino Mullane
Greg Stark
Gregory Smith
Guillaume Lelarge
Gunnar Bluth
Gurjeet Singh
Haiyang Wang
Haiying Tang
Hannu Krosing
Hans Buschmann
Hayato Kuroda
Heath Lord
Heikki Linnakangas
Herwig Goemans
Himanshu Upadhyaya
Holly Roberts
Hou Zhijie
Hubert Lubaczewski
Ian Barwick
Ian Campbell
Ibrar Ahmed
Ildus Kurbangaliev
Ilya Anfimov
Itamar Gafni
Jacob Champion
Jaime Casanova
Jakub Wartak
James Coleman
James Hilliard
James Inform
Jan Piotrowski
Japin Li
Jason Harvey
Jason Kim
Jean-Christophe Arnu
Jeevan Ladhe
Jeff Davis
Jeff Janes
Jehan-Guillaume de Rorthais
Jelte Fennema
Jeremy Evans
Jeremy Schneider
Jian Guo
Jian He
Jimmy Yih
Jiri Fejfar
Jitka Plesníková
Джо Конвей
Joe Wildish
Joel Jacobson
Joey Bodoia
John Naylor
Jonathan Katz
Josef Simanek
Joseph Koshakow
Josh Soref
Joshua Brindle
Juan José Santamaría Flecha
Julien Rouhaud
Julien Roze
Junwang Zhao
Jürgen Purtz
Justin Pryzby
Ken Kato
Kevin Burke
Kevin Grittner
Kevin Humphreys
Kevin McKibbin
Kevin Sweet
Kevin Zheng
Klaudie Willis
Konstantin Knizhnik
Konstantina Skovola
Kosei Masumura
Kotaro Kawamoto
Koyu Tanigawa
Kuntal Ghosh
Kyotaro Horiguchi
Lars Kanis
Lauren Fliksteen
Laurent Hasson
Laurenz Albe
Leslie Lemaire
Liam Bowen
Lingjie Qiang
Liu Huailing
Louis Jachiet
Lukas Fittl
Ma Liangzhu
Maciek Sakrejda
Magnus Hagander
Mahendra Singh Thalor
Maksim Milyutin
Marc Bachmann
Marcin Krupowicz
Marcus Gartner
Marek Szuba
Marina Polyakova
Mario Emmenlauer
Mark Dilger
Mark Murawski
Mark Wong
Markus Wanner
Markus Winand
Martijn van Oosterhout
Martin Jurca
Martin Kalcher
Martín Marqués
Masahiko Sawada
Masahiro Ikeda
Masao Fujii
Masaya Kawamoto
Masayuki Hirose
Matthias van de Meent
Matthijs van der Vleuten
Maxim Orlov
Maxim Yablokov
Melanie Plageman
Michael Banck
Michael Harris
Michael J. Sullivan
Michael Meskes
Michael Mühlbeyer
Michael Paquier
Michael Powers
Mike Fiedler
Mike Oh
Mikhail Kulagin
Miles Delahunty
Naoki Okano
Nathan Bossart
Nathan Long
Nazir Bilal Yavuz
Neha Sharma
Neil Chen
Nicola Contu
Nicolas Lutic
Nikhil Benesch
Nikhil Shetty
Nikhil Sontakke
Nikita Glukhov
Nikolai Berkoff
Nikolay Samokhvalov
Nikolay Shaplov
Nitin Jadhav
Noah Misch
Noboru Saito
Noriyoshi Shinoda
Olaf Bohlen
Olly Betts
Onder Kalaci
Oskar Stenberg
Otto Kekalainen
Paul Guo
Paul Jungwirth
Paul Martinez
Pavan Deolasee
Pavel Borisov
Pavel Luzanov
Pavel Stehule
Peter Eisentraut
Peter Geoghegan
Peter Slavov
Peter Smith
Petr Jelínek
Phil Florent
Phil Krylov
Pierre-Aurélien Georges
Prabhat Sahu
Quan Zongliang
Rachel Heaton
Rahila Syed
Rajakavitha Kodhandapani
Rajkumar Raghuwanshi
Ranier Vilela
Rei Kamigishi
Reid Thompson
Rémi Lapeyre
Renan Soares Lopes
Richard Guo
Richard Wesley
RKN Sai Krishna
Robert Haas
Роберт Трит
Roberto Mello
Robins Tharakan
Roger Mason
Roman Zharkov
Ронан Дунклау
Rui Zhao
Ryan Kelly
Ryo Matsumura
Ryohei Takahashi
Sadhuprasad Patro
Сайт Талха Нисанчи
Sami Imseih
Sandeep Thakkar
Sebastian Kemper
Sehrope Sarkuni
Sergei Kornilov
Sergei Shoulbakov
Sergey Shinderuk
Shay Rojansky
Shenhao Wang
Shi Yu
Shinya Kato
Shruthi Gowda
Simon Perepelitsa
Simon Riggs
Sirisha Chamarthi
Soumyadeep Chakraborty
Stan Hu
Stas Kelvich
Stefen Hillman
Stephen Frost
Steve Chavez
Sumanta Mukherjee
Suraj Khamkar
Suraj Kharage
Sven Klemm
Takamichi Osumi
Takayuki Tsunakawa
Takeshi Ideriha
Tatsuhiro Nakamori
Tatsuhito Kasahara
Tatsuo Ishii
Tatsuro Yamada
Teja Mupparti
Федор Сигаев
Thibaud Walkowiak
Thom Brown
Thomas McKay
Томас Манро
Tim McNamara
Timo Stolz
Тимур Ханжанов
Tom Lane
Tomas Barton
Tomas Vondra
Tony Reix
Troy Frericks
Tushar Ahuja
Victor Wagner
Victor Yegorov
Vignesh C
Vik Fearing
Vincas Dargis
Vitaly Burovoy
Vitaly Voronov
Vladimir Sitnikov
Wang Ke
Wei Sun
Wei Wang
Whale Song
Will Mortensen
Wolfgang Walther
Yanliang Lei
Yaoguang Chen
Yogendra Suralkar
YoungHwan Joo
Yugo Nagata
Yukun Wang
Yura Sokolov
Yusuke Egashira
Yuzuko Hosoya
Zhang Mingli
Zhang Wenjie
Zhihong Yu
Zhiyong Wu