From fba71c319d1008f6dc198b8585c41f7ff0a708f1 Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi Date: Fri, 24 Aug 2018 15:39:14 +0900 Subject: [PATCH 1/4] Add test for postgres_fdw foreign parition update This add a test for the failure of updating foreign partitioned table due to lack of distinction of remote child tables. This should fail. --- contrib/postgres_fdw/expected/postgres_fdw.out | 62 ++++++++++++++++++++++++++ contrib/postgres_fdw/sql/postgres_fdw.sql | 30 +++++++++++++ 2 files changed, 92 insertions(+) diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index d912bd9d54..dd4864f006 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -7568,6 +7568,68 @@ drop table loct1; drop table loct2; drop table parent; -- =================================================================== +-- test update foreign partiton table +-- =================================================================== +CREATE TABLE p1 (a int, b int); +CREATE TABLE c1 (LIKE p1) INHERITS (p1); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +CREATE TABLE c2 (LIKE p1) INHERITS (p1); +NOTICE: merging column "a" with inherited definition +NOTICE: merging column "b" with inherited definition +CREATE FOREIGN TABLE fp1 (a int, b int) + SERVER loopback OPTIONS (table_name 'p1'); +INSERT INTO c1 VALUES (0, 1); +INSERT INTO c2 VALUES (1, 1); +SELECT tableoid::int - (SELECT min(tableoid) FROM fp1)::int AS toiddiff, ctid, * FROM fp1; + toiddiff | ctid | a | b +----------+-------+---+--- + 0 | (0,1) | 0 | 1 + 0 | (0,1) | 1 | 1 +(2 rows) + +-- random() causes non-direct foreign update +EXPLAIN (VERBOSE, COSTS OFF) + UPDATE fp1 SET b = b + 1 WHERE a = 0 and random() <= 1; + QUERY PLAN +--------------------------------------------------------------------------------- + Update on public.fp1 + Remote SQL: UPDATE public.p1 SET b = $2 WHERE ctid = $1 + -> Foreign Scan on public.fp1 + Output: a, (b + 1), ctid + Filter: (random() <= '1'::double precision) + Remote SQL: SELECT a, b, ctid FROM public.p1 WHERE ((a = 0)) FOR UPDATE +(6 rows) + +UPDATE fp1 SET b = b + 1 WHERE a = 0 and random() <= 1; +-- Only one tuple should be updated +SELECT tableoid::int - (SELECT min(tableoid) FROM fp1)::int AS toiddiff, ctid, * FROM fp1; + toiddiff | ctid | a | b +----------+-------+---+--- + 0 | (0,2) | 0 | 2 + 0 | (0,1) | 1 | 1 +(2 rows) + +-- Reset ctid +TRUNCATE c1; +TRUNCATE c2; +INSERT INTO c1 VALUES (0, 1); +INSERT INTO c2 VALUES (1, 1); +DELETE FROM fp1 WHERE a = 1 and random() <= 1; +-- Only one tuple should be deleted +SELECT tableoid::int - (SELECT min(tableoid) FROM fp1)::int AS toiddiff, ctid, * FROM fp1; + toiddiff | ctid | a | b +----------+-------+---+--- + 0 | (0,1) | 0 | 1 +(1 row) + +-- cleanup +DROP FOREIGN TABLE fp1; +DROP TABLE p1 CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table c1 +drop cascades to table c2 +-- =================================================================== -- test tuple routing for foreign-table partitions -- =================================================================== -- Test insert tuple routing diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index c0b0dd949b..a821173a90 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -1846,6 +1846,36 @@ drop table loct1; drop table loct2; drop table parent; +-- =================================================================== +-- test update foreign partiton table +-- =================================================================== +CREATE TABLE p1 (a int, b int); +CREATE TABLE c1 (LIKE p1) INHERITS (p1); +CREATE TABLE c2 (LIKE p1) INHERITS (p1); +CREATE FOREIGN TABLE fp1 (a int, b int) + SERVER loopback OPTIONS (table_name 'p1'); +INSERT INTO c1 VALUES (0, 1); +INSERT INTO c2 VALUES (1, 1); +SELECT tableoid::int - (SELECT min(tableoid) FROM fp1)::int AS toiddiff, ctid, * FROM fp1; +-- random() causes non-direct foreign update +EXPLAIN (VERBOSE, COSTS OFF) + UPDATE fp1 SET b = b + 1 WHERE a = 0 and random() <= 1; +UPDATE fp1 SET b = b + 1 WHERE a = 0 and random() <= 1; +-- Only one tuple should be updated +SELECT tableoid::int - (SELECT min(tableoid) FROM fp1)::int AS toiddiff, ctid, * FROM fp1; +-- Reset ctid +TRUNCATE c1; +TRUNCATE c2; +INSERT INTO c1 VALUES (0, 1); +INSERT INTO c2 VALUES (1, 1); +DELETE FROM fp1 WHERE a = 1 and random() <= 1; +-- Only one tuple should be deleted +SELECT tableoid::int - (SELECT min(tableoid) FROM fp1)::int AS toiddiff, ctid, * FROM fp1; + +-- cleanup +DROP FOREIGN TABLE fp1; +DROP TABLE p1 CASCADE; + -- =================================================================== -- test tuple routing for foreign-table partitions -- =================================================================== -- 2.16.3