E.57. Выпуск 9.6

Дата выпуска: 2016-09-29

E.57.1. Обзор

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

  • Параллельное выполнение последовательного сканирования, соединений и агрегатных вычислений

  • Предупреждение излишнего сканирования страниц при операциях очистки с заморозкой

  • При синхронной репликации стало возможным использовать несколько резервных серверов для увеличения надёжности

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

  • postgres_fdw теперь может выполнять на удалённой стороне соединение, сортировку, UPDATE и DELETE

  • Существенное увеличение производительности, особенно в части масштабируемости на многопроцессорных серверах

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

E.57.2. Миграция на версию 9.6

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

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

  • Добавление в pg_stat_activity информации о том, чего ждёт процесс (Амит Капила, Ильдус Курбангалиев)

    Исторически процесс показывался как ожидающий, только если он ожидал тяжёлой блокировки. Теперь в pg_stat_activity также показываются ожидания лёгких блокировок и закреплений буферов. Также теперь виден тип ожидаемой блокировки. В результате этих изменений столбец waiting был заменён столбцами wait_event_type и wait_event.

  • В функции to_char() знак минус не должен считаться частью поля с заданной шириной для компонентов времени (Брюс Момджян)

    Например, to_char('-4 years'::interval, 'YY') теперь возвращает -04, а не -4.

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

    Ранее функция extract() просто возвращала ноль для аргумента «бесконечность», вне зависимости от выбранного поля. Теперь она будет возвращать infinity или -infinity соответственно, когда это поле является монотонно возрастающим (например, year, epoch), и NULL в противном случае (например, day, hour). Также теперь выдаётся ожидаемая ошибка при некорректном указании поля.

  • Ликвидация «особенности» PL/pgSQL, подавляющей строку КОНТЕКСТ в сообщениях, выдаваемых командами RAISE (Павел Стехуле)

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

  • Исправление стандартного анализатора текстового поиска, чтобы он принимал начальные цифры во фрагментах текста типа email и host (Артур Закиров)

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

  • Расширение стандартного файла unaccent.rules в модуле contrib/unaccent для обработки всех существующих в Unicode диакритик и корректного разворачивания лигатур (Томас Манро, Леонард Бенедетти)

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

  • Ликвидация давно считавшихся устаревшими указаний CREATEUSER/NOCREATEUSER команды CREATE ROLE и родственных ей (Том Лейн)

    Указание CREATEUSER на самом деле означало SUPERUSER из давних соображений относительно обратной совместимости. Это постоянно вводило в заблуждение людей, которые полагали (и имели на это право), что оно означало CREATEROLE. Это указание считается устаревшим уже десять лет, так что пора решить эту проблему, убрав его.

  • Считать имена ролей, начинающиеся с pg_, зарезервированными (Стивен Фрост)

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

  • Смена имени столбца в представлении information_schema.routines с result_cast_character_set_name на result_cast_char_set_name (Клеман Прево)

    Стандарт SQL:2011 устанавливает более длинное имя, но это, скорее всего, ошибка, так как у соседних столбцов имена более краткие, как и в других представлениях information_schema.

  • Параметр psql -c теперь не подразумевает поведение параметра --no-psqlrc (Павел Стехуле, Каталин Якоб)

    Для получения старого поведения нужно явно написать --no-psqlrc (или сокращение -X). Модифицированные таким образом скрипты будут продолжать работать и со старыми версиями psql.

  • Усовершенствование функции параметра pg_restore -t, чтобы он отбирал все типы отношений, а не только простые таблицы (Крейг Рингер)

  • Изменение формата отображения NextXID в pg_controldata и связанных местах (Джо Конвей, Брюс Момджян)

    Отображение значений эпоха-и-ID-транзакции в формате число:число. Предыдущий формат число/число был похож на формат LSN, что могло вводить в заблуждение.

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

    Во многие стандартные расширения внесены изменения, чтобы их функции могли выполняться параллельными исполнителями запросов. Эти изменения не вступят в силу в базах данных, обновлённых с предыдущих версий (с помощью pg_upgrade), пока вы не примените для каждого такого расширения команду ALTER EXTENSION UPDATE (в каждой базе данных кластера).

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

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

E.57.3.1. Сервер

E.57.3.1.1. Параллельное выполнение запросов
  • Параллельные запросы (Роберт Хаас, Амит Капила, Дэвид Роули и многие другие)

    С версией 9.6 в PostgreSQL появляется начальная поддержка параллельного выполнения больших запросов. Параллельному выполнению подлежат строго запросы только на чтение, в которых производится последовательное сканирование целевой таблицы. В параллельном режиме могут выполняться и соединения по хешу с вложенными циклами, а также агрегирование (с поддерживаемыми агрегатными функциями). Ещё многое предстоит сделать, но и этот набор возможностей уже весьма полезен.

    Параллельное выполнение запросов по умолчанию отключено (пока). Чтобы выключить его, установите для нового конфигурационного параметра max_parallel_workers_per_gather значение, большее нуля. Для дополнительной настройки распараллеливания запросов также введены новые параметры force_parallel_mode, parallel_setup_cost, parallel_tuple_cost и min_parallel_relation_size.

  • Инфраструктура для обозначения параллельно-безопасности функций (Роберт Хаас, Амит Капила)

E.57.3.1.2. Индексы
  • Индексы GIN строятся более эффективно при значениях maintenance_work_mem, превышающих 1 ГБ (Роберт Абрахам, Фёдор Сигаев)

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

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

  • Добавление функции gin_clean_pending_list(), позволяющей вручную вызвать очистку очереди обработки индекса GIN (Джефф Джейнс)

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

  • Оптимизация обработки «мёртвых» кортежей в индексах GiST (Анастасия Лубенникова)

    Кортежи в индексе теперь помечаются как «мёртвые», если при сканировании индекса обнаруживается, что соответствующий кортеж в куче — «мёртвый». Впоследствии, при добавлении новых кортежей, кортежи, помеченные как «мёртвые», могут быть замещены, если потребуется место на этой странице.

  • Добавлен класс операторов SP-GiST для типа box (Александр Лебедев)

E.57.3.1.3. Сортировка
  • Увеличение производительности сортировки за счёт использования quicksort вместо выбора с замещением при выполнении этапов внешней сортировки (Питер Гейган)

    Новый подход позволяет эффективнее использовать кеш процессора при типичных размерах кеша и объёмах данных. Где необходимо, новое поведение можно скорректировать, воспользовавшись новым конфигурационным параметром replacement_sort_tuples.

  • Ускорение сортировки текста, когда одна и та же строка встречается многократно (Питер Гейган)

  • Ускорение сортировки типов uuid, bytea и char(n) за счёт использования «сокращённых» ключей (Питер Гейган)

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

  • Ускорение команды CREATE INDEX CONCURRENTLY за счёт обработки идентификаторов TID как 64-битных целых в процессе сортировки (Питер Гейган)

E.57.3.1.4. Блокировки
  • Уменьшение конкуренции за ProcArrayLock (Амит Капила, Роберт Хаас)

  • Улучшение производительности за счёт переноса блокировок содержимого буфера в дескрипторы буферов (Андрес Фройнд, Саймон Риггс)

  • Замена циклических блокировок заголовков в общем буфере атомарными операциями для улучшения масштабируемости (Александр Коротков, Андрес Фройнд)

  • Использование атомарных операций вместо циклических блокировок для защиты очереди ожидания LWLock (Андрес Фройнд)

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

  • Сокращение взаимоблокировок на резервных серверах при воспроизведении операций очистки индекса-B-дерева (Саймон Риггс)

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

E.57.3.1.5. Статистика оптимизатора
  • Улучшение оценок ANALYZE для столбцов с большим количеством NULL (Томаш Вондра, Александр Шульгин)

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

  • Улучшение оценки планировщиком количества различных значений в результате запроса (Томаш Вондра)

  • Использование связей по внешним ключам для оценки избирательности предикатов соединения (Томаш Вондра, Дэвид Роули)

    Если в таблице t имеется ограничение внешнего ключа, например (a,b) REFERENCES r (x,y), то условие WHERE вида t.a = r.x AND t.b = r.y не может выбрать больше одной строки из r для строки t. Ранее планировщик считал объединённые AND условия независимыми и поэтому часто неправильно оценивал избирательность запроса. Теперь он сравнивает условия WHERE с применимыми ограничениями внешнего ключа и получает более точные оценки.

E.57.3.1.6. VACUUM
  • Предупреждение повторной очистки страниц, содержащих только замороженные кортежи (Масахико Савада, Роберт Хаас, Андрес Фройнд)

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

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

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

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

E.57.3.1.7. Общая производительность
  • Возможность аннулирования старых снимков MVCC после настраиваемого промежутка времени (Кевин Гриттнер)

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

  • Игнорирование в GROUP BY столбцов, функционально зависящих от других (Дэвид Роули)

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

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

    Например, индекс, определённый командой CREATE INDEX tidx_partial ON t(b) WHERE a > 0, теперь может использоваться для сканирования только по индексу в запросе, в котором задаётся условие WHERE a > 0 и никак больше не задействуется a. Ранее это использование не допускалось, на основании того, что a не входит в число столбцов индекса.

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

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

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

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

    В Linux для этой цели применяется функция sync_file_range(), и так как она практически безвредна, этот механизм задействуется в Linux по умолчанию. Возможность сброса буфера доступна и на других платформах, где имеется функция msync() или posix_fadvise(), но эти функции дают некоторые нежелательные побочные эффекты, поэтому на всех платформах кроме Linux данный механизм по умолчанию отключён.

    Этим поведением управляют новые конфигурационные параметры backend_flush_after, bgwriter_flush_after, checkpoint_flush_after и wal_writer_flush_after.

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

    Например, в запросе SELECT AVG(x), VARIANCE(x) FROM tab для строки может быть достаточно одной операции для вычисления обоих агрегатов.

  • Ускорение проверок видимости для недавно созданных кортежей путём проверки снимка текущей транзакции, вместо pg_clog, для определения, должна ли исходная транзакция считаться зафиксированной (Джефф Джейнс, Том Лейн)

  • Допущение установки вспомогательных битов кортежей на более раннем этапе (Андрес Фройнд)

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

    Информация о двухфазной фиксации теперь записывается только в WAL во время PREPARE TRANSACTION и считывается назад из WAL во время COMMIT PREPARED, если это имеет место вскоре. Отдельный файл состояния создаётся, только если ожидающая транзакция не фиксируется и не прерывается к моменту следующей контрольной точки.

  • Увеличение скорости уничтожения контекста памяти (Ян Вик)

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

  • Увеличение скорости функций вывода типов timestamp, time и date (Дэвид Роули, Андрес Фройнд)

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

  • Расширение отношений на несколько блоков сразу при конкуренции за блокировку расширения отношения (Дилип Кумар)

    Это улучшает масштабируемость и снижает уровень конфликтов.

  • Увеличение числа буферов clog для лучшей масштабируемости (Амит Капила, Андрес Фройнд)

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

  • Недопущение уменьшения значения SO_SNDBUF ниже значения по умолчанию в последних версиях Windows (Чен Хуацзюнь)

  • Отключение механизма update_process_title по умолчанию в Windows (Такаюки Цунакава)

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

