> Shoot me the patch again and I will put in the the queue. Thanks.
Please find attached (again) the patch I sent. It is against 7.4.1.
If necessary, I can redo the job against current head.
Have a nice day,
--
Fabien Coelho - [EMAIL PROTECTED]
*** ./doc/src/sgml/rules.sgml.orig Sun Feb 29 17:35:15 2004
--- ./doc/src/sgml/rules.sgml Sun Feb 29 17:38:45 2004
***************
*** 873,879 ****
<ListItem>
<Para>
! They can be <literal>INSTEAD</> or not.
</Para>
</ListItem>
--- 873,879 ----
<ListItem>
<Para>
! They can be <literal>INSTEAD</> or <literal>ALSO</> (default).
</Para>
</ListItem>
***************
*** 904,910 ****
<ProgramListing>
CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
TO <replaceable>object</> [WHERE <replaceable>rule_qualification</>]
! DO [INSTEAD] [<replaceable>action</> | (<replaceable>actions</>) | NOTHING];
</ProgramListing>
in mind.
--- 904,910 ----
<ProgramListing>
CREATE RULE <replaceable>rule_name</> AS ON <replaceable>event</>
TO <replaceable>object</> [WHERE <replaceable>rule_qualification</>]
! DO [ALSO|INSTEAD] [<replaceable>action</> | (<replaceable>actions</>) | NOTHING];
</ProgramListing>
in mind.
***************
*** 920,926 ****
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.
</Para>
<Para>
--- 920,926 ----
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
<literal>ALSO</> (default).
</Para>
<Para>
***************
*** 937,943 ****
<variablelist>
<varlistentry>
! <term>No qualification and not <literal>INSTEAD</></term>
<listitem>
<para>
the query tree from the rule action with the original query
--- 937,943 ----
<variablelist>
<varlistentry>
! <term>No qualification and <literal>ALSO</></term>
<listitem>
<para>
the query tree from the rule action with the original query
***************
*** 957,963 ****
</varlistentry>
<varlistentry>
! <term>Qualification given and not <literal>INSTEAD</></term>
<listitem>
<para>
the query tree from the rule action with the rule
--- 957,963 ----
</varlistentry>
<varlistentry>
! <term>Qualification given and <literal>ALSO</></term>
<listitem>
<para>
the query tree from the rule action with the rule
***************
*** 980,986 ****
</varlistentry>
</variablelist>
! Finally, if the rule is not <literal>INSTEAD</>, 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.
--- 980,986 ----
</varlistentry>
</variablelist>
! 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,1117 ****
</Para>
<Para>
! The rule is a qualified non-<literal>INSTEAD</> 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:
--- 1111,1117 ----
</Para>
<Para>
! 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,1196 ****
</para>
<para>
! That's it. Since the rule is not <literal>INSTEAD</>, 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:
--- 1190,1196 ----
</para>
<para>
! 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:
*** ./src/backend/parser/gram.y.orig Sun Feb 29 17:32:48 2004
--- ./src/backend/parser/gram.y Sun Feb 29 17:33:21 2004
***************
*** 327,333 ****
/* 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
ASSERTION ASSIGNMENT AT AUTHORIZATION
BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
--- 327,333 ----
/* ordinary key words in alphabetical order */
%token <keyword> ABORT_P ABSOLUTE_P ACCESS ACTION ADD AFTER
! AGGREGATE ALL ALSO ALTER ANALYSE ANALYZE AND ANY ARRAY AS ASC
ASSERTION ASSIGNMENT AT AUTHORIZATION
BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
***************
*** 3529,3534 ****
--- 3529,3535 ----
opt_instead:
INSTEAD
{ $$ = TRUE; }
+ | ALSO
{ $$ = FALSE; }
| /*EMPTY*/
{ $$ = FALSE; }
;
*** ./src/backend/parser/keywords.c.orig Sun Feb 29 17:29:44 2004
--- ./src/backend/parser/keywords.c Sun Feb 29 17:30:27 2004
***************
*** 38,43 ****
--- 38,44 ----
{"after", AFTER},
{"aggregate", AGGREGATE},
{"all", ALL},
+ {"also", ALSO},
{"alter", ALTER},
{"analyse", ANALYSE}, /* British spelling */
{"analyze", ANALYZE},
*** ./src/bin/psql/sql_help.h.orig Sun Feb 29 17:42:06 2004
--- ./src/bin/psql/sql_help.h Sun Feb 29 17:42:20 2004
***************
*** 159,165 ****
{ "CREATE RULE",
N_("define a new rewrite rule"),
! N_("CREATE [ OR REPLACE ] RULE name AS ON event\n TO table [ WHERE
condition ]\n DO [ INSTEAD ] { NOTHING | command | ( command ; command ... ) }") },
{ "CREATE SCHEMA",
N_("define a new schema"),
--- 159,165 ----
{ "CREATE RULE",
N_("define a new rewrite rule"),
! N_("CREATE [ OR REPLACE ] RULE name AS ON event\n TO table [ WHERE
condition ]\n DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... )
}") },
{ "CREATE SCHEMA",
N_("define a new schema"),
*** ./src/test/regress/expected/rules.out.orig Sun Feb 29 17:58:54 2004
--- ./src/test/regress/expected/rules.out Sun Feb 29 17:59:10 2004
***************
*** 29,47 ****
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 (
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 (
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
update rtest_admin set pname = new.pname where pname = old.pname;
! create rule rtest_pers_del as on delete to rtest_person do
delete from rtest_admin where pname = old.pname;
--
-- Tables and rules for the logging test
--- 29,47 ----
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 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 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 also
update rtest_admin set pname = new.pname where pname = old.pname;
! 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
*** ./src/test/regress/sql/rules.sql.orig Sun Feb 29 17:43:59 2004
--- ./src/test/regress/sql/rules.sql Sun Feb 29 17:45:47 2004
***************
*** 33,54 ****
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 (
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 (
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
update rtest_admin set pname = new.pname where pname = old.pname;
! create rule rtest_pers_del as on delete to rtest_person do
delete from rtest_admin where pname = old.pname;
--
--- 33,54 ----
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 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 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 also
update rtest_admin set pname = new.pname where pname = old.pname;
! create rule rtest_pers_del as on delete to rtest_person do also
delete from rtest_admin where pname = old.pname;
--
*** ./doc/src/sgml/keywords.sgml.orig Sun Feb 29 18:44:44 2004
--- ./doc/src/sgml/keywords.sgml Sun Feb 29 18:45:40 2004
***************
*** 171,176 ****
--- 171,182 ----
<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>
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster