Skip to content

Commit 6a6ee15

Browse files
committed
disable dangerous query optimizations on PostgreSQL 9.5 (issue #110)
1 parent fe8ba34 commit 6a6ee15

File tree

4 files changed

+266
-96
lines changed

4 files changed

+266
-96
lines changed

Diff for: expected/pathman_lateral.out

+37-35
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,22 @@ select * from
2727
where t1.id = t2.id and t.id = t3.id);
2828
QUERY PLAN
2929
--------------------------------------------------------------------------------------------
30-
Nested Loop Semi Join
30+
Nested Loop
3131
-> Nested Loop
32-
Join Filter: ((t2.id + t1.id) = t3.id)
33-
-> Append
34-
-> Seq Scan on data_0 t3
35-
-> Seq Scan on data_1 t3_1
36-
-> Seq Scan on data_2 t3_2
37-
-> Seq Scan on data_3 t3_3
38-
-> Seq Scan on data_4 t3_4
39-
-> Seq Scan on data_5 t3_5
40-
-> Seq Scan on data_6 t3_6
41-
-> Seq Scan on data_7 t3_7
42-
-> Seq Scan on data_8 t3_8
43-
-> Seq Scan on data_9 t3_9
32+
Join Filter: ((t2.id + t1.id) = t.id)
33+
-> HashAggregate
34+
Group Key: t.id
35+
-> Append
36+
-> Seq Scan on data_0 t
37+
-> Seq Scan on data_1 t_1
38+
-> Seq Scan on data_2 t_2
39+
-> Seq Scan on data_3 t_3
40+
-> Seq Scan on data_4 t_4
41+
-> Seq Scan on data_5 t_5
42+
-> Seq Scan on data_6 t_6
43+
-> Seq Scan on data_7 t_7
44+
-> Seq Scan on data_8 t_8
45+
-> Seq Scan on data_9 t_9
4446
-> Materialize
4547
-> Nested Loop
4648
Join Filter: ((t2.id > t1.id) AND (t1.id > t2.id) AND (t1.id = t2.id))
@@ -88,28 +90,28 @@ select * from
8890
-> Seq Scan on data_9 t1_9
8991
Filter: ((id >= 1) AND (id <= 100))
9092
-> Custom Scan (RuntimeAppend)
91-
Prune by: (t3.id = t.id)
92-
-> Seq Scan on data_0 t
93-
Filter: (t3.id = id)
94-
-> Seq Scan on data_1 t
95-
Filter: (t3.id = id)
96-
-> Seq Scan on data_2 t
97-
Filter: (t3.id = id)
98-
-> Seq Scan on data_3 t
99-
Filter: (t3.id = id)
100-
-> Seq Scan on data_4 t
101-
Filter: (t3.id = id)
102-
-> Seq Scan on data_5 t
103-
Filter: (t3.id = id)
104-
-> Seq Scan on data_6 t
105-
Filter: (t3.id = id)
106-
-> Seq Scan on data_7 t
107-
Filter: (t3.id = id)
108-
-> Seq Scan on data_8 t
109-
Filter: (t3.id = id)
110-
-> Seq Scan on data_9 t
111-
Filter: (t3.id = id)
112-
(82 rows)
93+
Prune by: (t.id = t3.id)
94+
-> Seq Scan on data_0 t3
95+
Filter: (t.id = id)
96+
-> Seq Scan on data_1 t3
97+
Filter: (t.id = id)
98+
-> Seq Scan on data_2 t3
99+
Filter: (t.id = id)
100+
-> Seq Scan on data_3 t3
101+
Filter: (t.id = id)
102+
-> Seq Scan on data_4 t3
103+
Filter: (t.id = id)
104+
-> Seq Scan on data_5 t3
105+
Filter: (t.id = id)
106+
-> Seq Scan on data_6 t3
107+
Filter: (t.id = id)
108+
-> Seq Scan on data_7 t3
109+
Filter: (t.id = id)
110+
-> Seq Scan on data_8 t3
111+
Filter: (t.id = id)
112+
-> Seq Scan on data_9 t3
113+
Filter: (t.id = id)
114+
(84 rows)
113115