E.57.3.1.8. Наблюдение
  • Добавление системного представления pg_stat_progress_vacuum для наблюдения за процессом выполнения операций VACUUM (Амит Ланготе, Роберт Хаас, Винаяк Покале, Рахила Сьед)

  • Добавление функций pg_control_system(), pg_control_checkpoint(), pg_control_recovery() и pg_control_init(), выдающих поля pg_control в SQL (Джо Конвей, Микаэль Пакье)

  • Добавление системного представления pg_config (Джо Конвей)

    В этом представлении выводится та же информация, что выдаётся утилитой командной строки pg_config, а именно разнообразные конфигурационные параметры времени компиляции PostgreSQL.

  • Добавление столбца confirmed_flush_lsn в системное представление pg_replication_slots (Марко Тииккая)

  • Добавление системного представления pg_stat_wal_receiver с информацией о состоянии процесса приёмника WAL на сервере горячего резерва (Микаэль Пакье)

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

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

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

  • Добавление функции pg_notification_queue_usage(), показывающей, насколько заполнена очередь NOTIFY (Брендан Юрд)

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

    Информация об использовании памяти, выводимая в протокол главного сервера при нехватке памяти, теперь включает итоговую статистику при большом числе контекстов памяти, вместо одного объёмного отчёта. Также в неё теперь входит итоговая строка «Всего».

E.57.3.1.9. Аутентификация
  • Добавление метода аутентификации BSD, позволяющего использовать для проверки подлинности клиентов PostgreSQL системную службу аутентификации BSD (Мариса Эмерсон)

    Аутентификация BSD в настоящее время поддерживается только в OpenBSD.

  • Когда используется аутентификация PAM, через поле PAM_RHOST модулям PAM может выдаваться IP-адрес или имя компьютера клиента (Гжегож Сампольски)

  • Добавление вывода в протокол сервера сообщений о дополнительных типах ошибок при проверке пароля (Том Лейн)

    Теперь в случае любых ошибок, которые обычно могут возникать, в протокол должны выдаваться сообщения уровня ПОДРОБНО.

  • Поддержка паролей RADIUS длиной до 128 символов (Марко Тииккая)

  • Добавление новых параметров аутентификации SSPI compat_realm и upn_username, позволяющих выбрать, как при проверке подлинности SSPI будут использоваться имена области и пользователя (NetBIOS или Kerberos) (Кристиан Ульрих)

E.57.3.1.10. Настройка сервера
  • Возможность автоматического завершения сеансов, которые находятся в состоянии простоя в транзакции слишком долго (Вик Фиринг)

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

  • Увеличение максимально допустимого значения checkpoint_timeout до 24 часов (Саймон Риггс)

  • Возможность устанавливать effective_io_concurrency для табличного пространства; это полезно в случаях, когда различные табличные пространства имеют разные характеристики ввода/вывода (Жюльен Руо)

  • Добавление в log_line_prefix спецкода %n для вывода текущего времени в формате Unix, с миллисекундами (Томаш Вондра, Джефф Дэвис)

  • Добавление конфигурационных параметров syslog_sequence_numbers и syslog_split_messages для дополнительной манипуляции форматом сообщений при выводе их в syslog (Питер Эйзентраут)

  • Объединение значений archive и hot_standby конфигурационного параметра wal_level в одном новом значении replica (Питер Эйзентраут)

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

  • Добавление в configure параметра --with-systemd, позволяющего вызывать sd_notify() при запуске и остановке сервера (Питер Эйзентраут)

    Это позволяет использовать единицы служб systemd типа notify, что значительно упрощает управление PostgreSQL в окружении systemd.

  • Теперь к файлу SSL-ключа сервера может быть разрешён доступ группы на чтение, если он принадлежит пользователю root (Кристоф Берг)

    Ранее мы настаивали на том, чтобы файл ключа принадлежал пользователю, запускающему сервер PostgreSQL, но это оказалось неудобным в некоторых системах (например, в Debian), в которых организовано централизованное управление сертификатами. Поэтому стоит допустить случай, когда файл принадлежит root, а группа имеет доступ на чтение. И в этом случае администратор отвечает за то, чтобы в эту группу не входили недоверенные пользователи.

E.57.3.1.11. Надёжность
  • Принудительное завершение обслуживающих процессов в случае отключения главного процесса (Раджив Растоги, Роберт Хаас)

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

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

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

  • Сообщения аннулирования должны записываться в WAL, даже если они выдаются транзакцией, которой не назначен XID (Андрес Фройнд)

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

  • Предупреждение одновременной отработки несколькими процессами очереди изменений в индексе GIN (Фёдор Сигаев, Джефф Джейнс)

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

E.57.3.2. Репликация и восстановление

  • Возможность при синхронной репликации задействовать одновременно несколько синхронных резервных серверов (раньше поддерживался только один) (Масахико Савада, Бина Эмерсон, Микаэль Пакье, Фудзии Масао, Кётаро Хоригути)

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

  • Добавление нового значения remote_apply для конфигурационного параметра synchronous_commit (Томас Манро)

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

  • Усовершенствование протокола репликации и добавление параметра в функцию pg_create_physical_replication_slot() для немедленного резервирования WAL при создании слота репликации (Гуржит Сингх, Микаэль Пакье)

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

  • Добавление ключа --slot для pg_basebackup (Питер Эйзентраут)

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

  • Доработка функций pg_start_backup() и pg_stop_backup() для поддержки немонопольного резервного копирования (Магнус Хагандер)

E.57.3.3. Запросы

  • Функции, возвращающие наборы кортежей, теперь могут возвращать просто NULL (Эндрю Гирт, Том Лейн)

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

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

    Ранее в таких ситуациях возникала ошибка, если один и тот же целевой столбец упоминался более одного раза, например так: INSERT INTO tab (x[1], x[2]) VALUES (...).

  • Когда уместно, вычисление выходных выражений SELECT откладывается и производится после сортировки ORDER BY (Константин Книжник)

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

  • Расширение счётчиков, хранящих число обработанных кортежей, до 64 бит (Андреас Шербаум)

    В результате этого изменения в метках команд, например SELECT, теперь будут корректно выдаваться количества кортежей, превышающие 4 миллиарда. Это также распространяется на команду GET DIAGNOSTICS ... ROW_COUNT в PL/pgSQL.

  • Уход от преобразования некоторых кодировок через кодировку MULE_INTERNAL (Том Лейн)

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

  • Допускать удалённое соединение сторонних таблиц, только если к ним обращается одна и та же роль (Шигеру Ханада, Ашутош Бапат, Эцуро Фудзита)

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

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

  • Поддержка в COPY копирования вывода запроса INSERT/UPDATE/DELETE ... RETURNING (Марко Тииккая)

    Ранее для этого приходилось создавать промежуточные CTE (общие табличные выражения).

  • Введение команды ALTER объект DEPENDS ON EXTENSION (Абхиджит Менон-Сен)

    Эта команда позволяет пометить объект базы данных как зависимый от расширения, чтобы он автоматически ликвидировался при удалении расширения (без явного указания CASCADE). Но при этом такой объект не будет частью расширения и поэтому pg_dump будет выгружать его отдельно.

  • Команда ALTER объект SET SCHEMA теперь не будет делать ничего, если объект уже относится к заданной схеме, вместо того, чтобы выдавать ошибку, что имело место раньше для большинства типов объектов (Марти Раудсепп)

  • Добавление в ALTER OPERATOR параметров, позволяющих изменять функции оценки избирательности, связанные с существующим оператором (Юрий Журавлёв)

  • Добавление указания IF NOT EXISTS в команду ALTER TABLE ADD COLUMN (Фабрицио де Ройес Мелло)

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

  • Введение команды CREATE ACCESS METHOD, позволяющей расширениям создавать методы доступа индексов (Александр Коротков, Петр Желинек)

  • Добавление указания CASCADE для команды CREATE EXTENSION, позволяющего автоматически устанавливать расширения, от которых зависит создаваемое (Петр Желинек)

  • Команда CREATE TABLE ... LIKE должна включать столбец OID, если он есть в какой-либо из исходных таблиц (Брюс Момджян)

  • Если ограничение CHECK объявлено как NOT VALID (непроверенное) в команде создания таблицы, оно должно автоматически помечаться как проверенное (Амит Ланготе, Амул Сул)

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

  • Исправлена команда DROP OPERATOR; она должна очищать ссылки на удаляемый оператор pg_operator.oprcom и pg_operator.oprnegate (Рома Соколов)

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

  • Один и тот же подплан не должен выдаваться дважды в выводе EXPLAIN (Том Лейн)

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

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

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

E.57.3.5. Управление разрешениями

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

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

  • Создание нескольких встроенных ролей, используя которые можно давать доступ к операциям, ранее доступным только суперпользователям (Стивен Фрост)

    В настоящее время есть только одна такая роль, pg_signal_backend, но в дальнейшем ожидается добавление других ролей.

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

  • Усовершенствование полнотекстового поиска; поддержка поиска фраз, то есть лексем, встречающихся рядом в определённом порядке, либо с заданным расстоянием между ними (Фёдор Сигаев, Олег Бартунов, Дмитрий Иванов)

    Запрос поиска фразы может быть записан в значении tsquery с использованием новых операторов <-> и <N>. Первая запись означает, что лексемы до и после неё должны находиться рядом и в заданном порядке. Вторая запись означает, что они могут быть разделены ровно N лексемами.

  • Возможность записать указание среза массива без одной или двух границ, например, array_col[3:] (Юрий Журавлёв)

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

  • Более аккуратное обращение с датами и временем за пределами допустимого диапазона (Виталий Буровой)

    Это изменение предотвращает неожиданные ошибки выхода за пределы диапазона для значений дата/время с часовым поясом, очень близких к предельным значениям реализации. Ранее «одно и то же» значение могло быть принято или нет, в зависимости от значения параметра timezone (часового пояса), и как следствие, ранее выгруженные данные могли не загружаться из-за значений, который до этого считались приемлемыми. Теперь границы проверяются по UTC, а не по местному часовому поясу, так что эта проверка не зависит от значения timezone.

    Также PostgreSQL теперь более аккуратно выявляет переполнение при вычислениях новых значений даты или даты/времени, таких как date + integer.

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

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

  • Добавление в словарь ispell поддержки дополнительных языков и современного формата файлов Hunspell (Артур Закиров)

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

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

  • Если в регулярных выражениях предположительно трёхсимвольное восьмеричное значение \nnn превосходит 377 (255 в десятичном виде), должно считываться только двухсимвольное восьмеричное значение (Том Лейн)

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

  • Добавление операторов для идентификаторов транзакций xid <> xid и xid <> int4, для согласованности с соответствующими операторами равенства (Микаэль Пакье)

