E.7. Выпуск 15

Дата выпуска: 2022-10-13

E.7.1. Обзор

PostgreSQL 15 содержит много новых возможностей и улучшений, в том числе:

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

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

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

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

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

Предыдущие пункты и другие новые возможности PostgreSQL 15 более подробно описаны в следующих разделах.

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

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

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

  • Лишение роли PUBLIC права создания объектов в схеме public (Ной Миш)

    По умолчанию теперь применяется один из шаблонов безопасного использования схем, который рекомендуется в Подраздел 5.9.6 с выпуска, посвящённого устранению CVE-2018-1058. Это изменение распространяется на новые кластеры и на новые базы, которые будут создаваться в существующих кластерах. При обновлении кластера или восстановлении выгруженной ранее копии для схемы public сохранятся предыдущие разрешения.

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

  • Назначение владельцем схемы public нововведённой роли pg_database_owner (Ной Миш)

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

    Это изменение распространяется на новые кластеры и на новые базы, которые будут создаваться в существующих кластерах. При обновлении кластера или восстановлении выгруженной ранее копии владелец схемы 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 и языка plpythonu, не привязанного к версии Python (Андрес Фройнд)

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

  • Недопущение пустых строк в передаваемом функции array_to_tsvector() массиве (Жан-Кристоф Арну)

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

  • Выдача ошибки при вызове функции chr() с отрицательным аргументом (Питер Эйзентраут)

  • Недопущение изменения правила сортировки выходного столбца в CREATE OR REPLACE VIEW (Том Лейн)

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

    Идентификаторы нулевой длины не в Unicode не допускались и до этого.

  • Запрещение числовых констант, оканчивающихся нецифровыми символами (Питер Эйзентраут)

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

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

    Теперь принимаются числовые форматы .1 и 1., но не допускается лишнее содержимое после числа, например 1.type().

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

    Например, значение 1.99 years будет преобразовано в 2 years (2 года), а не 1 year 11 months (1 год 11 месяцев), как раньше.

  • Реализация более согласованного разбора значений interval с точками в конце (Том Лейн)

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

  • Присвоение функции вывода interval характеристики стабильной, но не постоянной, так как она зависит от значения IntervalStyle (Том Лейн)

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

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

    Это изменение затронуло функции justify_interval(), justify_hours() и justify_days().

  • Изменение формата ввода/вывода типа "char" для не ASCII-символов (Том Лейн)

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

  • Лишение ролей подразумеваемого по умолчанию права ADMIN OPTION, которое они имели для собственной роли (Роберт Хаас)

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

  • Выполнение процесса логической репликации от имени владельца подписки (Марк Дилгер)

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

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

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

  • Обозначение схемы временных объектов сеанса в выводе EXPLAIN псевдонимом pg_temp (Амул Сул)

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

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

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

  • Запрет присваивания значений нестандартным параметрам, у которых префикс имени совпадает с префиксами имён установленных расширений, но при этом данные параметры не являются объявленными переменными расширения (Флорин Ирион, Том Лейн)

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

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

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

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

  • Функция libpq PQsendQuery() более не поддерживается в конвейерном режиме (Альваро Эррера)

    В приложениях, использующих её в этом режиме, нужно перейти к использованию PQsendQueryParams().

  • Реализация определения домашнего каталога пользователя на платформах, отличных от Windows, по значению переменной окружения HOME (Андерс Касеорг)

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

  • Ликвидация параметра pg_dump --no-synchronized-snapshots (Том Лейн)

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

  • Замена окончательной команды COMMIT на ROLLBACK в случае возникновения ошибки в режиме psql --single-transaction только при установленном параметре ON_ERROR_STOP (Микаэль Пакье)

  • Исключение ненужных приведений констант в запросах, которые передаёт postgres_fdw (Дайан Фей)

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

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

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

  • Наделение провайдеров нестандартного сканирования возможностью обозначать поддержку проекций (Свен Клемм)

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

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

Ниже вы найдёте подробный список изменений, произошедших между предыдущим основным выпуском и выпуском PostgreSQL 15.