114116
set enable_hashjoin = on;
115117
set enable_mergejoin = on;

Diff for: expected/pathman_rowmarks_1.out

+113-34
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,27 @@ SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
179179
EXPLAIN (COSTS OFF)
180180
UPDATE rowmarks.second SET id = 2
181181
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
182-
QUERY PLAN
183-
--------------------------------------
182+
QUERY PLAN
183+
---------------------------------------------
184184
Update on second
185185
-> Nested Loop Semi Join
186186
-> Seq Scan on second
187187
Filter: (id = 1)
188188
-> Materialize
189-
-> Seq Scan on first
190-
Filter: (id = 1)
191-
(7 rows)
189+
-> Append
190+
-> Seq Scan on first
191+
Filter: (id = 1)
192+
-> Seq Scan on first_0
193+
Filter: (id = 1)
194+
-> Seq Scan on first_1
195+
Filter: (id = 1)
196+
-> Seq Scan on first_2
197+
Filter: (id = 1)
198+
-> Seq Scan on first_3
199+
Filter: (id = 1)
200+
-> Seq Scan on first_4
201+
Filter: (id = 1)
202+
(18 rows)
192203

193204
EXPLAIN (COSTS OFF)
194205
UPDATE rowmarks.second SET id = 2
@@ -200,67 +211,113 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
200211
Join Filter: (second.id = first.id)
201212
-> HashAggregate
202213
Group Key: first.id
203-
-> Seq Scan on first
204-
Filter: (id < 1)
214+
-> Append
215+
-> Seq Scan on first
216+
Filter: (id < 1)
217+
-> Seq Scan on first_0
218+
Filter: (id < 1)
219+
-> Seq Scan on first_1
220+
Filter: (id < 1)
221+
-> Seq Scan on first_2
222+
Filter: (id < 1)
223+
-> Seq Scan on first_3
224+
Filter: (id < 1)
225+
-> Seq Scan on first_4
226+
Filter: (id < 1)
205227
-> Materialize
206228
-> Seq Scan on second
207-
(9 rows)
229+
(20 rows)
208230

209231
EXPLAIN (COSTS OFF)
210232
UPDATE rowmarks.second SET id = 2
211233
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1 OR id = 2);
212-
QUERY PLAN
213-
----------------------------------------------------
234+
QUERY PLAN
235+
----------------------------------------------------------
214236
Update on second
215237
-> Nested Loop Semi Join
216238
Join Filter: (second.id = first.id)
217239
-> Seq Scan on second
218240
-> Materialize
219-
-> Seq Scan on first
220-
Filter: ((id = 1) OR (id = 2))
221-
(7 rows)
241+
-> Append
242+
-> Seq Scan on first
243+
Filter: ((id = 1) OR (id = 2))
244+
-> Seq Scan on first_0
245+
Filter: ((id = 1) OR (id = 2))
246+
-> Seq Scan on first_1
247+
Filter: ((id = 1) OR (id = 2))
248+
-> Seq Scan on first_2
249+
Filter: ((id = 1) OR (id = 2))
250+
-> Seq Scan on first_3
251+
Filter: ((id = 1) OR (id = 2))
252+
-> Seq Scan on first_4
253+
Filter: ((id = 1) OR (id = 2))
254+
(18 rows)
222255

223256
EXPLAIN (COSTS OFF)
224257
UPDATE rowmarks.second SET id = 2
225258
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1)
226259
RETURNING *, tableoid::regclass;
227-
QUERY PLAN
228-
--------------------------------------
260+
QUERY PLAN
261+
---------------------------------------------
229262
Update on second
230263
-> Nested Loop Semi Join
231264
-> Seq Scan on second
232265
Filter: (id = 1)
233266
-> Materialize
234-
-> Seq Scan on first
235-
Filter: (id = 1)
236-
(7 rows)
267+
-> Append
268+
-> Seq Scan on first
269+
Filter: (id = 1)
270+
-> Seq Scan on first_0
271+
Filter: (id = 1)
272+
-> Seq Scan on first_1
273+
Filter: (id = 1)
274+
-> Seq Scan on first_2
275+
Filter: (id = 1)
276+
-> Seq Scan on first_3
277+
Filter: (id = 1)
278+
-> Seq Scan on first_4
279+
Filter: (id = 1)
280+
(18 rows)
237281

