diff --git a/doc/src/sgml/rules.sgml b/doc/src/sgml/rules.sgml index 79bb1629a8799c86a4907fad0782ec2d43932698..8ee30a63b4ac85c08ab99d687d50ef27cea2e985 100644 --- a/doc/src/sgml/rules.sgml +++ b/doc/src/sgml/rules.sgml @@ -1,4 +1,4 @@ -<!-- $PostgreSQL: pgsql/doc/src/sgml/rules.sgml,v 1.47 2006/09/16 00:30:15 momjian Exp $ --> +<!-- $PostgreSQL: pgsql/doc/src/sgml/rules.sgml,v 1.48 2006/12/27 16:07:36 tgl Exp $ --> <chapter id="rules"> <title>The Rule System</title> @@ -649,21 +649,6 @@ SELECT shoe_ready.shoename, shoe_ready.sh_avail, collapsing the query tree is an optimization that the rewrite system doesn't have to concern itself with. </para> - - <note> - <para> - There is currently no recursion stopping mechanism for view rules - in the rule system (only for the other kinds of rules). This - doesn't hurt much, because the only way to push this into an - endless loop (bloating up the server process until it reaches the memory - limit) is to create tables and then setup the view rules by hand - with <command>CREATE RULE</command> in such a way, that one - selects from the other that selects from the one. This could - never happen if <command>CREATE VIEW</command> is used because for - the first <command>CREATE VIEW</command>, the second relation does - not exist and thus the first view cannot select from the second. - </para> - </note> </sect2> <sect2> @@ -688,7 +673,7 @@ SELECT shoe_ready.shoename, shoe_ready.sh_avail, <programlisting> SELECT t2.b FROM t1, t2 WHERE t1.a = t2.a; -UPDATE t1 SET b = t2.b WHERE t1.a = t2.a; +UPDATE t1 SET b = t2.b FROM t2 WHERE t1.a = t2.a; </programlisting> are nearly identical. In particular: @@ -730,7 +715,7 @@ UPDATE t1 SET b = t2.b WHERE t1.a = t2.a; as <programlisting> -UPDATE t1 SET a = t1.a, b = t2.b WHERE t1.a = t2.a; +UPDATE t1 SET a = t1.a, b = t2.b FROM t2 WHERE t1.a = t2.a; </programlisting> and thus the executor run over the join will produce exactly the @@ -756,11 +741,12 @@ SELECT t1.a, t2.b FROM t1, t2 WHERE t1.a = t2.a; To resolve this problem, another entry is added to the target list in <command>UPDATE</command> (and also in <command>DELETE</command>) statements: the current tuple ID - (<acronym>CTID</>).<indexterm><primary>CTID</></> This is a system column containing the + (<acronym>CTID</>).<indexterm><primary>CTID</></> + This is a system column containing the file block number and position in the block for the row. Knowing the table, the <acronym>CTID</> can be used to retrieve the - original row of <literal>t1</> to be updated. After adding the <acronym>CTID</> - to the target list, the query actually looks like + original row of <literal>t1</> to be updated. After adding the + <acronym>CTID</> to the target list, the query actually looks like <programlisting> SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; @@ -774,8 +760,7 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; <acronym>CTID</> pointed to, the <literal>cmax</> and <literal>xmax</> entries are set to the current command counter and current transaction ID. Thus the old row is hidden, and after - the transaction committed the vacuum cleaner can really move it - out. + the transaction commits the vacuum cleaner can really remove it. </para> <para>