E.3. Выпуск 14

Дата выпуска: 2021-09-30

E.3.1. Обзор

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

  • Хранимые процедуры теперь могут возвращать данные через параметры OUT.

  • Реализованы описанные в стандарте SQL параметры SEARCH и CYCLE для общих табличных выражений.

  • Операцию обращения по индексу теперь можно применять не только к массивам, но и к любому типу данных, для которого она имеет смысл. В этом выпуске такие операторы добавлены для типов jsonb и hstore.

  • Диапазонные типы были дополнены мультидиапазонными, позволяющими представлять несплошные диапазоны данных.

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

  • Изменения в индексах-B-деревьях теперь обрабатываются более эффективным методом, уменьшающим замусоривание индексов.

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

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

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

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

E.3.2. Миграция на версию 14

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

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

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

    А именно, функции array_append(), array_prepend(), array_cat(), array_position(), array_positions(), array_remove(), array_replace() и width_bucket() раньше принимали аргументы типа anyarray, а теперь принимают anycompatiblearray. Вследствие этого, пользовательские объекты, такие как операторы и агрегатные функции, использующие старые сигнатуры перечисленных функций, необходимо удалить перед обновлением, а затем создать вновь после завершения обновления.

  • Ликвидированы устаревшие операторы проверки включения @ и ~ для встроенных геометрических типов данных и дополнительных модулей cube, hstore, intarray и seg (Джастин Призби)

    Многие годы рекомендовалось применять вместо них более единообразно названные операторы <@ и @>.

  • Исправление в to_tsquery() и websearch_to_tsquery() разбора текста запроса, содержащего отброшенные фрагменты (Александр Коротков)

    При отбрасывании некоторых фрагментов, например подчёркивания, эти функции выдавали некорректный запрос tsquery; так, результатом вызовов websearch_to_tsquery('"pg_class pg"') и to_tsquery('pg_class <-> pg') был запрос ( 'pg' & 'class' ) <-> 'pg', но теперь эти функции выдают 'pg' <-> 'class' <-> 'pg'.

  • Исправление в websearch_to_tsquery() разбора нескольких идущих подряд отбрасываемых фрагментов в кавычках (Александр Коротков)

    Ранее текст в кавычках, содержащий несколько идущих подряд отбрасываемых фрагментов, воспринимался как отдельные фрагменты, и в результате выдавался некорректный запрос tsquery, например в результате вызова websearch_to_tsquery('"aaa: bbb"') выдавался запрос 'aaa' <2> 'bbb', а теперь выдаётся 'aaa' <-> 'bbb'.

  • Смена типа результата EXTRACT() с float8 на numeric (Питер Эйзентраут)

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

    Кроме того, EXTRACT(date) теперь выдаёт ошибку для единиц времени, не входящих в состав типа данных date.

  • Смена значения, возвращаемого функциями var_samp() и stddev_samp(), при передаче им в аргументе единственного значения NaN, на NULL (Том Лейн)

    Ранее возвращалось значение NaN.

  • При вызове has_column_privilege() в случае указания по номеру атрибута на несуществующий или удалённый столбец теперь возвращается false (Джо Конвей)

    Ранее при передаче таких номеров атрибутов возвращалась ошибка с сообщением о неверном столбце.

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

    Прежде с определениями рамок вида 'inf' PRECEDING AND 'inf' FOLLOWING выдавались неправильные результаты.

  • Ликвидация операторов вычисления факториала ! и !!, а также функции numeric_fac() (Марк Дилгер)

    Функция factorial() по-прежнему поддерживается.

  • Недопущение выполнения функции factorial() с отрицательными аргументами (Питер Эйзентраут)

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

  • Удаление поддержки постфиксных (правых унарных) операторов (Марк Дилгер)

    Утилиты pg_dump и pg_upgrade выдадут предупреждения, встретив такие операторы в обрабатываемой базе.

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

    Ранее в этом режиме данным кодам не сопоставлялись символы конца строки, но это не согласуется с поведением других распространённых процессоров регулярных выражений. Для получения старого поведения можно написать [^[:digit:]] или [^[:word:]].

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

    Например, в выражении (^\d+).*\1 ограничение ^ должно действовать в начале строки, но не при сопоставлении ссылки \1.

  • Запрет использования \w в качестве начала или конца диапазона в классах символов регулярного выражения (Том Лейн)

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

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

  • Изменение значения по умолчанию серверного параметра password_encryption на scram-sha-256 (Питер Эйзентраут)

    Ранее вариантом по умолчанию был md5. Все новые пароли будут сохранены в виде SHA256, если только этот параметр сервера не изменён или пароль не задан непосредственно в виде MD5. Помимо этого, теперь не принимаются устаревшие (не документированные) подобные булевским значения, которые ранее были синонимичны md5.

  • Ликвидация серверного параметра vacuum_cleanup_index_scale_factor (Питер Гейган)

    Этот параметр игнорировался в PostgreSQL, начиная с версии 13.3.

  • Удаление серверного параметра operator_precedence_warning (Том Лейн)

    Этот параметр использовался для уведомления приложений об изменениях, произошедших в PostgreSQL 9.5.

  • Изменение разбора указания clientcert в pg_hba.conf (Кётаро Хоригути)

    Значения 1/0/no-verify для этого параметра более не поддерживаются; принимаются только строки verify-ca и verify-full. Также не допускается значение verify-ca, если включена аутентификация по сертификату, так как она требует проверки verify-full.

  • Ликвидация поддержки сжатия SSL (Даниэль Густафссон, Микаэль Пакье)

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

  • Удаление поддержки второй версии клиент-серверного протокола на стороне сервера и в libpq (Хейкки Линнакангас)

    Последний раз эта версия использовалась по умолчанию в PostgreSQL 7.3 (выпущенном в 2002 г.).

  • Введение запрета на заключение имени языка в апострофы в команде CREATE/DROP LANGUAGE (Питер Эйзентраут)

  • Ликвидация составных типов, которые ранее создавались для последовательностей и TOAST-таблиц (Том Лейн)

  • Исправление обработки в ecpg удвоенных апострофов и кавычек в строках SQL-команд (Том Лейн)

    Ранее строка 'abc''def' передавалась серверу в виде 'abc'def', а "abc""def" — в виде "abc"def", что вызывало ошибки синтаксиса.

  • Недопущение использования индексов GiST операторами включения (<@ и @>) из модуля intarray (Том Лейн)

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

  • Удаление дополнительной программы pg_standby (Джастин Призби)

  • Недопущение обработки отрицательных аргументов функцией normal_rand() модуля tablefunc (Ашутош Бапат)

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

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

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