238282
SET enable_hashjoin = t;
239283
SET enable_mergejoin = t;
240284
/* Check updates (execution) */
241285
UPDATE rowmarks.second SET id = 1
242286
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1 OR id = 2)
243287
RETURNING *, tableoid::regclass;
244-
id | tableoid
245-
----+----------
246-
(0 rows)
288+
id | tableoid
289+
----+-----------------
290+
1 | rowmarks.second
291+
1 | rowmarks.second
292+
(2 rows)
247293

248294
/* Check deletes (plan) */
249295
SET enable_hashjoin = f; /* Hash Semi Join on 10 vs Hash Join on 9.6 */
250296
SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
251297
EXPLAIN (COSTS OFF)
252298
DELETE FROM rowmarks.second
253299
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
254-
QUERY PLAN
255-
--------------------------------------
300+
QUERY PLAN
301+
---------------------------------------------
256302
Delete on second
257303
-> Nested Loop Semi Join
258304
-> Seq Scan on second
259305
Filter: (id = 1)
260306
-> Materialize
261-
-> Seq Scan on first
262-
Filter: (id = 1)
263-
(7 rows)
307+
-> Append
308+
-> Seq Scan on first
309+
Filter: (id = 1)
310+
-> Seq Scan on first_0
311+
Filter: (id = 1)
312+
-> Seq Scan on first_1
313+
Filter: (id = 1)
314+
-> Seq Scan on first_2
315+
Filter: (id = 1)
316+
-> Seq Scan on first_3
317+
Filter: (id = 1)
318+
-> Seq Scan on first_4
319+
Filter: (id = 1)
320+
(18 rows)
264321

265322
EXPLAIN (COSTS OFF)
266323
DELETE FROM rowmarks.second
@@ -272,25 +329,47 @@ WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
272329
Join Filter: (second.id = first.id)
273330
-> HashAggregate
274331
Group Key: first.id
275-
-> Seq Scan on first
276-
Filter: (id < 1)
332+
-> Append
333+
-> Seq Scan on first
334+
Filter: (id < 1)
335+
-> Seq Scan on first_0
336+
Filter: (id < 1)
337+
-> Seq Scan on first_1
338+
Filter: (id < 1)
339+
-> Seq Scan on first_2
340+
Filter: (id < 1)
341+
-> Seq Scan on first_3
342+
Filter: (id < 1)
343+
-> Seq Scan on first_4
344+
Filter: (id < 1)
277345
-> Materialize
278346
-> Seq Scan on second
279-
(9 rows)
347+
(20 rows)
280348

281349
EXPLAIN (COSTS OFF)
282350
DELETE FROM rowmarks.second
283351
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1 OR id = 2);
284-
QUERY PLAN
285-
----------------------------------------------------
352+
QUERY PLAN
353+
----------------------------------------------------------
286354
Delete on second
287355
-> Nested Loop Semi Join
288356
Join Filter: (second.id = first.id)
289357
-> Seq Scan on second
290358
-> Materialize
291-
-> Seq Scan on first
292-
Filter: ((id = 1) OR (id = 2))
293-
(7 rows)
359+
-> Append
360+
-> Seq Scan on first
361+
Filter: ((id = 1) OR (id = 2))
362+
-> Seq Scan on first_0
363+
Filter: ((id = 1) OR (id = 2))
364+
-> Seq Scan on first_1
365+
Filter: ((id = 1) OR (id = 2))
366+
-> Seq Scan on first_2
367+
Filter: ((id = 1) OR (id = 2))
368+
-> Seq Scan on first_3
369+
Filter: ((id = 1) OR (id = 2))
370+
-> Seq Scan on first_4
371+
Filter: ((id = 1) OR (id = 2))
372+
(18 rows)
294373

295374
SET enable_hashjoin = t;
296375
SET enable_mergejoin = t;

0 commit comments

Comments
 (0)