Thread: BUG #5202: Rule affecting more than one row is only fired once with LIMIT 1

BUG #5202: Rule affecting more than one row is only fired once with LIMIT 1

From
"Marcel Wieland"
Date:
The following bug has been logged online:

Bug reference:      5202
Logged by:          Marcel Wieland
Email address:      marcel.wieland@fondsnet.de
PostgreSQL version: 8.2
Operating system:   Linux
Description:        Rule affecting more than one row is only fired once with
LIMIT 1
Details:

BEGIN;

-- Create testing Tables
CREATE TABLE footable (
    name char
);
CREATE TABLE bartable (
    foo char
);

-- Insert testing Values
INSERT INTO footable (name) VALUES('a'), ('b');

-- RULE with LIMIT 1
CREATE OR REPLACE RULE foorule AS ON UPDATE TO footable DO
    INSERT INTO bartable (foo) SELECT name FROM footable WHERE name =
old.name LIMIT 1;

-- Query fires Rule
UPDATE footable SET name = name;
-- Result
SELECT * FROM bartable;

-- Reset
DELETE FROM bartable;

-- RULE without LIMIT 1
CREATE OR REPLACE RULE foorule AS ON UPDATE TO footable DO
    INSERT INTO bartable (foo) SELECT name FROM footable WHERE name =
old.name;

-- Query fires Rule
UPDATE footable SET name = name;
-- Result
SELECT * FROM bartable;

-- Cleanup
DROP TABLE footable;
DROP TABLE bartable;

ROLLBACK;

Re: BUG #5202: Rule affecting more than one row is only fired once with LIMIT 1

From
Robert Haas
Date:
On Fri, Nov 20, 2009 at 9:58 AM, Marcel Wieland
<marcel.wieland@fondsnet.de> wrote:
>
> The following bug has been logged online:
>
> Bug reference: =A0 =A0 =A05202
> Logged by: =A0 =A0 =A0 =A0 =A0Marcel Wieland
> Email address: =A0 =A0 =A0marcel.wieland@fondsnet.de
> PostgreSQL version: 8.2
> Operating system: =A0 Linux
> Description: =A0 =A0 =A0 =A0Rule affecting more than one row is only fire=
d once with
> LIMIT 1
> Details:
>
> BEGIN;
>
> -- Create testing Tables
> CREATE TABLE footable (
> =A0 =A0name char
> );
> CREATE TABLE bartable (
> =A0 =A0foo char
> );
>
> -- Insert testing Values
> INSERT INTO footable (name) VALUES('a'), ('b');
>
> -- RULE with LIMIT 1
> CREATE OR REPLACE RULE foorule AS ON UPDATE TO footable DO
> =A0 =A0INSERT INTO bartable (foo) SELECT name FROM footable WHERE name =
=3D
> old.name LIMIT 1;
>
> -- Query fires Rule
> UPDATE footable SET name =3D name;
> -- Result
> SELECT * FROM bartable;
>
> -- Reset
> DELETE FROM bartable;
>
> -- RULE without LIMIT 1
> CREATE OR REPLACE RULE foorule AS ON UPDATE TO footable DO
> =A0 =A0INSERT INTO bartable (foo) SELECT name FROM footable WHERE name =
=3D
> old.name;
>
> -- Query fires Rule
> UPDATE footable SET name =3D name;
> -- Result
> SELECT * FROM bartable;
>
> -- Cleanup
> DROP TABLE footable;
> DROP TABLE bartable;
>
> ROLLBACK;

See my response to your other bug report - same issues apply here.

...Robert