E.3.3.1. Сервер

  • Добавление предопределённых ролей pg_read_all_data и pg_write_all_data (Стивен Фрост)

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

  • Добавление предопределённой роли pg_database_owner, в которую включается только текущий владелец базы данных (Ной Миш)

    Она особенно полезна в базах-шаблонах.

  • Удаление временных файлов после аварии обслуживающего процесса (Эйлер Тавейра)

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

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

    Проверкой соединения в ходе выполнения запросов управляет серверный параметр client_connection_check_interval. (Эта функциональность поддерживается в Linux и некоторых других операционных системах.)

  • Добавление дополнительного параметра, задающего тайм-аут, функции pg_terminate_backend() (Магнус Хагандер)

  • Реализация размещения широких кортежей в почти пустых страницах кучи (Джон Нейлор, Флорис ван Ни)

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

  • Добавление поля SNI (Server Name Indication, Указания имени сервера) в пакеты SSL-соединений (Питер Эйзентраут)

    Убрать это поле можно, отключив клиентский параметр подключения sslsni.

E.3.3.1.1. Очистка
  • Возможность пропускать очистку индекса, когда число удаляемых из индекса записей незначительно (Масахико Савада, Питер Гейган)

    Параметр очистки INDEX_CLEANUP теперь имеет новое значение по умолчанию, auto, включающее эту оптимизацию.

  • Наделение процедуры очистки способностью более прилежно добавлять удалённые страницы btree в карту свободного места (Питер Гейган)

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

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

  • Увеличение активности процедуры очистки в части ликвидации «мертвых» строк во время обработки индексов с минимальными блокировками (Альваро Эррера)

    А именно, команды CREATE INDEX CONCURRENTLY и REINDEX CONCURRENTLY теперь не препятствуют ликвидации «мёртвых» строк в других отношениях.

  • Ускорение очистки баз, содержащих множество отношений (Тацухито Касахара)

  • Уменьшение значения по умолчанию параметра vacuum_cost_page_miss в соответствии с текущими аппаратными требованиями (Питер Гейган)

  • Добавление возможности пропускать очистку TOAST-таблиц (Натан Боссарт)

    У команды VACUUM появился параметр PROCESS_TOAST, которому можно присвоить false и отключить обработку TOAST, а у программы vacuumdb появился аналогичный параметр --no-process-toast.

  • Обеспечение должного изменения битов видимости страниц при выполнении COPY FREEZE (Анастасия Лубенникова, Паван Деоласи, Джефф Джейнс)

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

    Этим поведением управляют параметры vacuum_failsafe_age и vacuum_multixact_failsafe_age.

  • Увеличение интервала предупреждения и жёсткого ограничения, препятствующего зацикливанию идентификаторов транзакций и мультитранзакций (Ной Миш)

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

  • Добавление информации об отдельных индексах в вывод процедуры автоочистки (Масахико Савада)

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

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

  • Добавление возможности отсоединять секции неблокирующим образом (Альваро Эррера)

    Для этого предусмотрен синтаксис ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY и FINALIZE.

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

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

E.3.3.1.3. Индексы
  • Возможность при добавлении данных в индекс btree удалять ненужные элементы индекса для предотвращения разделения страниц (Питер Гейган)

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

  • Добавление в индексы BRIN возможности записывать несколько минимальных/максимальных значений для каждой зоны (Томаш Вондра)

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

  • Использование фильтров Блума в индексах BRIN (Томаш Вондра)

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

  • Поддержка построения индексов GiST с предварительной сортировкой данных (Андрей Бородин)

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

  • Возможность добавления в индексы SP-GiST неключевых столбцов (INCLUDE) (Павел Борисов)

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

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

  • Увеличение возможностей применения расширенной статистики при анализе предложений OR (Томаш Вондра, Дин Рашид)

  • Поддержка расширенной статистики для выражений (Томаш Вондра)

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

  • Механизм эффективного сканирования диапазона TID в куче (Эдмунд Хорнер, Дэвид Роули)

    Ранее для условий на неравенство TID требовалось последовательное сканирование.

  • Исправление в EXPLAIN CREATE TABLE AS и EXPLAIN CREATE MATERIALIZED VIEW поведения IF NOT EXISTS (Бхарат Рупиредди)

    Ранее в случае существования целевого объекта команда EXPLAIN выдавала ошибку.

E.3.3.1.5. Общая производительность
  • Ускорение вычисления снимков видимости MVCC в многопроцессорных системах при большом количестве сеансов (Андрес Фройнд)

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

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

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

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

  • Увеличение производительности ввода/вывода при последовательном сканировании с использованием параллельных исполнителей (Томас Манро, Дэвид Роули)

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

  • Возможность параллельного сканирования сторонних таблиц при выполнении запроса, обращающегося к нескольким сторонним таблицам (Роберт Хаас, Кётаро Хоригути, Томас Манро, Эцуро Фудзита)

    Обёртка postgres_fdw поддерживает такое сканирование, если установлен параметр async_capable.

  • Возможность выполнения предвыборки страниц во время analyze (Стивен Фрост)

    Этой возможностью управляет параметр maintenance_io_concurrency.

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

  • Кардинальное улучшение производительности при нормализации символов Unicode (Джон Нейлор)

    Тем самым ускорена работа normalize() и IS NORMALIZED.

  • Добавление возможности использовать для данных в TOAST метод сжатия LZ4 (Дилип Кумар)

    Этот метод можно выбрать на уровне столбца или установить его как метод по умолчанию в серверном параметре default_toast_compression. Данная функциональность поддерживается, только если сервер скомпилирован с ключом --with-lz4. По умолчанию по-прежнему выбирается метод pglz.

E.3.3.1.6. Мониторинг
  • При включении серверного параметра compute_query_id для каждого запроса вычисляется идентификатор, который отображается в pg_stat_activity, EXPLAIN VERBOSE и csvlog, а может также вставляться в log_line_prefix (Жюльен Руо)

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

  • Улучшение информационных сообщений процессов автоматической очистки и автоматического анализа (Стивен Фрост, Якуб Вартак)

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

  • Добавление в вывод команды log_connections сведений об имени исходного пользователя, переданном клиентом (Джейкоб Чемпион)

E.3.3.1.7. Системные представления
  • Добавление системного представления pg_stat_progress_copy, отражающего прогресс выполнения COPY (Йозеф Шиманек, Маттиас ван де Меент)

  • Добавление системного представления pg_stat_wal, отражающего активность WAL (Масахиро Икеда)

  • Добавление системного представления pg_stat_replication_slots, отражающего активность слотов репликации (Масахико Савада, Амит Капила, Вигнеш Си)

    Статистику слота сбрасывает функция pg_stat_reset_replication_slot().

  • Добавление системного представления pg_backend_memory_contexts, отражающего использование памяти сеансами (Атсуши Торикоши, Масао Фудзии)

  • Добавление функции pg_log_backend_memory_contexts(), выводящей информацию о контекстах памяти определённого обслуживающего процесса (Атсуши Торикоши)

  • Добавление статистики по сеансам в системное представление pg_stat_database (Лауренц Альбе)

  • Добавление в pg_prepared_statements столбцов со счётчиками общих и специализированных планов (Атсуши Торикоши, Кётаро Хоригути)

  • Добавление времени начала ожидания блокировки в представление pg_locks (Атсуши Торикоши)

  • Отображение процесса архивации в pg_stat_activity (Кётаро Хоригути)

  • Добавление события ожидания WalReceiverExit, отражающего состояние ожидания завершения приёмника WAL (Масао Фудзии)

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

