E.13. Выпуск 11

Дата выпуска: 2018-10-18

E.13.1. Обзор

В число ключевых усовершенствований PostgreSQL 11 входят:

  • Усовершенствования, связанные с секционированием:

    • Реализована поддержка секционирования по хешу

    • Реализована поддержка ключей PRIMARY KEY, FOREIGN KEY, индексов и триггеров в секционированных таблицах

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

    • При изменении операторами UPDATE значений ключа разбиения в строках секционированной таблицы эти строки теперь будут переноситься в соответствующие секции

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

  • Усовершенствования, связанные с распараллеливанием:

    • Команда CREATE INDEX теперь может строить индекс-B-дерево параллельно

    • Стало возможным параллельное выполнение CREATE TABLE .. AS, CREATE MATERIALIZED VIEW и некоторых запросов с UNION

    • Распараллеливаемые соединения по хешу и распараллеливаемые последовательные сканирования теперь выполняются эффективнее

  • Хранимые процедуры на SQL, поддерживающие внутренние транзакции

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

  • Оконные функции теперь поддерживают все варианты описания рамки, определённые в стандарте SQL:2011, включая RANGE смещение PRECEDING/FOLLOWING, режим GROUPS и рамки с исключением

  • Возможность создания покрывающих индексов, которые определяются предложением INCLUDE команды CREATE INDEX

  • Много других улучшений, увеличивающих производительность, в частности возможность избежать перезаписи таблицы при выполнении ALTER TABLE .. ADD COLUMN с отличным от NULL значением по умолчанию

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

E.13.2. Миграция на версию 11

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

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

  • pg_dump теперь выгружает и свойства базы данных, а не только её содержимое (Харибабу Комми)

    Ранее такие атрибуты базы данных, как разрешения GRANT/REVOKE уровня базы данных и назначения переменных ALTER DATABASE SET, выгружались только утилитой pg_dumpall. Теперь при выполнении pg_dump --create и pg_restore --create в дополнение к объектам базы будут восстанавливаться и такие её свойства. При этом pg_dumpall -g будет выводить только атрибуты, связанные с ролями и табличными пространствами. Содержимое полного вывода pg_dumpall (без -g) не изменилось.

    Команды pg_dump и pg_restore без ключа --create теперь не выгружают/не восстанавливают комментарии на уровне базы и метки безопасности; эти атрибуты теперь считаются свойствами базы данных.

    При восстановлении вывода pg_dumpall теперь базы данных всегда должны восстанавливаться с исходными локалями и кодировками, и поэтому, если локаль или кодировка окажется неизвестной в целевой системе, произойдёт ошибка. Ранее команда CREATE DATABASE выдавалась без таких указаний, если локаль и кодировка базы данных не отличались от установленных по умолчанию в старом кластере.

    pg_dumpall --clean теперь позволяет восстановить исходные параметры локали и кодировки для баз данных postgres и template1, а не только для баз, создаваемых пользователями.

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

    В предположении, что x — имя таблицы или составного столбца, PostgreSQL традиционно считал синтаксические формы f(x) и x.f равнозначными. Это позволяло использовать такие приёмы, как вызов специально написанной функции в виде обращения к вычисляемому столбцу. Однако в случаях, допускающих оба прочтения, ранее всегда выбиралось прочтение столбца, что приводило к неожиданным результатам, когда пользователь намеревался именно вызвать функцию. Теперь в случае подобной неоднозначности прочтение выбирается в зависимости от синтаксической формы.

  • Строгое требование уникальности для имён ограничений таблиц и доменов (Том Лейн)

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

  • Обработка в функциях power(numeric, numeric) и power(float8, float8) аргументов NaN в соответствии со стандартом POSIX (Том Лейн, Дан Мин Хыонг)

    Согласно стандарту POSIX, NaN ^ 0 = 1 и 1 ^ NaN = 1, а во всех других случаях с аргументами NaN должно возвращаться значение NaN. Ранее power(numeric, numeric) просто всегда возвращала NaN; сейчас она учитывает эти два исключения. power(float8, float8) следовала стандарту в зависимости от поведения нижележащей библиотеки C; однако на некоторых старых платформах Unix эта библиотека работала некорректно, и кроме того, возникали расхождения в некоторых версиях Windows.

  • Недопущение игнорирования функцией to_number() символов, которые не соответствуют символам в шаблоне (Оливер Форд)

    В частности, SELECT to_number('1234', '9,999') раньше возвращала 134. Теперь она возвращает 1234. Символы в шаблоне L и TH теперь будут поглощать только символы, отличные от цифр, знаков плюс/минус, десятичной точки и запятой.

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

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

  • В to_char(), to_number() и to_timestamp() исправлена обработка символов обратной косой черты в двойных кавычках внутри строки шаблона.

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

  • Корректная обработка выражений с относительными путями в xmltable(), xpath() и других функциях, работающих с XML (Маркус Винанд)

    Согласно стандарту SQL, относительные пути нужно рассматривать от узла документа XML, а не от корневого узла, как раньше это делали данные функции.

  • В протоколе расширенных запросов значение statement_timeout должно применяться к каждому отдельному сообщению Execute, а не ко всем командам до Sync (Тацуо Исии, Андрес Фройнд)

  • Удаление столбца relhaspkey из системного каталога pg_class (Питер Эйзентраут)

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

  • Замена столбцов proisagg и proiswindow в системном каталоге pg_proc на prokind (Питер Эйзентраут)

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

  • Откорректировано содержимое столбца информационной схемы tables.table_type — значение FOREIGN TABLE изменено на FOREIGN (Питер Эйзентраут)

    Новое содержимое соответствует стандарту SQL.

  • Изменены отображаемые в ps имена фоновых рабочих процессов для соответствия меткам pg_stat_activity.backend_type (Питер Эйзентраут)

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

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

  • Разрешение переиндексирования общих каталогов только для суперпользователей (Микаэль Пакье, Роберт Хаас)

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

  • Удаление устаревших функций adminpack pg_file_read(), pg_file_length() и pg_logfile_rotate() (Стивен Фрост)

    Равнозначная функциональность теперь представлена в ядре сервера. Старые инсталляции adminpack продолжат использовать эти функции, пока не будут обновлены посредством ALTER EXTENSION ... UPDATE.

  • Параметры команд, заключённые в двойные кавычки, стали восприниматься с учётом регистра (Даниэль Густафссон)

    Ранее имена параметров в определённых SQL-командах принудительно приводились к нижнему регистру, даже когда они задавались в кавычках; так, например, "FillFactor" воспринималось как имя параметра хранения индекса, тогда как правильное имя должно записываться строчными буквами. Теперь в подобных случаях будет выдаваться ошибка.

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

    Было решено, что сортировка с замещением в настоящее время не имеет практической пользы.

  • Удаление предложения WITH в CREATE FUNCTION (Микаэль Пакье)

    PostgreSQL уже долгое время поддерживает более стандартный вариант записи для этой возможности.

  • В триггерных функциях, написанных на PL/pgSQL, переменные OLD и NEW теперь воспринимаются как NULL, когда им не присвоено значение (Том Лейн)

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

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

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