E.57.3.7. Функции

  • Добавление функции jsonb_insert() для вставки нового элемента в массив jsonb или ранее не существовавшего ключа в объект jsonb (Дмитрий Долгов)

  • Увеличение точности функций ln(), log(), exp() и pow() для типа numeric (Дин Рашид)

  • Добавление функции scale(numeric), выдающей масштаб значения numeric (Марко Тииккая)

  • Добавление тригонометрических функций, работающих с градусами (Дин Рашид)

    Например, sind() воспринимает свой аргумент в градусах, тогда как sin() — в радианах. Эти функции до некоторой степени выдают точный результат для аргументов, для которых его можно ожидать, например, sind(30) = 0.5.

  • Обработка аргументов infinity и NaN в тригонометрических функциях по стандарту POSIX (Дин Рашид)

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

  • Функция to_timestamp(float8) теперь преобразует infinity (бесконечность) в числе с плавающей точкой в infinity в дате (Виталий Буровой)

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

  • Добавление новых функций для значений tsvector (Стас Кельвич)

    Это функции ts_delete(), ts_filter(), unnest(), tsvector_to_array(), array_to_tsvector() и вариация setweight(), устанавливающая вес только для заданных лексем.

  • Функции ts_stat() и tsvector_update_trigger() теперь принимают значения, имеющие не только конкретный ожидаемый тип аргумента, но и тип, двоично совместимый с ним; например, они могут принимать citext там, где ожидается text (Фёдор Сигаев)

  • Добавление функций num_nulls() и num_nonnulls() с переменным числом аргументов, возвращающих число переданных им значений NULL и значений, отличных от NULL (Марко Тииккая)

    Например, их можно использовать в ограничении CHECK(num_nonnulls(a,b,c) = 1), которое требует, чтобы ровно одно из значений a,b,c было отлично от NULL. Эти функции также могут применяться для подсчёта элементов NULL и элементов, отличных от NULL, в массиве.

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

  • Функция to_number() воспринимает код формата V как признак деления числа на 10 в степени, заданной цифрами после V (Брюс Момджян)

    Таким образом поведение этой функции оказывается обратным к to_char().

  • Функции to_reg*() теперь принимают тип text, а не cstring (Пётр Коробейников)

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

  • Добавление функции pg_size_bytes() для преобразования понятных человеку объёмов в числа (Павел Стехуле, Виталий Буровой, Дин Рашид)

    Эта функция преобразует строки, в частности, те, что выдаёт pg_size_pretty(), в количество байтов. Использовать её можно, например, так: SELECT oid::regclass FROM pg_class WHERE pg_total_relation_size(oid) > pg_size_bytes('10 GB').

  • Формат вывода отрицательных чисел в pg_size_pretty() не должен отличаться от положительных (Адриан фон ден Дриш)

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

  • Добавление необязательного аргумента missing_ok в функцию current_setting() (Дэвид Кристенсен)

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

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

    Функция pg_get_viewdef() теперь возвращает NULL, получая неправильный OID представления; также и другие функции будут возвращать NULL при некорректных параметрах. Ранее в таких случаях обычно возникали ошибки типа «cache lookup failed» (ошибка поиска в кеше), с которыми не должны сталкиваться пользователи.

  • Избавление функции pg_replication_origin_xact_reset() от аргументов (Фудзии Масао)

    В документации говорится, что у неё нет аргументов, и коду функции на C никакие аргументы не нужны, но в записи в pg_proc по ошибке указаны два аргумента.

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

  • Выявление некорректных операторов CONTINUE и EXIT в PL/pgSQL при компиляции функции, а не во время выполнения (Джим Нэсби)

  • Расширение функций, выдающих ошибки и сообщения в PL/Python, чтобы они могли передавать помимо основного сообщения и дополнительные поля (Павел Стехуле)

  • Исправление механизма вызова функций PL/Python, позволяющее производить рекурсивные вызовы этих функций через SPI, и корректировка поведения в ситуации, когда несколько функций на PL/Python, возвращающих множества, вызываются в одном запросе (Алексей Грищенко, Том Лейн)

  • Ликвидация утечек памяти в пределах длительности сеанса в PL/Python (Хейкки Линнакангас, Харибабу Комми, Том Лейн)

  • Модернизация PL/Tcl, переход от передачи простых строк к «объектному» API Tcl (Джим Нэсби, Карл Лехенбауэр)

    Это может значительно увеличить производительность в некоторых случаях. Заметьте, что для PL/Tcl теперь требуется версия Tcl 8.4 или новее.

  • В PL/Tcl при возникновении ошибок базы данных теперь возвращается дополнительная информация в глобальной переменной Tcl errorCode (Джим Нэсби, Том Лейн)

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

  • Исправление логики преобразования кодировки в PL/Tcl; строки в кодировке базы данных должны преобразовываться в UTF-8 (кодировку, ожидаемую в Tcl) и обратно (Том Лейн)

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

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

  • Добавление нелокализуемой версии поля серьёзности в сообщения об ошибках и уведомления (Том Лейн)

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

  • Введение в libpq средства подавления поля КОНТЕКСТ в сообщениях об ошибках, либо для всех, либо только для информационных сообщений (Павел Стехуле)

    По умолчанию PQerrorMessage() теперь выводит КОНТЕКСТ только для ошибок. Для корректировки её поведения предназначена новая функция PQsetErrorContextVisibility().

  • Добавление в libpq возможности переформировать сообщение об ошибке с другим уровнем важности (Алексей Шульгин)

    Данную возможность реализует новая функция PQresultVerboseErrorMessage(). Это поддерживается новой командой psql \errverbose и может быть также полезно для других клиентов.

  • Усовершенствование функции PQhost() в libpq, чтобы она возвращала полезную информацию при подключении к сокету Unix по умолчанию (Том Лейн)

    Ранее она возвращала NULL в отсутствие явного указания адреса узла; теперь она возвращает путь каталога сокетов по умолчанию.

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

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

  • Добавление флага --strict-names в pg_dump и pg_restore (Павел Стехуле)

    С этим флагом программа выдаст ошибку, не найдя объектов, заданных параметрами -t или -n, а не просто не будет ничего делать.

  • В pg_dump реализована выгрузка локально изменённых назначений прав на системные объекты (Стивен Фрост)

    Хотя суперпользователь всегда мог изменить назначения прав для встроенных или созданных расширениями объектов, после выгрузки/загрузки базы эти изменения терялись. Теперь pg_dump распознаёт такие назначения и выгружает их. (Однако это работает только при выгрузке данных с сервера 9.6 или новее.)

  • Теперь pg_dump может выгружать объекты, не принадлежащие расширениям, но находящиеся в принадлежащих им схемах (Мартин Маркиз)

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

  • В выводе pg_dump добавлено имя таблицы в метки тех объектов, которые являются уникальными только в рамках таблицы (как, например, триггеры) (Питер Эйзентраут)

E.57.3.10.1. psql
  • Поддержка нескольких параметров командной строки -c и -f (Павел Стехуле, Каталин Якоб)

    Эти операции выполняются в том порядке, в каком передаются параметры, а затем psql завершается.

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

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

  • Добавление команды \errverbose, выводящей последнюю ошибку сервера с максимальной детализацией (Александр Шульгин)

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

  • Добавление команд \ev и \sv для редактирования и просмотра определений представлений (Пётр Коробейников)

    Эти команды соответствуют существующим командам \ef и \sf для функций.

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

  • Команда \pset C строка должна устанавливать заголовок таблицы, как это делает \C строка (Брюс Момджян)

  • В режиме автоматического расширения (\pset expanded auto) не нужно применять широкий формат для запросов результата с всего одним столбцом (Андреас Карлссон, Роберт Хаас)

  • Улучшение заголовков, выводимых командой \watch (Микаэль Пакье, Том Лейн)

    Добавление названия, если оно было задано командой \pset title, и сокращение предустановленной части заголовка до время (каждые N с). При этом формат времени теперь определяется локалью из окружения psql.

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

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

  • Многочисленные улучшения механизма завершения табуляцией (Питер Эйзентраут, Вик Фиринг, Кевин Гриттнер, Кётаро Хоригути, Джефф Джейнс, Андреас Карлссон, Фудзии Масао, Томас Манро, Масахико Савада, Павел Стехуле)

  • Добавление в формат приглашения PROMPT спецкода %p для отображения ID текущего обслуживающего процесса (Жюльен Руо)

  • Введение средства подавления поля КОНТЕКСТ в сообщения об ошибках, либо для всех, либо только для информационных сообщений (Павел Стехуле)

    Теперь по умолчанию КОНТЕКСТ выводится только для ошибок. И это можно изменить с помощью специальной переменной SHOW_CONTEXT.

  • Добавление в вывод \df+ прав доступа к функции и характеристик распараллеливания (Микаэль Пакье)

