@@ -14,6 +14,7 @@ SET enable_seqscan = OFF;
14
14
CREATE TABLE test.tmp (id INTEGER NOT NULL, value INTEGER NOT NULL);
15
15
INSERT INTO test.tmp VALUES (1, 1), (2, 2);
16
16
CREATE TABLE test.tmp2 (id INTEGER NOT NULL, value INTEGER NOT NULL);
17
+ INSERT INTO test.tmp2 SELECT i % 10 + 1, i FROM generate_series(1, 100) i;
17
18
SELECT pathman.create_range_partitions('test.tmp2', 'id', 1, 1, 10);
18
19
create_range_partitions
19
20
-------------------------
@@ -218,48 +219,57 @@ USING (SELECT *
218
219
JOIN test.tmp2 a2
219
220
USING(id)) t
220
221
WHERE t.id = r.id;
221
- QUERY PLAN
222
- ------------------------------------------------------
222
+ QUERY PLAN
223
+ ------------------------------------------------
223
224
Delete on tmp r
224
225
-> Nested Loop
225
- Join Filter: (a1.id = a2.id)
226
- -> Append
226
+ -> Nested Loop
227
+ -> Seq Scan on tmp r
228
+ -> Custom Scan (RuntimeAppend)
229
+ Prune by: (r.id = a1.id)
230
+ -> Seq Scan on tmp2_1 a1
231
+ Filter: (r.id = id)
232
+ -> Seq Scan on tmp2_2 a1
233
+ Filter: (r.id = id)
234
+ -> Seq Scan on tmp2_3 a1
235
+ Filter: (r.id = id)
236
+ -> Seq Scan on tmp2_4 a1
237
+ Filter: (r.id = id)
238
+ -> Seq Scan on tmp2_5 a1
239
+ Filter: (r.id = id)
240
+ -> Seq Scan on tmp2_6 a1
241
+ Filter: (r.id = id)
242
+ -> Seq Scan on tmp2_7 a1
243
+ Filter: (r.id = id)
244
+ -> Seq Scan on tmp2_8 a1
245
+ Filter: (r.id = id)
246
+ -> Seq Scan on tmp2_9 a1
247
+ Filter: (r.id = id)
248
+ -> Seq Scan on tmp2_10 a1
249
+ Filter: (r.id = id)
250
+ -> Custom Scan (RuntimeAppend)
251
+ Prune by: (a1.id = a2.id)
227
252
-> Seq Scan on tmp2_1 a2
228
- -> Seq Scan on tmp2_2 a2_1
229
- -> Seq Scan on tmp2_3 a2_2
230
- -> Seq Scan on tmp2_4 a2_3
231
- -> Seq Scan on tmp2_5 a2_4
232
- -> Seq Scan on tmp2_6 a2_5
233
- -> Seq Scan on tmp2_7 a2_6
234
- -> Seq Scan on tmp2_8 a2_7
235
- -> Seq Scan on tmp2_9 a2_8
236
- -> Seq Scan on tmp2_10 a2_9
237
- -> Materialize
238
- -> Nested Loop
239
- -> Seq Scan on tmp r
240
- -> Custom Scan (RuntimeAppend)
241
- Prune by: (r.id = a1.id)
242
- -> Seq Scan on tmp2_1 a1
243
- Filter: (r.id = id)
244
- -> Seq Scan on tmp2_2 a1
245
- Filter: (r.id = id)
246
- -> Seq Scan on tmp2_3 a1
247
- Filter: (r.id = id)
248
- -> Seq Scan on tmp2_4 a1
249
- Filter: (r.id = id)
250
- -> Seq Scan on tmp2_5 a1
251
- Filter: (r.id = id)
252
- -> Seq Scan on tmp2_6 a1
253
- Filter: (r.id = id)
254
- -> Seq Scan on tmp2_7 a1
255
- Filter: (r.id = id)
256
- -> Seq Scan on tmp2_8 a1
257
- Filter: (r.id = id)
258
- -> Seq Scan on tmp2_9 a1
259
- Filter: (r.id = id)
260
- -> Seq Scan on tmp2_10 a1
261
- Filter: (r.id = id)
262
- (39 rows)
253
+ Filter: (a1.id = id)
254
+ -> Seq Scan on tmp2_2 a2
255
+ Filter: (a1.id = id)
256
+ -> Seq Scan on tmp2_3 a2
257
+ Filter: (a1.id = id)
258
+ -> Seq Scan on tmp2_4 a2
259
+ Filter: (a1.id = id)
260
+ -> Seq Scan on tmp2_5 a2
261
+ Filter: (a1.id = id)
262
+ -> Seq Scan on tmp2_6 a2
263
+ Filter: (a1.id = id)
264
+ -> Seq Scan on tmp2_7 a2
265
+ Filter: (a1.id = id)
266
+ -> Seq Scan on tmp2_8 a2
267
+ Filter: (a1.id = id)
268
+ -> Seq Scan on tmp2_9 a2
269
+ Filter: (a1.id = id)
270
+ -> Seq Scan on tmp2_10 a2
271
+ Filter: (a1.id = id)
272
+ (48 rows)
263
273
264
274
BEGIN;
265
275
DELETE FROM test.tmp r
@@ -279,6 +289,45 @@ UPDATE test.range_rel r SET value = 1 FROM test.tmp2 t
279
289
WHERE t.id = r.id;
280
290
ERROR: DELETE and UPDATE queries with a join of partitioned tables are not supported
281
291
ROLLBACK;
292
+ /*
293
+ * UPDATE + subquery with partitioned table (PG 9.5).
294
+ * See pathman_rel_pathlist_hook() + RELOPT_OTHER_MEMBER_REL.
295
+ */
296
+ EXPLAIN (COSTS OFF)
297
+ UPDATE test.tmp t SET value = 2
298
+ WHERE t.id IN (SELECT id
299
+ FROM test.tmp2 t2
300
+ WHERE id = t.id);
301
+ QUERY PLAN
302
+ --------------------------------------------
303
+ Update on tmp t
304
+ -> Seq Scan on tmp t
305
+ Filter: (SubPlan 1)
306
+ SubPlan 1
307
+ -> Custom Scan (RuntimeAppend)
308
+ Prune by: (t2.id = t.id)
309
+ -> Seq Scan on tmp2_1 t2
310
+ Filter: (id = t.id)
311
+ -> Seq Scan on tmp2_2 t2
312
+ Filter: (id = t.id)
313
+ -> Seq Scan on tmp2_3 t2
314
+ Filter: (id = t.id)
315
+ -> Seq Scan on tmp2_4 t2
316
+ Filter: (id = t.id)
317
+ -> Seq Scan on tmp2_5 t2
318
+ Filter: (id = t.id)
319
+ -> Seq Scan on tmp2_6 t2
320
+ Filter: (id = t.id)
321
+ -> Seq Scan on tmp2_7 t2
322
+ Filter: (id = t.id)
323
+ -> Seq Scan on tmp2_8 t2
324
+ Filter: (id = t.id)
325
+ -> Seq Scan on tmp2_9 t2
326
+ Filter: (id = t.id)
327
+ -> Seq Scan on tmp2_10 t2
328
+ Filter: (id = t.id)
329
+ (26 rows)
330
+
282
331
/* Test special rule for CTE; SELECT (PostgreSQL 9.5) */
283
332
EXPLAIN (COSTS OFF)
284
333
WITH q AS (SELECT * FROM test.range_rel r
0 commit comments