|
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>40.1. The Query Tree</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets V1.79.1" /><link rel="prev" href="rules.html" title="Chapter 40. The Rule System" /><link rel="next" href="rules-views.html" title="40.2. Views and the Rule System" /></head><body><div xmlns="http://www.w3.org/TR/xhtml1/transitional" class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">40.1. The Query Tree</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="rules.html" title="Chapter 40. The Rule System">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="rules.html" title="Chapter 40. The Rule System">Up</a></td><th width="60%" align="center">Chapter 40. The Rule System</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 12.4 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="rules-views.html" title="40.2. Views and the Rule System">Next</a></td></tr></table><hr></hr></div><div class="sect1" id="QUERYTREE"><div class="titlepage"><div><div><h2 class="title" style="clear: both">40.1. The Query Tree</h2></div></div></div><a id="id-1.8.6.6.2" class="indexterm"></a><p>
- To understand how the rule system works it is necessary to know
- when it is invoked and what its input and results are.
- </p><p>
- The rule system is located between the parser and the planner.
- It takes the output of the parser, one query tree, and the user-defined
- rewrite rules, which are also
- query trees with some extra information, and creates zero or more
- query trees as result. So its input and output are always things
- the parser itself could have produced and thus, anything it sees
- is basically representable as an <acronym class="acronym">SQL</acronym> statement.
- </p><p>
- Now what is a query tree? It is an internal representation of an
- <acronym class="acronym">SQL</acronym> statement where the single parts that it is
- built from are stored separately. These query trees can be shown
- in the server log if you set the configuration parameters
- <code class="varname">debug_print_parse</code>,
- <code class="varname">debug_print_rewritten</code>, or
- <code class="varname">debug_print_plan</code>. The rule actions are also
- stored as query trees, in the system catalog
- <code class="structname">pg_rewrite</code>. They are not formatted like
- the log output, but they contain exactly the same information.
- </p><p>
- Reading a raw query tree requires some experience. But since
- <acronym class="acronym">SQL</acronym> representations of query trees are
- sufficient to understand the rule system, this chapter will not
- teach how to read them.
- </p><p>
- When reading the <acronym class="acronym">SQL</acronym> representations of the
- query trees in this chapter it is necessary to be able to identify
- the parts the statement is broken into when it is in the query tree
- structure. The parts of a query tree are
-
- </p><div class="variablelist"><dl class="variablelist"><dt><span class="term">
- the command type
- </span></dt><dd><p>
- This is a simple value telling which command
- (<code class="command">SELECT</code>, <code class="command">INSERT</code>,
- <code class="command">UPDATE</code>, <code class="command">DELETE</code>) produced
- the query tree.
- </p></dd><dt><span class="term">
- the range table
- <a id="id-1.8.6.6.7.2.2.1.1" class="indexterm"></a>
- </span></dt><dd><p>
- The range table is a list of relations that are used in the query.
- In a <code class="command">SELECT</code> statement these are the relations given after
- the <code class="literal">FROM</code> key word.
- </p><p>
- Every range table entry identifies a table or view and tells
- by which name it is called in the other parts of the query.
- In the query tree, the range table entries are referenced by
- number rather than by name, so here it doesn't matter if there
- are duplicate names as it would in an <acronym class="acronym">SQL</acronym>
- statement. This can happen after the range tables of rules
- have been merged in. The examples in this chapter will not have
- this situation.
- </p></dd><dt><span class="term">
- the result relation
- </span></dt><dd><p>
- This is an index into the range table that identifies the
- relation where the results of the query go.
- </p><p>
- <code class="command">SELECT</code> queries don't have a result
- relation. (The special case of <code class="command">SELECT INTO</code> is
- mostly identical to <code class="command">CREATE TABLE</code> followed by
- <code class="literal">INSERT ... SELECT</code>, and is not discussed
- separately here.)
- </p><p>
- For <code class="command">INSERT</code>, <code class="command">UPDATE</code>, and
- <code class="command">DELETE</code> commands, the result relation is the table
- (or view!) where the changes are to take effect.
- </p></dd><dt><span class="term">
- the target list
- <a id="id-1.8.6.6.7.2.4.1.1" class="indexterm"></a>
- </span></dt><dd><p>
- The target list is a list of expressions that define the
- result of the query. In the case of a
- <code class="command">SELECT</code>, these expressions are the ones that
- build the final output of the query. They correspond to the
- expressions between the key words <code class="command">SELECT</code>
- and <code class="command">FROM</code>. (<code class="literal">*</code> is just an
- abbreviation for all the column names of a relation. It is
- expanded by the parser into the individual columns, so the
- rule system never sees it.)
- </p><p>
- <code class="command">DELETE</code> commands don't need a normal target list
- because they don't produce any result. Instead, the planner
- adds a special <acronym class="acronym">CTID</acronym> entry to the empty target list,
- to allow the executor to find the row to be deleted.
- (<acronym class="acronym">CTID</acronym> is added when the result relation is an ordinary
- table. If it is a view, a whole-row variable is added instead, by
- the rule system, as described in <a class="xref" href="rules-views.html#RULES-VIEWS-UPDATE" title="40.2.4. Updating a View">Section 40.2.4</a>.)
- </p><p>
- For <code class="command">INSERT</code> commands, the target list describes
- the new rows that should go into the result relation. It consists of the
- expressions in the <code class="literal">VALUES</code> clause or the ones from the
- <code class="command">SELECT</code> clause in <code class="literal">INSERT
- ... SELECT</code>. The first step of the rewrite process adds
- target list entries for any columns that were not assigned to by
- the original command but have defaults. Any remaining columns (with
- neither a given value nor a default) will be filled in by the
- planner with a constant null expression.
- </p><p>
- For <code class="command">UPDATE</code> commands, the target list
- describes the new rows that should replace the old ones. In the
- rule system, it contains just the expressions from the <code class="literal">SET
- column = expression</code> part of the command. The planner will
- handle missing columns by inserting expressions that copy the values
- from the old row into the new one. Just as for <code class="command">DELETE</code>,
- a <acronym class="acronym">CTID</acronym> or whole-row variable is added so that
- the executor can identify the old row to be updated.
- </p><p>
- Every entry in the target list contains an expression that can
- be a constant value, a variable pointing to a column of one
- of the relations in the range table, a parameter, or an expression
- tree made of function calls, constants, variables, operators, etc.
- </p></dd><dt><span class="term">
- the qualification
- </span></dt><dd><p>
- The query's qualification is an expression much like one of
- those contained in the target list entries. The result value of
- this expression is a Boolean that tells whether the operation
- (<code class="command">INSERT</code>, <code class="command">UPDATE</code>,
- <code class="command">DELETE</code>, or <code class="command">SELECT</code>) for the
- final result row should be executed or not. It corresponds to the <code class="literal">WHERE</code> clause
- of an <acronym class="acronym">SQL</acronym> statement.
- </p></dd><dt><span class="term">
- the join tree
- </span></dt><dd><p>
- The query's join tree shows the structure of the <code class="literal">FROM</code> clause.
- For a simple query like <code class="literal">SELECT ... FROM a, b, c</code>, the join tree is just
- a list of the <code class="literal">FROM</code> items, because we are allowed to join them in
- any order. But when <code class="literal">JOIN</code> expressions, particularly outer joins,
- are used, we have to join in the order shown by the joins.
- In that case, the join tree shows the structure of the <code class="literal">JOIN</code> expressions. The
- restrictions associated with particular <code class="literal">JOIN</code> clauses (from <code class="literal">ON</code> or
- <code class="literal">USING</code> expressions) are stored as qualification expressions attached
- to those join-tree nodes. It turns out to be convenient to store
- the top-level <code class="literal">WHERE</code> expression as a qualification attached to the
- top-level join-tree item, too. So really the join tree represents
- both the <code class="literal">FROM</code> and <code class="literal">WHERE</code> clauses of a <code class="command">SELECT</code>.
- </p></dd><dt><span class="term">
- the others
- </span></dt><dd><p>
- The other parts of the query tree like the <code class="literal">ORDER BY</code>
- clause aren't of interest here. The rule system
- substitutes some entries there while applying rules, but that
- doesn't have much to do with the fundamentals of the rule
- system.
- </p></dd></dl></div><p>
- </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="rules.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="rules.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="rules-views.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 40. The Rule System </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> 40.2. Views and the Rule System</td></tr></table></div></body></html>
|