From: | Amit Langote <Langote_Amit_f8(at)lab(dot)ntt(dot)co(dot)jp> |
---|---|
To: | Pg Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Foreign tables don't enforce the partition constraint |
Date: | 2017-03-31 08:06:18 |
Message-ID: | 8f89dcb2-bd15-d8dc-5f54-3e11dc6c9463@lab.ntt.co.jp |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
We don't enforce the constraints defined on foreign tables in ExecInsert()
and ExecUpdate(). (COPY FROM does not support foreign tables at all.)
Since partition constraints are enforced using ExecConstraints() which is
not called for foreign tables, they will not be checked if one inserts
directly into foreign partitions. So:
create table p (a int) partition by list (a);
create table p1t (like p);
create table p2t (like p);
create foreign table p1 partition of p for values in (1)
server loopback options (table_name 'p1t');
create foreign table p2 partition of p for values in (2)
server loopback options (table_name 'p2t');
insert into p1 values (2); -- ungood
insert into p2 values (1); -- ungood
While we have the ability to mark check constraints as being NOT VALID so
that planner can ignore them, partition constraints are assumed to
*always* hold, giving possibly surprising results.
explain (costs off) select * from p where a = 1;
QUERY PLAN
--------------------------
Append
-> Foreign Scan on p1
(2 rows)
select * from p where a = 1;
a
---
(0 rows)
explain (costs off) select * from p where a = 2;
QUERY PLAN
--------------------------
Append
-> Foreign Scan on p2
(2 rows)
select * from p where a = 2;
a
---
(0 rows)
Should we do something about this (treat as an open item)?
Thanks,
Amit
From | Date | Subject | |
---|---|---|---|
Next Message | Andreas Karlsson | 2017-03-31 08:12:13 | Re: REINDEX CONCURRENTLY 2.0 |
Previous Message | Tsunakawa, Takayuki | 2017-03-31 07:46:00 | Re: Allow interrupts on waiting standby |