Rules puzzle with "current" keyword.
Hi,
Looking at a previous bug report I noticed a strange behaviour
in rule creation and display.
postgres=> CREATE RULE rule1 AS ON UPDATE TO test1 DO INSERT INTO test2 SELECT * FROM
postgres-> test1 WHERE oid=current.oid;
ERROR: current: Table does not exist.
Above we do not recognise "current" as a special case.
If I substitute "old" for "current" the definition is accepted.
postgres=> CREATE RULE rule1 AS ON UPDATE TO test1 DO INSERT INTO test2 SELECT * FROM
postgres-> test1 WHERE oid=old.oid;
CREATE
Things get spooky when pg_rules shows the keyword "current" where I said "old".
postgres=> select * from pg_rules where rulename like '%rule1%';
tablename|rulename|definition
---------+--------+------------------------------------------------------------------------------------------------------------------
-----------------------------------------
test1 |rule1 |CREATE RULE "rule1" AS ON UPDATE TO "test1" DO INSERT INTO "test2" ("field1", "field2") SELECT "field1", "field2"
FROM "test1" WHERE "oid" = current."oid";
(1 row)
It could be that just the parser and rule decoder are out of step?
I'm not sure which is correct now "old" or "current", anyone care to comment?
Keith.
Hi,
Looking at a previous bug report I noticed a strange behaviour
in rule creation and display.postgres=> CREATE RULE rule1 AS ON UPDATE TO test1 DO INSERT INTO test2 SELECT * FROM
postgres-> test1 WHERE oid=current.oid;
ERROR: current: Table does not exist.Above we do not recognise "current" as a special case.
If I substitute "old" for "current" the definition is accepted.
postgres=> CREATE RULE rule1 AS ON UPDATE TO test1 DO INSERT INTO test2 SELECT * FROM
postgres-> test1 WHERE oid=old.oid;
CREATEThings get spooky when pg_rules shows the keyword "current" where I said "old".
postgres=> select * from pg_rules where rulename like '%rule1%';
tablename|rulename|definition
---------+--------+------------------------------------------------------------------------------------------------------------------
-----------------------------------------
test1 |rule1 |CREATE RULE "rule1" AS ON UPDATE TO "test1" DO INSERT INTO "test2" ("field1", "field2") SELECT "field1", "field2"
FROM "test1" WHERE "oid" = current."oid";
(1 row)It could be that just the parser and rule decoder are out of step?
I'm not sure which is correct now "old" or "current", anyone care to comment?
Sure - I'm the one who added OLD to v6.4 and removed CURRENT
from v6.5. I think it was announced in the release notes for
v6.4 that CURRENT will disappear in v6.5.
Seems I missed that change myself in the utilities that make
up pg_views and pg_rules.
Anyway - OLD is the correct keyword in your case. I'll take
a look at it - thanks.
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#======================================== jwieck@debis.com (Jan Wieck) #
It could be that just the parser and rule decoder are out of step?
I'm not sure which is correct now "old" or "current", anyone care to comment?
Anyway - OLD is the correct keyword in your case. I'll take
a look at it - thanks.
Fixed
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#======================================== jwieck@debis.com (Jan Wieck) #