39.1. Дерево запросов#

39.1. Дерево запросов

39.1. Дерево запросов

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

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

Что такое дерево запроса? Это внутреннее представление оператора SQL, в котором отдельно хранятся его составные части. Эти деревья запросов могут быть показаны в журнале сервера, если вы установите параметры конфигурации debug_print_parse, debug_print_rewritten или debug_print_plan. Действия правил также хранятся в виде деревьев запросов в системном каталоге pg_rewrite. Они не форматируются так же, как вывод в журнале, но содержат точно такую же информацию.

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

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

the command type

Это простое значение, указывающее, какая команда (SELECT, INSERT, UPDATE, DELETE) создала дерево запроса.

the range table

Диапазон таблицы - это список отношений, которые используются в запросе. В операторе SELECT эти отношения указываются после ключевого слова FROM.

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

the result relation

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

SELECT запросы не имеют результирующего отношения. (Особый случай SELECT INTO в основном идентичен CREATE TABLE, за которым следует INSERT ... SELECT, и здесь не обсуждается отдельно).

Для команд INSERT, UPDATE и DELETE результатом является таблица (или представление!), на которую должны влиять изменения.

the target list

Список целей - это список выражений, которые определяют результат запроса. В случае команды SELECT эти выражения являются теми, которые строят окончательный вывод запроса. Они соответствуют выражениям между ключевыми словами SELECT и FROM. (*) - это всего лишь сокращение для всех имен столбцов отношения. Парсер разворачивает его в отдельные столбцы, поэтому система правил никогда его не видит.

DELETE команды не требуют обычного списка целей, потому что они не производят никакого результата. Вместо этого планировщик добавляет специальную запись CTID в пустой список целей, чтобы исполнитель мог найти строку для удаления. (CTID добавляется, когда результатом является обычная таблица. Если это представление, вместо этого добавляется переменная целой строки, системой правил, как описано в Раздел 39.2.4).

Для команд INSERT список целей описывает новые строки, которые должны быть добавлены в результирующее отношение. Он состоит из выражений в предложении VALUES или из выражений из предложения SELECT в INSERT ... SELECT. Первый шаг процесса переписывания добавляет записи в список целей для любых столбцов, которые не были назначены в исходной команде, но имеют значения по умолчанию. Любые оставшиеся столбцы (без заданного значения и без значения по умолчанию) будут заполнены планировщиком константным нулевым выражением.

Для команд UPDATE список целей описывает новые строки, которые должны заменить старые. В системе правил он содержит только выражения из части SET column = expression команды. Планировщик будет обрабатывать отсутствующие столбцы, вставляя выражения, которые копируют значения из старой строки в новую. Как и для команды DELETE, добавляется переменная CTID или переменная целой строки, чтобы исполнитель мог идентифицировать старую строку для обновления.

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

the qualification

Квалификация запроса - это выражение, похожее на одно из выражений, содержащихся в записях списка целей. Результатом этого выражения является логическое значение, которое указывает, должна ли выполняться операция (INSERT, UPDATE, DELETE или SELECT) для конечной строки результата или нет. Оно соответствует предложению WHERE в операторе SQL.

the join tree

Соединительное дерево запроса показывает структуру предложения FROM. Для простого запроса вроде SELECT ... FROM a, b, c, соединительное дерево представляет собой просто список элементов FROM, так как мы можем объединять их в любом порядке. Но когда используются выражения JOIN, особенно внешние соединения, мы должны объединять их в порядке, указанном в соединениях. В этом случае соединительное дерево показывает структуру выражений JOIN. Ограничения, связанные с конкретными предложениями JOIN (из выражений ON или USING), хранятся как выражения квалификации, присоединенные к узлам соединительного дерева. Оказывается удобным хранить верхнеуровневое выражение WHERE как квалификацию, присоединенную к верхнеуровневому элементу соединительного дерева. Таким образом, соединительное дерево на самом деле представляет как FROM, так и предложения WHERE команды SELECT.

the others

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