aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2004-03-09 05:05:41 +0000
committerBruce Momjian <bruce@momjian.us>2004-03-09 05:05:41 +0000
commit943eae92fb7d8c8078a73063429c8c06599b3556 (patch)
tree14a253609729dcea09f2545d5f8491914ea14d94
parent53cd7cd8a9168d4b2e2feb52129336429cc99b98 (diff)
downloadpostgresql-943eae92fb7d8c8078a73063429c8c06599b3556.tar.gz
postgresql-943eae92fb7d8c8078a73063429c8c06599b3556.zip
Add ALSO keyword to CREATE RULE.
Fabien COELHO
-rw-r--r--doc/src/sgml/keywords.sgml8
-rw-r--r--doc/src/sgml/rules.sgml18
-rw-r--r--src/backend/parser/gram.y5
-rw-r--r--src/backend/parser/keywords.c3
-rw-r--r--src/test/regress/expected/rules.out8
-rw-r--r--src/test/regress/sql/rules.sql8
6 files changed, 29 insertions, 21 deletions
diff --git a/doc/src/sgml/keywords.sgml b/doc/src/sgml/keywords.sgml
index 51e08a360e2..e8f5d9b75c5 100644
--- a/doc/src/sgml/keywords.sgml
+++ b/doc/src/sgml/keywords.sgml
@@ -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">
<title><acronym>SQL</acronym> Key Words</title>
@@ -171,6 +171,12 @@
<entry>reserved</entry>
</row>
<row>
+ <entry><token>ALSO</token></entry>
+ <entry>non-reserved</entry>
+ <entry></entry>
+ <entry></entry>
+ </row>
+ <row>
<entry><token>ALTER</token></entry>
<entry>non-reserved</entry>
<entry>reserved</entry>
diff --git a/doc/src/sgml/rules.sgml b/doc/src/sgml/rules.sgml
index c719a651de1..a764dcfc5f4 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.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">
<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>
<Para>
- They can be <literal>INSTEAD</> or not.
+ They can be <literal>INSTEAD</> or <literal>ALSO</> (default).
</Para>
</ListItem>
@@ -904,7 +904,7 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
<ProgramListing>
CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
TO <replaceable>object</> [WHERE <replaceable>rule_qualification</>]
- DO [INSTEAD] [<replaceable>action</> | (<replaceable>actions</>) | NOTHING];
+ DO [ALSO|INSTEAD] [<replaceable>action</> | (<replaceable>actions</>) | NOTHING];
</ProgramListing>
in mind.
@@ -920,7 +920,7 @@ CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
Initially the query-tree list is empty.
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
- 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>
@@ -937,7 +937,7 @@ CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
<variablelist>
<varlistentry>
- <term>No qualification and not <literal>INSTEAD</></term>
+ <term>No qualification and <literal>ALSO</></term>
<listitem>
<para>
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>
- <term>Qualification given and not <literal>INSTEAD</></term>
+ <term>Qualification given and <literal>ALSO</></term>
<listitem>
<para>
the query tree from the rule action with the rule
@@ -980,7 +980,7 @@ CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
</varlistentry>
</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
original query tree, we end up with either one or two output query trees
for a rule with one action.
@@ -1111,7 +1111,7 @@ INSERT INTO shoelace_log VALUES (
</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
query tree. In step 1, the range table of the original query is
incorporated into the rule's action query tree. This results in:
@@ -1190,7 +1190,7 @@ INSERT INTO shoelace_log VALUES (
</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
is a list of two query trees that correspond to these statements:
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 60570716537..20db7fc6213 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* 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
* AUTHOR DATE MAJOR EVENT
@@ -332,7 +332,7 @@ static void doNegateFloat(Value *v);
/* ordinary key words in alphabetical order */
%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
BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
@@ -3610,6 +3610,7 @@ event: SELECT { $$ = CMD_SELECT; }
opt_instead:
INSTEAD { $$ = TRUE; }
+ | ALSO { $$ = FALSE; }
| /*EMPTY*/ { $$ = FALSE; }
;
diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c
index a94786690ed..24430a9cc60 100644
--- a/src/backend/parser/keywords.c
+++ b/src/backend/parser/keywords.c
@@ -8,7 +8,7 @@
*
*
* 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},
{"aggregate", AGGREGATE},
{"all", ALL},
+ {"also", ALSO},
{"alter", ALTER},
{"analyse", ANALYSE}, /* British spelling */
{"analyze", ANALYZE},
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index f7f5db4244e..902ff4472f6 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -34,19 +34,19 @@ create table rtest_system (sysname text, sysdesc text);
create table rtest_interface (sysname text, ifname text);
create table rtest_person (pname text, pdesc 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
where sysname = old.sysname;
update rtest_admin set sysname = new.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_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;
-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;
--
-- Tables and rules for the logging test
diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql
index 55c3805bd5f..908c9804628 100644
--- a/src/test/regress/sql/rules.sql
+++ b/src/test/regress/sql/rules.sql
@@ -36,22 +36,22 @@ create table rtest_interface (sysname text, ifname text);
create table rtest_person (pname text, pdesc 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
where sysname = old.sysname;
update rtest_admin set sysname = new.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_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;
-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;
--