Add ALSO keyword to CREATE RULE.

Fabien COELHO
This commit is contained in:
Bruce Momjian 2004-03-09 05:05:41 +00:00
parent 53cd7cd8a9
commit 943eae92fb
6 changed files with 29 additions and 21 deletions

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/keywords.sgml,v 2.12 2003/11/29 19:51:37 pgsql Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/keywords.sgml,v 2.13 2004/03/09 05:05:40 momjian Exp $ -->
<appendix id="sql-keywords-appendix"> <appendix id="sql-keywords-appendix">
<title><acronym>SQL</acronym> Key Words</title> <title><acronym>SQL</acronym> Key Words</title>
@ -170,6 +170,12 @@
<entry>reserved</entry> <entry>reserved</entry>
<entry>reserved</entry> <entry>reserved</entry>
</row> </row>
<row>
<entry><token>ALSO</token></entry>
<entry>non-reserved</entry>
<entry></entry>
<entry></entry>
</row>
<row> <row>
<entry><token>ALTER</token></entry> <entry><token>ALTER</token></entry>
<entry>non-reserved</entry> <entry>non-reserved</entry>

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/rules.sgml,v 1.33 2003/12/13 23:59:06 neilc Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/rules.sgml,v 1.34 2004/03/09 05:05:40 momjian Exp $ -->
<Chapter Id="rules"> <Chapter Id="rules">
<Title>The Rule System</Title> <Title>The Rule System</Title>
@ -873,7 +873,7 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
<ListItem> <ListItem>
<Para> <Para>
They can be <literal>INSTEAD</> or not. They can be <literal>INSTEAD</> or <literal>ALSO</> (default).
</Para> </Para>
</ListItem> </ListItem>
@ -904,7 +904,7 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
<ProgramListing> <ProgramListing>
CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</> CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
TO <replaceable>object</> [WHERE <replaceable>rule_qualification</>] TO <replaceable>object</> [WHERE <replaceable>rule_qualification</>]
DO [INSTEAD] [<replaceable>action</> | (<replaceable>actions</>) | NOTHING]; DO [ALSO|INSTEAD] [<replaceable>action</> | (<replaceable>actions</>) | NOTHING];
</ProgramListing> </ProgramListing>
in mind. in mind.
@ -920,7 +920,7 @@ CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
Initially the query-tree list is empty. Initially the query-tree list is empty.
There can be zero (<literal>NOTHING</> key word), one, or multiple actions. There can be zero (<literal>NOTHING</> key word), one, or multiple actions.
To simplify, we will look at a rule with one action. This rule To simplify, we will look at a rule with one action. This rule
can have a qualification or not and it can be <literal>INSTEAD</> or not. can have a qualification or not and it can be <literal>INSTEAD</> or <literal>ALSO</> (default).
</Para> </Para>
<Para> <Para>
@ -937,7 +937,7 @@ CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
<variablelist> <variablelist>
<varlistentry> <varlistentry>
<term>No qualification and not <literal>INSTEAD</></term> <term>No qualification and <literal>ALSO</></term>
<listitem> <listitem>
<para> <para>
the query tree from the rule action with the original query the query tree from the rule action with the original query
@ -957,7 +957,7 @@ CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term>Qualification given and not <literal>INSTEAD</></term> <term>Qualification given and <literal>ALSO</></term>
<listitem> <listitem>
<para> <para>
the query tree from the rule action with the rule the query tree from the rule action with the rule
@ -980,7 +980,7 @@ CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
</varlistentry> </varlistentry>
</variablelist> </variablelist>
Finally, if the rule is not <literal>INSTEAD</>, the unchanged original query tree is Finally, if the rule is <literal>ALSO</>, the unchanged original query tree is
added to the list. Since only qualified <literal>INSTEAD</> rules already add the added to the list. Since only qualified <literal>INSTEAD</> rules already add the
original query tree, we end up with either one or two output query trees original query tree, we end up with either one or two output query trees
for a rule with one action. for a rule with one action.
@ -1111,7 +1111,7 @@ INSERT INTO shoelace_log VALUES (
</Para> </Para>
<Para> <Para>
The rule is a qualified non-<literal>INSTEAD</> rule, so the rule system The rule is a qualified <literal>ALSO</> rule, so the rule system
has to return two query trees: the modified rule action and the original has to return two query trees: the modified rule action and the original
query tree. In step 1, the range table of the original query is query tree. In step 1, the range table of the original query is
incorporated into the rule's action query tree. This results in: incorporated into the rule's action query tree. This results in:
@ -1190,7 +1190,7 @@ INSERT INTO shoelace_log VALUES (
</para> </para>
<para> <para>
That's it. Since the rule is not <literal>INSTEAD</>, we also output the That's it. Since the rule is <literal>ALSO</>, we also output the
original query tree. In short, the output from the rule system original query tree. In short, the output from the rule system
is a list of two query trees that correspond to these statements: is a list of two query trees that correspond to these statements:

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.446 2004/01/11 04:58:17 neilc Exp $ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.447 2004/03/09 05:05:41 momjian Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -332,7 +332,7 @@ static void doNegateFloat(Value *v);
/* ordinary key words in alphabetical order */ /* ordinary key words in alphabetical order */
%token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER %token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
AGGREGATE ALL ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC AGGREGATE ALL ALSO ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
ASSERTION ASSIGNMENT AT AUTHORIZATION ASSERTION ASSIGNMENT AT AUTHORIZATION
BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
@ -3610,6 +3610,7 @@ event: SELECT { $$ = CMD_SELECT; }
opt_instead: opt_instead:
INSTEAD { $$ = TRUE; } INSTEAD { $$ = TRUE; }
| ALSO { $$ = FALSE; }
| /*EMPTY*/ { $$ = FALSE; } | /*EMPTY*/ { $$ = FALSE; }
; ;

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.145 2004/02/21 00:34:52 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.146 2004/03/09 05:05:41 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -38,6 +38,7 @@ static const ScanKeyword ScanKeywords[] = {
{"after", AFTER}, {"after", AFTER},
{"aggregate", AGGREGATE}, {"aggregate", AGGREGATE},
{"all", ALL}, {"all", ALL},
{"also", ALSO},
{"alter", ALTER}, {"alter", ALTER},
{"analyse", ANALYSE}, /* British spelling */ {"analyse", ANALYSE}, /* British spelling */
{"analyze", ANALYZE}, {"analyze", ANALYZE},

View File

@ -34,19 +34,19 @@ create table rtest_system (sysname text, sysdesc text);
create table rtest_interface (sysname text, ifname text); create table rtest_interface (sysname text, ifname text);
create table rtest_person (pname text, pdesc text); create table rtest_person (pname text, pdesc text);
create table rtest_admin (pname text, sysname text); create table rtest_admin (pname text, sysname text);
create rule rtest_sys_upd as on update to rtest_system do ( create rule rtest_sys_upd as on update to rtest_system do also (
update rtest_interface set sysname = new.sysname update rtest_interface set sysname = new.sysname
where sysname = old.sysname; where sysname = old.sysname;
update rtest_admin set sysname = new.sysname update rtest_admin set sysname = new.sysname
where sysname = old.sysname where sysname = old.sysname
); );
create rule rtest_sys_del as on delete to rtest_system do ( create rule rtest_sys_del as on delete to rtest_system do also (
delete from rtest_interface where sysname = old.sysname; delete from rtest_interface where sysname = old.sysname;
delete from rtest_admin where sysname = old.sysname; delete from rtest_admin where sysname = old.sysname;
); );
create rule rtest_pers_upd as on update to rtest_person do create rule rtest_pers_upd as on update to rtest_person do also
update rtest_admin set pname = new.pname where pname = old.pname; update rtest_admin set pname = new.pname where pname = old.pname;
create rule rtest_pers_del as on delete to rtest_person do create rule rtest_pers_del as on delete to rtest_person do also
delete from rtest_admin where pname = old.pname; delete from rtest_admin where pname = old.pname;
-- --
-- Tables and rules for the logging test -- Tables and rules for the logging test

View File

@ -36,22 +36,22 @@ create table rtest_interface (sysname text, ifname text);
create table rtest_person (pname text, pdesc text); create table rtest_person (pname text, pdesc text);
create table rtest_admin (pname text, sysname text); create table rtest_admin (pname text, sysname text);
create rule rtest_sys_upd as on update to rtest_system do ( create rule rtest_sys_upd as on update to rtest_system do also (
update rtest_interface set sysname = new.sysname update rtest_interface set sysname = new.sysname
where sysname = old.sysname; where sysname = old.sysname;
update rtest_admin set sysname = new.sysname update rtest_admin set sysname = new.sysname
where sysname = old.sysname where sysname = old.sysname
); );
create rule rtest_sys_del as on delete to rtest_system do ( create rule rtest_sys_del as on delete to rtest_system do also (
delete from rtest_interface where sysname = old.sysname; delete from rtest_interface where sysname = old.sysname;
delete from rtest_admin where sysname = old.sysname; delete from rtest_admin where sysname = old.sysname;
); );
create rule rtest_pers_upd as on update to rtest_person do create rule rtest_pers_upd as on update to rtest_person do also
update rtest_admin set pname = new.pname where pname = old.pname; update rtest_admin set pname = new.pname where pname = old.pname;
create rule rtest_pers_del as on delete to rtest_person do create rule rtest_pers_del as on delete to rtest_person do also
delete from rtest_admin where pname = old.pname; delete from rtest_admin where pname = old.pname;
-- --