E.13.3.1. Сервер

E.13.3.1.1. Секционирование
  • Возможность создания секций по хешу ключевого столбца (Амул Сул)

  • Поддержка индексов в секционированных таблицах (Альваро Эррера, Амит Ланготе)

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

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

    Новая команда ALTER INDEX ATTACH PARTITION позволяет связать существующий в определённой секции индекс с соответствующим шаблоном индекса для содержащей её секционированной таблицы. Это даёт возможность гибко образовывать новые секционированные индексы для существующих секционированных таблиц.

  • Возможность создавать внешние ключи с секционированными таблицами (Альваро Эррера)

  • Поддержка триггеров FOR EACH ROW в секционированных таблицах (Альваро Эррера)

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

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

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

  • При изменении операторами UPDATE значений ключа разбиения в строках секционированной таблицы эти строки теперь будут переноситься в соответствующие секции (Амит Хандекар)

  • При выполнении в секционированных таблицах команд INSERT, UPDATE и COPY строки должным образом перенаправляются в секции, размещённые в сторонних таблицах (Эцуро Фудзита, Амит Ланготе)

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

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

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

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

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

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

    По умолчанию эта возможность отключена, но её можно включить, изменив параметр enable_partitionwise_join.

  • Возможность вычисления агрегатных функций в секционированных таблицах по отдельным секциям с последующим объединением результатов (Дживан Чок, Ашутош Бапат, Роберт Хаас)

    Эта функциональность по умолчанию отключена, но её можно включить, изменив параметр enable_partitionwise_aggregate.

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

E.13.3.1.2. Параллельное выполнение запросов
  • Возможность параллельного построения индексов btree (Питер Гейган, Рушаб Латиа, Хейкки Линнакангас)

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

  • При выполнении UNION образующие его запросы SELECT могут выполняться параллельно, если отдельный SELECT не может быть распараллелен (Амит Хандекар, Роберт Хаас, Амул Сул)

  • Сканирование секций может более эффективно использовать параллельные исполнители (Амит Хандекар, Роберт Хаас, Амул Сул)

  • Указание LIMIT может передаваться параллельным исполнителям (Роберт Хаас, Том Лейн)

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

  • Возможность распараллеливания запросов, выполняемых разово, например, агрегатных запросов в предложении WHERE и функций в выходном списке запроса (Амит Капила, Роберт Хаас)

  • Добавление серверного параметра parallel_leader_participation, управляющего участием ведущего процесса в выполнении подпланов (Томас Мунро)

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

  • Возможность распараллеливания команд CREATE TABLE ... AS, SELECT INTO и CREATE MATERIALIZED VIEW (Харибабу Комми)

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

  • Добавление в вывод EXPLAIN информации о действиях, выполняемых при сортировке с параллельными исполнителями (Роберт Хаас, Том Лейн)

E.13.3.1.3. Индексы
  • Возможность включать в индексы-B-деревья столбцы, которые не входят в ограничение уникальности или ключ поиска, но могут быть прочитаны при сканировании только индекса (Анастасия Лубенникова, Александр Коротков, Фёдор Сигаев)

    Для определения таких индексов предназначено новое предложение INCLUDE команды CREATE INDEX. Таким образом стало возможным создавать «покрывающие индексы», оптимизирующие некоторые типы запросов. В покрывающий индекс могут включаться столбцы даже с такими типами данных, которые не поддерживает B-дерево.

  • Ускорение добавления в индекс монотонно увеличивающихся ключей (Паван Деоласи, Питер Гейган)

  • Улучшение производительности сканирования хеш-индекса (Томаш Вондра, Роберт Хаас)

  • Добавление предикатных блокировок для индексов GiST, GIN и хеш-индексов (Шубхам Барай)

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

E.13.3.1.3.1. SP-GiST
  • Добавление оператора сопоставления префиксов text ^@ text и реализация его поддержки в SP-GiST (Ильдус Курбангалиев)

    Он действует подобно конструкции переменная LIKE 'слово%' с индексом btree, но обрабатывается более эффективно.

  • Возможность индексирования многоугольников с SP-GiST (Никита Глухов, Александр Коротков)

  • Возможность использования в SP-GiST неточного представления ключей на уровне листьев (Фёдор Сигаев, Хейкки Линнакангас, Александр Коротков, Никита Глухов)

