Rules puzzle with "current" keyword.

Started by Keith Parksover 26 years ago3 messages
#1Keith Parks
emkxp01@mtcc.demon.co.uk

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.

#2Noname
wieck@debis.com
In reply to: Keith Parks (#1)
Re: 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?

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) #

#3Noname
wieck@debis.com
In reply to: Noname (#2)
Re: Rules puzzle with "current" keyword.

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) #