E.57.3.10.2. pgbench
  • Команды SQL в pgbench теперь завершаются точкой с запятой, а не переводом строки (Кётаро Хоригути, Том Лейн)

    Благодаря этому изменению, команды SQL в скриптах могут располагаться на нескольких строках. Существующие нестандартные скрипты придётся подредактировать и добавить точку с запятой в конце каждой строки, если это не было сделано ранее. (Это не помешает использовать тот же скрипт со старыми версиями pgbench.)

  • Поддержка арифметики с плавающей точкой, а также некоторых встроенных функций, в выражениях команд с обратной косой чертой (Фабьен Коэльо)

  • Замена \setrandom встроенными функциями (Фабьен Коэльо)

    Новые встроенные функции random(), random_exponential() и random_gaussian() делают то же, что и \setrandom, но проще в использовании, так как их можно задействовать в более сложных выражениях. Так как в результате этого добавления команда \setrandom стала ненужной, она была ликвидирована.

  • Возможность многократно запускать и встроенные, а не только нестандартные скрипты (Фабьен Коэльо)

    Для этого введён ключ -b, работающий подобно ключу -f для нестандартных скриптов.

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

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

  • Сбор статистики по каждому скрипту при запуске нескольких скриптов (Фабьен Коэльо)

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

  • Добавление параметра --progress-timestamp для вывода текущего времени эпохи Unix вместо времени с момента запуска теста (Фабьен Коэльо)

  • Возможность устанавливать число клиентских соединений (-c), не кратное количеству потоков (-j) (Фабьен Коэльо)

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

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

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

  • Улучшение вывода ошибок в initdb на стадии после начальной инициализации (Том Лейн)

    Ранее при возникновении ошибок в качестве «ошибочного запроса» выдавался весь входной файл; теперь выдаётся только текущий запрос. Чтобы получить желаемое поведение, теперь запросы во входных файлах initdb нужно разделять пустыми строками.

  • Ускорение initdb благодаря использованию только одного серверного сеанса для всех операций после инициализации (Том Лейн)

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

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

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

  • Удаление устаревших функций heap_formtuple/heap_modifytuple/heap_deformtuple (Питер Гейган)

  • Добавление макросов, призванных сделать вызовы AllocSetContextCreate() проще и безопаснее (Том Лейн)

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

  • Безусловное использование функций static inline в заголовочных файлах (Андрес Фройнд)

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

  • Усовершенствование инфраструктуры тестирования TAP (Микаэль Пакье, Крейг Рингер, Альваро Эррера, Стивен Фрост)

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

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

  • Улучшение инфраструктуры psql, обеспечивающей дополнение кода табуляцией (Томас Манро, Микаэль Пакье)

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

  • Закрепление системного каталога pg_shseclabel в кеше, чтобы он был доступен при проверке подлинности в момент подключения (Адам Брайтвелл)

    Код ядра не использует этот каталог для аутентификации, но к нему могут обращаться расширения.

  • Реструктуризация API методов доступа индексов с целью в большей степени скрыть его на уровне C (Александр Коротков, Эндрю Гирт)

    В результате этого изменения API индексных методов становится больше похожим на API, принятый для обёрток сторонних данных и генераторов выборки из таблицы. Это упрощает код C и должно сделать более приемлемой реализацию методов доступа индексов в устанавливаемых расширениях. Данное изменение позволило удалить из системного каталога pg_am многие столбцы. Чтобы SQL-запросы могли анализировать свойства МД индексов, которые раньше были доступны в pg_am, были добавлены новые функции проверки свойств.

  • Добавление системного каталога pg_init_privs для записи изначальных прав, назначаемых для объектов, которые создаёт initdb и расширения (Стивен Фрост)

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

  • Изменение способа запрашивания дополнительных лёгких блокировок расширениями (Амит Капила, Роберт Хаас)

    Функция RequestAddinLWLocks() была удалена, а ей на смену пришла RequestNamedLWLockTranche(). С новым подходом будет проще идентифицировать лёгкие блокировки и сложнее допустить ошибку.

  • Усовершенствование тестировщика изоляции, чтобы в состоянии ожидания могли находиться сразу несколько сеансов; это позволяет тестировать сценарии взаимоблокировок (Роберт Хаас)

  • Введение расширяемых типов узлов (КайГай Кохэй)

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

  • Планировщик должен рассматривать дальнейшие шаги после сканирования/объединения, генерируя и сравнивая структуры Path; это позволяет упростить большой объём несистематической логики (Том Лейн)

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

  • Поддержка частичного агрегирования (Дэвид Роули, Саймон Риггс)

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

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

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

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

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

  • Внедрение нового API WaitEventSet для эффективного ожидания набора событий, которые обычно не меняются от одного цикла ожидания к другому (Андрес Фройнд, Амит Капила)

  • Добавление унифицированного интерфейса для добавления записей в WAL (Александр Коротков, Петр Желинек, Маркус Нуллмейер)

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

  • Поддержка произвольных сообщений WAL при логическом декодировании (Петр Желинек, Андрес Фройнд)

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

  • Реализация возможности для классов операторов SP-GiST сохранять произвольное «переходящее значение» при проходе по индексу (Александр Лебедев, Фёдор Сигаев)

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

  • Введение уровня сообщений LOG_SERVER_ONLY для ereport() (Дэвид Стил)

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

  • Реализация в Makefile цели для сборки всех генерируемых заголовочных файлов (Микаэль Пакье, Том Лейн)

    Теперь, чтобы убедиться, что все генерируемые серверные заголовочные файлы актуальны, можно выполнить сборку цели submake-generated-headers. Это полезно в подкаталогах, которые могут собираться «отдельно».

  • Поддержка OpenSSL 1.1.0 (Андреас Карлссон, Хейкки Линнакангас)

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

  • Добавление параметра конфигурации auto_explain.sample_rate, устанавливающего для contrib/auto_explain процент запросов, подлежащих анализу (Крейг Рингер, Жюльен Руо)

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

  • Добавление модуля contrib/bloom, реализующего метод доступа индекса на основе фильтра Блума (Фёдор Сигаев, Александр Коротков)

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

  • В модуле contrib/cube введены операторы расстояния для кубов и поддержка поиска в стиле kNN в индексах GiST по столбцам типа cube (Стас Кельвич)

  • Согласование представления о числах в функциях hstore_to_jsonb_loose() и hstore_to_json_loose() расширения contrib/hstore (Том Лейн)

    Ранее функция hstore_to_jsonb_loose() преобразовывала похожие на числа строки в числа JSON, а не в строки, даже когда они в точности не соответствовали правилам записи чисел в JSON. Это не согласовывалось с поведением hstore_to_json_loose(), так что проверки были усилены для соблюдения синтаксиса JSON.

  • Добавление функций оценки избирательности для операторов модуля contrib/intarray с целью улучшения планов запросов, использующих эти операторы (Юрий Журавлёв, Александр Коротков)

  • Доработка функции heap_page_items() в модуле contrib/pageinspect, чтобы она выводила неструктурированные данные в каждом кортеже, а также добавление функций tuple_data_split() и heap_page_item_attrs() для исследования отдельных полей кортежей (Николай Шаплов)

  • Добавление необязательного параметра, задающего число итераций S2K, в функцию contrib/pgcrypto в модуле pgp_sym_encrypt() (Джефф Джейнс)

  • Добавление возможности оценивать «схожесть слов» в contrib/pg_trgm (Александр Коротков, Артур Закиров)

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

  • Добавление параметра конфигурации pg_trgm.similarity_threshold, устанавливающего порог схожести для contrib/pg_trgm (Артур Закиров)

    Этот порог настраивался и раньше, но до этого им управляли специальные функции set_limit() и show_limit(). Теперь они считаются устаревшими.

  • Усовершенствование класса операторов GIN в contrib/pg_trgm для ускорения запросов с применением индекса, в которых ищутся и редкие, и частые ключи (Джефф Джейнс)

  • Увеличение производительности поиска по схожести в индексах GIN (модуль contrib/pg_trgm) (Кристоф Форнароли)

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

  • Добавление в contrib/sslinfo функции ssl_extension_info() для вывода информации о расширениях SSL, представленных в сертификате X509, который используется для текущего соединения (Дмитрий Воронин)

E.57.3.13.1. postgres_fdw
  • Возможность передавать предоставляемые расширением операторы и функции на удалённый сервер, если это расширение указано в белом списке в параметрах стороннего сервера (Пол Рамси)

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

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

  • Возможность выполнения соединений на удалённом сервере (Шигеру Ханада, Ашутош Бапат)

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

    Ранее для удалённой модификации данных требовалось передавать команду SELECT FOR UPDATE, а затем изменять или удалять отобранные строки по одной. Хотя это по-прежнему необходимо, если эта операция требует локальных действий, теперь она может выполняться и удалённо, если все элементы запроса можно безопасно передать на удалённый сервер.

  • Возможность задавать число извлекаемых строк в параметрах сервера или таблицы (Кори Хинкер)

    Ранее postgres_fdw всегда читала результаты удалённых запросов по 100 строк; теперь это количество стало настраиваемым.

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

  • Передача требования отмены запроса на удалённый сервер (Микаэль Пакье, Эцуро Фудзита)

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

E.57. Release 9.6

Release date: 2016-09-29

E.57.1. Overview

Major enhancements in PostgreSQL 9.6 include:

  • Parallel execution of sequential scans, joins and aggregates

  • Avoid scanning pages unnecessarily during vacuum freeze operations

  • Synchronous replication now allows multiple standby servers for increased reliability

  • Full-text search can now search for phrases (multiple adjacent words)

  • postgres_fdw now supports remote joins, sorts, UPDATEs, and DELETEs

  • Substantial performance improvements, especially in the area of scalability on multi-CPU-socket servers

The above items are explained in more detail in the sections below.

E.57.2. Migration to Version 9.6

A dump/restore using pg_dumpall, or use of pg_upgrade, is required for those wishing to migrate data from any previous release.

Version 9.6 contains a number of changes that may affect compatibility with previous releases. Observe the following incompatibilities:

  • Improve the pg_stat_activity view's information about what a process is waiting for (Amit Kapila, Ildus Kurbangaliev)

    Historically a process has only been shown as waiting if it was waiting for a heavyweight lock. Now waits for lightweight locks and buffer pins are also shown in pg_stat_activity. Also, the type of lock being waited for is now visible. These changes replace the waiting column with wait_event_type and wait_event.

  • In to_char(), do not count a minus sign (when needed) as part of the field width for time-related fields (Bruce Momjian)

    For example, to_char('-4 years'::interval, 'YY') now returns -04, rather than -4.

  • Make extract() behave more reasonably with infinite inputs (Vitaly Burovoy)

    Historically the extract() function just returned zero given an infinite timestamp, regardless of the given field name. Make it return infinity or -infinity as appropriate when the requested field is one that is monotonically increasing (e.g, year, epoch), or NULL when it is not (e.g., day, hour). Also, throw the expected error for bad field names.

  • Remove PL/pgSQL's “feature” that suppressed the innermost line of CONTEXT for messages emitted by RAISE commands (Pavel Stehule)

    This ancient backwards-compatibility hack was agreed to have outlived its usefulness.

  • Fix the default text search parser to allow leading digits in email and host tokens (Artur Zakirov)

    In most cases this will result in few changes in the parsing of text. But if you have data where such addresses occur frequently, it may be worth rebuilding dependent tsvector columns and indexes so that addresses of this form will be found properly by text searches.

  • Extend contrib/unaccent's standard unaccent.rules file to handle all diacritics known to Unicode, and to expand ligatures correctly (Thomas Munro, Léonard Benedetti)

    The previous version neglected to convert some less-common letters with diacritic marks. Also, ligatures are now expanded into separate letters. Installations that use this rules file may wish to rebuild tsvector columns and indexes that depend on the result.

  • Remove the long-deprecated CREATEUSER/NOCREATEUSER options from CREATE ROLE and allied commands (Tom Lane)

    CREATEUSER actually meant SUPERUSER, for ancient backwards-compatibility reasons. This has been a constant source of confusion for people who (reasonably) expect it to mean CREATEROLE. It has been deprecated for ten years now, so fix the problem by removing it.

  • Treat role names beginning with pg_ as reserved (Stephen Frost)

    User creation of such role names is now disallowed. This prevents conflicts with built-in roles created by initdb.

  • Change a column name in the information_schema.routines view from result_cast_character_set_name to result_cast_char_set_name (Clément Prévost)

    The SQL:2011 standard specifies the longer name, but that appears to be a mistake, because adjacent column names use the shorter style, as do other information_schema views.

  • psql's -c option no longer implies --no-psqlrc (Pavel Stehule, Catalin Iacob)

    Write --no-psqlrc (or its abbreviation -X) explicitly to obtain the old behavior. Scripts so modified will still work with old versions of psql.

  • Improve pg_restore's -t option to match all types of relations, not only plain tables (Craig Ringer)

  • Change the display format used for NextXID in pg_controldata and related places (Joe Conway, Bruce Momjian)

    Display epoch-and-transaction-ID values in the format number:number. The previous format number/number was confusingly similar to that used for LSNs.

  • Update extension functions to be marked parallel-safe where appropriate (Andreas Karlsson)

    Many of the standard extensions have been updated to allow their functions to be executed within parallel query worker processes. These changes will not take effect in databases pg_upgrade'd from prior versions unless you apply ALTER EXTENSION UPDATE to each such extension (in each database of a cluster).