E.13.3.1.4. Оптимизатор
  • Улучшение выбора наиболее типичных значений для статистики (Джефф Джейнс, Дин Рашид)

    Ранее самые частые значения (Most-Common-Values, MCV) выбирались с учётом их частоты относительно всех других значений столбца. Теперь MCV выбираются с учётом их частоты относительно значений, не попадающих в число MCV. Это способствует улучшению статистики для равномерного и неравномерного распределения.

  • Улучшение оценок избирательности для >= и <= (Том Лейн)

    Ранее для них применялась та же оценка избирательности, что и для операторов > и <, соответственно, за исключением сравнения с константами из числа MCV. Это изменение особенно полезно для условий BETWEEN с маленькими диапазонами.

  • Сведение выражения переменная = переменная к выражению переменная IS NOT NULL там, где они равнозначны (Том Лейн)

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

  • Улучшение оценки числа строк оптимизатором для запросов EXISTS и NOT EXISTS (Том Лейн)

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

E.13.3.1.5. Общая производительность
  • Реализация JIT-компиляции некоторых частей планов для ускорения выполнения запросов (Андрес Фройнд)

    Для этой функциональности требуется наличие LLVM. По умолчанию она отключена, даже в сборках, обеспечивающих её поддержку.

  • Возможность выполнения при определённых условиях сканирования битовой карты подобно сканированию только индекса (Александр Кузьменков)

  • Обновление карты свободного пространства во время VACUUM (Клаудио Фрейре)

    Это позволяет задействовать освободившееся пространство более оперативно.

  • Исключение ненужных операций сканирований индекса при выполнении VACUUM (Масахико Савада, Александр Коротков)

  • Увеличение производительности при одновременном фиксировании множества транзакций (Амит Капила)

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

  • Ускорение агрегатных вычислений (Андрес Фройнд)

  • Реализация в postgres_fdw возможности передавать на сторонние серверы запросы UPDATE и DELETE, использующие соединения (Эцуро Фудзита)

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

  • Добавление поддержки больших страниц в Windows (Такаюки Цунакава, Томас Мунро)

    Эта поддержка включается параметром конфигурации huge_pages.

E.13.3.1.6. Мониторинг
  • Добавление информации об использовании памяти в вывод log_statement_stats, log_parser_stats, log_planner_stats и log_executor_stats (Джастин Призби, Питер Эйзентраут)

  • Добавление поля pg_stat_activity.backend_type, в котором показывается тип рабочего процесса (Питер Эйзентраут)

    Этот тип также можно увидеть в выводе ps.

  • В режиме log_autovacuum_min_duration добавлен вывод сообщений о таблицах, которые были удалены, пока выполнялась очистка (Натан Боссарт)

  • Добавление столбцов в представления information_schema, связанные с ограничениями таблиц и триггерами (Питер Эйзентраут)

    А именно, поля triggers.action_order, triggers.action_reference_old_table и triggers.action_reference_new_table, ранее всегда содержавшие NULL, теперь заполнены значениями. Также добавилось поле table_constraints.enforced, но оно пока не содержит полезного значения.

E.13.3.1.7. Аутентификация
  • Возможность задавать на сервере более сложные конструкции LDAP в режиме поиск+связывание (Томас Мунро)

    В частности, в ldapsearchfilter можно задавать шаблоны с комбинациями атрибутов LDAP.

  • Возможность аутентификации LDAP с использованием шифрованного протокола LDAP (Томас Мунро)

    Ранее мы поддерживали работу LDAP поверх TLS с параметром ldaptls=1. Новый метод TLS LDAP для зашифрованного LDAP включается параметром ldapscheme=ldaps или ldapurl=ldaps://.

  • Улучшен вывод сообщений об ошибках LDAP (Томас Мунро)

E.13.3.1.8. Разрешения
  • Добавление стандартных ролей для управления доступом к файловой системе (Стивен Фрост)

    А именно, добавлены роли: pg_read_server_files, pg_write_server_files и pg_execute_server_program. Эти роли теперь также определяют, кому разрешено выполнять COPY на стороне сервера и использовать расширение file_fdw. Ранее эти функции были доступны только суперпользователям, и сейчас по умолчанию другим пользователям они недоступны.

  • Вместо явных проверок суперпользователей ограничение доступа к функциям, которые работают с файловой системой, теперь обеспечивается разрешениями, управляемыми командами GRANT/REVOKE (Стивен Фрост)

    Соответствующим образом были изменены функции: pg_ls_dir(), pg_read_file(), pg_read_binary_file() и pg_stat_file().

  • Переход к использованию GRANT/REVOKE для ограничения доступа к функциям lo_import() и lo_export() (Микаэль Пакье, Том Лейн)

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

    Удалён параметр времени компиляции ALLOW_DANGEROUS_LO_FUNCTIONS.

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

    PostgreSQL позволяет только суперпользователям обращаться к таблицам postgres_fdw без паролей, то есть в режиме peer. Ранее для получения такого доступа суперпользователем должен был быть владелец сеанса; теперь же проверяется владелец представления.

  • Исправление некорректной проверки разрешений для блокировки в SELECT FOR UPDATE с представлениями (Том Лейн)

E.13.3.1.9. Конфигурация сервера
  • Добавление серверного параметра ssl_passphrase_command, позволяющего передать пароль, требующийся для расшифровывания файлов ключей SSL (Питер Эйзентраут)

    Вместе с этим добавлен параметр ssl_passphrase_command_supports_reload, указывающий, нужно ли перезагружать конфигурацию SSL и вызывать ssl_passphrase_command при перезагрузке конфигурации сервера.

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

    Подразумеваемое по умолчанию пороговое значение для применения TOAST осталось прежним.

  • Возможность задавать значения серверных параметров, связанных с объёмом файлов и памяти, в байтах (Бина Эмерсон)

    Новая единица обозначается «B». Она дополняет прежний набор из «kB», «MB», «GB» и «TB».

  • Возможность указания размера файлов WAL при вызове initdb (Бина Эмерсон)

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

  • Сохранение данных WAL только для одной контрольной точки (Саймон Риггс)

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

  • Заполнение нулями неиспользованной части принудительно переключаемых сегментов WAL для более эффективного их сжатия (Чепмен Флэк)