E.7.3.1. Сервер

  • Сохранение и проверка версии правила сортировки для каждой базы данных (Питер Эйзентраут)

    Контроль версий правил сортировки предназначен для выявления изменения версий и предотвращения повреждения индексов. Версию правила сортировки в ОС позволяет узнать функция pg_database_collation_actual_version(), а привести версию, записанную в БД, в соответствие с версией в ОС позволяет команда ALTER DATABASE ... REFRESH.

  • Возможность использования правила сортировки ICU в качестве основного для кластеров и баз данных (Питер Эйзентраут)

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

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

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

    Эффект этого изменения заметен, только когда затрагивается лишь несколько секций из множества.

  • Возможность упорядоченного сканирования секций, что позволяет избежать сортировки ещё в ряде случаев (Дэвид Роули)

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

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

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

  • Поддержка выполнения CLUSTER в секционированных таблицах (Джастин Призби)

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

    Также теперь не будут переименовываться скопированные триггеры.

E.7.3.1.2. Индексы
  • Обеспечение эффективного хранения дублирующихся значений в индексах btree системных таблиц и TOAST-таблиц (Питер Эйзентраут)

    Ранее в таких индексах исключение дубликатов не работало.

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

  • Обеспечение возможности обрабатывать NULL в уникальных ограничениях и индексах как равные значения (Питер Эйзентраут)

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

  • Поддержка использования оператора ^@ («начинается с») и функции starts_with() в индексах btree с правилом сортировки C (Том Лейн)

    Ранее эти конструкции можно было использовать только в индексах SP-GiST.

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

    В обычной статистике данные только родительской таблицы и консолидированные данные, охватывающие и все дочерние таблицы, хранились отдельно и ранее.

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

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

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

  • Возможность параллельного выполнения SELECT DISTINCT (Дэвид Роули)

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

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

  • Оптимизация производительности операций сортировки, для которых недостаточно объёма work_mem (Хейкки Линнакангас)

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

  • Улучшение производительности операций сортировки в памяти и уменьшение требующегося для них объёма ОЗУ (Ронан Данклау, Дэвид Роули, Томас Манро, Джон Нейлор)

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

    Для выбора алгоритма сжатия предназначен серверный параметр wal_compression.

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

    Этот механизм задействуется, только если max_wal_senders = 0 и wal_level = minimal.

  • Реализация более агрессивного выбора идентификаторов старейшей замороженной транзакции и мультитранзакции в процессе очистки (Питер Эйзентраут)

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

  • Оптимизация выполнения запросов с оконными функциями, где используются row_number(), rank(), dense_rank() и count() (Дэвид Роули)

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

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

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

  • Вывод в журнал сообщений о текущих действиях во время длительного запуска сервера (Нитин Ядав, Роберт Хаас)

    Эти сообщения будут содержать информацию о причине задержки. Интервал этих уведомлений задаётся в новой серверной переменной log_startup_progress_interval.

  • Сохранение данных накопительной статистики в общей памяти (Кётаро Хоригути, Андрес Фройнд, Мелани Плейгман)

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

  • Добавление дополнительной информации в сообщения, выводимые командой VACUUM VERBOSE и процессом автоочистки (Питер Гейган)

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

  • Реализация вывода журнала в формате JSON (Сероп Саркуни, Микаэль Пакье)

    Выбирает такой формат значение log_destination = jsonlog.

  • Добавление в pg_stat_reset_single_table_counters() возможности сбрасывать счётчики для отношений, разделяемых всеми базами данных (Садхупрасад Патро)

  • Добавление событий ожидания для локальных команд оболочки (Фудзии Масао)

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

