@@ -10294,6 +10294,166 @@ SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a
10294
10294
(4 rows)
10295
10295
10296
10296
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
+
10297
10457
RESET enable_partitionwise_join;
10298
10458
-- ===================================================================
10299
10459
-- test partitionwise aggregates
0 commit comments