E.13.3.2. Базовое резервное копирование и потоковая репликация

  • Репликация действия TRUNCATE в ходе логической репликации (Саймон Риггс, Марко Ненчарини, Питер Эйзентраут)

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

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

    Копировать такие файлы нет необходимости.

  • Возможность проверки контрольных сумм страниц кучи при трансляции базовой резервной копии (Михаэль Банк)

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

    Это позволяет эффективно продвигаться вперёд в слоте репликации, когда считывать его содержимое не требуется. Данная возможность реализована в функции pg_replication_slot_advance().

  • Добавление информации о линии времени в файл backup_label (Микаэль Пакье)

    Также добавлена проверка на соответствие линии времени в WAL линии времени в файле backup_label.

  • Добавление адреса узла и порта в системное представление pg_stat_wal_receiver (Харибабу Комми)

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

  • Возможность избежать перезаписи таблицы при добавлении в ALTER TABLE столбца с отличным от NULL значением по умолчанию (Эндрю Дунстан, Серж Рило)

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

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

  • Возможность определения в ALTER INDEX ориентиров сбора статистики для индексов по выражению (Александр Коротков, Адриен Найрат)

    В psql команда \d+ теперь показывает ориентир статистики для индексов.

  • Возможность указания нескольких таблиц в одной команде VACUUM или ANALYZE (Натан Боссарт)

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

  • В ANALYZE добавлен синтаксис указания параметров в скобках (Натан Боссарт)

    Подобный синтаксис поддерживает команда VACUUM.

  • Добавление в CREATE AGGREGATE параметра, отмечающего поведение функции завершения агрегата (Том Лейн)

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

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

  • Возможность создания массивов доменов (Том Лейн)

    Это также позволяет использовать array_agg() с доменами.

  • Поддержка доменов поверх составных типов (Том Лейн)

    В дополнение к этому языки PL/Perl, PL/Python и PL/Tcl получили возможность принимать аргументы и выдавать результаты с составными доменными типами. Также улучшена поддержка доменных типов в PL/Python.

  • Добавление приведений скаляров JSONB к числовому и логическому типу данных (Анастасия Лубенникова)

E.13.3.5. Функции

  • Реализация всех описанных в SQL:2011 вариантов определения рамки для оконных функций (Оливер Форд, Том Лейн)

    В режиме RANGE теперь допускается указание в PRECEDING и FOLLOWING смещений для выбора строк с группирующими значениями плюс/минус заданное смещение. Кроме того, был добавлен режим GROUPS, в котором в рамку включается плюс/минус заданное число групп родственных строк. Также добавлен синтаксис для описания рамки с исключением.

  • Добавление семейства хеш-функций SHA-2 (Питер Эйзентраут)

    А именно, были добавлены функции: sha224(), sha256(), sha384() и sha512().

  • Добавление поддержки 64-битных функций хеширования без криптографической стойкости (Роберт Хаас, Амул Сул)

  • Возможность указания в to_char() и to_timestamp() смещения часового пояса от UTC в часах и минутах (Никита Глухов, Эндрю Дунстан)

    Для этого предназначены указания формата TZH и TZM.

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

  • Добавление функций json(b)_to_tsvector(), создающих запрос текстового поиска для соответствующих значений JSON/JSONB (Дмитрий Долгов)

E.13.3.6. Языки программирования на стороне сервера

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

    Для создания хранимых процедур предназначена новая команда CREATE PROCEDURE, а для выполнения — CALL

    Новые команды ALTER/DROP ROUTINE позволяют изменять/удалять все виды объектов-подпрограмм, а именно процедуры, функции и агрегаты.

    Кроме того, теперь запись FUNCTION в командах CREATE OPERATOR и CREATE TRIGGER предпочтительнее, чем PROCEDURE, так как целевой объект должен быть функцией, а не процедурой. Однако для совместимости старый синтаксис по-прежнему поддерживается.

  • Добавление возможностей управления транзакциями в серверные языки PL/pgSQL, PL/Perl, PL/Python, PL/Tcl и SPI (Питер Эйзентраут)

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

  • Добавление в PL/pgSQL возможности обозначать типы записей составного типа как не принимающие NULL, постоянные, или имеющие начальные значения (Том Лейн)

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

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

  • Добавление расширения jsonb_plpython для преобразования JSONB в типы PL/Python и в обратном направлении (Антон Быков)

  • Добавление расширения jsonb_plperl для преобразования JSONB в типы PL/Perl и в обратном направлении (Антон Быков)

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

  • По умолчанию сжатие теперь отключено в libpq (Питер Эйзентраут)

    В современных версиях OpenSSL сжатие отключено, так что соответствующий параметр libpq в них фактически не действовал.

  • Добавление указания DO CONTINUE в команду ecpg WHENEVER (Винаяк Покале)

    При этом генерируется команда continue языка C, приводящая к передаче управления в начало цикла, содержащего указанное условие.

  • Добавление в ecpg режима обработки символьных массивов в стиле Oracle Pro*C.

    Этот режим включается ключом -C.

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