E.57.3. Changes

Below you will find a detailed account of the changes between PostgreSQL 9.6 and the previous major release.

E.57.3.1. Server

E.57.3.1.1. Parallel Queries
  • Parallel queries (Robert Haas, Amit Kapila, David Rowley, many others)

    With 9.6, PostgreSQL introduces initial support for parallel execution of large queries. Only strictly read-only queries where the driving table is accessed via a sequential scan can be parallelized. Hash joins and nested loops can be performed in parallel, as can aggregation (for supported aggregates). Much remains to be done, but this is already a useful set of features.

    Parallel query execution is not (yet) enabled by default. To allow it, set the new configuration parameter max_parallel_workers_per_gather to a value larger than zero. Additional control over use of parallelism is available through other new configuration parameters force_parallel_mode, parallel_setup_cost, parallel_tuple_cost, and min_parallel_relation_size.

  • Provide infrastructure for marking the parallel-safety status of functions (Robert Haas, Amit Kapila)

E.57.3.1.2. Indexes
  • Allow GIN index builds to make effective use of maintenance_work_mem settings larger than 1 GB (Robert Abraham, Teodor Sigaev)

  • Add pages deleted from a GIN index's pending list to the free space map immediately (Jeff Janes, Teodor Sigaev)

    This reduces bloat if the table is not vacuumed often.

  • Add gin_clean_pending_list() function to allow manual invocation of pending-list cleanup for a GIN index (Jeff Janes)

    Formerly, such cleanup happened only as a byproduct of vacuuming or analyzing the parent table.

  • Improve handling of dead index tuples in GiST indexes (Anastasia Lubennikova)

    Dead index tuples are now marked as such when an index scan notices that the corresponding heap tuple is dead. When inserting tuples, marked-dead tuples will be removed if needed to make space on the page.

  • Add an SP-GiST operator class for type box (Alexander Lebedev)

E.57.3.1.3. Sorting
  • Improve sorting performance by using quicksort, not replacement selection sort, when performing external sort steps (Peter Geoghegan)

    The new approach makes better use of the CPU cache for typical cache sizes and data volumes. Where necessary, the behavior can be adjusted via the new configuration parameter replacement_sort_tuples.

  • Speed up text sorts where the same string occurs multiple times (Peter Geoghegan)

  • Speed up sorting of uuid, bytea, and char(n) fields by using “abbreviated” keys (Peter Geoghegan)

    Support for abbreviated keys has also been added to the non-default operator classes text_pattern_ops, varchar_pattern_ops, and bpchar_pattern_ops. Processing of ordered-set aggregates can also now exploit abbreviated keys.

  • Speed up CREATE INDEX CONCURRENTLY by treating TIDs as 64-bit integers during sorting (Peter Geoghegan)

E.57.3.1.4. Locking
  • Reduce contention for the ProcArrayLock (Amit Kapila, Robert Haas)

  • Improve performance by moving buffer content locks into the buffer descriptors (Andres Freund, Simon Riggs)

  • Replace shared-buffer header spinlocks with atomic operations to improve scalability (Alexander Korotkov, Andres Freund)

  • Use atomic operations, rather than a spinlock, to protect an LWLock's wait queue (Andres Freund)

  • Partition the shared hash table freelist to reduce contention on multi-CPU-socket servers (Aleksander Alekseev)

  • Reduce interlocking on standby servers during the replay of btree index vacuuming operations (Simon Riggs)

    This change avoids substantial replication delays that sometimes occurred while replaying such operations.

E.57.3.1.5. Optimizer Statistics
  • Improve ANALYZE's estimates for columns with many nulls (Tomas Vondra, Alex Shulgin)

    Previously ANALYZE tended to underestimate the number of non-NULL distinct values in a column with many NULLs, and was also inaccurate in computing the most-common values.

  • Improve planner's estimate of the number of distinct values in a query result (Tomas Vondra)

  • Use foreign key relationships to infer selectivity for join predicates (Tomas Vondra, David Rowley)

    If a table t has a foreign key restriction, say (a,b) REFERENCES r (x,y), then a WHERE condition such as t.a = r.x AND t.b = r.y cannot select more than one r row per t row. The planner formerly considered these AND conditions to be independent and would often drastically misestimate selectivity as a result. Now it compares the WHERE conditions to applicable foreign key constraints and produces better estimates.

E.57.3.1.6. VACUUM
  • Avoid re-vacuuming pages containing only frozen tuples (Masahiko Sawada, Robert Haas, Andres Freund)

    Formerly, anti-wraparound vacuum had to visit every page of a table, even pages where there was nothing to do. Now, pages containing only already-frozen tuples are identified in the table's visibility map, and can be skipped by vacuum even when doing transaction wraparound prevention. This should greatly reduce the cost of maintaining large tables containing mostly-unchanging data.

    If necessary, vacuum can be forced to process all-frozen pages using the new DISABLE_PAGE_SKIPPING option. Normally this should never be needed, but it might help in recovering from visibility-map corruption.

  • Avoid useless heap-truncation attempts during VACUUM (Jeff Janes, Tom Lane)

    This change avoids taking an exclusive table lock in some cases where no truncation is possible. The main benefit comes from avoiding unnecessary query cancellations on standby servers.

E.57.3.1.7. General Performance
  • Allow old MVCC snapshots to be invalidated after a configurable timeout (Kevin Grittner)

    Normally, deleted tuples cannot be physically removed by vacuuming until the last transaction that could “see” them is gone. A transaction that stays open for a long time can thus cause considerable table bloat because space cannot be recycled. This feature allows setting a time-based limit, via the new configuration parameter old_snapshot_threshold, on how long an MVCC snapshot is guaranteed to be valid. After that, dead tuples are candidates for removal. A transaction using an outdated snapshot will get an error if it attempts to read a page that potentially could have contained such data.

  • Ignore GROUP BY columns that are functionally dependent on other columns (David Rowley)

    If a GROUP BY clause includes all columns of a non-deferred primary key, as well as other columns of the same table, those other columns are redundant and can be dropped from the grouping. This saves computation in many common cases.

  • Allow use of an index-only scan on a partial index when the index's WHERE clause references columns that are not indexed (Tomas Vondra, Kyotaro Horiguchi)

    For example, an index defined by CREATE INDEX tidx_partial ON t(b) WHERE a > 0 can now be used for an index-only scan by a query that specifies WHERE a > 0 and does not otherwise use a. Previously this was disallowed because a is not listed as an index column.

  • Perform checkpoint writes in sorted order (Fabien Coelho, Andres Freund)

    Previously, checkpoints wrote out dirty pages in whatever order they happen to appear in shared buffers, which usually is nearly random. That performs poorly, especially on rotating media. This change causes checkpoint-driven writes to be done in order by file and block number, and to be balanced across tablespaces.

  • Where feasible, trigger kernel writeback after a configurable number of writes, to prevent accumulation of dirty data in kernel disk buffers (Fabien Coelho, Andres Freund)

    PostgreSQL writes data to the kernel's disk cache, from where it will be flushed to physical storage in due time. Many operating systems are not smart about managing this and allow large amounts of dirty data to accumulate before deciding to flush it all at once, causing long delays for new I/O requests until the flushing finishes. This change attempts to alleviate this problem by explicitly requesting data flushes after a configurable interval.

    On Linux, sync_file_range() is used for this purpose, and the feature is on by default on Linux because that function has few downsides. This flushing capability is also available on other platforms if they have msync() or posix_fadvise(), but those interfaces have some undesirable side-effects so the feature is disabled by default on non-Linux platforms.

    The new configuration parameters backend_flush_after, bgwriter_flush_after, checkpoint_flush_after, and wal_writer_flush_after control this behavior.

  • Improve aggregate-function performance by sharing calculations across multiple aggregates if they have the same arguments and transition functions (David Rowley)

    For example, SELECT AVG(x), VARIANCE(x) FROM tab can use a single per-row computation for both aggregates.

  • Speed up visibility tests for recently-created tuples by checking the current transaction's snapshot, not pg_clog, to decide if the source transaction should be considered committed (Jeff Janes, Tom Lane)

  • Allow tuple hint bits to be set sooner than before (Andres Freund)

  • Improve performance of short-lived prepared transactions (Stas Kelvich, Simon Riggs, Pavan Deolasee)

    Two-phase commit information is now written only to WAL during PREPARE TRANSACTION, and will be read back from WAL during COMMIT PREPARED if that happens soon thereafter. A separate state file is created only if the pending transaction does not get committed or aborted by the time of the next checkpoint.

  • Improve performance of memory context destruction (Jan Wieck)

  • Improve performance of resource owners with many tracked objects (Aleksander Alekseev)

  • Improve speed of the output functions for timestamp, time, and date data types (David Rowley, Andres Freund)

  • Avoid some unnecessary cancellations of hot-standby queries during replay of actions that take AccessExclusive locks (Jeff Janes)

  • Extend relations multiple blocks at a time when there is contention for the relation's extension lock (Dilip Kumar)

    This improves scalability by decreasing contention.

  • Increase the number of clog buffers for better scalability (Amit Kapila, Andres Freund)

  • Speed up expression evaluation in PL/pgSQL by keeping ParamListInfo entries for simple variables valid at all times (Tom Lane)

  • Avoid reducing the SO_SNDBUF setting below its default on recent Windows versions (Chen Huajun)

  • Disable update_process_title by default on Windows (Takayuki Tsunakawa)

    The overhead of updating the process title is much larger on Windows than most other platforms, and it is also less useful to do it since most Windows users do not have tools that can display process titles.

E.57.3.1.8. Monitoring
  • Add pg_stat_progress_vacuum system view to provide progress reporting for VACUUM operations (Amit Langote, Robert Haas, Vinayak Pokale, Rahila Syed)

  • Add pg_control_system(), pg_control_checkpoint(), pg_control_recovery(), and pg_control_init() functions to expose fields of pg_control to SQL (Joe Conway, Michael Paquier)

  • Add pg_config system view (Joe Conway)

    This view exposes the same information available from the pg_config command-line utility, namely assorted compile-time configuration information for PostgreSQL.

  • Add a confirmed_flush_lsn column to the pg_replication_slots system view (Marko Tiikkaja)

  • Add pg_stat_wal_receiver system view to provide information about the state of a hot-standby server's WAL receiver process (Michael Paquier)

  • Add pg_blocking_pids() function to reliably identify which sessions block which others (Tom Lane)

    This function returns an array of the process IDs of any sessions that are blocking the session with the given process ID. Historically users have obtained such information using a self-join on the pg_locks view. However, it is unreasonably tedious to do it that way with any modicum of correctness, and the addition of parallel queries has made the old approach entirely impractical, since locks might be held or awaited by child worker processes rather than the session's main process.

  • Add function pg_current_xlog_flush_location() to expose the current transaction log flush location (Tomas Vondra)

  • Add function pg_notification_queue_usage() to report how full the NOTIFY queue is (Brendan Jurd)

  • Limit the verbosity of memory context statistics dumps (Tom Lane)

    The memory usage dump that is output to the postmaster log during an out-of-memory failure now summarizes statistics when there are a large number of memory contexts, rather than possibly generating a very large report. There is also a “grand total” summary line now.

