-
+
reserved
reserved
+ |
+ ALSO
+ non-reserved
+
+
+
|
ALTER
non-reserved
-
+
The Rule System
- They can be INSTEAD> or not.
+ They can be INSTEAD> or ALSO> (default).
CREATE RULE rule_name> AS ON event>
TO object> [WHERE rule_qualification>]
- DO [INSTEAD] [action> | (actions>) | NOTHING];
+ DO [ALSO|INSTEAD] [action> | (actions>) | NOTHING];
in mind.
Initially the query-tree list is empty.
There can be zero (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 INSTEAD> or not.
+ can have a qualification or not and it can be INSTEAD> or ALSO> (default).
- No qualification and not INSTEAD>
+ No qualification and ALSO>
the query tree from the rule action with the original query
- Qualification given and not INSTEAD>
+ Qualification given and ALSO>
the query tree from the rule action with the rule
- Finally, if the rule is not INSTEAD>, the unchanged original query tree is
+ Finally, if the rule is ALSO>, the unchanged original query tree is
added to the list. Since only qualified 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.
- The rule is a qualified non-INSTEAD> rule, so the rule system
+ The rule is a qualified 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:
- That's it. Since the rule is not INSTEAD>, we also output the
+ That's it. Since the rule is 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:
*
*
* 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
/* ordinary key words in alphabetical order */
%token 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
opt_instead:
INSTEAD { $$ = TRUE; }
+ | ALSO { $$ = FALSE; }
| /*EMPTY*/ { $$ = FALSE; }
;
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
{"after", AFTER},
{"aggregate", AGGREGATE},
{"all", ALL},
+ {"also", ALSO},
{"alter", ALTER},
{"analyse", ANALYSE}, /* British spelling */
{"analyze", ANALYZE},
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
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;
--