E.3.3.1.8. Аутентификация
  • Возможность использования заданного в SSL-сертификате уникального имени (DN) в качестве имени пользователя при аутентификации по клиентскому сертификату (Эндрю Дунстан)

    Новый вариант clientname=DN в pg_hba.conf позволяет считать исходным именем пользователя не только атрибут CN и может быть полезен в сочетании с сопоставлениями аутентификации.

  • Возможность включения в pg_hba.conf и pg_ident.conf многострочных записей (Фабьен Коэльо)

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

  • Возможность указания каталога со списками отозванных сертификатов (Кётаро Хоригути)

    Указать этот каталог позволяет серверный параметр ssl_crl_dir и параметр подключения libpq sslcrldir. Ранее можно было указать только один файл со списком отозванных сертификатов (CRL).

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

E.3.3.1.9. Конфигурация сервера
  • Добавление серверного параметра idle_session_timeout, позволяющего закрывать простаивающие сеансы (Япинь Ли)

    Он работает подобно idle_in_transaction_session_timeout.

  • Изменение значения checkpoint_completion_target по умолчанию — теперь оно равно 0.9 (Стивен Фрост)

    Ранее оно равнялось 0.5.

  • Возможность указания кода %P в log_line_prefix, обозначающего PID ведущего процесса группы параллельных исполнителей в строках журнала, относящихся к параллельным исполнителям (Джастин Призби)

  • Возможность определения в параметре unix_socket_directories путей в виде отдельных, разделённых запятыми строк в апострофах (Иэн Барвик)

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

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

    Этим управляет параметр min_dynamic_shared_memory. Данная возможность позволяет лучше использовать огромные страницы.

  • Добавление серверного параметра huge_page_size, управляющего размером используемых огромных страниц в Linux (Один Угедал)

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

  • Возможность использования pg_rewind для перематывания состояния резервных серверов (Хейкки Линнакангас)

  • Возможность изменения команды, задаваемой параметром restore_command, при перезагрузке конфигурации сервера (Сергей Корнилов)

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

  • Добавление серверного параметра log_recovery_conflict_waits, позволяющего узнавать о длительном ожидании разрешения конфликтов при восстановлении (Бертран Друво, Масахико Савада)

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

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

  • Добавление функции pg_get_wal_replay_pause_state(), отображающей состояние восстановления (Дилип Кумар)

    Она выдаёт более подробную информацию, чем функция pg_is_wal_replay_paused(), которая тоже сохранена.

  • Добавление нового серверного параметра in_hot_standby, доступного только для чтения (Харибабу Комми, Грег Нанкарроу, Том Лейн)

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

  • Ускорение усечения маленьких таблиц при восстановлении кластеров с большим количеством общих буферов (Кирк Джемисон)

  • Обеспечение в Linux возможности синхронизации файловой системы в начале процесса восстановления после сбоя (Томас Манро)

    По умолчанию PostgreSQL открывает и синхронизирует с ФС каждый файл данных в кластере перед началом восстановления после сбоя. Новый вариант recovery_init_sync_method=syncfs позволяет вместо этого синхронизировать саму файловую систему, используемую кластером, что ускоряет восстановление кластеров с большим количеством файлов.

  • Реализация функции pg_xact_commit_timestamp_origin(), выдающей время фиксации и источник репликации для заданной транзакции (Мувад Ли)

  • Добавление источника репликации в записи, возвращаемые функцией pg_last_committed_xact() (Мувад Ли)

  • Предоставление возможности использования стандартного механизма разрешений для управления доступом к функциям, манипулирующим источниками репликации (Мартин Маркес)

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

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

    Ранее содержимое транзакции объёмом, превышающим logical_decoding_work_mem, записывалось на диск до завершения транзакции.

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

    Имена соответствующих функций-обработчиков начинаются со слова stream. Такой режим также поддерживает расширение test_decoding.

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

  • Немедленное внесение в WAL сопоставления подтранзакции с XID транзакции верхнего уровня (Томаш Вондра, Дилип Кумар, Амит Капила)

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

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

    Соответствующий параметр появился у функции pg_create_logical_replication_slot().

  • Добавление в WAL сообщений аннулирования по завершении команды, когда используется логическая репликация (Дилип Кумар, Томаш Вондра, Амит Капила)

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

  • Реализация для процедуры логического декодирования более эффективной обработки сообщений аннулирования кеша (Дилип Кумар)

    Благодаря этой оптимизации процедура логического декодирования будет лучше справляться с большим объёмом команд DDL.

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

  • Возможность транслирования подписок логической репликации в режиме двоичной передачи данных (Дэйв Крамер)

    Этот режим работает быстрее текстового, но чуть менее устойчив.

  • Возможность фильтрации логического декодирования по xid (Маркус Ваннер)

