@@ -14,6 +14,7 @@ SET enable_seqscan = OFF;
1414CREATE TABLE test.tmp (id INTEGER NOT NULL, value INTEGER NOT NULL);
1515INSERT INTO test.tmp VALUES (1, 1), (2, 2);
1616CREATE 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;
1718SELECT pathman.create_range_partitions('test.tmp2', 'id', 1, 1, 10);
1819 create_range_partitions
1920-------------------------
@@ -218,48 +219,57 @@ USING (SELECT *
218219 JOIN test.tmp2 a2
219220 USING(id)) t
220221WHERE t.id = r.id;
221- QUERY PLAN
222- ------------------------------------------------------
222+ QUERY PLAN
223+ ------------------------------------------------
223224 Delete on tmp r
224225 -> 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)
227252 -> 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)
263273
264274BEGIN;
265275DELETE FROM test.tmp r
@@ -279,6 +289,45 @@ UPDATE test.range_rel r SET value = 1 FROM test.tmp2 t
279289WHERE t.id = r.id;
280290ERROR: DELETE and UPDATE queries with a join of partitioned tables are not supported
281291ROLLBACK;
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+
282331/* Test special rule for CTE; SELECT (PostgreSQL 9.5) */
283332EXPLAIN (COSTS OFF)
284333WITH q AS (SELECT * FROM test.range_rel r
0 commit comments