Re: create OR REPLACE rule bug - Mailing list pgsql-bugs

From Mikael Carneholm
Subject Re: create OR REPLACE rule bug
Date
Msg-id 7F10D26ECFA1FB458B89C5B4B0D72C2B088200@sesrv12.wirelesscar.com
Whole thread Raw
In response to create OR REPLACE rule bug  ("Mikael Carneholm" <Mikael.Carneholm@WirelessCar.com>)
Responses Re: create OR REPLACE rule bug
List pgsql-bugs
Forget that, is seems as a EMS PostgreSQL Manager bug (no problem creating =
the rule when executed from the pgAdmin III Query tool)

However, the rule does not work as expected (but I have been warned, see ht=
tp://archives.postgresql.org/pgsql-general/2005-10/msg01902.php)

insert into parttest.mastertab (id, datecol)
values (nextval('mastertab_id_seq'), '20050101');

insert into parttest.mastertab (id, datecol)
values (nextval('mastertab_id_seq'), '20050201');

SELECT p.relname, m.id, m.datecol
FROM mastertab m, pg_class p
WHERE m.tableoid =3D p.oid
ORDER BY id;

relname|id|datecol
----------------------------
mastertab_jan05|1|2005-01-01
mastertab_feb05|2|2005-02-01

update mastertab set datecol =3D '20050228' where id =3D 1;

SELECT p.relname, m.id, m.datecol
FROM mastertab m, pg_class p
WHERE m.tableoid =3D p.oid
ORDER BY id;

relname|id|datecol
----------------------------
mastertab_feb05|2|2005-02-01

(row with id 1 was deleted but not re-inserted)

/Mikael


-----Original Message-----
From: Mikael Carneholm=20
Sent: den 5 november 2005 23:05
To: 'pgsql-bugs@postgresql.org'
Subject: create OR REPLACE rule bug


I believe this is a bug:

-- OR REPLACE present
create or replace rule "mastertab_jan05_update" as
on update to mastertab where
   (NEW.datecol < '20050101' or NEW.datecol >=3D '20050201')
   and
   (OLD.datecol >=3D '20050101' and OLD.datecol < '20050201')
do instead (
   -- multiple commands
   delete from mastertab_jan05 where id =3D OLD.id;
   insert into mastertab (id, datecol) values (OLD.id, NEW.datecol);
);

=3D> ERROR:  syntax error at end of input at character 255


-- OR REPLACE not present
create rule "mastertab_jan05_update" as
on update to mastertab where
   (NEW.datecol < '20050101' or NEW.datecol >=3D '20050201')
   and
   (OLD.datecol >=3D '20050101' and OLD.datecol < '20050201')
do instead (
   -- multiple commands
   delete from mastertab_jan05 where id =3D OLD.id;
   insert into mastertab (id, datecol) values (OLD.id, NEW.datecol);
);

=3D> Query OK, 0 rows affected (0,00 sec)


-- OR REPLACE present
create or replace rule "mastertab_jan05_update" as
on update to mastertab where
   (NEW.datecol < '20050101' or NEW.datecol >=3D '20050201')
   and
   (OLD.datecol >=3D '20050101' and OLD.datecol < '20050201')
do instead (
   -- single command, no semicolon
   delete from mastertab_jan05 where id =3D OLD.id=20
);

=3D> Query OK, 0 rows affected (0,00 sec)


-- OR REPLACE present
create or replace rule "mastertab_jan05_update" as
on update to mastertab where
   (NEW.datecol < '20050101' or NEW.datecol >=3D '20050201')
   and
   (OLD.datecol >=3D '20050101' and OLD.datecol < '20050201')
do instead (
   -- single command, semicolon present
   delete from mastertab_jan05 where id =3D OLD.id;
);

=3D> ERROR:  syntax error at end of input at character 255


Ie, the "OR REPLACE" token is broken in that is doesn't work with multiple =
commands (semicolons?)


/Mikael

pgsql-bugs by date:

Previous
From: "Mikael Carneholm"
Date:
Subject: create OR REPLACE rule bug
Next
From: Tom Lane
Date:
Subject: Re: create OR REPLACE rule bug