Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 4b565fe

Browse files
Alexander PyhalovCommitfest Bot
Alexander Pyhalov
authored and
Commitfest Bot
committed
postgres_fdw: fix partition-wise DML
1 parent 52ab882 commit 4b565fe

File tree

6 files changed

+323
-18
lines changed

6 files changed

+323
-18
lines changed

contrib/postgres_fdw/deparse.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,7 +2307,7 @@ deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root,
23072307

23082308
appendStringInfoString(buf, "UPDATE ");
23092309
deparseRelation(buf, rel);
2310-
if (foreignrel->reloptkind == RELOPT_JOINREL)
2310+
if (IS_JOIN_REL(foreignrel))
23112311
appendStringInfo(buf, " %s%d", REL_ALIAS_PREFIX, rtindex);
23122312
appendStringInfoString(buf, " SET ");
23132313

@@ -2334,7 +2334,7 @@ deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root,
23342334

23352335
reset_transmission_modes(nestlevel);
23362336

2337-
if (foreignrel->reloptkind == RELOPT_JOINREL)
2337+
if (IS_JOIN_REL(foreignrel))
23382338
{
23392339
List *ignore_conds = NIL;
23402340

@@ -2350,7 +2350,7 @@ deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root,
23502350
if (additional_conds != NIL)
23512351
list_free_deep(additional_conds);
23522352

2353-
if (foreignrel->reloptkind == RELOPT_JOINREL)
2353+
if (IS_JOIN_REL(foreignrel))
23542354
deparseExplicitTargetList(returningList, true, retrieved_attrs,
23552355
&context);
23562356
else
@@ -2415,10 +2415,10 @@ deparseDirectDeleteSql(StringInfo buf, PlannerInfo *root,
24152415

24162416
appendStringInfoString(buf, "DELETE FROM ");
24172417
deparseRelation(buf, rel);
2418-
if (foreignrel->reloptkind == RELOPT_JOINREL)
2418+
if (IS_JOIN_REL(foreignrel))
24192419
appendStringInfo(buf, " %s%d", REL_ALIAS_PREFIX, rtindex);
24202420

2421-
if (foreignrel->reloptkind == RELOPT_JOINREL)
2421+
if (IS_JOIN_REL(foreignrel))
24222422
{
24232423
List *ignore_conds = NIL;
24242424

@@ -2433,7 +2433,7 @@ deparseDirectDeleteSql(StringInfo buf, PlannerInfo *root,
24332433
if (additional_conds != NIL)
24342434
list_free_deep(additional_conds);
24352435

2436-
if (foreignrel->reloptkind == RELOPT_JOINREL)
2436+
if (IS_JOIN_REL(foreignrel))
24372437
deparseExplicitTargetList(returningList, true, retrieved_attrs,
24382438
&context);
24392439
else

contrib/postgres_fdw/expected/postgres_fdw.out

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10294,6 +10294,166 @@ SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a
1029410294
(4 rows)
1029510295

1029610296
reset enable_sort;
10297+
-- test partition-wise DML
10298+
EXPLAIN (COSTS OFF, VERBOSE)
10299+
UPDATE fprt1 SET b=fprt1.b+1 FROM fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0;
10300+
QUERY PLAN
10301+
----------------------------------------------------------------------------------------------------------------------------------------------
10302+
Update on public.fprt1
10303+
Foreign Update on public.ftprt1_p1 fprt1_1
10304+
Foreign Update on public.ftprt1_p2 fprt1_2
10305+
-> Append
10306+
-> Foreign Update
10307+
Remote SQL: UPDATE public.fprt1_p1 r3 SET b = (r3.b + 1) FROM public.fprt2_p1 r5 WHERE ((r3.a = r5.b)) AND (((r5.a % 25) = 0))
10308+
-> Foreign Update
10309+
Remote SQL: UPDATE public.fprt1_p2 r4 SET b = (r4.b + 1) FROM public.fprt2_p2 r6 WHERE ((r4.a = r6.b)) AND (((r6.a % 25) = 0))
10310+
(8 rows)
10311+
10312+
UPDATE fprt1 SET b=fprt1.b+1 FROM fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0;
10313+
EXPLAIN (COSTS OFF, VERBOSE)
10314+
UPDATE fprt1 SET b=(fprt1.a+fprt2.b)/2 FROM fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0;
10315+
QUERY PLAN
10316+
-------------------------------------------------------------------------------------------------------------------------------------------------------
10317+
Update on public.fprt1
10318+
Foreign Update on public.ftprt1_p1 fprt1_1
10319+
Foreign Update on public.ftprt1_p2 fprt1_2
10320+
-> Append
10321+
-> Foreign Update
10322+
Remote SQL: UPDATE public.fprt1_p1 r3 SET b = ((r3.a + r5.b) / 2) FROM public.fprt2_p1 r5 WHERE ((r3.a = r5.b)) AND (((r5.a % 25) = 0))
10323+
-> Foreign Update
10324+
Remote SQL: UPDATE public.fprt1_p2 r4 SET b = ((r4.a + r6.b) / 2) FROM public.fprt2_p2 r6 WHERE ((r4.a = r6.b)) AND (((r6.a % 25) = 0))
10325+
(8 rows)
10326+
10327+
UPDATE fprt1 SET b=(fprt1.a+fprt2.b)/2 FROM fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0;
10328+
-- returning whole row references
10329+
EXPLAIN (COSTS OFF)
10330+
UPDATE fprt1 SET b=fprt1.b+1 FROM fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0 RETURNING fprt1, fprt2;
10331+
QUERY PLAN
10332+
---------------------------------------
10333+
Update on fprt1
10334+
Foreign Update on ftprt1_p1 fprt1_1
10335+
Foreign Update on ftprt1_p2 fprt1_2
10336+
-> Append
10337+
-> Foreign Update
10338+
-> Foreign Update
10339+
(6 rows)
10340+
10341+
UPDATE fprt1 SET b=fprt1.b+1 FROM fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0 RETURNING fprt1, fprt2;
10342+
fprt1 | fprt2
10343+
----------------+----------------
10344+
(0,1,0000) | (0,0,0000)
10345+
(150,151,0003) | (150,150,0003)
10346+
(250,251,0005) | (250,250,0005)
10347+
(400,401,0008) | (400,400,0008)
10348+
(4 rows)
10349+
10350+
-- tableoids are returned correctly
10351+
EXPLAIN (COSTS OFF)
10352+
UPDATE fprt1 t1 SET b = t1.b + 1 FROM fprt2 t2 WHERE t1.a = t2.b AND t1.a % 25 = 0 RETURNING t2.tableoid::regclass;
10353+
QUERY PLAN
10354+
------------------------------------
10355+
Update on fprt1 t1
10356+
Foreign Update on ftprt1_p1 t1_1
10357+
Foreign Update on ftprt1_p2 t1_2
10358+
-> Append
10359+
-> Foreign Update
10360+
-> Foreign Update
10361+
(6 rows)
10362+
10363+
UPDATE fprt1 t1 SET b = t1.b + 1 FROM fprt2 t2 WHERE t1.a = t2.b AND t1.a % 25 = 0 RETURNING t2.tableoid::regclass;
10364+
tableoid
10365+
-----------
10366+
ftprt2_p1
10367+
ftprt2_p1
10368+
ftprt2_p2
10369+
ftprt2_p2
10370+
(4 rows)
10371+
10372+
-- join of several tables
10373+
EXPLAIN (VERBOSE, COSTS OFF)
10374+
UPDATE fprt1 t1 SET b = t1.b + 1 FROM fprt2 t2, fprt1 t3 WHERE t1.a = t2.b AND t2.b = t3.a AND t1.a % 25 = 0 RETURNING *;
10375+
QUERY PLAN
10376+
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10377+
Update on public.fprt1 t1
10378+
Output: t1_1.a, t1_1.b, t1_1.c, t2.a, t2.b, t2.c, t3.a, t3.b, t3.c
10379+
Foreign Update on public.ftprt1_p1 t1_1
10380+
Foreign Update on public.ftprt1_p2 t1_2
10381+
-> Append
10382+
-> Foreign Update
10383+
Remote SQL: UPDATE public.fprt1_p1 r4 SET b = (r4.b + 1) FROM (public.fprt2_p1 r6 INNER JOIN public.fprt1_p1 r8 ON (TRUE)) WHERE ((r4.a = r8.a)) AND ((r4.a = r6.b)) AND (((r4.a % 25) = 0)) RETURNING r4.a, r4.b, r4.c, r6.a, r6.b, r6.c, r8.a, r8.b, r8.c
10384+
-> Foreign Update
10385+
Remote SQL: UPDATE public.fprt1_p2 r5 SET b = (r5.b + 1) FROM (public.fprt2_p2 r7 INNER JOIN public.fprt1_p2 r9 ON (TRUE)) WHERE ((r5.a = r9.a)) AND ((r5.a = r7.b)) AND (((r5.a % 25) = 0)) RETURNING r5.a, r5.b, r5.c, r7.a, r7.b, r7.c, r9.a, r9.b, r9.c
10386+
(9 rows)
10387+
10388+
UPDATE fprt1 t1 SET b = t1.b + 1 FROM fprt2 t2, fprt1 t3 WHERE t1.a = t2.b AND t2.b = t3.a AND t1.a % 25 = 0 RETURNING *;
10389+
a | b | c | a | b | c | a | b | c
10390+
-----+-----+------+-----+-----+------+-----+-----+------
10391+
0 | 3 | 0000 | 0 | 0 | 0000 | 0 | 2 | 0000
10392+
150 | 153 | 0003 | 150 | 150 | 0003 | 150 | 152 | 0003
10393+
250 | 253 | 0005 | 250 | 250 | 0005 | 250 | 252 | 0005
10394+
400 | 403 | 0008 | 400 | 400 | 0008 | 400 | 402 | 0008
10395+
(4 rows)
10396+
10397+
-- left join
10398+
EXPLAIN (VERBOSE, COSTS OFF)
10399+
UPDATE fprt1 t1 SET b = t1.b + 1 FROM fprt2 t2 LEFT JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a = t2.b AND t1.a % 25 = 0 RETURNING *;
10400+
QUERY PLAN
10401+
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10402+
Update on public.fprt1 t1
10403+
Output: t1_1.a, t1_1.b, t1_1.c, t2.a, t2.b, t2.c, t3.a, t3.b, t3.c
10404+
Foreign Update on public.ftprt1_p1 t1_1
10405+
Foreign Update on public.ftprt1_p2 t1_2
10406+
-> Append
10407+
-> Foreign Update
10408+
Remote SQL: UPDATE public.fprt1_p1 r5 SET b = (r5.b + 1) FROM (public.fprt2_p1 r7 LEFT JOIN public.fprt1_p1 r9 ON (((r7.b = r9.a)))) WHERE ((r5.a = r7.b)) AND (((r5.a % 25) = 0)) RETURNING r5.a, r5.b, r5.c, r7.a, r7.b, r7.c, r9.a, r9.b, r9.c
10409+
-> Foreign Update
10410+
Remote SQL: UPDATE public.fprt1_p2 r6 SET b = (r6.b + 1) FROM (public.fprt2_p2 r8 LEFT JOIN public.fprt1_p2 r10 ON (((r8.b = r10.a)))) WHERE ((r6.a = r8.b)) AND (((r6.a % 25) = 0)) RETURNING r6.a, r6.b, r6.c, r8.a, r8.b, r8.c, r10.a, r10.b, r10.c
10411+
(9 rows)
10412+
10413+
UPDATE fprt1 t1 SET b = t1.b + 1 FROM fprt2 t2 LEFT JOIN fprt1 t3 ON (t2.b = t3.a) WHERE t1.a = t2.b AND t1.a % 25 = 0 RETURNING *;
10414+
a | b | c | a | b | c | a | b | c
10415+
-----+-----+------+-----+-----+------+-----+-----+------
10416+
0 | 4 | 0000 | 0 | 0 | 0000 | 0 | 3 | 0000
10417+
150 | 154 | 0003 | 150 | 150 | 0003 | 150 | 153 | 0003
10418+
250 | 254 | 0005 | 250 | 250 | 0005 | 250 | 253 | 0005
10419+
400 | 404 | 0008 | 400 | 400 | 0008 | 400 | 403 | 0008
10420+
(4 rows)
10421+
10422+
-- delete
10423+
EXPLAIN (COSTS OFF)
10424+
DELETE FROM fprt1 USING fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 30 = 29;
10425+
QUERY PLAN
10426+
---------------------------------------
10427+
Delete on fprt1
10428+
Foreign Delete on ftprt1_p1 fprt1_1
10429+
Foreign Delete on ftprt1_p2 fprt1_2
10430+
-> Append
10431+
-> Foreign Delete
10432+
-> Foreign Delete
10433+
(6 rows)
10434+
10435+
DELETE FROM fprt1 USING fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 30 = 29;
10436+
EXPLAIN (COSTS OFF)
10437+
DELETE FROM fprt1 USING fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0 RETURNING *;
10438+
QUERY PLAN
10439+
---------------------------------------
10440+
Delete on fprt1
10441+
Foreign Delete on ftprt1_p1 fprt1_1
10442+
Foreign Delete on ftprt1_p2 fprt1_2
10443+
-> Append
10444+
-> Foreign Delete
10445+
-> Foreign Delete
10446+
(6 rows)
10447+
10448+
DELETE FROM fprt1 USING fprt2 WHERE fprt1.a = fprt2.b AND fprt2.a % 25 = 0 RETURNING *;
10449+
a | b | c | a | b | c
10450+
-----+-----+------+-----+-----+------
10451+
0 | 4 | 0000 | 0 | 0 | 0000
10452+
150 | 154 | 0003 | 150 | 150 | 0003
10453+
250 | 254 | 0005 | 250 | 250 | 0005
10454+
400 | 404 | 0008 | 400 | 400 | 0008
10455+
(4 rows)
10456+
1029710457
RESET enable_partitionwise_join;
1029810458
-- ===================================================================
1029910459
-- test partitionwise aggregates

0 commit comments

Comments
 (0)