|
1 |
| -<!-- $PostgreSQL: pgsql/doc/src/sgml/rules.sgml,v 1.36 2004/11/15 06:32:14 neilc Exp $ --> |
| 1 | +<!-- $PostgreSQL: pgsql/doc/src/sgml/rules.sgml,v 1.37 2004/12/30 03:13:56 tgl Exp $ --> |
2 | 2 |
|
3 | 3 | <Chapter Id="rules">
|
4 | 4 | <Title>The Rule System</Title>
|
|
104 | 104 | <ListItem>
|
105 | 105 | <Para>
|
106 | 106 | The range table is a list of relations that are used in the query.
|
107 |
| - In a <command>SELECT</command> statement these are the relations given after |
108 |
| - the <literal>FROM</literal> key word. |
| 107 | + In a <command>SELECT</command> statement these are the relations given after |
| 108 | + the <literal>FROM</literal> key word. |
109 | 109 | </Para>
|
110 | 110 |
|
111 | 111 | <Para>
|
112 | 112 | Every range table entry identifies a table or view and tells
|
113 |
| - by which name it is called in the other parts of the query. |
114 |
| - In the query tree, the range table entries are referenced by |
115 |
| - number rather than by name, so here it doesn't matter if there |
116 |
| - are duplicate names as it would in an <Acronym>SQL</Acronym> |
117 |
| - statement. This can happen after the range tables of rules |
118 |
| - have been merged in. The examples in this chapter will not have |
119 |
| - this situation. |
| 113 | + by which name it is called in the other parts of the query. |
| 114 | + In the query tree, the range table entries are referenced by |
| 115 | + number rather than by name, so here it doesn't matter if there |
| 116 | + are duplicate names as it would in an <Acronym>SQL</Acronym> |
| 117 | + statement. This can happen after the range tables of rules |
| 118 | + have been merged in. The examples in this chapter will not have |
| 119 | + this situation. |
120 | 120 | </Para>
|
121 | 121 | </ListItem>
|
122 | 122 | </VarListEntry>
|
|
128 | 128 | <ListItem>
|
129 | 129 | <Para>
|
130 | 130 | This is an index into the range table that identifies the
|
131 |
| - relation where the results of the query go. |
| 131 | + relation where the results of the query go. |
132 | 132 | </Para>
|
133 | 133 |
|
134 | 134 | <Para>
|
135 |
| - <command>SELECT</command> queries normally don't have a result |
136 |
| - relation. The special case of a <command>SELECT INTO</command> is |
137 |
| - mostly identical to a <command>CREATE TABLE</command> followed by a |
138 |
| - <literal>INSERT ... SELECT</literal> and is not discussed |
139 |
| - separately here. |
| 135 | + <command>SELECT</command> queries normally don't have a result |
| 136 | + relation. The special case of a <command>SELECT INTO</command> is |
| 137 | + mostly identical to a <command>CREATE TABLE</command> followed by a |
| 138 | + <literal>INSERT ... SELECT</literal> and is not discussed |
| 139 | + separately here. |
140 | 140 | </Para>
|
141 | 141 |
|
142 | 142 | <Para>
|
143 | 143 | For <command>INSERT</command>, <command>UPDATE</command>, and
|
144 |
| - <command>DELETE</command> commands, the result relation is the table |
145 |
| - (or view!) where the changes take effect. |
| 144 | + <command>DELETE</command> commands, the result relation is the table |
| 145 | + (or view!) where the changes are to take effect. |
146 | 146 | </Para>
|
147 | 147 | </ListItem>
|
148 | 148 | </VarListEntry>
|
|
167 | 167 |
|
168 | 168 | <Para>
|
169 | 169 | <command>DELETE</command> commands don't need a target list
|
170 |
| - because they don't produce any result. In fact, the planner will |
171 |
| - add a special <acronym>CTID</> entry to the empty target list, but |
172 |
| - this is after the rule system and will be discussed later; for the |
173 |
| - rule system, the target list is empty. |
| 170 | + because they don't produce any result. In fact, the planner will |
| 171 | + add a special <acronym>CTID</> entry to the empty target list, but |
| 172 | + this is after the rule system and will be discussed later; for the |
| 173 | + rule system, the target list is empty. |
174 | 174 | </Para>
|
175 | 175 |
|
176 | 176 | <Para>
|
177 | 177 | For <command>INSERT</command> commands, the target list describes
|
178 |
| - the new rows that should go into the result relation. It consists of the |
179 |
| - expressions in the <literal>VALUES</> clause or the ones from the |
180 |
| - <command>SELECT</command> clause in <literal>INSERT |
181 |
| - ... SELECT</literal>. The first step of the rewrite process adds |
182 |
| - target list entries for any columns that were not assigned to by |
183 |
| - the original command but have defaults. Any remaining columns (with |
184 |
| - neither a given value nor a default) will be filled in by the |
185 |
| - planner with a constant null expression. |
| 178 | + the new rows that should go into the result relation. It consists of the |
| 179 | + expressions in the <literal>VALUES</> clause or the ones from the |
| 180 | + <command>SELECT</command> clause in <literal>INSERT |
| 181 | + ... SELECT</literal>. The first step of the rewrite process adds |
| 182 | + target list entries for any columns that were not assigned to by |
| 183 | + the original command but have defaults. Any remaining columns (with |
| 184 | + neither a given value nor a default) will be filled in by the |
| 185 | + planner with a constant null expression. |
186 | 186 | </Para>
|
187 | 187 |
|
188 | 188 | <Para>
|
189 | 189 | For <command>UPDATE</command> commands, the target list
|
190 |
| - describes the new rows that should replace the old ones. In the |
191 |
| - rule system, it contains just the expressions from the <literal>SET |
192 |
| - column = expression</literal> part of the command. The planner will handle |
193 |
| - missing columns by inserting expressions that copy the values from |
194 |
| - the old row into the new one. And it will add the special |
195 |
| - <acronym>CTID</> entry just as for <command>DELETE</command>, too. |
| 190 | + describes the new rows that should replace the old ones. In the |
| 191 | + rule system, it contains just the expressions from the <literal>SET |
| 192 | + column = expression</literal> part of the command. The planner will handle |
| 193 | + missing columns by inserting expressions that copy the values from |
| 194 | + the old row into the new one. And it will add the special |
| 195 | + <acronym>CTID</> entry just as for <command>DELETE</command>, too. |
196 | 196 | </Para>
|
197 | 197 |
|
198 | 198 | <Para>
|
199 | 199 | Every entry in the target list contains an expression that can
|
200 |
| - be a constant value, a variable pointing to a column of one |
201 |
| - of the relations in the range table, a parameter, or an expression |
202 |
| - tree made of function calls, constants, variables, operators, etc. |
| 200 | + be a constant value, a variable pointing to a column of one |
| 201 | + of the relations in the range table, a parameter, or an expression |
| 202 | + tree made of function calls, constants, variables, operators, etc. |
203 | 203 | </Para>
|
204 | 204 | </ListItem>
|
205 | 205 | </VarListEntry>
|
|
211 | 211 | <ListItem>
|
212 | 212 | <Para>
|
213 | 213 | The query's qualification is an expression much like one of
|
214 |
| - those contained in the target list entries. The result value of |
215 |
| - this expression is a Boolean that tells whether the operation |
216 |
| - (<command>INSERT</command>, <command>UPDATE</command>, |
217 |
| - <command>DELETE</command>, or <command>SELECT</command>) for the |
218 |
| - final result row should be executed or not. It corresponds to the <literal>WHERE</> clause |
219 |
| - of an <Acronym>SQL</Acronym> statement. |
| 214 | + those contained in the target list entries. The result value of |
| 215 | + this expression is a Boolean that tells whether the operation |
| 216 | + (<command>INSERT</command>, <command>UPDATE</command>, |
| 217 | + <command>DELETE</command>, or <command>SELECT</command>) for the |
| 218 | + final result row should be executed or not. It corresponds to the <literal>WHERE</> clause |
| 219 | + of an <Acronym>SQL</Acronym> statement. |
220 | 220 | </Para>
|
221 | 221 | </ListItem>
|
222 | 222 | </VarListEntry>
|
|
228 | 228 | <ListItem>
|
229 | 229 | <Para>
|
230 | 230 | The query's join tree shows the structure of the <literal>FROM</> clause.
|
231 |
| - For a simple query like <literal>SELECT ... FROM a, b, c</literal>, the join tree is just |
232 |
| - a list of the <literal>FROM</> items, because we are allowed to join them in |
233 |
| - any order. But when <literal>JOIN</> expressions, particularly outer joins, |
234 |
| - are used, we have to join in the order shown by the joins. |
235 |
| - In that case, the join tree shows the structure of the <literal>JOIN</> expressions. The |
236 |
| - restrictions associated with particular <literal>JOIN</> clauses (from <literal>ON</> or |
237 |
| - <literal>USING</> expressions) are stored as qualification expressions attached |
238 |
| - to those join-tree nodes. It turns out to be convenient to store |
239 |
| - the top-level <literal>WHERE</> expression as a qualification attached to the |
240 |
| - top-level join-tree item, too. So really the join tree represents |
241 |
| - both the <literal>FROM</> and <literal>WHERE</> clauses of a <command>SELECT</command>. |
| 231 | + For a simple query like <literal>SELECT ... FROM a, b, c</literal>, the join tree is just |
| 232 | + a list of the <literal>FROM</> items, because we are allowed to join them in |
| 233 | + any order. But when <literal>JOIN</> expressions, particularly outer joins, |
| 234 | + are used, we have to join in the order shown by the joins. |
| 235 | + In that case, the join tree shows the structure of the <literal>JOIN</> expressions. The |
| 236 | + restrictions associated with particular <literal>JOIN</> clauses (from <literal>ON</> or |
| 237 | + <literal>USING</> expressions) are stored as qualification expressions attached |
| 238 | + to those join-tree nodes. It turns out to be convenient to store |
| 239 | + the top-level <literal>WHERE</> expression as a qualification attached to the |
| 240 | + top-level join-tree item, too. So really the join tree represents |
| 241 | + both the <literal>FROM</> and <literal>WHERE</> clauses of a <command>SELECT</command>. |
242 | 242 | </Para>
|
243 | 243 | </ListItem>
|
244 | 244 | </VarListEntry>
|
|
250 | 250 | <ListItem>
|
251 | 251 | <Para>
|
252 | 252 | The other parts of the query tree like the <literal>ORDER BY</>
|
253 |
| - clause aren't of interest here. The rule system |
254 |
| - substitutes some entries there while applying rules, but that |
255 |
| - doesn't have much to do with the fundamentals of the rule |
256 |
| - system. |
| 253 | + clause aren't of interest here. The rule system |
| 254 | + substitutes some entries there while applying rules, but that |
| 255 | + doesn't have much to do with the fundamentals of the rule |
| 256 | + system. |
257 | 257 | </Para>
|
258 | 258 | </ListItem>
|
259 | 259 | </VarListEntry>
|
@@ -322,7 +322,7 @@ CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
|
322 | 322 | Currently, there can be only one action in an <literal>ON SELECT</> rule, and it must
|
323 | 323 | be an unconditional <command>SELECT</> action that is <literal>INSTEAD</>. This restriction was
|
324 | 324 | required to make rules safe enough to open them for ordinary users, and
|
325 |
| - it restricts <literal>ON SELECT</> rules to real view rules. |
| 325 | + it restricts <literal>ON SELECT</> rules to act like views. |
326 | 326 | </Para>
|
327 | 327 |
|
328 | 328 | <Para>
|
@@ -695,29 +695,29 @@ UPDATE t1 SET b = t2.b WHERE t1.a = t2.a;
|
695 | 695 |
|
696 | 696 | <ItemizedList>
|
697 | 697 | <ListItem>
|
698 |
| - <Para> |
699 |
| - The range tables contain entries for the tables <literal>t1</> and <literal>t2</>. |
700 |
| - </Para> |
| 698 | + <Para> |
| 699 | + The range tables contain entries for the tables <literal>t1</> and <literal>t2</>. |
| 700 | + </Para> |
701 | 701 | </ListItem>
|
702 | 702 |
|
703 | 703 | <ListItem>
|
704 |
| - <Para> |
705 |
| - The target lists contain one variable that points to column |
706 |
| - <literal>b</> of the range table entry for table <literal>t2</>. |
707 |
| - </Para> |
| 704 | + <Para> |
| 705 | + The target lists contain one variable that points to column |
| 706 | + <literal>b</> of the range table entry for table <literal>t2</>. |
| 707 | + </Para> |
708 | 708 | </ListItem>
|
709 | 709 |
|
710 | 710 | <ListItem>
|
711 |
| - <Para> |
712 |
| - The qualification expressions compare the columns <literal>a</> of both |
713 |
| - range-table entries for equality. |
714 |
| - </Para> |
| 711 | + <Para> |
| 712 | + The qualification expressions compare the columns <literal>a</> of both |
| 713 | + range-table entries for equality. |
| 714 | + </Para> |
715 | 715 | </ListItem>
|
716 | 716 |
|
717 | 717 | <ListItem>
|
718 |
| - <Para> |
719 |
| - The join trees show a simple join between <literal>t1</> and <literal>t2</>. |
720 |
| - </Para> |
| 718 | + <Para> |
| 719 | + The join trees show a simple join between <literal>t1</> and <literal>t2</>. |
| 720 | + </Para> |
721 | 721 | </ListItem>
|
722 | 722 | </ItemizedList>
|
723 | 723 | </para>
|
@@ -860,34 +860,34 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
|
860 | 860 |
|
861 | 861 | <ItemizedList>
|
862 | 862 | <ListItem>
|
863 |
| - <Para> |
864 |
| - They are allowed to have no action. |
865 |
| - </Para> |
866 |
| - </ListItem> |
| 863 | + <Para> |
| 864 | + They are allowed to have no action. |
| 865 | + </Para> |
| 866 | + </ListItem> |
867 | 867 |
|
868 | 868 | <ListItem>
|
869 |
| - <Para> |
870 |
| - They can have multiple actions. |
871 |
| - </Para> |
872 |
| - </ListItem> |
| 869 | + <Para> |
| 870 | + They can have multiple actions. |
| 871 | + </Para> |
| 872 | + </ListItem> |
873 | 873 |
|
874 | 874 | <ListItem>
|
875 |
| - <Para> |
876 |
| - They can be <literal>INSTEAD</> or <literal>ALSO</> (default). |
877 |
| - </Para> |
878 |
| - </ListItem> |
| 875 | + <Para> |
| 876 | + They can be <literal>INSTEAD</> or <literal>ALSO</> (default). |
| 877 | + </Para> |
| 878 | + </ListItem> |
879 | 879 |
|
880 | 880 | <ListItem>
|
881 |
| - <Para> |
882 |
| - The pseudorelations <literal>NEW</> and <literal>OLD</> become useful. |
883 |
| - </Para> |
884 |
| - </ListItem> |
| 881 | + <Para> |
| 882 | + The pseudorelations <literal>NEW</> and <literal>OLD</> become useful. |
| 883 | + </Para> |
| 884 | + </ListItem> |
885 | 885 |
|
886 | 886 | <ListItem>
|
887 |
| - <Para> |
888 |
| - They can have rule qualifications. |
889 |
| - </Para> |
890 |
| - </ListItem> |
| 887 | + <Para> |
| 888 | + They can have rule qualifications. |
| 889 | + </Para> |
| 890 | + </ListItem> |
891 | 891 | </ItemizedList>
|
892 | 892 |
|
893 | 893 | Second, they don't modify the query tree in place. Instead they
|
@@ -1875,14 +1875,15 @@ GRANT SELECT ON phone_number TO secretary;
|
1875 | 1875 | </Para>
|
1876 | 1876 |
|
1877 | 1877 | <Para>
|
1878 |
| - For the things that can be implemented by both, |
1879 |
| - it depends on the usage of the database, which is the best. |
| 1878 | + For the things that can be implemented by both, which is best |
| 1879 | + depends on the usage of the database. |
1880 | 1880 | A trigger is fired for any affected row once. A rule manipulates
|
1881 |
| - the query tree or generates an additional one. So if many |
| 1881 | + the query or generates an additional query. So if many |
1882 | 1882 | rows are affected in one statement, a rule issuing one extra
|
1883 |
| - command would usually do a better job than a trigger that is |
| 1883 | + command is likely to be faster than a trigger that is |
1884 | 1884 | called for every single row and must execute its operations
|
1885 |
| - many times. |
| 1885 | + many times. However, the trigger approach is conceptually far |
| 1886 | + simpler than the rule approach, and is easier for novices to get right. |
1886 | 1887 | </Para>
|
1887 | 1888 |
|
1888 | 1889 | <Para>
|
|
0 commit comments