E.57.3.1.9. Authentication
  • Add a BSD authentication method to allow use of the BSD Authentication service for PostgreSQL client authentication (Marisa Emerson)

    BSD Authentication is currently only available on OpenBSD.

  • When using PAM authentication, provide the client IP address or host name to PAM modules via the PAM_RHOST item (Grzegorz Sampolski)

  • Provide detail in the postmaster log for more types of password authentication failure (Tom Lane)

    All ordinarily-reachable password authentication failure cases should now provide specific DETAIL fields in the log.

  • Support RADIUS passwords up to 128 characters long (Marko Tiikkaja)

  • Add new SSPI authentication parameters compat_realm and upn_username to control whether NetBIOS or Kerberos realm names and user names are used during SSPI authentication (Christian Ullrich)

E.57.3.1.10. Server Configuration
  • Allow sessions to be terminated automatically if they are in idle-in-transaction state for too long (Vik Fearing)

    This behavior is controlled by the new configuration parameter idle_in_transaction_session_timeout. It can be useful to prevent forgotten transactions from holding locks or preventing vacuum cleanup for too long.

  • Raise the maximum allowed value of checkpoint_timeout to 24 hours (Simon Riggs)

  • Allow effective_io_concurrency to be set per-tablespace to support cases where different tablespaces have different I/O characteristics (Julien Rouhaud)

  • Add log_line_prefix option %n to print the current time in Unix epoch form, with milliseconds (Tomas Vondra, Jeff Davis)

  • Add syslog_sequence_numbers and syslog_split_messages configuration parameters to provide more control over the message format when logging to syslog (Peter Eisentraut)

  • Merge the archive and hot_standby values of the wal_level configuration parameter into a single new value replica (Peter Eisentraut)

    Making a distinction between these settings is no longer useful, and merging them is a step towards a planned future simplification of replication setup. The old names are still accepted but are converted to replica internally.

  • Add configure option --with-systemd to enable calling sd_notify() at server start and stop (Peter Eisentraut)

    This allows the use of systemd service units of type notify, which greatly simplifies the management of PostgreSQL under systemd.

  • Allow the server's SSL key file to have group read access if it is owned by root (Christoph Berg)

    Formerly, we insisted the key file be owned by the user running the PostgreSQL server, but that is inconvenient on some systems (such as Debian) that are configured to manage certificates centrally. Therefore, allow the case where the key file is owned by root and has group read access. It is up to the operating system administrator to ensure that the group does not include any untrusted users.

E.57.3.1.11. Reliability
  • Force backends to exit if the postmaster dies (Rajeev Rastogi, Robert Haas)

    Under normal circumstances the postmaster should always outlive its child processes. If for some reason the postmaster dies, force backend sessions to exit with an error. Formerly, existing backends would continue to run until their clients disconnect, but that is unsafe and inefficient. It also prevents a new postmaster from being started until the last old backend has exited. Backends will detect postmaster death when waiting for client I/O, so the exit will not be instantaneous, but it should happen no later than the end of the current query.

  • Check for serializability conflicts before reporting constraint-violation failures (Thomas Munro)

    When using serializable transaction isolation, it is desirable that any error due to concurrent transactions should manifest as a serialization failure, thereby cueing the application that a retry might succeed. Unfortunately, this does not reliably happen for duplicate-key failures caused by concurrent insertions. This change ensures that such an error will be reported as a serialization error if the application explicitly checked for the presence of a conflicting key (and did not find it) earlier in the transaction.

  • Ensure that invalidation messages are recorded in WAL even when issued by a transaction that has no XID assigned (Andres Freund)

    This fixes some corner cases in which transactions on standby servers failed to notice changes, such as new indexes.

  • Prevent multiple processes from trying to clean a GIN index's pending list concurrently (Teodor Sigaev, Jeff Janes)

    This had been intentionally allowed, but it causes race conditions that can result in vacuum missing index entries it needs to delete.

E.57.3.2. Replication and Recovery

  • Allow synchronous replication to support multiple simultaneous synchronous standby servers, not just one (Masahiko Sawada, Beena Emerson, Michael Paquier, Fujii Masao, Kyotaro Horiguchi)

    The number of standby servers that must acknowledge a commit before it is considered complete is now configurable as part of the synchronous_standby_names parameter.

  • Add new setting remote_apply for configuration parameter synchronous_commit (Thomas Munro)

    In this mode, the master waits for the transaction to be applied on the standby server, not just written to disk. That means that you can count on a transaction started on the standby to see all commits previously acknowledged by the master.

  • Add a feature to the replication protocol, and a corresponding option to pg_create_physical_replication_slot(), to allow reserving WAL immediately when creating a replication slot (Gurjeet Singh, Michael Paquier)

    This allows the creation of a replication slot to guarantee that all the WAL needed for a base backup will be available.

  • Add a --slot option to pg_basebackup (Peter Eisentraut)

    This lets pg_basebackup use a replication slot defined for WAL streaming. After the base backup completes, selecting the same slot for regular streaming replication allows seamless startup of the new standby server.

  • Extend pg_start_backup() and pg_stop_backup() to support non-exclusive backups (Magnus Hagander)

E.57.3.3. Queries

  • Allow functions that return sets of tuples to return simple NULLs (Andrew Gierth, Tom Lane)

    In the context of SELECT FROM function(...), a function that returned a set of composite values was previously not allowed to return a plain NULL value as part of the set. Now that is allowed and interpreted as a row of NULLs. This avoids corner-case errors with, for example, unnesting an array of composite values.

  • Fully support array subscripts and field selections in the target column list of an INSERT with multiple VALUES rows (Tom Lane)

    Previously, such cases failed if the same target column was mentioned more than once, e.g., INSERT INTO tab (x[1], x[2]) VALUES (...).

  • When appropriate, postpone evaluation of SELECT output expressions until after an ORDER BY sort (Konstantin Knizhnik)

    This change ensures that volatile or expensive functions in the output list are executed in the order suggested by ORDER BY, and that they are not evaluated more times than required when there is a LIMIT clause. Previously, these properties held if the ordering was performed by an index scan or pre-merge-join sort, but not if it was performed by a top-level sort.

  • Widen counters recording the number of tuples processed to 64 bits (Andreas Scherbaum)

    This change allows command tags, e.g., SELECT, to correctly report tuple counts larger than 4 billion. This also applies to PL/pgSQL's GET DIAGNOSTICS ... ROW_COUNT command.

  • Avoid doing encoding conversions by converting through the MULE_INTERNAL encoding (Tom Lane)

    Previously, many conversions for Cyrillic and Central European single-byte encodings were done by converting to a related MULE_INTERNAL coding scheme and then to the destination encoding. Aside from being inefficient, this meant that when the conversion encountered an untranslatable character, the error message would confusingly complain about failure to convert to or from MULE_INTERNAL, rather than the user-visible encoding.

  • Consider performing joins of foreign tables remotely only when the tables will be accessed under the same role ID (Shigeru Hanada, Ashutosh Bapat, Etsuro Fujita)

    Previously, the foreign join pushdown infrastructure left the question of security entirely up to individual foreign data wrappers, but that made it too easy for an FDW to inadvertently create subtle security holes. So, make it the core code's job to determine which role ID will access each table, and do not attempt join pushdown unless the role is the same for all relevant relations.

E.57.3.4. Utility Commands

  • Allow COPY to copy the output of an INSERT/UPDATE/DELETE ... RETURNING query (Marko Tiikkaja)

    Previously, an intermediate CTE had to be written to get this result.

  • Introduce ALTER object DEPENDS ON EXTENSION (Abhijit Menon-Sen)

    This command allows a database object to be marked as depending on an extension, so that it will be dropped automatically if the extension is dropped (without needing CASCADE). However, the object is not part of the extension, and thus will be dumped separately by pg_dump.

  • Make ALTER object SET SCHEMA do nothing when the object is already in the requested schema, rather than throwing an error as it historically has for most object types (Marti Raudsepp)

  • Add options to ALTER OPERATOR to allow changing the selectivity functions associated with an existing operator (Yury Zhuravlev)

  • Add an IF NOT EXISTS option to ALTER TABLE ADD COLUMN (Fabrízio de Royes Mello)

  • Reduce the lock strength needed by ALTER TABLE when setting fillfactor and autovacuum-related relation options (Fabrízio de Royes Mello, Simon Riggs)

  • Introduce CREATE ACCESS METHOD to allow extensions to create index access methods (Alexander Korotkov, Petr Jelínek)

  • Add a CASCADE option to CREATE EXTENSION to automatically create any extensions the requested one depends on (Petr Jelínek)

  • Make CREATE TABLE ... LIKE include an OID column if any source table has one (Bruce Momjian)

  • If a CHECK constraint is declared NOT VALID in a table creation command, automatically mark it as valid (Amit Langote, Amul Sul)

    This is safe because the table has no existing rows. This matches the longstanding behavior of FOREIGN KEY constraints.

  • Fix DROP OPERATOR to clear pg_operator.oprcom and pg_operator.oprnegate links to the dropped operator (Roma Sokolov)

    Formerly such links were left as-is, which could pose a problem in the somewhat unlikely event that the dropped operator's OID was reused for another operator.

  • Do not show the same subplan twice in EXPLAIN output (Tom Lane)

    In certain cases, typically involving SubPlan nodes in index conditions, EXPLAIN would print data for the same subplan twice.

  • Disallow creation of indexes on system columns, except for OID columns (David Rowley)

    Such indexes were never considered supported, and would very possibly misbehave since the system might change the system-column fields of a tuple without updating indexes. However, previously there were no error checks to prevent them from being created.

E.57.3.5. Permissions Management

  • Use the privilege system to manage access to sensitive functions (Stephen Frost)

    Formerly, many security-sensitive functions contained hard-wired checks that would throw an error if they were called by a non-superuser. This forced the use of superuser roles for some relatively pedestrian tasks. The hard-wired error checks are now gone in favor of making initdb revoke the default public EXECUTE privilege on these functions. This allows installations to choose to grant usage of such functions to trusted roles that do not need all superuser privileges.

  • Create some built-in roles that can be used to grant access to what were previously superuser-only functions (Stephen Frost)

    Currently the only such role is pg_signal_backend, but more are expected to be added in future.