E.13.3.8.1. psql
  • Добавление в psql команды \gdesc, выводящей названия и типы столбцов в результате запроса (Павел Стехуле)

  • Добавление переменных psql для управление выводом ошибок и действий запросов (Фабьен Коэльо)

    А именно, были добавлены переменные: ERROR, SQLSTATE, ROW_COUNT, LAST_ERROR_MESSAGE и LAST_ERROR_SQLSTATE.

  • Добавление в psql возможности проверить существование переменной (Фабьен Коэльо)

    Для проверки существования переменной в операторе \if реализован синтаксис :{?имя_переменной}.

  • Добавление переменной окружения PSQL_PAGER для управления постраничником в psql (Павел Стехуле)

    Эта переменная позволяет задать для psql постраничник по умолчанию, отличный от постраничника, который выбран для других программ. Значение PAGER по-прежнему действует, если переменная PSQL_PAGER не определена.

  • Безусловное добавление информации о секционировании в вывод команды psql \d+ (Амит Ланготе, Ашутош Бапат)

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

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

    Ранее, когда имя пользователя задавалось в адресе URI и одновременно использовался ключ -U, в приглашении выдавалось некорректное имя. Теперь также подавляется имя при запросе пароля, когда указывается ключ --password.

  • Выполнение выхода из psql при вводе команд quit и exit, когда в буфере ввода больше ничего нет (Брюс Момджян)

    Добавление подсказки о том, как выйти из программы, когда команды quit и exit вводятся в отдельной строке при непустом буфере ввода. Эта же информация добавлена в справку (help).

  • Добавление в psql подсказки об использовании Control-D, когда \q вводится в отдельной строке, но при этом игнорируется (Брюс Момджян)

    Например, ввод \q не приведёт к выходу, если эти символы введены внутри текстовой строки.

  • Улучшение дополнения табуляцией для команды ALTER INDEX RESET/SET (Масахико Савада)

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

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

E.13.3.8.2. pgbench
  • Добавление в pgbench поддержки выражений с NULL, логическими значениями, а также нескольких функций и операторов (Фабьен Коэльо)

  • Добавление условий \if в pgbench (Фабьен Коэльо)

  • Возможность использовать в именах переменных pgbench не только символы ASCII (Фабьен Коэльо)

  • Добавление в pgbench ключа --init-steps, позволяющего управлять этапами инициализации (Масахико Савада)

  • Добавление в pgbench генератора случайных чисел с распределением, приблизительно соответствующим закону Ципфа (Алик Хилажев)

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

  • Добавление в pgbench функций pow() и power() для возведения в степень (Раул Марин Родригес)

  • Добавление в pgbench функций хеширования (Ильдар Мусин)

  • Улучшение точности статистики pgbench при использовании параметров --latency-limit и --rate (Фабьен Коэльо)

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

  • Добавление в pg_basebackup параметра для создания слота репликации с заданным именем (Михаэль Банк)

    С ключом --create-slot будет создаваться слот репликации (с именем, заданным ключом --slot), когда используется метод потоковой трансляции WAL (--wal-method=stream).

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

    Для этого предназначен добавленный ключ initdb --allow-group-access. Администраторы также могут установить разрешения для группы в пустом каталоге данных до запуска initdb. Узнать, разрешено ли группе чтение в каталоге данных, позволяет серверная переменная data_directory_mode.

  • Добавление утилиты pg_verify_checksums для проверки контрольных сумм базы данных в отключённом состоянии (Магнус Хагандер)

  • Возможность изменить в pg_resetwal размер сегмента WAL с помощью ключа --wal-segsize (Натан Боссарт)

  • Добавление длинных параметров в pg_resetwal и pg_controldata (Натан Боссарт, Питер Эйзентраут)

  • Добавление в pg_receivewal ключа --no-sync, отключающего синхронную запись WAL в целях тестирования (Микаэль Пакье)

  • Добавление в pg_receivewal ключа --endpos, указывающего, когда нужно остановить приём WAL (Микаэль Пакье)

  • Включение в pg_ctl возможности посылать процессам сигналы SIGKILL (Андрес Фройнд)

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

  • Уменьшение числа файлов, копируемых утилитой pg_rewind (Микаэль Пакье)

  • Недопущение запуска pg_rewind от имени root (Микаэль Пакье)

  • Добавление в pg_dumpall ключа --encoding для управления выводом указаний кодировок (Микаэль Пакье)

    В pg_dump этот ключ уже был раньше.

  • Добавление в pg_dump ключа --load-via-partition-root, указывающего, что данные должны загружаться в корневую таблицу секционирования, а не в исходную секцию (Рушаб Латиа)

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

  • Добавление ключа для отключения выгрузки и восстановления комментариев объекта базы данных (Робинс Таракан)

    Новый ключ утилит pg_dump, pg_dumpall и pg_restore называется --no-comments.

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

  • Добавление в PGXS возможности устанавливать заголовочные файлы (Эндрю Гирт)

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

  • Установка файла errcodes.txt при инсталляции, что позволяет расширениям получать список кодов ошибок, известных в PostgreSQL (Томас Мунро)

  • Преобразование документации в формат DocBook XML (Питер Эйзентраут, Александр Лахин, Юрген Пуртц)

    Имена файлов по-прежнему имеют расширение sgml для совместимости с ветвями старых версий.

  • Использование определения типа bool из stdbool.h там, где это возможно, то есть на подавляющем большинстве платформ (Питер Эйзентраут)

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

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

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

  • Недопущение создания расширениями собственных серверных параметров, принимающих значения в виде списка в кавычках (Том Лейн)

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

  • Добавление возможности применять связывание каналов при использовании аутентификации SCRAM (Микаэль Пакье)

    Связывание каналов предназначено для предотвращения атак посредника; SCRAM сам по себе не обеспечивает такую защиту — связывание необходимо включать явно. К сожалению, libpq не позволяет это сделать. Необходимая поддержка ожидается в будущих версиях libpq и в интерфейсах, построенных не на базе libpq, например, в JDBC.

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

  • Поддержка аппаратного вычисления CRC на платформе ARMv8 (Юки Гу, Хейкки Линнакангас, Томас Мунро)

  • Ускорение поиска встроенных функций по OID (Андрес Фройнд)

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

  • Ускорение форматирования результатов запроса (Андрес Фройнд)

  • Увеличение скорости доступа к кешам системы (Андрес Фройнд)

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

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

  • Согласование вычисления pg_class.reltuples при VACUUM с вычислением этого же значения при выполнении ANALYZE (Томаш Вондра)

  • Переход к использованию более новой версии perltidy, 20170521 (Том Лейн, Питер Эйзентраут)

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

  • В расширение pg_prewarm добавлена возможность восстанавливать предыдущее содержимое общего буфера при запуске (Митхун Сай, Роберт Хаас)

    Для этого информацию об отношениях и номерах блоков, наблюдаемых в общем буфере, pg_prewarm периодически сохраняет на диск во время работы и при отключении сервера.

  • Добавление в pg_trgm функции strict_word_similarity() для вычисления схожести целых слов (Александр Коротков)

    Для подобной цели уже существовала функция word_similarity(), но она была предназначена для поиска схожих частей слов, тогда как strict_word_similarity() вычисляет схожесть целых слов.

  • Возможность создания индексов, которые можно использовать в сравнениях LIKE со столбцами citext (Алексей Чернышов)

    Для этого индексы должны создаваться с использованием класса операторов citext_pattern_ops.

  • Возможность создания индексов btree_gin по значениям типов данных bool, bpchar, name и uuid (Матеус Оливейра)

  • Возможность выполнения расширениями cube и seg сканирования только индекса при использовании индексов GiST (Андрей Бородин)

  • Реализация извлечения отрицательных координат куба оператором ~> (Александр Коротков)

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

  • Обработка букв вьетнамского языка в расширении unaccent (Дан Мин Хыонг, Микаэль Пакье)

  • Добавление в amcheck проверки наличия для каждого кортежа в куче соответствующей записи в индексе (Питер Гейган)

  • Переход в модуле adminpack к использованию новых стандартных ролей для доступа к файловой системе (Стивен Фрост)

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

  • Расширение идентификатора запроса в pg_stat_statement до 64 бит (Роберт Хаас)

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

  • Удаление скриптов contrib/start-scripts/osx, так как использовать их более не рекомендуется (вместо них следует использовать contrib/start-scripts/macos) (Том Лейн)

  • Удаление расширения chkpass (Питер Эйзентраут)

    Это расширение более не считается полезным средством безопасности и примером написания расширения.

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

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

