From: | Terje Elde <terje(at)elde(dot)net> |
---|---|
To: | "pgsql-bugs(at)postgresql(dot)org" <pgsql-bugs(at)postgresql(dot)org> |
Subject: | Single row INSERT on updatable VIEW on top of partitioned table is run against each inheriting table, giving multiple rows from single insert. |
Date: | 2013-07-24 12:37:21 |
Message-ID: | F2788A90-359C-451F-A5B2-263709950862@elde.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
Hi,
Short summary:
If I run a single INSERT against an updateable VIEW on top of a partitioned table, it's run against all the tables/partitions. I'd expect that with UPDATE and DELETE, but not with INSERT. Result is multiple rows for a single INSERT, one for each table.
I ran into this on 9.3beta1, confirmed on 9.3beta2. Example is run against the latter.
---------- SCHEMA
-- Main table
CREATE TABLE cars (
id serial primary key,
runs boolean not null
);
-- And a table that INHERITS it.
CREATE TABLE wrecks ( ) INHERITS ( cars );
---------- VIEW
-- Simple view
CREATE VIEW cars_view AS
SELECT * FROM cars;
---------- ACTION!
-- INSERTing into the view actually inserts two rows…
bughunt=# INSERT INTO cars_view ( runs ) VALUES ( True );
INSERT 0 2
-- … one in cars…
bughunt=# SELECT count(*) FROM ONLY cars;
count
-------
1
(1 row)
-- .. and the other in wrecks.
bughunt=# SELECT count(*) FROM wrecks;
count
-------
1
(1 row)
bughunt=#
-- Insert into cars though, leads to single INSERT:
bughunt=# INSERT INTO cars ( runs ) VALUES ( True );
INSERT 0 1
---------- end ACTION!
What I'd expect to happen would be for the INSERT to only run against the parimary cars table.
To me, this looks like a bug, but opinions might differ. If this is intended and desirable behaviour, I'd say it at least warrants a mention in the docs, such as under "Updatable views" here:
http://www.postgresql.org/docs/9.3/static/sql-createview.html
Right now, that says:
"If the view is automatically updatable the system will convert any INSERT, UPDATE or DELETE statement on the view into the corresponding statement on the underlying base relation."
If the underlaying relation is cars, I'd expect it to behave more as an insert on cars.
Terje
From | Date | Subject | |
---|---|---|---|
Next Message | Terje Elde | 2013-07-24 13:11:31 | Re: Single row INSERT on updatable VIEW on top of partitioned table is run against each inheriting table, giving multiple rows from single insert. |
Previous Message | Terje Elde | 2013-07-24 12:19:05 | Single row INSERT on updatable VIEW on top of partitioned table is run against each inheriting table, giving multiple rows from single insert. |