E.3.3.3. SELECT, INSERT

  • Сокращение числа ключевых слов, которые нельзя использовать в качестве меток столбцов без AS (Марк Дилгер)

    Число недопустимых в этом контексте ключевых слов сокращено на 90%.

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

    Задать псевдоним можно, написав AS после предложения USING. Затем этот псевдоним можно использовать как указание таблицы для объединённых столбцов из USING.

  • Возможность добавления DISTINCT в GROUP BY для устранения повторяющихся сочетаний GROUPING SET (Вик Фиринг)

    Например, конструкция GROUP BY CUBE (a,b), CUBE (b,c) будет выдавать повторяющиеся сочетания группировки без DISTINCT.

  • Исправление обработки указаний DEFAULT при использовании в INSERT списков VALUES, определяющих несколько кортежей (Дин Рашид)

    Ранее в таких случаях выдавалась ошибка.

  • Реализация описанных в стандарте SQL предложений SEARCH и CYCLE для общих табличных выражений (Питер Эйзентраут)

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

  • Добавление возможности указания имени таблицы перед именем столбцов в предложении WHERE конструкции ON CONFLICT (Том Лейн)

    Однако сослаться в таком указании можно только на целевую таблицу.

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

  • Возможность использования распараллеливания при выполнении REFRESH MATERIALIZED VIEW (Бхарат Рупиредди)

  • Возможность смены табличного пространства для нового индекса, создаваемого командой REINDEX (Алексей Кондратов, Микаэль Пакье, Джастин Призби)

    Целевое табличное пространство указывается в предложении TABLESPACE. В reindexdb для использования этой возможности добавлен параметр --tablespace.

  • Возможность обработки командой REINDEX всех дочерних таблиц или индексов секционированного отношения (Джастин Призби, Микаэль Пакье)

  • Избавление команд построения индексов с указанием CONCURRENTLY от необходимости ожидать завершения других операций в режиме CONCURRENTLY (Альваро Эррера)

  • Увеличение производительности COPY FROM в двоичном режиме (Бхарат Рупиредди, Амит Ланготе)

  • Сохранение совместимого со стандартом SQL синтаксиса для определённых в SQL функций, используемых в определениях представлений (Том Лейн)

    Ранее вызовы определённых в стандарте SQL функций, например EXTRACT(), выводились в упрощённом виде. Теперь же в отображаемом определении правила или представления они выводятся в исходном синтаксисе.

  • Добавление соответствующего стандарту SQL предложения GRANTED BY в команды GRANT и REVOKE (Питер Эйзентраут)

  • Добавление указания OR REPLACE в CREATE TRIGGER (Такамити Осуми)

    Оно позволяет заменять уже существующие триггеры.

  • Возможность выполнения TRUNCATE со сторонними таблицами (Кадзутака Ониси, Кохэй КайГай)

    Также теперь эту операцию поддерживает модуль postgres_fdw.

  • Предоставление более удобной возможности добавления и удаления публикаций из подписки (Япинь Ли)

    Для этого предусмотрены новые предложения ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION, не требующие указания всех публикаций при добавлении/удалении элементов.

  • Добавление первичных ключей, ограничений уникальности и внешних ключей в системные каталоги (Питер Эйзентраут)

    Эти изменения призваны облегчить анализ системных каталогов в графических инструментах. С существующими уникальными индексами каталогов теперь связаны ограничения UNIQUE или PRIMARY KEY. Связи по внешнему ключу фактически не хранятся и не реализованы в виде ограничений, но их можно получить для визуального представления, воспользовавшись функцией pg_get_catalog_foreign_keys().

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

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

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

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

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

    Используя операцию обращения по индексу к JSONB, можно извлекать и менять внутреннее содержимое JSONB.

  • Добавление поддержки мультидиапазонных типов данных (Пол Юнгвирт, Александр Коротков)

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

  • Добавление поддержки стемминга для следующих языков: армянский, баскский, каталанский, хинди, идиш и сербский (Питер Эйзентраут)

  • Обеспечение поддержки строк неограниченной длины в файлах данных tsearch (Том Лейн)

    Ранее длина строки ограничивалась 4 килобайтами. Попутно удалена функция t_readline().

  • Добавление поддержки значений Infinity и -Infinity в тип данных numeric (Том Лейн)

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

  • Добавление операторов <<| и |>> для типа point, представляющих проверки «строго выше» и «строго ниже» (Эмре Хасегели)

    Ранее существовали аналогичные операторы с названиями >^ и <^, но это наименование не соответствует принятому для других геометрических типов. Старые названия сохранены, но когда-нибудь могут быть удалены.

  • Добавление операторов для прибавления и вычитания из LSN числовых значений в байтах (Масао Фудзии)

  • Ослабление требования совпадения OID массивов и записей при двоичной передаче данных (Том Лейн)

  • Создание типов-массивов составных элементов для системных каталогов (Вэньцзин Цзэн)

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

E.3.3.6. Функции

  • Возможность определения функций и процедур на языке SQL с телом в виде, соответствующем стандарту SQL (Питер Эйзентраут)

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

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

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

    Функции array_append(), array_prepend(), array_cat(), array_position(), array_positions(), array_remove(), array_replace() и width_bucket() теперь принимают аргументы anycompatiblearray вместо anyarray. Вследствие этого они стали менее щепетильными в случае несовпадения типов аргументов.

  • Реализация описанной в стандарте SQL функции trim_array() (Вик Фиринг)

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

  • Добавление функций, аналогичных ltrim() и rtrim(), для типа bytea (Джоэл Джейкобсон)

  • Поддержка отрицательных индексов в функции split_part() (Никхил Бенеш)

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

  • Добавление функции string_to_table(), разбивающей строковое значение по разделителям (Павел Стехуле)

    Она подобна существовавшей ранее функции regexp_split_to_table().

  • Добавление функции unistr(), обрабатывающей символы Unicode, заданные в строке шестнадцатеричными кодами с обратной косой чертой (Павел Стехуле)

    Подобным образом символы Unicode могут задаваться в строковых константах.

  • Добавление агрегатной функции bit_xor(), вычисляющей ИСКЛЮЧАЮЩЕЕ ИЛИ (Алекей Баштанов)

  • Реализация функции bit_count(), возвращающей количество установленных бит в строке битов или байтов (Давид Феттер)

  • Добавление функции date_bin() (Джон Нейлор)

    Эта функция «подгоняет» дату/время под интервал определённой длительности, отсчитывая от заданного начального момента.

  • Поддержка отрицательного значения года в аргументах функций make_timestamp()/make_timestamptz() (Питер Эйзентраут)

    Отрицательные значения воспринимаются как годы до нашей эры.

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

    В стандарте SQL описан новый синтаксис SUBSTRING(text SIMILAR pattern ESCAPE escapechar) вместо предыдущего SUBSTRING(text FROM pattern FOR escapechar), который остаётся допустимым в PostgreSQL.

  • Поддержка дополнительных спецкодов \D, \S и \W, задающих классы символов, в квадратных скобках внутри регулярных выражений (Том Лейн)

  • Добавление варианта [[:word:]], равнозначного \w, в качестве класса символов в регулярных выражениях (Том Лейн)

  • Увеличение гибкости в выборе типа параметра, задающего значение по умолчанию, для оконных функций lead() и lag() (Вик Фиринг)

  • Принятие нулевого значения результатом деления чисел с плавающей точкой на бесконечность (Кётаро Хоригути)

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

  • Принятие значения NaN результатом деления числа с плавающей точкой на NaN (Том Лейн)

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

  • Принятие нулевого значения результатом функций exp() и power() со степенью, равной минус бесконечности (Том Лейн)

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

  • Улучшение точности геометрических вычислений, в которых фигурирует бесконечность (Том Лейн)

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

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

  • Изменение поведения функций pg_describe_object(), pg_identify_object() и pg_identify_object_as_address(), чтобы они всегда выдавали полезные сообщения об ошибках в случае отсутствия объектов (Микаэль Пакье)

E.3.3.7. PL/pgSQL

  • Улучшение разбора выражений и присваиваний в PL/pgSQL (Том Лейн)

    Благодаря этому изменению стало возможным присваивание значений срезам массивов и полям вложенных записей.

  • Возможность параллельного выполнения запроса, заданного в команде RETURN QUERY языка plgpsql (Том Лейн)

  • Увеличение производительности повторяющихся команд CALL в процедурах на языке plpgsql (Павел Стехуле, Том Лейн)

E.3.3.8. Клиентские интерфейсы

  • Реализация конвейерного режима в libpq (Крейг Рингер, Матье Гарриг, Альваро Эррера)

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

  • Расширение функциональности параметра libpq target_session_attrs (Харибабу Комми, Грег Нанкарроу, Вигнеш Си, Том Лейн)

    У него появились новые значения read-only, primary, standby и prefer-standby.

  • Улучшение формата вывода функции libpq PQtrace() (Ая Ивата, Альваро Эррера)

  • Возможность привязывания идентификатора ECPG SQL к определённому подключению (Хайато Курода)

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

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

  • Добавление в vacuumdb возможности пропускать очистку индекса и отсечение пустых страниц (Натан Боссарт)

    Для отключения этих операций добавлены параметры --no-index-cleanup и --no-truncate.

  • Обеспечение в pg_dump возможности выгрузки только определённых расширений (Гийом Леларж)

    Выбрать расширение позволяет параметр --extension.

  • Добавление в pgbench функции permute(), перемешивающей значения случайным образом (Фабьен Коэльо, Хиронобу Судзуки, Дин Рашид)

  • Принятие в расчёт времени отключения при вычислении длительности переподключений, измеряемой при запуске pgbench с ключом -C (Юго Нагата)

  • Возможность увеличения уровня детализации сообщений при добавлении дополнительных ключей -v (Том Лейн)

    Это поведение поддерживается программами pg_dump, pg_dumpall и pg_restore.