Абхиджит Менон-Сен (Abhijit Menon-Sen)
Адам Беланьский (Adam Bielanski)
Адам Брайтвелл (Adam Brightwell)
Адам Брюссельбек (Adam Brusselback)
Адитья Тошнивал (Aditya Toshniwal)
Адриан Эскомс (Adrián Escoms)
Адриен Найрат (Adrien Nayrat)
Акос Вандра (Akos Vandra)
Александр Алексеев (Aleksander Alekseev)
Александр Коротков (Alexander Korotkov)
Александр Кузьменков (Alexander Kuzmenkov)
Александр Кукушкин (Alexander Kukushkin)
Александр Лахин (Alexander Lakhin)
Александр Парфёнов (Aleksandr Parfenov)
Александре Гарсия (Alexandre Garcia)
Алексей Баштанов (Alexey Bashtanov)
Алексей Крючков (Alexey Kryuchkov)
Алексей Чернышов (Alexey Chernyshov)
Алик Хилажев (Alik Khilazhev)
Альваро Эррера (Álvaro Herrera)
Амит Капила (Amit Kapila)
Амит Ланготе (Amit Langote)
Амит Хандекар (Amit Khandekar)
Амул Сул (Amul Sul)
Анастасия Лубенникова (Anastasia Lubennikova)
Андре Гензель (André Hänsel)
Андреас Джозеф Крог (Andreas Joseph Krogh)
Андреас Зельтенрейх (Andreas Seltenreich)
Андреас Карлссон (Andreas Karlsson)
Андрей Бородин (Andrey Borodin)
Андрей Горита (Andrei Gorita)
Андрей Красичков (Andrew Krasichkov)
Андрей Лизенко (Andrey Lizenko)
Андрес Фройнд (Andres Freund)
Антон Быков (Anthony Bykov)
Антон Дигнос (Anton Dignös)
Антонин Хоуска (Antonin Houska)
Антуан Семама (Antoine Scemama)
Арсений Шароглазов (Arseniy Sharoglazov)
Арсений Шер (Arseny Sher)
Артур Закиров (Artur Zakirov)
Асим Правин (Asim Praveen)
Атсуши Торикоши (Atsushi Torikoshi)
Ашвин Агравал (Ashwin Agrawal)
Ашутош Бапат (Ashutosh Bapat)
Ашутош Шарма (Ashutosh Sharma)
Бадрул Чоудхури (Badrul Chowdhury)
Балаж Силфаи (Balazs Szilfai)
Бейзил Бурк (Basil Bourque)
Бен Чобот (Ben Chobot)
Бенджамин Кутю (Benjamin Coutu)
Бернд Хелмле (Bernd Helmle)
Бина Эмерсон (Beena Emerson)
Блаз Мерела (Blaz Merela)
Брайан Клотье (Brian Cloutier)
Брент Дерт (Brent Dearth)
Брэд Дейонг (Brad DeJong)
Брюс Момджян (Bruce Momjian)
Вайшнави Прабакаран (Vaishnavi Prabakaran)
Васундар Боддапати (Vasundhar Boddapati)
Вик Фиринг (Vik Fearing)
Виктор Вагнер (Victor Wagner)
Виктор Дробный (Victor Drobny)
Виктор Егоров (Victor Yegorov)
Винаяк Покале (Vinayak Pokale)
Винсент Лаченал (Vincent Lachenal)
Виталий Буровой (Vitaly Burovoy)
Виталий Гарнашевич (Vitaliy Garnashevich)
Владимир Баранов (Vladimir Baranoff)
Гао Цзэнци (Gao Zengqi)
Го Сян Тань (Guo Xiang Tan)
Грег Старк (Greg Stark)
Гуннлаугур Тор Брием (Gunnlaugur Thor Briem)
Давид Перейро Лагарес (David Pereiro Lagares)
Давид Феттер (David Fetter)
Даг Дул (Doug Doole)
Даг Рэди (Doug Rady)
Дагфинн Ильмари Маннсакер (Dagfinn Ilmari Mannsåker)
Дан Вианелло (Dan Vianello)
Дан Мин Хыонг
Даниель Вестерман (Daniel Westermann)
Даниель Вуд (Daniel Wood)
Даниэль Верите (Daniel Vérité)
Даниэль Густафссон (Daniel Gustafsson)
Дейв Крамер (Dave Cramer)
Дейв Пейдж (Dave Page)
Джанни Чиолли (Gianni Ciolli)
Джастин Призби (Justin Pryzby)
Джейкоб Чемпион (Jacob Champion)
Джереми Финцель (Jeremy Finzel)
Джереми Шнайдер (Jeremy Schneider)
Джереми Эванс (Jeremy Evans)
Джеспер Педерсен (Jesper Pedersen)
Джефф Девис (Jeff Davis)
Джефф Джейнс (Jeff Janes)
Дживан Ладхе (Jeevan Ladhe)
Дживан Чок (Jeevan Chalke)
Джим Нэсби (Jim Nasby)
Джимми Йи (Jimmy Yih)
Джо Конвей (Joe Conway)
Джон Вольский (Jon Wolski)
Джон Горман (John Gorman)
Джон Нейлор (John Naylor)
Джонатан Аллен (Jonathan Allen)
Джонатан С. Кац (Jonathan S. Katz)
Диан Фей (Dian Fay)
Дилип Кумар (Dilip Kumar)
Дин Рашид (Dean Rasheed)
Дмитрий Долгов (Dmitry Dolgov)
Дмитрий Иванов (Dmitry Ivanov)
Дмитрий Сарафанников (Dmitriy Sarafannikov)
Дмитрий Шалашов (Dmitry Shalashov)
Дон Зейлер (Don Seiler)
Дорофей Пролесковский (Darafei Praliaskouski)
Дэви Мачадо (Davy Machado)
Дэвид Биндерман (David Binderman)
Дэвид Гулд (David Gould)
Дэвид Дж. Джонстон (David G. Johnston)
Дэвид Карлье (David Carlier)
Дэвид Роули (David Rowley)
Дэвид Рэйдер (David Rader)
Дэвид Стил (David Steele)
Дэвид Хинкль (David Hinkle)
Дэн Ватсон (Dan Watson)
Жан-Пьер Пельтье (Jean-Pierre Pelletier)
Жобен Августин (Jobin Augustine)
Жюльен Руо (Julien Rouhaud)
И Вэнь Вон (Yi Wen Wong)
Ив Герген (Yves Goergen)
Игорь Корот (Igor Korot)
Игорь Нейман (Igor Neyman)
Ильдар Мусин (Ildar Musin)
Ильдус Курбангалиев (Ildus Kurbangaliev)
Йозеф Ким (Ioseph Kim)
Йон Нельсон (Jon Nelson)
Йорик Петерс (Yorick Peterse)
Ка Нгуен (Kha Nguyen)
КайГай Кохэй (KaiGai Kohei)
Кайл Самсон (Kyle Samson)
Кайтин Чен (Kaiting Chen)
Карл Лехенбауэр (Karl Lehenbauer)
Каталин Якоб (Catalin Iacob)
Кевин Блох (Kevin Bloch)
Ким Росе Карлсен (Kim Rose Carlsen)
Кит Фиске (Keith Fiske)
Клаудио Фрейре (Claudio Freire)
Клейтон Салем (Clayton Salem)
Константин Книжник (Konstantin Knizhnik)
Крейг Рингер (Craig Ringer)
Кристиан Дута (Christian Duta)
Кристиан Ульрих (Christian Ullrich)
Кристоф Берг (Christoph Berg)
Кристоф Дрейс (Christoph Dreis)
Кристоф Куртуа (Christophe Courtois)
Кристофер Джонс (Christopher Jones)
Кунтал Гхош (Kuntal Ghosh)
Куэль Чжо (QL Zhuo)
Кётаро Хоригути (Kyotaro Horiguchi)
Ларс Канис (Lars Kanis)
Лауренц Альбе (Laurenz Albe)
Леонардо Чекки (Leonardo Cecchi)
Летиция Авро (Lætitia Avrot)
Лисиань Цзоу (Lixian Zou)
Ллойд Альбин (Lloyd Albin)
Лука Феррари (Luca Ferrari)
Лукас Фиттл (Lukas Fittl)
Лукас Фэйрчайлд (Lucas Fairchild)
Лукас Эдер (Lukas Eder)
Людмила Мантрова (Liudmila Mantrova)
Магнус Хагандер (Magnus Hagander)
Май Пэн (Mai Peng)
Майк Блэквелл (Mike Blackwell)
Максим Богук (Maksym Boguk)
Максим Милютин (Maksim Milyutin)
Мансур Галиев (Mansur Galiev)
Марина Полякова (Marina Polyakova)
Марио де Фрутос Диегес (Mario de Frutos Dieguez)
Марк Вуд (Mark Wood)
Марк Дилгер (Marc Dilger)
Марк Дилгер (Mark Dilger)
Марк Кейв-Айланд (Mark Cave-Ayland)
Марко Ненчарини (Marco Nenciarini)
Марко Тииккая (Marko Tiikkaja)
Маркус Винанд (Markus Winand)
Мартин Маркес (Martín Marqués)
Масахико Савада (Masahiko Sawada)
Матеус Оливейра (Matheus Oliveira)
Метин Дослу (Metin Doslu)
Микаэль Пакье (Michael Paquier)
Мин-Цюань Тран (Minh-Quan Tran)
Митхун Сай (Mithun Cy)
Михаил Николаев (Michail Nikolaev)
Михаэль Банк (Michael Banck)
Михаэль Мескес (Michael Meskes)
Морган Оуэнс (Morgan Owens)
Мэтью Стикни (Matthew Stickney)
Натан Боссарт (Nathan Bossart)
Натан Вагнер (Nathan Wagner)
Нейл Конвей (Neil Conway)
Ник Барнс (Nick Barnes)
Никита Глухов (Nikita Glukhov)
Николай Шаплов (Nikolay Shaplov)
Николас Товен (Nicolas Thauvin)
Никхил Сонтакке (Nikhil Sontakke)
Ной Миш (Noah Misch)
Нориёси Синода (Noriyoshi Shinoda)
Олег Бартунов (Oleg Bartunov)
Олег Самойлов (Oleg Samoilov)
Оливер Форд (Oliver Ford)
Паван Деоласи (Pavan Deolasee)
Паван Маддамсетти (Pavan Maddamsetti)
Павел Голубь (Pavel Golub)
Павел Стехуле (Pavel Stehule)
Пан Бянь (Pan Bian)
Паскаль Легран (Pascal Legrand)
Патрик Крекер (Patrick Krecker)
Патрик Хеммер (Patrick Hemmer)
Петр Желинек (Petr Jelínek)
Петру-Флорин Миханча (Petru-Florin Mihancea)
Питер Гейган (Peter Geoghegan)
Питер Эйзентраут (Peter Eisentraut)
Пол Гуо (Paul Guo)
Пол Рамсей (Paul Ramsey)
Поль Боно (Paul Bonaud)
Прабхат Саху (Prabhat Sahu)
Пу Квун (Pu Qun)
Пьер Дюкроке (Pierre Ducroquet)
Пётр Стефаняк (Piotr Stefaniak)
Раджкумар Рагхуванши (Rajkumar Raghuwanshi)
Райан Мерфи (Ryan Murphy)
Райнер Орт (Rainer Orth)
Рауль Марин Родригес (Raúl Marín Rodríguez)
Рафия Сабих (Rafia Sabih)
Рахила Сьед (Rahila Syed)
Регина Обе (Regina Obe)
Ричард Йен (Richard Yen)
Роберт Хаас (Robert Haas)
Робинс Таракан (Robins Tharakan)
Род Тейлор (Rod Taylor)
Рушаб Латиа (Rushabh Lathia)
Саймон Риггс (Simon Riggs)
Самуэль Хорвиц (Samuel Horwitz)
Свен Кунце (Sven Kunze)
Симоне Готти (Simone Gotti)
Синь Чжан (Xin Zhang)
Скотт Уре (Scott Ure)
Стас Кельвич (Stas Kelvich)
Стефан Кальтенбруннер (Stefan Kaltenbrunner)
Стефан Фройлих (Stephen Froehlich)
Стив Сингер (Steve Singer)
Стивен Винфилд (Steven Winfield)
Стивен Фрост (Stephen Frost)
Тайки Кондо (Taiki Kondo)
Такаюки Цунакава (Takayuki Tsunakawa)
Такэси Идэриха (Takeshi Ideriha)
Тацуо Исии (Tatsuo Ishii)
Тацуро Ямада (Tatsuro Yamada)
Тобиас Бусман (Tobias Bussmann)
Тодд А. Кук (Todd A. Cook)
Том Браун (Thom Brown)
Том Казимирс (Tom Kazimiers)
Том Лейн (Tom Lane)
Томас Келлерер (Thomas Kellerer)
Томас Мунро (Thomas Munro)
Томас Рейсс (Thomas Reiss)
Томаш Вондра (Tomas Vondra)
Томонари Кацумата (Tomonari Katsumata)
Торстен Груст (Torsten Grust)
Тушар Ахуджа (Tushar Ahuja)
Фабрицио де Ройес Мелло (Fabrízio de Royes Mello)
Фабьен Коэльо (Fabien Coelho)
Фейке Стинберген (Feike Steenbergen)
Фил Флорент (Phil Florent)
Филипп Бодуэн (Philippe Beaudoin)
Фриц Ялвинг (Frits Jalvingh)
Фудзии Масао (Fujii Masao)
Фёдор Сигаев (Teodor Sigaev)
Хади Мошаеди (Hadi Moshayedi)
Хайлун Ли (Hailong Li)
Хайме Казанова (Jaime Casanova)
Харибабу Комми (Haribabu Kommi)
Хейкки Линнакангас (Heikki Linnakangas)
Хит Лорд (Heath Lord)
Хьюго Мерсье (Hugo Mercier)
Цзин Ван (Jing Wang)
Чад Трабант (Chad Trabant)
Чепмен Флэк (Chapman Flack)
Чжоу Дигоал (Zhou Digoal)
Шао Брет (Shao Bret)
Шахап Ашчи (Sahap Asci)
Шивасубраманьян Рамасубраманьян (Sivasubramanian Ramasubramanian)
Шон Джонстон (Sean Johnston)
Шубхам Барай (Shubham Barai)
Шэй Роджански (Shay Rojansky)
Эверальдо Кануто (Everaldo Canuto)
Эдмунд Хорнер (Edmund Horner)
Эйдзи Сэки (Eiji Seki)
Эйлер Тавейра (Euler Taveira)
Элвис Пранскевичус (Elvis Pranskevichus)
Эмре Хасегели (Emre Hasegeli)
Энди Абелисто (Andy Abelisto)
Эндрю Гирт (Andrew Gierth)
Эндрю Гроссман (Andrew Grossman)
Эндрю Дунстан (Andrew Dunstan)
Эндрю Флетчер (Andrew Fletcher)
Эрвин Брандштеттер (Erwin Brandstetter)
Эрик Рижкерс (Erik Rijkers)
Эцуро Фудзита (Etsuro Fujita)
Юго Нагата (Yugo Nagata)
Юки Гу (Yuqi Gu)
Юрген Пуртц (Jürgen Purtz)
Юрий Соколов (Yura Sokolov)
Якоб Еггер (Jakob Egger)