E.57.3.6. Data Types

  • Improve full-text search to support searching for phrases, that is, lexemes appearing adjacent to each other in a specific order, or with a specified distance between them (Teodor Sigaev, Oleg Bartunov, Dmitry Ivanov)

    A phrase-search query can be specified in tsquery input using the new operators <-> and <N>. The former means that the lexemes before and after it must appear adjacent to each other in that order. The latter means they must be exactly N lexemes apart.

  • Allow omitting one or both boundaries in an array slice specifier, e.g., array_col[3:] (Yury Zhuravlev)

    Omitted boundaries are taken as the upper or lower limit of the corresponding array subscript. This allows simpler specification for many common use-cases.

  • Be more careful about out-of-range dates and timestamps (Vitaly Burovoy)

    This change prevents unexpected out-of-range errors for timestamp with time zone values very close to the implementation limits. Previously, the “same” value might be accepted or not depending on the timezone setting, meaning that a dump and reload could fail on a value that had been accepted when presented. Now the limits are enforced according to the equivalent UTC time, not local time, so as to be independent of timezone.

    Also, PostgreSQL is now more careful to detect overflow in operations that compute new date or timestamp values, such as date + integer.

  • For geometric data types, make sure infinity and NaN component values are treated consistently during input and output (Tom Lane)

    Such values will now always print the same as they would in a simple float8 column, and be accepted the same way on input. Previously the behavior was platform-dependent.

  • Upgrade the ispell dictionary type to handle modern Hunspell files and support more languages (Artur Zakirov)

  • Implement look-behind constraints in regular expressions (Tom Lane)

    A look-behind constraint is like a lookahead constraint in that it consumes no text; but it checks for existence (or nonexistence) of a match ending at the current point in the string, rather than one starting at the current point. Similar features exist in many other regular-expression engines.

  • In regular expressions, if an apparent three-digit octal escape \nnn would exceed 377 (255 decimal), assume it is a two-digit octal escape instead (Tom Lane)

    This makes the behavior match current Tcl releases.

  • Add transaction ID operators xid <> xid and xid <> int4, for consistency with the corresponding equality operators (Michael Paquier)

E.57.3.7. Functions

  • Add jsonb_insert() function to insert a new element into a jsonb array, or a not-previously-existing key into a jsonb object (Dmitry Dolgov)

  • Improve the accuracy of the ln(), log(), exp(), and pow() functions for type numeric (Dean Rasheed)

  • Add a scale(numeric) function to extract the display scale of a numeric value (Marko Tiikkaja)

  • Add trigonometric functions that work in degrees (Dean Rasheed)

    For example, sind() measures its argument in degrees, whereas sin() measures in radians. These functions go to some lengths to deliver exact results for values where an exact result can be expected, for instance sind(30) = 0.5.

  • Ensure that trigonometric functions handle infinity and NaN inputs per the POSIX standard (Dean Rasheed)

    The POSIX standard says that these functions should return NaN for NaN input, and should throw an error for out-of-range inputs including infinity. Previously our behavior varied across platforms.

  • Make to_timestamp(float8) convert float infinity to timestamp infinity (Vitaly Burovoy)

    Formerly it just failed on an infinite input.

  • Add new functions for tsvector data (Stas Kelvich)

    The new functions are ts_delete(), ts_filter(), unnest(), tsvector_to_array(), array_to_tsvector(), and a variant of setweight() that sets the weight only for specified lexeme(s).

  • Allow ts_stat() and tsvector_update_trigger() to operate on values that are of types binary-compatible with the expected argument type, not just exactly that type; for example allow citext where text is expected (Teodor Sigaev)

  • Add variadic functions num_nulls() and num_nonnulls() that count the number of their arguments that are null or non-null (Marko Tiikkaja)

    An example usage is CHECK(num_nonnulls(a,b,c) = 1) which asserts that exactly one of a,b,c is not NULL. These functions can also be used to count the number of null or nonnull elements in an array.

  • Add function parse_ident() to split a qualified, possibly quoted SQL identifier into its parts (Pavel Stehule)

  • In to_number(), interpret a V format code as dividing by 10 to the power of the number of digits following V (Bruce Momjian)

    This makes it operate in an inverse fashion to to_char().

  • Make the to_reg*() functions accept type text not cstring (Petr Korobeinikov)

    This avoids the need to write an explicit cast in most cases where the argument is not a simple literal constant.

  • Add pg_size_bytes() function to convert human-readable size strings to numbers (Pavel Stehule, Vitaly Burovoy, Dean Rasheed)

    This function converts strings like those produced by pg_size_pretty() into bytes. An example usage is SELECT oid::regclass FROM pg_class WHERE pg_total_relation_size(oid) > pg_size_bytes('10 GB').

  • In pg_size_pretty(), format negative numbers similarly to positive ones (Adrian Vondendriesch)

    Previously, negative numbers were never abbreviated, just printed in bytes.

  • Add an optional missing_ok argument to the current_setting() function (David Christensen)

    This allows avoiding an error for an unrecognized parameter name, instead returning a NULL.

  • Change various catalog-inspection functions to return NULL for invalid input (Michael Paquier)

    pg_get_viewdef() now returns NULL if given an invalid view OID, and several similar functions likewise return NULL for bad input. Previously, such cases usually led to “cache lookup failed” errors, which are not meant to occur in user-facing cases.

  • Fix pg_replication_origin_xact_reset() to not have any arguments (Fujii Masao)

    The documentation said that it has no arguments, and the C code did not expect any arguments, but the entry in pg_proc mistakenly specified two arguments.

E.57.3.8. Server-Side Languages

  • In PL/pgSQL, detect mismatched CONTINUE and EXIT statements while compiling a function, rather than at execution time (Jim Nasby)

  • Extend PL/Python's error-reporting and message-reporting functions to allow specifying additional message fields besides the primary error message (Pavel Stehule)

  • Allow PL/Python functions to call themselves recursively via SPI, and fix the behavior when multiple set-returning PL/Python functions are called within one query (Alexey Grishchenko, Tom Lane)

  • Fix session-lifespan memory leaks in PL/Python (Heikki Linnakangas, Haribabu Kommi, Tom Lane)

  • Modernize PL/Tcl to use Tcl's “object” APIs instead of simple strings (Jim Nasby, Karl Lehenbauer)

    This can improve performance substantially in some cases. Note that PL/Tcl now requires Tcl 8.4 or later.

  • In PL/Tcl, make database-reported errors return additional information in Tcl's errorCode global variable (Jim Nasby, Tom Lane)

    This feature follows the Tcl convention for returning auxiliary data about an error.

  • Fix PL/Tcl to perform encoding conversion between the database encoding and UTF-8, which is what Tcl expects (Tom Lane)

    Previously, strings were passed through without conversion, leading to misbehavior with non-ASCII characters when the database encoding was not UTF-8.

E.57.3.9. Client Interfaces

  • Add a nonlocalized version of the severity field in error and notice messages (Tom Lane)

    This change allows client code to determine severity of an error or notice without having to worry about localized variants of the severity strings.

  • Introduce a feature in libpq whereby the CONTEXT field of messages can be suppressed, either always or only for non-error messages (Pavel Stehule)

    The default behavior of PQerrorMessage() is now to print CONTEXT only for errors. The new function PQsetErrorContextVisibility() can be used to adjust this.

  • Add support in libpq for regenerating an error message with a different verbosity level (Alex Shulgin)

    This is done with the new function PQresultVerboseErrorMessage(). This supports psql's new \errverbose feature, and may be useful for other clients as well.

  • Improve libpq's PQhost() function to return useful data for default Unix-socket connections (Tom Lane)

    Previously it would return NULL if no explicit host specification had been given; now it returns the default socket directory path.

  • Fix ecpg's lexer to handle line breaks within comments starting on preprocessor directive lines (Michael Meskes)

E.57.3.10. Client Applications

  • Add a --strict-names option to pg_dump and pg_restore (Pavel Stehule)

    This option causes the program to complain if there is no match for a -t or -n option, rather than silently doing nothing.

  • In pg_dump, dump locally-made changes of privilege assignments for system objects (Stephen Frost)

    While it has always been possible for a superuser to change the privilege assignments for built-in or extension-created objects, such changes were formerly lost in a dump and reload. Now, pg_dump recognizes and dumps such changes. (This works only when dumping from a 9.6 or later server, however.)

  • Allow pg_dump to dump non-extension-owned objects that are within an extension-owned schema (Martín Marqués)

    Previously such objects were ignored because they were mistakenly assumed to belong to the extension owning their schema.

  • In pg_dump output, include the table name in object tags for object types that are only uniquely named per-table (for example, triggers) (Peter Eisentraut)

E.57.3.10.1. psql
  • Support multiple -c and -f command-line options (Pavel Stehule, Catalin Iacob)

    The specified operations are carried out in the order in which the options are given, and then psql terminates.

  • Add a \crosstabview command that prints the results of a query in a cross-tabulated display (Daniel Vérité)

    In the crosstab display, data values from one query result column are placed in a grid whose column and row headers come from other query result columns.

  • Add an \errverbose command that shows the last server error at full verbosity (Alex Shulgin)

    This is useful after getting an unexpected error — you no longer need to adjust the VERBOSITY variable and recreate the failure in order to see error fields that are not shown by default.

  • Add \ev and \sv commands for editing and showing view definitions (Petr Korobeinikov)

    These are parallel to the existing \ef and \sf commands for functions.

  • Add a \gexec command that executes a query and re-submits the result(s) as new queries (Corey Huinker)

  • Allow \pset C string to set the table title, for consistency with \C string (Bruce Momjian)

  • In \pset expanded auto mode, do not use expanded format for query results with only one column (Andreas Karlsson, Robert Haas)

  • Improve the headers output by the \watch command (Michael Paquier, Tom Lane)

    Include the \pset title string if one has been set, and shorten the prefabricated part of the header to be timestamp (every Ns). Also, the timestamp format now obeys psql's locale environment.

  • Improve tab-completion logic to consider the entire input query, not only the current line (Tom Lane)

    Previously, breaking a command into multiple lines defeated any tab completion rules that needed to see words on earlier lines.

  • Numerous minor improvements in tab-completion behavior (Peter Eisentraut, Vik Fearing, Kevin Grittner, Kyotaro Horiguchi, Jeff Janes, Andreas Karlsson, Fujii Masao, Thomas Munro, Masahiko Sawada, Pavel Stehule)

  • Add a PROMPT option %p to insert the process ID of the connected backend (Julien Rouhaud)

  • Introduce a feature whereby the CONTEXT field of messages can be suppressed, either always or only for non-error messages (Pavel Stehule)

    Printing CONTEXT only for errors is now the default behavior. This can be changed by setting the special variable SHOW_CONTEXT.

  • Make \df+ show function access privileges and parallel-safety attributes (Michael Paquier)

