-
Notifications
You must be signed in to change notification settings - Fork 71
Expand file tree
/
Copy pathpathman_only_1.out
More file actions
323 lines (312 loc) · 12.6 KB
/
pathman_only_1.out
File metadata and controls
323 lines (312 loc) · 12.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
/*
* ---------------------------------------------
* NOTE: This test behaves differenly on PgPro
* ---------------------------------------------
*
* --------------------
* pathman_only_1.sql
* --------------------
* Since 608b167f9f in PostgreSQL 12, CTEs which are scanned once are no longer
* an optimization fence, which changes practically all plans here. There is
* an option to forcibly make them MATERIALIZED, but we also need to run tests
* on older versions, so create pathman_only_1.out instead.
*
* --------------------
* pathman_only_2.sql
* --------------------
* Since 55a1954da16 and 6ef77cf46e8 in PostgreSQL 13, output of EXPLAIN was
* changed, now it includes aliases for inherited tables.
*
* --------------------
* pathman_only_3.sql
* --------------------
* Since a5fc46414de in PostgreSQL 16, the order of the operands was changed,
* which affected the output of the "Prune by" in EXPLAIN.
*
* --------------------
* pathman_only_4.sql
* --------------------
* Since fd0398fcb09 in PostgreSQL 17, output of EXPLAIN was
* changed, now it displays SubPlan nodes and output parameters.
*/
\set VERBOSITY terse
SET search_path = 'public';
CREATE EXTENSION pg_pathman;
CREATE SCHEMA test_only;
-- Prevent Ent-specific changes in query plans. Equivalent to
-- "SET enable_extra_transformations = off" but output is
-- edition-independent.
SELECT count(*) >= 0 AS success
FROM (
SELECT set_config(name, 'off', false) FROM pg_settings
WHERE name = 'enable_extra_transformations'
) tmp;
success
---------
t
(1 row)
/* Test special case: ONLY statement with not-ONLY for partitioned table */
CREATE TABLE test_only.from_only_test(val INT NOT NULL);
INSERT INTO test_only.from_only_test SELECT generate_series(1, 20);
SELECT create_range_partitions('test_only.from_only_test', 'val', 1, 2);
create_range_partitions
-------------------------
10
(1 row)
VACUUM ANALYZE;
/* should be OK */
EXPLAIN (COSTS OFF)
SELECT * FROM ONLY test_only.from_only_test
UNION SELECT * FROM test_only.from_only_test;
QUERY PLAN
-------------------------------------------------
HashAggregate
Group Key: from_only_test.val
-> Append
-> Seq Scan on from_only_test
-> Append
-> Seq Scan on from_only_test_1
-> Seq Scan on from_only_test_2
-> Seq Scan on from_only_test_3
-> Seq Scan on from_only_test_4
-> Seq Scan on from_only_test_5
-> Seq Scan on from_only_test_6
-> Seq Scan on from_only_test_7
-> Seq Scan on from_only_test_8
-> Seq Scan on from_only_test_9
-> Seq Scan on from_only_test_10
(15 rows)
/* should be OK */
EXPLAIN (COSTS OFF)
SELECT * FROM test_only.from_only_test
UNION SELECT * FROM ONLY test_only.from_only_test;
QUERY PLAN
-------------------------------------------------
HashAggregate
Group Key: from_only_test_1.val
-> Append
-> Append
-> Seq Scan on from_only_test_1
-> Seq Scan on from_only_test_2
-> Seq Scan on from_only_test_3
-> Seq Scan on from_only_test_4
-> Seq Scan on from_only_test_5
-> Seq Scan on from_only_test_6
-> Seq Scan on from_only_test_7
-> Seq Scan on from_only_test_8
-> Seq Scan on from_only_test_9
-> Seq Scan on from_only_test_10
-> Seq Scan on from_only_test
(15 rows)
/* should be OK */
EXPLAIN (COSTS OFF)
SELECT * FROM test_only.from_only_test
UNION SELECT * FROM test_only.from_only_test
UNION SELECT * FROM ONLY test_only.from_only_test;
QUERY PLAN
---------------------------------------------------------------------
HashAggregate
Group Key: from_only_test_1.val
-> Append
-> Append
-> Seq Scan on from_only_test_1
-> Seq Scan on from_only_test_2
-> Seq Scan on from_only_test_3
-> Seq Scan on from_only_test_4
-> Seq Scan on from_only_test_5
-> Seq Scan on from_only_test_6
-> Seq Scan on from_only_test_7
-> Seq Scan on from_only_test_8
-> Seq Scan on from_only_test_9
-> Seq Scan on from_only_test_10
-> Append
-> Seq Scan on from_only_test_1 from_only_test_1_1
-> Seq Scan on from_only_test_2 from_only_test_2_1
-> Seq Scan on from_only_test_3 from_only_test_3_1
-> Seq Scan on from_only_test_4 from_only_test_4_1
-> Seq Scan on from_only_test_5 from_only_test_5_1
-> Seq Scan on from_only_test_6 from_only_test_6_1
-> Seq Scan on from_only_test_7 from_only_test_7_1
-> Seq Scan on from_only_test_8 from_only_test_8_1
-> Seq Scan on from_only_test_9 from_only_test_9_1
-> Seq Scan on from_only_test_10 from_only_test_10_1
-> Seq Scan on from_only_test
(26 rows)
/* should be OK */
EXPLAIN (COSTS OFF)
SELECT * FROM ONLY test_only.from_only_test
UNION SELECT * FROM test_only.from_only_test
UNION SELECT * FROM test_only.from_only_test;
QUERY PLAN
---------------------------------------------------------------------
HashAggregate
Group Key: from_only_test.val
-> Append
-> Seq Scan on from_only_test
-> Append
-> Seq Scan on from_only_test_1
-> Seq Scan on from_only_test_2
-> Seq Scan on from_only_test_3
-> Seq Scan on from_only_test_4
-> Seq Scan on from_only_test_5
-> Seq Scan on from_only_test_6
-> Seq Scan on from_only_test_7
-> Seq Scan on from_only_test_8
-> Seq Scan on from_only_test_9
-> Seq Scan on from_only_test_10
-> Append
-> Seq Scan on from_only_test_1 from_only_test_1_1
-> Seq Scan on from_only_test_2 from_only_test_2_1
-> Seq Scan on from_only_test_3 from_only_test_3_1
-> Seq Scan on from_only_test_4 from_only_test_4_1
-> Seq Scan on from_only_test_5 from_only_test_5_1
-> Seq Scan on from_only_test_6 from_only_test_6_1
-> Seq Scan on from_only_test_7 from_only_test_7_1
-> Seq Scan on from_only_test_8 from_only_test_8_1
-> Seq Scan on from_only_test_9 from_only_test_9_1
-> Seq Scan on from_only_test_10 from_only_test_10_1
(26 rows)
/* not ok, ONLY|non-ONLY in one query (this is not the case for PgPro) */
EXPLAIN (COSTS OFF)
SELECT * FROM test_only.from_only_test a
JOIN ONLY test_only.from_only_test b USING(val);
QUERY PLAN
---------------------------------------------
Nested Loop
-> Seq Scan on from_only_test b
-> Custom Scan (RuntimeAppend)
Prune by: (b.val = a.val)
-> Seq Scan on from_only_test_1 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_2 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_3 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_4 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_5 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_6 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_7 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_8 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_9 a
Filter: (b.val = val)
-> Seq Scan on from_only_test_10 a
Filter: (b.val = val)
(24 rows)
/* should be OK */
EXPLAIN (COSTS OFF)
WITH q1 AS (SELECT * FROM test_only.from_only_test),
q2 AS (SELECT * FROM ONLY test_only.from_only_test)
SELECT * FROM q1 JOIN q2 USING(val);
QUERY PLAN
---------------------------------------------------------------
Nested Loop
-> Seq Scan on from_only_test from_only_test_1
-> Custom Scan (RuntimeAppend)
Prune by: (from_only_test_1.val = from_only_test.val)
-> Seq Scan on from_only_test_1 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_2 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_3 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_4 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_5 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_6 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_7 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_8 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_9 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_10 from_only_test
Filter: (from_only_test_1.val = val)
(24 rows)
/* should be OK */
EXPLAIN (COSTS OFF)
WITH q1 AS (SELECT * FROM ONLY test_only.from_only_test)
SELECT * FROM test_only.from_only_test JOIN q1 USING(val);
QUERY PLAN
---------------------------------------------------------------
Nested Loop
-> Seq Scan on from_only_test from_only_test_1
-> Custom Scan (RuntimeAppend)
Prune by: (from_only_test_1.val = from_only_test.val)
-> Seq Scan on from_only_test_1 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_2 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_3 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_4 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_5 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_6 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_7 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_8 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_9 from_only_test
Filter: (from_only_test_1.val = val)
-> Seq Scan on from_only_test_10 from_only_test
Filter: (from_only_test_1.val = val)
(24 rows)
/* should be OK */
EXPLAIN (COSTS OFF)
SELECT * FROM test_only.from_only_test
WHERE val = (SELECT val FROM ONLY test_only.from_only_test
ORDER BY val ASC
LIMIT 1);
QUERY PLAN
-----------------------------------------------------------------
Custom Scan (RuntimeAppend)
Prune by: (from_only_test.val = $0)
InitPlan 1 (returns $0)
-> Limit
-> Sort
Sort Key: from_only_test_1.val
-> Seq Scan on from_only_test from_only_test_1
-> Seq Scan on from_only_test_1 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_2 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_3 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_4 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_5 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_6 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_7 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_8 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_9 from_only_test
Filter: (val = $0)
-> Seq Scan on from_only_test_10 from_only_test
Filter: (val = $0)
(27 rows)
DROP TABLE test_only.from_only_test CASCADE;
NOTICE: drop cascades to 11 other objects
DROP SCHEMA test_only;
DROP EXTENSION pg_pathman;
-- RESET enable_extra_transformations
SELECT count(*) >= 0 AS success
FROM (
SELECT set_config(name, NULL, false) FROM pg_settings
WHERE name = 'enable_extra_transformations'
) tmp;
success
---------
t
(1 row)