Thread: 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; > 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? 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) #