E.3.3.9.1. psql
  • Возможность указания в командах psql \df и \do типов аргументов для функций и операторов (Грег Сабино Маллейн, Том Лейн)

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

  • Добавление в вывод команды psql \d[i|m|t]+ столбца, показывающего метод доступа (Георгиос Коколатос)

  • Дополнение вывода команд psql \dt и \di информацией о TOAST-таблицах и их индексах (Джастин Призби)

  • Добавление в psql команды \dX, показывающей объекты расширенной статистики (Тацуро Ямада)

  • Наделение команды psql \dT способностью понимать синтаксис массивов и принятые на стороне сервера грамматические синонимы, например воспринимать int как integer (Грег Сабино Маллейн, Том Лейн)

  • Отбрасывание содержимого предыдущего запроса или файла, который открывался в редакторе, вызванном командами psql \e, \ef и \ev, в случае выхода из редактора без сохранения (Лауренц Альбе)

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

  • Улучшение механизма дополнения табуляцией (Вигнеш Си, Микаэль Пакье, Джастин Призби, Георгиос Коколатос, Жюльен Руо)

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

  • Добавление утилиты командной строки pg_amcheck, упрощающей проведение проверок contrib/amcheck при большом количестве отношений (Марк Дилгер)

  • Добавление ключа --no-instructions для программы initdb (Магнус Хагандер)

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

  • Отказ от создания скрипта analyze_new_cluster программой pg_upgrade (Магнус Хагандер)

    Вместо этого теперь будут выводиться заменяющие его инструкции по запуску vacuumdb.

  • Ликвидация ключа postmaster -o (Магнус Хагандер)

    Этот ключ стал ненужным, так как все передаваемые посредством его параметры уже можно передавать напрямую.

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

  • Переименование сущности «Default Roles» (Роли по умолчанию) в «Predefined Roles» (Предопределённые роли) в английском оригинале (Брюс Момджян, Стивен Фрост)

  • Добавление описания функции factorial() (Питер Эйзентраут)

    После удаления оператора !, которое состоялось в этом выпуске, функция factorial() является единственным встроенным средством вычисления факториала.

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

  • Добавление параметра configure --with-ssl={openssl} для предоставления в будущем возможности выбрать используемую библиотеку SSL (Даниэль Густафссон, Микаэль Пакье)

    Старый вариант --with-openssl оставлен для совместимости.

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

    В настоящее время эта поддержка обеспечивается в Linux и Windows.

  • Обеспечение корректной работы с файлами больше 4 гигабайт в Windows (Хуан Хосе Сантамария Флеча)

    Например, теперь с файлами больше 4 ГБ может работать COPY, также поддерживаются файлы сегментов отношений и файлы WAL такого размера.

  • Добавление серверного параметра debug_discard_caches, включающего режим сброса кеша, что бывает полезно при тестировании (Крейг Рингер)

    Ранее этим поведением можно было управлять только на этапе компиляции. Для включения этого режима во время работы initdb, у этой программы появился ключ --discard-caches.

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

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

  • Обеспечение поддержки LLVM версии 12 (Andres Freund)

  • Переход от низкоуровневых функций для вычисления хешей SHA1, SHA2 и MD5 к EVP API библиотеки OpenSSL (Микаэль Пакье)

    Этот интерфейс более современный и поддерживает режим FIPS.

  • Отказ от отдельного выбора генератора случайных чисел на этапе сборки (Даниэль Густафссон)

    Теперь этот выбор связан с выбором библиотеки SSL.

  • Добавление процедур прямого преобразования символов из кодировки EUC_TW в Big5 и обратно (Хейкки Линнакангас)

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

  • Добавление функции amadjustmembers в API индексных методов доступа (Том Лейн)

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

  • Добавление в libpq-fe.h макросов для проверки наличия в libpq недавно появившейся функциональности (Том Лейн, Альваро Эррера)

    Ранее наличие нужной приложениям функциональности было принято определять во время компиляции, анализируя PG_VERSION_NUM. Но это прежде всего версия сервера, она может быть не очень хорошим признаком версии libpq. Теперь в libpq-fe.h добавлены символы #define, обозначающие видимую приложениям функциональность, появившуюся в 14 версии; подобные символы планируется добавлять и в дальнейшем.

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

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

  • Возможность использования в pg_trgm индексов GiST/GIN при поиске по условию равенства (Жюльен Руо)

    Такое условие обрабатывается подобно LIKE, но без учёта знаков подстановки.

  • Возможность передачи значений типа cube в двоичном режиме (КайГай Кохэй)

  • Реализация в pgstattuple_approx() возможности обработки TOAST-таблиц (Питер Эйзентраут)

  • Добавление дополнительного модуля pg_surgery, позволяющего изменять видимость строк путём хирургического вмешательства (Ашутош Шарма)

    Это полезный инструмент для извлечения данных из повреждённых баз.

  • Добавление дополнительного модуля old_snapshot, выдающего сопоставление XID/время, которое используется функциональностью old_snapshot_threshold (Роберт Хаас)

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

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

  • Реализация в pageinspect возможности рассмотрения GiST-индексов (Андрей Бородин, Хейкки Линнакангас)

  • Смена в pageinspect типа значений, задающих номера блоков, на bigint (Питер Эйзентраут)

  • Признание функций btree_gist допускающими распараллеливание и присвоение им метки parallel safe (Стивен Винфилд)

E.3.3.13.1. pg_stat_statements
  • Перенос вычисления хеша запроса из pg_stat_statements в ядро сервера (Жюльен Руо)

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

  • Разделение отслеживаемых pg_stat_statements операторов на операторы верхнего уровня и вложенные (Жюльен Руо)

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

  • Добавление в pg_stat_statements счётчика обработанных строк для служебных команд (Масао Фудзии, Юта Кацураги, Юки Сэйно)

  • Добавление системного представления pg_stat_statements_info для отслеживания активности pg_stat_statements (Юта Кацураги, Юки Сэйно, Naoki Nakamichi)