E.57.3.10.2. pgbench
  • SQL commands in pgbench scripts are now ended by semicolons, not newlines (Kyotaro Horiguchi, Tom Lane)

    This change allows SQL commands in scripts to span multiple lines. Existing custom scripts will need to be modified to add a semicolon at the end of each line that does not have one already. (Doing so does not break the script for use with older versions of pgbench.)

  • Support floating-point arithmetic, as well as some built-in functions, in expressions in backslash commands (Fabien Coelho)

  • Replace \setrandom with built-in functions (Fabien Coelho)

    The new built-in functions include random(), random_exponential(), and random_gaussian(), which perform the same work as \setrandom, but are easier to use since they can be embedded in larger expressions. Since these additions have made \setrandom obsolete, remove it.

  • Allow invocation of multiple copies of the built-in scripts, not only custom scripts (Fabien Coelho)

    This is done with the new -b switch, which works similarly to -f for custom scripts.

  • Allow changing the selection probabilities (weights) for scripts (Fabien Coelho)

    When multiple scripts are specified, each pgbench transaction randomly chooses one to execute. Formerly this was always done with uniform probability, but now different selection probabilities can be specified for different scripts.

  • Collect statistics for each script in a multi-script run (Fabien Coelho)

    This feature adds an intermediate level of detail to existing global and per-command statistics printouts.

  • Add a --progress-timestamp option to report progress with Unix epoch timestamps, instead of time since the run started (Fabien Coelho)

  • Allow the number of client connections (-c) to not be an exact multiple of the number of threads (-j) (Fabien Coelho)

  • When the -T option is used, stop promptly at the end of the specified time (Fabien Coelho)

    Previously, specifying a low transaction rate could cause pgbench to wait significantly longer than specified.

E.57.3.11. Server Applications

  • Improve error reporting during initdb's post-bootstrap phase (Tom Lane)

    Previously, an error here led to reporting the entire input file as the “failing query”; now just the current query is reported. To get the desired behavior, queries in initdb's input files must be separated by blank lines.

  • Speed up initdb by using just one standalone-backend session for all the post-bootstrap steps (Tom Lane)

  • Improve pg_rewind so that it can work when the target timeline changes (Alexander Korotkov)

    This allows, for example, rewinding a promoted standby back to some state of the old master's timeline.

E.57.3.12. Source Code

  • Remove obsolete heap_formtuple/heap_modifytuple/heap_deformtuple functions (Peter Geoghegan)

  • Add macros to make AllocSetContextCreate() calls simpler and safer (Tom Lane)

    Writing out the individual sizing parameters for a memory context is now deprecated in favor of using one of the new macros ALLOCSET_DEFAULT_SIZES, ALLOCSET_SMALL_SIZES, or ALLOCSET_START_SMALL_SIZES. Existing code continues to work, however.

  • Unconditionally use static inline functions in header files (Andres Freund)

    This may result in warnings and/or wasted code space with very old compilers, but the notational improvement seems worth it.

  • Improve TAP testing infrastructure (Michael Paquier, Craig Ringer, Álvaro Herrera, Stephen Frost)

    Notably, it is now possible to test recovery scenarios using this infrastructure.

  • Make trace_lwlocks identify individual locks by name (Robert Haas)

  • Improve psql's tab-completion code infrastructure (Thomas Munro, Michael Paquier)

    Tab-completion rules are now considerably easier to write, and more compact.

  • Nail the pg_shseclabel system catalog into cache, so that it is available for access during connection authentication (Adam Brightwell)

    The core code does not use this catalog for authentication, but extensions might wish to consult it.

  • Restructure index access method API to hide most of it at the C level (Alexander Korotkov, Andrew Gierth)

    This change modernizes the index AM API to look more like the designs we have adopted for foreign data wrappers and tablesample handlers. This simplifies the C code and makes it much more practical to define index access methods in installable extensions. A consequence is that most of the columns of the pg_am system catalog have disappeared. New inspection functions have been added to allow SQL queries to determine index AM properties that used to be discoverable from pg_am.

  • Add pg_init_privs system catalog to hold original privileges of initdb-created and extension-created objects (Stephen Frost)

    This infrastructure allows pg_dump to dump changes that an installation may have made in privileges attached to system objects. Formerly, such changes would be lost in a dump and reload, but now they are preserved.

  • Change the way that extensions allocate custom LWLocks (Amit Kapila, Robert Haas)

    The RequestAddinLWLocks() function is removed, and replaced by RequestNamedLWLockTranche(). This allows better identification of custom LWLocks, and is less error-prone.

  • Improve the isolation tester to allow multiple sessions to wait concurrently, allowing testing of deadlock scenarios (Robert Haas)

  • Introduce extensible node types (KaiGai Kohei)

    This change allows FDWs or custom scan providers to store data in a plan tree in a more convenient format than was previously possible.

  • Make the planner deal with post-scan/join query steps by generating and comparing Paths, replacing a lot of ad-hoc logic (Tom Lane)

    This change provides only marginal user-visible improvements today, but it enables future work on a lot of upper-planner improvements that were impractical to tackle using the old code structure.

  • Support partial aggregation (David Rowley, Simon Riggs)

    This change allows the computation of an aggregate function to be split into separate parts, for example so that parallel worker processes can cooperate on computing an aggregate. In future it might allow aggregation across local and remote data to occur partially on the remote end.

  • Add a generic command progress reporting facility (Vinayak Pokale, Rahila Syed, Amit Langote, Robert Haas)

  • Separate out psql's flex lexer to make it usable by other client programs (Tom Lane, Kyotaro Horiguchi)

    This eliminates code duplication for programs that need to be able to parse SQL commands well enough to identify command boundaries. Doing that in full generality is more painful than one could wish, and up to now only psql has really gotten it right among our supported client programs.

    A new source-code subdirectory src/fe_utils/ has been created to hold this and other code that is shared across our client programs. Formerly such sharing was accomplished by symbolic linking or copying source files at build time, which was ugly and required duplicate compilation.

  • Introduce WaitEventSet API to allow efficient waiting for event sets that usually do not change from one wait to the next (Andres Freund, Amit Kapila)

  • Add a generic interface for writing WAL records (Alexander Korotkov, Petr Jelínek, Markus Nullmeier)

    This change allows extensions to write WAL records for changes to pages using a standard layout. The problem of needing to replay WAL without access to the extension is solved by having generic replay code. This allows extensions to implement, for example, index access methods and have WAL support for them.

  • Support generic WAL messages for logical decoding (Petr Jelínek, Andres Freund)

    This feature allows extensions to insert data into the WAL stream that can be read by logical-decoding plugins, but is not connected to physical data restoration.

  • Allow SP-GiST operator classes to store an arbitrary “traversal value” while descending the index (Alexander Lebedev, Teodor Sigaev)

    This is somewhat like the “reconstructed value”, but it could be any arbitrary chunk of data, not necessarily of the same data type as the indexed column.

  • Introduce a LOG_SERVER_ONLY message level for ereport() (David Steele)

    This level acts like LOG except that the message is never sent to the client. It is meant for use in auditing and similar applications.

  • Provide a Makefile target to build all generated headers (Michael Paquier, Tom Lane)

    submake-generated-headers can now be invoked to ensure that generated backend header files are up-to-date. This is useful in subdirectories that might be built “standalone”.

  • Support OpenSSL 1.1.0 (Andreas Karlsson, Heikki Linnakangas)

E.57.3.13. Additional Modules

  • Add configuration parameter auto_explain.sample_rate to allow contrib/auto_explain to capture just a configurable fraction of all queries (Craig Ringer, Julien Rouhaud)

    This allows reduction of overhead for heavy query traffic, while still getting useful information on average.

  • Add contrib/bloom module that implements an index access method based on Bloom filtering (Teodor Sigaev, Alexander Korotkov)

    This is primarily a proof-of-concept for non-core index access methods, but it could be useful in its own right for queries that search many columns.

  • In contrib/cube, introduce distance operators for cubes, and support kNN-style searches in GiST indexes on cube columns (Stas Kelvich)

  • Make contrib/hstore's hstore_to_jsonb_loose() and hstore_to_json_loose() functions agree on what is a number (Tom Lane)

    Previously, hstore_to_jsonb_loose() would convert numeric-looking strings to JSON numbers, rather than strings, even if they did not exactly match the JSON syntax specification for numbers. This was inconsistent with hstore_to_json_loose(), so tighten the test to match the JSON syntax.

  • Add selectivity estimation functions for contrib/intarray operators to improve plans for queries using those operators (Yury Zhuravlev, Alexander Korotkov)

  • Make contrib/pageinspect's heap_page_items() function show the raw data in each tuple, and add new functions tuple_data_split() and heap_page_item_attrs() for inspection of individual tuple fields (Nikolay Shaplov)

  • Add an optional S2K iteration count parameter to contrib/pgcrypto's pgp_sym_encrypt() function (Jeff Janes)

  • Add support for “word similarity” to contrib/pg_trgm (Alexander Korotkov, Artur Zakirov)

    These functions and operators measure the similarity between one string and the most similar single word of another string.

  • Add configuration parameter pg_trgm.similarity_threshold for contrib/pg_trgm's similarity threshold (Artur Zakirov)

    This threshold has always been configurable, but formerly it was controlled by special-purpose functions set_limit() and show_limit(). Those are now deprecated.

  • Improve contrib/pg_trgm's GIN operator class to speed up index searches in which both common and rare keys appear (Jeff Janes)

  • Improve performance of similarity searches in contrib/pg_trgm GIN indexes (Christophe Fornaroli)

  • Add contrib/pg_visibility module to allow examining table visibility maps (Robert Haas)

  • Add ssl_extension_info() function to contrib/sslinfo, to print information about SSL extensions present in the X509 certificate used for the current connection (Dmitry Voronin)

E.57.3.13.1. postgres_fdw
  • Allow extension-provided operators and functions to be sent for remote execution, if the extension is whitelisted in the foreign server's options (Paul Ramsey)

    Users can enable this feature when the extension is known to exist in a compatible version in the remote database. It allows more efficient execution of queries involving extension operators.

  • Consider performing sorts on the remote server (Ashutosh Bapat)

  • Consider performing joins on the remote server (Shigeru Hanada, Ashutosh Bapat)

  • When feasible, perform UPDATE or DELETE entirely on the remote server (Etsuro Fujita)

    Formerly, remote updates involved sending a SELECT FOR UPDATE command and then updating or deleting the selected rows one-by-one. While that is still necessary if the operation requires any local processing, it can now be done remotely if all elements of the query are safe to send to the remote server.

  • Allow the fetch size to be set as a server or table option (Corey Huinker)

    Formerly, postgres_fdw always fetched 100 rows at a time from remote queries; now that behavior is configurable.

  • Use a single foreign-server connection for local user IDs that all map to the same remote user (Ashutosh Bapat)

  • Transmit query cancellation requests to the remote server (Michael Paquier, Etsuro Fujita)

    Previously, a local query cancellation request did not cause an already-sent remote query to terminate early.

FAQ