E.7.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.7.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.7.3.2. Потоковая репликация и восстановление

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

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

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

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

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

  • Возможность архивирования с применением загружаемых модулей (Натан Боссарт)

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

  • Устранение требования выполнять IDENTIFY_SYSTEM перед START_REPLICATION (Джефф Девис)

  • Реализация возможности публиковать все таблицы в схеме (Вигнеш Си, Хоу Чжицзе, Амит Капила)

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

  • Возможность фильтрации содержимого публикации с использованием предложения WHERE (Хоу Чжицзе, Эйлер Тавейра, Питер Смит, Аджин Чериан, Томаш Вондра, Амит Капила)

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

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

  • Добавление конструкции ALTER SUBSCRIPTION ... SKIP, позволяющей пропускать транзакции на стороне подписчика (Масахико Савада)

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

    Новый параметр команды CREATE_REPLICATION_SLOT называется TWO_PHASE. Теперь pg_recvlogical при создании слота принимает новый ключ --two-phase.

  • Предотвращение логической репликации пустых транзакций (Аджин Чериан, Хоу Чжицзе, Эйлер Тавейра)

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

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

    Новые функции: pg_ls_logicalsnapdir(), pg_ls_logicalmapdir() и pg_ls_replslotdir(). Вызывать их разрешено членам предопределённой роли pg_monitor.

  • Предоставление подписчикам возможности остановить применение изменений логической репликации в случае ошибки (Такамити Осуми, Марк Дилгер)

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

  • Приведение серверных переменных на стороне подписчика в соответствие со стороной публикации, чтобы значения даты/времени и типа float8 воспринимались согласованно (Япинь Ли)

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

  • Добавление системного представления pg_stat_subscription_stats с информацией об активности подписчика (Масахико Савада)

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

  • Подавление дублирующихся записей в системном представлении pg_publication_tables (Хоу Чжицзе)

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

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

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

    Эта команда подобна конструкции INSERT ... ON CONFLICT, но больше подходит для массовой обработки данных.

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

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

  • Добавление для команды создания базы нового метода с записью WAL (Дилип Кумар)

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

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

  • Исключение возможных ошибок команд DROP DATABASE, DROP TABLESPACE и ALTER DATABASE SET TABLESPACE при параллельном использовании в Windows (Томас Манро)

  • Возможность изменения только определённых столбцов в связанных с внешними ключами действиях ON DELETE SET(Пол Мартинес)

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

  • Добавление в ALTER TABLE возможности сменить ACCESS METHOD (Джастин Призби, Джефф Девис)

  • Добавление вызова обработчика обращения к объекту в случаях, когда при выполнении ALTER TABLE происходит перезапись таблицы (Микаэль Пакье)

  • Возможность создания нежурналируемых последовательностей (Питер Эйзентраут)

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

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

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

  • Возможность задать для значения numeric масштаб, превышающий точность или отрицательный (Дин Рашид, Том Лейн)

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

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

  • Изменение формата ввода/вывода типа "char" для не ASCII-символов (Том Лейн)

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

    При этом также обновлена версия Unicode с 5.0 до 14.0.0 и разработан автоматический метод синхронизации кода Postgres с новыми версиями Unicode.

E.7.3.5. Функции

  • Добавление поддержки мультидиапазонных значений в функцию range_agg() (Пол Юнгвирт)

  • Реализация агрегатных функций MIN() и MAX() для типа данных xid8 (Кен Като)

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

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

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

  • Добавление в функцию to_char() кодов формата of, tzh и tzm (Нитин Ядав)

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

  • Определение режима летнего времени для выполнения 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.7.3.6. PL/pgSQL

  • Исправление поведения переменных PL/pgSQL с пометкой CONSTANT (Том Лейн)

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

E.7.3.7. libpq

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

  • Возможность узнать у PQsslAttribute() тип библиотеки SSL, не устанавливая соединение libpq (Джейкоб Чемпион)

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

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

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

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

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

E.7.3.8.1. psql
  • Оптимизация производительности команды psql \copy за счёт передачи данных порциями большего размера (Хейкки Линнакангас)

  • Реализация команды \dconfig, показывающей серверные переменные (Марк Дилгер, Том Лейн)

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

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

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

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

    Для этого предназначена переменная окружения PSQL_WATCH_PAGER; поддерживается эта возможность только в Unix.

  • Сохранение комментариев с двумя минусами внутри запросов, которые psql передаёт серверу (Том Лейн, Грег Нанкарроу)

    Ранее такие комментарии удалялись из строки запроса до передачи серверу. Если два минуса стоят в строке перед текстом запроса, такая строка серверу не передаётся и не записывается в историю psql.

  • Связывание с командой Readline Meta+# в psql добавления маркера комментария с двумя минусами (Том Лейн)

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

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

    Ранее выводился результат только последнего запроса. Восстановить предыдущее поведение можно, присвоив переменной psql SHOW_ALL_RESULTS значение off.

  • Замена окончательной команды COMMIT на ROLLBACK в случае возникновения ошибки в режиме --single-transaction только при установленном параметре ON_ERROR_STOP (Микаэль Пакье)

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

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

  • Ограничение поддержки в psql команд с обратной косой чертой для серверов PostgreSQL версий ниже 9.2 (Том Лейн)

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

