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