E.3.3.13.2. postgres_fdw
  • Добавление в postgres_fdw возможности вставлять сразу несколько строк (Такаюки Цунакава, Томаш Вондра, Амит Ланготе)

  • Реализация в postgres_fdw возможности импорта отдельных секций таблицы, определяемых командой IMPORT FOREIGN SCHEMA ... LIMIT TO (Маттиас ван де Меент)

    По умолчанию импортируется только корневая секционированная таблица.

  • Добавление в postgres_fdw функции postgres_fdw_get_connections(), выдающей список открытых соединений со сторонними серверами (Бхарат Рупиредди)

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

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

  • Реализация восстановления подключения postgres_fdw к стороннему серверу при необходимости (Бхарат Рупиредди)

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

  • Добавление в postgres_fdw функций для отключения существующих соединений (Bharath Rupireddy)

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

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

Абхиджит Менон-Сен (Abhijit Menon-Sen)
Адам Балог (Ádám Balogh)
Аджин Чериан (Ajin Cherian)
Адриан Хо (Adrian Ho)
Айзек Морленд (Isaac Morland)
Александр Алексеев (Aleksander Alekseev)
Александр Кожемякин (Alex Kozhemyakin)
Александр Коротков (Alexander Korotkov)
Александр Лахин (Alexander Lakhin)
Александр Навратил (Alexander Nawratil)
Александр Пыхалов (Alexander Pyhalov)
Александра Ван (Alexandra Wang)
Алексей Баштанов (Alexey Bashtanov)
Алексей Булгаков (Alexey Bulgakov)
Алексей Кондратов (Alexey Kondratov)
Алессандро Герарди (Alessandro Gherardi)
Альваро Эррера (Álvaro Herrera)
Амит Капила (Amit Kapila)
Амит Ланготе (Amit Langote)
Амит Хандекар (Amit Khandekar)
Амул Сул (Amul Sul)
Анастасия Лубенникова (Anastasia Lubennikova)
Андреас Викт (Andreas Wicht)
Андреас Гроб (Andreas Grob)
Андреас Зельтенрейх (Andreas Seltenreich)
Андреас Кречмер (Andreas Kretschmer)
Андрей Билле (Andrew Bille)
Андрей Бородин (Andrey Borodin)
Андрей Лепихов (Andrey Lepikhov)
Андрес Фройнд (Andres Freund)
Антон Волошин (Anton Voloshin)
Антонин Хоуска (Antonin Houska)
Арне Роланд (Arne Roland)
Арсений Шер (Arseny Sher)
Артур Закиров (Artur Zakirov)
Артур Насименту (Arthur Nascimento)
Асим Правин (Asim Praveen)
Асиф Рехман (Asif Rehman)
Атсуши Торикоши (Atsushi Torikoshi)
Ахсан Хади (Ahsan Hadi)
Ашвин Агравал (Ashwin Agrawal)
Ашутош Бапат (Ashutosh Bapat)
Ашутош Шарма (Ashutosh Sharma)
Ая Ивата (Aya Iwata)
Барри Педерсон (Barry Pederson)
Бас Пот (Bas Poot)
Бауржан Сахариев (Bauyrzhan Sakhariyev)
Бенуа Лобро (Benoît Lobréau)
Бернд Хелмле (Bernd Helmle)
Бернхард М. Видеманн (Bernhard M. Wiedemann)
Бертран Друво (Bertrand Drouvot)
Бина Эмерсон (Beena Emerson)
Борис Колпаков (Boris Kolpackov)
Брайан Йе (Brian Ye)
Брар Пининг (Brar Piening)
Брин Ллевеллин (Bryn Llewellyn)
Брюс Момджян (Bruce Momjian)
Бхарат Рупиредди (Bharath Rupireddy)
Вайшнави Прабакаран (Vaishnavi Prabakaran)
Валантен Гасьен-Барон (Valentin Gatien-Baron)
Ван Шеньхао (Wang Shenhao)
Вигнеш Си (Vignesh C)
Вик Фиринг (Vik Fearing)
Виктор Вагнер (Victor Wagner)
Виктор Егоров (Victor Yegorov)
Виталий Устинов (Vitaly Ustinov)
Владимир Ситников (Vladimir Sitnikov)
Вольфганг Вальтер (Wolfgang Walther)
Вэй Ван (Wei Wang)
Вэньцзин Цзэн (Wenjing Zeng)
Вячеслав Шаблистый (Vyacheslav Shablistyy)
Гай Бёрджесс (Guy Burgess)
Гайрен Хау (Guyren Howe)
Георгиос Коколатос (Georgios Kokolatos)
Гийом Леларж (Guillaume Lelarge)
Грег Нанкарроу (Greg Nancarrow)
Грег Рыхлевски (Greg Rychlewski)
Грег Сабино Маллейн (Greg Sabino Mullane)
Грегори Смит (Gregory Smith)
Григорий Смолкин (Grigory Smolkin)
Давид Гайер (David Geier)
Давид Туронь (David Turon)
Давид Феттер (David Fetter)
Дагфинн Ильмари Маннсакер (Dagfinn Ilmari Mannsåker)
Дайан Фей (Dian Fay)
Дана Бёрд (Dana Burd)
Даниель Вестерман (Daniel Westermann)
Даниил Черний (Daniel Cherniy)
Даниэле Вараццо (Daniele Varrazzo)
Даниэль Верите (Daniel Vérité)
Даниэль Густафссон (Daniel Gustafsson)
Данкан Сэндс (Duncan Sands)
Дар Альатар-Йемен (Dar Alathar-Yemen)
Дейв Крамер (Dave Cramer)
Денис Патрон (Denis Patron)
Джастин Призби (Justin Pryzby)
Джейкоб Чемпион (Jacob Champion)
Джеймс Информ (James Inform)
Джеймс Коулман (James Coleman)
Джеймс Хантер (James Hunter)
Джеймс Хиллиард (James Hilliard)
Джейсен Беттс (Jasen Betts)
Джейсон Ким (Jason Kim)
Джейсон Харви (Jason Harvey)
Джереми Смит (Jeremy Smith)
Джереми Финцель (Jeremy Finzel)
Джереми Эванс (Jeremy Evans)
Джесси Кинкед (Jesse Kinkead)
Джесси Чжан (Jesse Zhang)
Джефф Девис (Jeff Davis)
Джефф Джейнс (Jeff Janes)
Джи Чжан (Jie Zhang)
Дживан Ладхе (Jeevan Ladhe)
Джим Доти (Jim Doty)
Джим Нэсби (Jim Nasby)
Джимми Анджелакос (Jimmy Angelakos)
Джимми Йи (Jimmy Yih)
Джо Конвей (Joe Conway)
Джон Нейлор (John Naylor)
Джон Томпсон (John Thompson)
Джонатан С Кац (Jonathan S. Katz)
Джош Беркус (Josh Berkus)
Джоэл Джейкобсон (Joel Jacobson)
Дилип Кумар (Dilip Kumar)
Димитри Нюшелер (Dimitri Nüscheler)
Дин Рашид (Dean Rasheed)
Дмитрий Долгов (Dmitry Dolgov)
Дмитрий Кузьмин (Dmitriy Kuzmin)
Дмитрий Маракасов (Dmitry Marakasov)
Домагой Смолянович (Domagoj Smoljanovic)
Дон Ук (Dong Wook)
Дорофей Пролесковский (Darafei Praliaskouski)
Дуглас Дул (Douglas Doole)
Дэвид Гилман (David Gilman)
Дэвид Дж. Джонстон (David G. Johnston)
Дэвид Кристенсен (David Christensen)
Дэвид Пиротт (David Pirotte)
Дэвид Роули (David Rowley)
Дэвид Стил (David Steele)
Дэвид Чжан (David Zhang)
Евгений Коньков (Eugen Konkov)
Егор Рогов (Egor Rogov)
Екатерина Кирьянова (Ekaterina Kiryanova)
Елена Индрупская (Elena Indrupskaya)
Жолт Эро (Zsolt Ero)
Жюльен Руо (Julien Rouhaud)
Зигрид Эренрейх (Sigrid Ehrenreich)
Ибрар Ахмед (Ibrar Ahmed)
Израэл Барт (Israel Barth)
Ильдус Курбангалиев (Ildus Kurbangaliev)
Иржи Фейфар (Jiri Fejfar)
Итамар Гафни (Itamar Gafni)
Иэн Барвик (Ian Barwick)
Йелте Феннема (Jelte Fennema)
Йозеф Нахмиас (Joseph Nahmias)
Йозеф Шиманек (Josef Šimánek)
Йоран Хелинг (Yoran Heling)
Кадзутака Ониси (Kazutaka Onishi)
Кайл Кингсбери (Kyle Kingsbury)
Кевин Йип (Kevin Yeap)
Кевин Свит (Kevin Sweet)
Келли Минь (Kelly Min)
Кирк Джемисон (Kirk Jamison)
Константин Книжник (Konstantin Knizhnik)
Кори Хинкер (Corey Huinker)
Кота Миякэ (Kota Miyake)
Кохэй КайГай (Kohei KaiGai)
Крейг Рингер (Craig Ringer)
Крис Вилсон (Chris Wilson)
Кристиан Квест (Christian Quest)
Кристоф Берг (Christoph Berg)
Кристоф Куртуа (Christophe Courtois)
Кунтал Гхош (Kuntal Ghosh)
Кшиштоф Градек (Krzysztof Gradek)
Кэйсукэ Курода (Keisuke Kuroda)
Кэмерон Дэниел (Cameron Daniel)
Кэнсукэ Окамура (Kensuke Okamura)
Кётаро Хоригути (Kyotaro Horiguchi)
Лауренц Альбе (Laurenz Albe)
Ли Дон Ук (Lee Dong Wook)
Ли Япинь (Li Japin)
Лоран Хассон (Laurent Hasson)
Луис Роберто (Luis Roberto)
Лукас Эдер (Lukas Eder)
Лю Хуайлин (Liu Huailing)
Людовик Кути (Ludovic Kuty)
Люк Фламинг (Luc Vlaming)
Ма Лянчжу (Ma Liangzhu)
Магнус Хагандер (Magnus Hagander)
Мадан Кумар (Madan Kumar)
Майкл Браун (Michael Brown)
Майкл Вастола (Michael Vastola)
Майкл Пауэрс (Michael Powers)
Максим Милютин (Maksim Milyutin)
Максим Орлов (Maxim Orlov)
Марек Шуба (Marek Szuba)
Марина Полякова (Marina Polyakova)
Марио Эмменлауэр (Mario Emmenlauer)
Марк Бурен (Marc Boeren)
Марк Вон (Mark Wong)
Марк Дилгер (Mark Dilger)
Марк Жао (Mark Zhao)
Марко Атзери (Marco Atzeri)
Маркус Ваннер (Markus Wanner)
Мартин Виссер (Martin Visser)
Мартин Маркес (Martín Marqués)
Марцин Крупович (Marcin Krupowicz)
Масао Фудзии (Masao Fujii)
Масахико Савада (Masahiko Sawada)
Масахиро Икеда (Masahiro Ikeda)
Матис Рудольф (Mathis Rudolf)
Маттейс ван дер Влётен (Matthijs van der Vleuten)
Маттиас ван де Меент (Matthias van de Meent)
Матье Гарриг (Matthieu Garrigues)
Махендра Сингх Талор (Mahendra Singh Thalor)
Мачик Сакрейда (Maciek Sakrejda)
Мелани Плейгман (Melanie Plageman)
Мерлин Монкьюр (Merlin Moncure)
Микаэль Густавссон (Mikael Gustavsson)
Микаэль Пакье (Michael Paquier)
Михаил Николаев (Michail Nikolaev)
Михаль Альбрехт (Michal Albrycht)
Михаэль Банк (Michael Banck)
Михаэль Мескес (Michael Meskes)
Мишель Поль Киллиан (Michael Paul Killian)
Мувад Ли (Movead Li)
Мухаммед Усама (Muhammad Usama)
Нагарадж Радж (Nagaraj Raj)
Назлы Уур Кёйлюоглу (Nazli Ugur Koyluoglu)
Наоки Накамити (Naoki Nakamichi)
Натан Боссарт (Nathan Bossart)
Натан Лонг (Nathan Long)
Нейл Чен (Neil Chen)
Неха Шарма (Neha Sharma)
Ник Клитон (Nick Cleaton)
Никита Глухов (Nikita Glukhov)
Никита Конев (Nikita Konev)
Нико Вильямс (Nico Williams)
Николай Беркофф (Nikolai Berkoff)
Николай Самохвалов (Nikolay Samokhvalov)
Николай Шаплов (Nikolay Shaplov)
Никхил Бенеш (Nikhil Benesch)
Никхил Сонтакке (Nikhil Sontakke)
Нитин Ядав (Nitin Jadhav)
Ной Миш (Noah Misch)
Нориёси Синода (Noriyoshi Shinoda)
Один Угедал (Odin Ugedal)
Олег Бартунов (Oleg Bartunov)
Олег Самойлов (Oleg Samoilov)
Ондер Каладжи (Önder Kalaci)
Паван Деоласи (Pavan Deolasee)
Павел Боев (Pavel Boev)
Павел Борисов (Pavel Borisov)
Павел Лузанов (Pavel Luzanov)
Павел Сиваш (Paul Sivash)
Павел Стехуле (Pavel Stehule)
Паскаль Легран (Pascal Legrand)
Пауль Фёрстер (Paul Förster)
Петр Желинек (Petr Jelínek)
Питер Вандивье (Peter Vandivier)
Питер Гейган (Peter Geoghegan)
Питер Смит (Peter Smith)
Питер Эйзентраут (Peter Eisentraut)
Пол Гуо (Paul Guo)
Пол Мартинес (Paul Martinez)
Пол Юнгвирт (Paul Jungwirth)
Прабхат Саху (Prabhat Sahu)
Пьер Жиро (Pierre Giraud)
Пэнчэн Лю (Pengcheng Liu)
Пётр Фёдоров (Petr Fedorov)
Раджкумар Рагхуванши (Rajkumar Raghuwanshi)
Райан Ламберт (Ryan Lambert)
Ранье Вилела (Ranier Vilela)
Рафи Шамим (Rafi Shamim)
Рахила Сьед (Rahila Syed)
Регина Обе (Regina Obe)
Реми Лапейр (Rémi Lapeyre)
Роберт Гранж (Robert Grange)
Роберт Калерт (Robert Kahlert)
Роберт Сосински (Robert Sosinski)
Роберт Трит (Robert Treat)
Роберт Фоджа (Robert Foggia)
Роберт Хаас (Robert Haas)
Робин Абби (Robin Abbi)
Робинс Таракан (Robins Tharakan)
Роджер Мейсон (Roger Mason)
Роман Жарков (Roman Zharkov)
Рон Л. Джонсон (Ron L. Johnson)
Ронан Данклау (Ronan Dunklau)
Рохит Бхогате (Rohit Bhogate)
Рё Мацумура (Ryo Matsumura)
Саид Хубайшан (Saeed Hubaishan)
Саит Талха Нишанджы (Sait Talha Nisanci)
Саймон Риггс (Simon Riggs)
Сандро Мани (Sandro Mani)
Сантош Удупи (Santosh Udupi)
Свен Клемм (Sven Klemm)
Сергей Берников (Sergey Bernikov)
Сергей Зубковский (Sergey Zubkovsky)
Сергей Копосов (Sergey Koposov)
Сергей Корнилов (Sergei Kornilov)
Сергей Черкашин (Sergey Cherkashin)
Сергей Шиндерук (Sergey Shinderuk)
Сероп Саркуни (Sehrope Sarkuni)
Симон Норрис (Simon Norris)
Синъя Като (Shinya Kato)
Синъя Окано (Shinya Okano)
Скотт Райб (Scott Ribe)
Соумйадип Чакраборти (Soumyadeep Chakraborty)
Софоклис Папасофокли (Sofoklis Papasofokli)
Стас Кельвич (Stas Kelvich)
Стефан Лорек (Stéphane Lorek)
Стивен Винфилд (Steven Winfield)
Стивен Фрост (Stephen Frost)
Сурадж Хараге (Suraj Kharage)
Сурафел Темесген (Surafel Temesgen)
Такамити Осуми (Takamichi Osumi)
Такаси Мэндзё (Takashi Menjo)
Такаюки Цунакава (Takayuki Tsunakawa)
Тан Хайин (Tang Haiying)
Тацуо Исии (Tatsuo Ishii)
Тацуро Ямада (Tatsuro Yamada)
Тацухито Касахара (Tatsuhito Kasahara)
Тейс ван Дам (Tijs van Dam)
Теодор-Арсений Ларионов-Тришкин (Theodor Arsenij Larionov-Trichkin)
Том Вейлбриф (Tom Vijlbrief)
Том Готтфрид (Tom Gottfried)
Том Лейн (Tom Lane)
Том Эллис (Tom Ellis)
Томас Бартон (Tomas Barton)
Томас Келлерер (Thomas Kellerer)
Томас Манро (Thomas Munro)
Томас Тренц (Thomas Trenz)
Томаш Вондра (Tomas Vondra)
Томохиро Хирамицу (Tomohiro Hiramitsu)
Тони Ре (Tony Reix)
Уэллс Оливер (Wells Oliver)
Фабрицио де Ройес Мелло (Fabrízio de Royes Mello)
Фабьен Коэльо (Fabien Coelho)
Федерико Казелли (Federico Caselli)
Феликс Лехнер (Felix Lechner)
Фил Крылов (Phil Krylov)
Филипп Бодуэн (Philippe Beaudoin)
Филипп Господинов (Filip Gospodinov)
Филипп Грамцов (Philipp Gramzow)
Филипп Менке (Phillip Menke)
Флорис Ван Ни (Floris Van Nee)
Франк Ганьепен (Frank Gagnepain)
Фриц Ялвинг (Frits Jalvingh)
Хайато Курода (Hayato Kuroda)
Хайин Тан (Haiying Tang)
Хайме Казанова (Jaime Casanova)
Хайме Солер (Jaime Soler)
Хамид Ахтар (Hamid Akhtar)
Ханс Бушман (Hans Buschmann)
Хао Ву (Hao Wu)
Харибабу Комми (Haribabu Kommi)
Харисаи Хари (Harisai Hari)
Хейкки Линнакангас (Heikki Linnakangas)
Хенри Хинце (Henry Hinze)
Хервиг Геманс (Herwig Goemans)
Химаншу Упадхьяя (Himanshu Upadhyaya)
Хиронобу Судзуки (Hironobu Suzuki)
Хироси Иноуэ (Hiroshi Inoue)
Хисанори Кобаяси (Hisanori Kobayashi)
Хит Лорд (Heath Lord)
Хонза Хорак (Honza Horak)
Хоу Чжицзе (Hou Zhijie)
Хуан Хосе Сантамария Флеча (Juan José Santamaría Flecha)
Хуберт Любачевски (Hubert Lubaczewski)
Хуберт Чжан (Hubert Zhang)
Цзюньфэн Ян (Junfeng Yang)
Цюань Цзунлян (Quan Zongliang)
Чарли Хорнсби (Charlie Hornsby)
Чарльз Самборски (Charles Samborski)
Чен Цзяоцянь (Chen Jiaoqian)
Чепмен Флэк (Chapman Flack)
Чжихун Юй (Zhihong Yu)
Чжиюн Ву (Zhiyong Wu)
Ши Юй (Shi Yu)
Шон Ван (Shawn Wang)
Штефан Шпрингль (Stephan Springl)
Шэй Роджански (Shay Rojansky)
Эдмунд Хорнер (Edmund Horner)
Эдсон Рихтер (Edson Richter)
Эйлер Тавейра (Euler Taveira)
Эмил Иггланд (Emil Iggland)
Эмре Хасегели (Emre Hasegeli)
Энди Фан (Andy Fan)
Эндрю Гирт (Andrew Gierth)
Эндрю Дунстан (Andrew Dunstan)
Эрвин Брандштеттер (Erwin Brandstetter)
Эрик Рижкерс (Erik Rijkers)
Эрик Тиннес (Eric Thinnes)
Этьен Сталманс (Etienne Stalmans)
Эцуро Фудзита (Etsuro Fujita)
Юго Нагата (Yugo Nagata)
Юзуко Хосоя (Yuzuko Hosoya)
Юйкунь Ван (Yukun Wang)
Юки Сэйно (Yuki Seino)
Юлинь Пей (Yulin Pei)
Юрген Пуртц (Jürgen Purtz)
Юрий Соколов (Yura Sokolov)
Юта Кацураги (Yuta Katsuragi)
Юта Кондо (Yuta Kondo)
Якуб Вартак (Jakub Wartak)
Ян Линь (Yang Lin)
Ян Мусслер (Jan Mussler)
ЯнгХван Чу (YoungHwan Joo)
Яньлян Лэй (Yanliang Lei)
Яогуан Чэнь (Yaoguang Chen)
Япинь Ли (Japin Li)
Ярослав Пашинский (Yaroslav Pashinsky)
Ярослав Щёкин (Yaroslav Schekin)
Ясуси Ямасита (Yasushi Yamashita)