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 строк; теперь это количество стало настраиваемым.

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

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

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