38.1. Дерево запросов#
38.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 добавляется, когда результатом является обычная таблица. Если это представление, вместо этого добавляется переменная целой строки, системой правил, как описано в Раздел 38.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
не представляют интереса в данном контексте. Система правил заменяет некоторые записи в этой части при применении правил, но это не имеет особого отношения к основам системы правил.