Обсуждение: Rules puzzle with "current" keyword.

Поиск
Список
Период
Сортировка

Rules puzzle with "current" keyword.

От
Keith Parks
Дата:
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.



Re: Rules puzzle with "current" keyword.

От
wieck@debis.com (Jan Wieck)
Дата:
>
> 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) #

Re: Rules puzzle with "current" keyword.

От
wieck@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) #