E.7.3.8.2. pg_dump
  • Обеспечение в pg_dump выгрузки информации о метках безопасности и владельце схемы public (Ной Миш)

  • Увеличение производительности при выгрузке баз данных со множеством объектов (Том Лейн)

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

  • Оптимизация производительности параллельного режима pg_dump при выгрузке таблиц с большими TOAST-отношениями (Том Лейн)

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

  • Прекращение поддержки программами pg_dump и pg_dumpall серверов PostgreSQL версии ниже 9.2 (Том Лейн)

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

  • Добавление в pg_basebackup параметра --target, задающего расположение базовой резервной копии (Роберт Хаас)

    Возможные значения этого параметра: server для сохранения копии на сервере и blackhole для отказа от сохранения копии (в целях тестирования).

  • Реализация в pg_basebackup возможности сжимать файлы базовой копии методами gzip, LZ4 и Zstandard на стороне сервера и методами LZ4 и Zstandard на стороне клиента (Дипеш Пандит, Дживан Ладхе)

    Сжатие методом gzip на стороне клиента поддерживалось ранее.

  • Реализация в pg_basebackup возможности сжимать данные на стороне сервера и сохранять их на стороне клиента в распакованном виде (Дипеш Пандит)

    Теперь вы можете, используя формат вывода plain, запросить сжатие на стороне сервера.

  • Добавление для параметра pg_basebackup --compress возможности выбирать, где производить сжатие (на стороне сервера или клиента), метод сжатия и параметры сжатия (Микаэль Пакье, Роберт Хаас)

  • Поддержка метода сжатия LZ4 в pg_receivewal (Георгиос Коколатос)

    Такое сжатие включается параметром --compress=lz4; при этом исполняемые файлы должны быть собраны с ключом --with-lz4.

  • Расширение возможностей параметра pg_receivewal --compress (Георгиос Коколатос)

  • Улучшение в pg_receivewal выбора позиции перезапуска в WAL (Ронан Данклау)

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

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

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

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

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

    Вывод информации о текущем состоянии на устройства, отличные от tty, можно включить ключом --verbose.

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

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

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

  • Добавление ключа --no-sync для pg_upgrade (Микаэль Пакье)

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

  • Прекращение поддержки программой pg_upgrade серверов PostgreSQL версии ниже 9.2 (Том Лейн)

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

  • Обеспечение в pg_waldump вывода статистики перед завершением работы при прерывании (Бхарат Рупиредди)

    Например, если нажать Ctrl+C в терминале, где работает pg_waldump --stats --follow, перед завершением работы программы будет выведена текущая статистика. В Windows это не работает.

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

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

    Для получения такой информации можно передать параметр --rmgr несколько раз.

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

  • Добавление документации функций pg_encoding_to_char() и pg_char_to_encoding() (Иэн Барвик)

  • Документирование оператора ^@ «начинается с» (Том Лейн)

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

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

  • Добавление параметра configure --with-zstd для сборки с библиотекой Zstandard (Дживан Ладхе, Роберт Хаас, Микаэль Пакье)

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

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

  • Определение нового значения pg_type.typcategory для типа "char" (Том Лейн)

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

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

    Этот метод теперь применяется в pg_basebackup.

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

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

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

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

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

  • Экспортирование всех глобальных серверных переменных в Windows, для чего в их объявления добавлены маркеры PGDLLIMPORT (Роберт Хаас)

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

  • Увеличение минимальной версии GNU make, требующейся для сборки PostgreSQL, до 3.81 (Том Лейн)

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

  • Увеличение минимальной требуемой версии Perl до 5.8.3 (Дагфинн Ильмари Маннсакер)

  • Отказ от поддержки Python версий ниже 3.2 (Андрес Фройнд)

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

  • Добавление в amcheck проверки последовательностей (Марк Дилгер)

  • Улучшение в amcheck проверок корректности таблиц TOAST (Марк Дилгер)

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

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

  • Возможность построения индексов btree_gist по логическим столбцам (Эмре Хасегели)

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

  • Исправление в функции pageinspect page_header() обработки страниц размером 32 Кбайта (Цюань Цзунлян)

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

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

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

  • Добавление нового модуля pg_walinspect (Бхарат Рупиредди)

    Он позволяет получить на уровне SQL примерно ту же информацию, что выдаёт pg_waldump.

  • Отображение в сообщениях sepgsql состояния разрешительного/запретительного режима (Дейв Пейдж)

E.7.3.12.1. postgres_fdw
  • Возможность передачи через postgres_fdw выражений CASE для удалённого выполнения (Александр Пыхалов)

  • Добавление серверной переменной postgres_fdw.application_name, позволяющей установить имя приложения для подключений postgres_fdw (Хайато Курода)

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

  • Возможность параллельной фиксации транзакций на серверах postgres_fdw (Эцуро Фудзита)

    Эта возможность включается параметром parallel_commit команды CREATE SERVER.

E.7.4. Благодарственный список

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

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