OSDN Git Service

Support DECLARE CURSOR syntax and added regression for table hinting.
[pghintplan/pg_hint_plan.git] / sql / pg_hint_plan.sql
1 SET search_path TO public;
2 SET client_min_messages TO log;
3 \set SHOW_CONTEXT always
4
5 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
6 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
7
8 LOAD 'pg_hint_plan';
9 SET pg_hint_plan.debug_print TO on;
10
11 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
12 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
13
14 /*+ Test (t1 t2) */
15 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
16 SET pg_hint_plan.enable_hint TO off;
17 /*+ Test (t1 t2) */
18 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
19 SET pg_hint_plan.enable_hint TO on;
20
21 /*Set(enable_indexscan off)*/
22 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
23 --+Set(enable_indexscan off)
24 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
25 /*+Set(enable_indexscan off) /* nest comment */ */
26 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
27 /*+Set(enable_indexscan off)*/
28 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
29 EXPLAIN (COSTS false) /*+Set(enable_indexscan off)*/
30  SELECT * FROM t1, t2 WHERE t1.id = t2.id;
31 /*+ Set(enable_indexscan off) Set(enable_hashjoin off) */
32 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
33
34 /*+      Set     (       enable_indexscan        off     )       */
35 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
36 /*+      
37                 Set      
38                 (        
39                 enable_indexscan         
40                 off      
41                 )        
42                 */              
43 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
44 /*+ Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)          
45                 Set(enable_seqscan off)
46                 */
47 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
48 /*+Set(work_mem "1M")*/
49 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
50 /*+Set(work_mem "1MB")*/
51 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
52 /*+Set(work_mem TO "1MB")*/
53 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
54
55 /*+SeqScan(t1 t2)*/
56 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
57 /*+SeqScan(t1)*/
58 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
59 /*+SeqScan(t1)IndexScan(t2)*/
60 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
61 /*+BitmapScan(t2)*/
62 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
63 /*+BitmapScan(t2)NoSeqScan(t1)*/
64 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
65 /*+NoIndexScan(t1)*/
66 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
67
68 /*+NoBitmapScan(t1)*/
69 EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
70 /*+TidScan(t4)*/
71 EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1,1)';
72 /*+NoTidScan(t1)*/
73 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)';
74
75 /*+HashJoin(t1 t2)*/
76 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
77 /*+NestLoop(t1 t2)*/
78 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
79 /*+NoMergeJoin(t1 t2)*/
80 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
81
82 /*+MergeJoin(t1 t3)*/
83 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
84 /*+NestLoop(t1 t3)*/
85 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
86 /*+NoHashJoin(t1 t3)*/
87 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
88
89 /*+MergeJoin(t4 t1 t2 t3)*/
90 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
91 /*+HashJoin(t3 t4 t1 t2)*/
92 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
93 /*+NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
94 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
95 /*+NoNestLoop(t4 t1 t3 t2)*/
96 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
97
98 /*+Leading( */
99 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
100 /*+Leading( )*/
101 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
102 /*+Leading( t3 )*/
103 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
104 /*+Leading( t3 t4 )*/
105 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
106 /*+Leading(t3 t4 t1)*/
107 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
108 /*+Leading(t3 t4 t1 t2)*/
109 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
110 /*+Leading(t3 t4 t1 t2 t1)*/
111 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
112 /*+Leading(t3 t4 t4)*/
113 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
114
115 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
116 /*+HashJoin(t1 t2)*/
117 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
118 /*+HashJoin(t1 *VALUES*)*/
119 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
120 /*+HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
121 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
122
123 -- single table scan hint test
124 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
125 /*+BitmapScan(v_1)*/
126 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
127 /*+BitmapScan(v_2)*/
128 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
129 /*+BitmapScan(t1)*/
130 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
131 /*+BitmapScan(v_1)BitmapScan(v_2)*/
132 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
133 /*+BitmapScan(v_1)BitmapScan(t1)*/
134 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
135 /*+BitmapScan(v_2)BitmapScan(t1)*/
136 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
137 /*+BitmapScan(v_1)BitmapScan(v_2)BitmapScan(t1)*/
138 EXPLAIN (COSTS false) SELECT (SELECT max(id) FROM t1 v_1 WHERE id < 10), id FROM v1 WHERE v1.id = (SELECT max(id) FROM t1 v_2 WHERE id < 10);
139
140 -- full scan hint pattern test
141 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
142 /*+SeqScan(t1)*/
143 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
144 /*+IndexScan(t1)*/
145 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
146 /*+BitmapScan(t1)*/
147 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
148 /*+TidScan(t1)*/
149 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
150 /*+NoSeqScan(t1)*/
151 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
152 /*+NoIndexScan(t1)*/
153 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
154 /*+NoBitmapScan(t1)*/
155 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
156 /*+NoTidScan(t1)*/
157 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
158
159 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
160 /*+SeqScan(t1)*/
161 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
162 /*+SeqScan(t2)*/
163 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
164 /*+SeqScan(t1) SeqScan(t2)*/
165 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
166 /*+SeqScan(t1) IndexScan(t2)*/
167 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
168 /*+SeqScan(t1) BitmapScan(t2)*/
169 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
170 /*+SeqScan(t1) TidScan(t2)*/
171 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
172 /*+SeqScan(t1) NoSeqScan(t2)*/
173 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
174 /*+SeqScan(t1) NoIndexScan(t2)*/
175 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
176 /*+SeqScan(t1) NoBitmapScan(t2)*/
177 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
178 /*+SeqScan(t1) NoTidScan(t2)*/
179 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
180
181 /*+IndexScan(t1)*/
182 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
183 /*+IndexScan(t2)*/
184 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
185 /*+IndexScan(t1) SeqScan(t2)*/
186 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
187 /*+IndexScan(t1) IndexScan(t2)*/
188 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
189 /*+IndexScan(t1) BitmapScan(t2)*/
190 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
191 /*+IndexScan(t1) TidScan(t2)*/
192 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
193 /*+IndexScan(t1) NoSeqScan(t2)*/
194 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
195 /*+IndexScan(t1) NoIndexScan(t2)*/
196 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
197 /*+IndexScan(t1) NoBitmapScan(t2)*/
198 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
199 /*+IndexScan(t1) NoTidScan(t2)*/
200 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
201
202 /*+BitmapScan(t1)*/
203 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
204 /*+BitmapScan(t2)*/
205 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
206 /*+BitmapScan(t2)*/
207 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
208 /*+BitmapScan(t1) SeqScan(t2)*/
209 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
210 /*+BitmapScan(t1) IndexScan(t2)*/
211 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
212 /*+BitmapScan(t1) BitmapScan(t2)*/
213 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
214 /*+BitmapScan(t1) TidScan(t2)*/
215 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
216 /*+BitmapScan(t1) NoSeqScan(t2)*/
217 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
218 /*+BitmapScan(t1) NoIndexScan(t2)*/
219 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
220 /*+BitmapScan(t1) NoBitmapScan(t2)*/
221 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
222 /*+BitmapScan(t1) NoTidScan(t2)*/
223 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
224
225 /*+TidScan(t1)*/
226 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
227 /*+TidScan(t2)*/
228 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
229 /*+TidScan(t1) SeqScan(t2)*/
230 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
231 /*+TidScan(t1) IndexScan(t2)*/
232 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
233 /*+TidScan(t1) BitmapScan(t2)*/
234 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
235 /*+TidScan(t1) TidScan(t2)*/
236 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
237 /*+TidScan(t1) NoSeqScan(t2)*/
238 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
239 /*+TidScan(t1) NoIndexScan(t2)*/
240 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
241 /*+TidScan(t1) NoBitmapScan(t2)*/
242 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
243 /*+TidScan(t1) NoTidScan(t2)*/
244 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
245
246 /*+NoSeqScan(t1)*/
247 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
248 /*+NoSeqScan(t2)*/
249 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
250 /*+NoSeqScan(t1) SeqScan(t2)*/
251 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
252 /*+NoSeqScan(t1) IndexScan(t2)*/
253 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
254 /*+NoSeqScan(t1) BitmapScan(t2)*/
255 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
256 /*+NoSeqScan(t1) TidScan(t2)*/
257 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
258 /*+NoSeqScan(t1) NoSeqScan(t2)*/
259 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
260 /*+NoSeqScan(t1) NoIndexScan(t2)*/
261 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
262 /*+NoSeqScan(t1) NoBitmapScan(t2)*/
263 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
264 /*+NoSeqScan(t1) NoTidScan(t2)*/
265 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
266
267 /*+NoIndexScan(t1)*/
268 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
269 /*+NoIndexScan(t2)*/
270 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
271 /*+NoIndexScan(t1) SeqScan(t2)*/
272 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
273 /*+NoIndexScan(t1) IndexScan(t2)*/
274 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
275 /*+NoIndexScan(t1) BitmapScan(t2)*/
276 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
277 /*+NoIndexScan(t1) TidScan(t2)*/
278 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
279 /*+NoIndexScan(t1) NoSeqScan(t2)*/
280 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
281 /*+NoIndexScan(t1) NoIndexScan(t2)*/
282 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
283 /*+NoIndexScan(t1) NoBitmapScan(t2)*/
284 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
285 /*+NoIndexScan(t1) NoTidScan(t2)*/
286 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
287
288 /*+NoBitmapScan(t1)*/
289 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
290 /*+NoBitmapScan(t2)*/
291 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
292 /*+NoBitmapScan(t1) SeqScan(t2)*/
293 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
294 /*+NoBitmapScan(t1) IndexScan(t2)*/
295 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
296 /*+NoBitmapScan(t1) BitmapScan(t2)*/
297 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
298 /*+NoBitmapScan(t1) TidScan(t2)*/
299 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
300 /*+NoBitmapScan(t1) NoSeqScan(t2)*/
301 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
302 /*+NoBitmapScan(t1) NoIndexScan(t2)*/
303 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
304 /*+NoBitmapScan(t1) NoBitmapScan(t2)*/
305 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
306 /*+NoBitmapScan(t1) NoTidScan(t2)*/
307 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
308
309 /*+NoTidScan(t1)*/
310 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
311 /*+NoTidScan(t2)*/
312 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
313 /*+NoTidScan(t1) SeqScan(t2)*/
314 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
315 /*+NoTidScan(t1) IndexScan(t2)*/
316 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
317 /*+NoTidScan(t1) BitmapScan(t2)*/
318 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
319 /*+NoTidScan(t1) TidScan(t2)*/
320 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
321 /*+NoTidScan(t1) NoSeqScan(t2)*/
322 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
323 /*+NoTidScan(t1) NoIndexScan(t2)*/
324 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
325 /*+NoTidScan(t1) NoBitmapScan(t2)*/
326 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
327 /*+NoTidScan(t1) NoTidScan(t2)*/
328 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
329
330 -- additional test
331 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)' AND t1.id < 10 AND t2.id < 10;
332 /*+BitmapScan(t1) BitmapScan(t2)*/
333 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)' AND t1.id < 10 AND t2.id < 10;
334
335 -- outer join test
336 EXPLAIN (COSTS false) SELECT * FROM t1 FULL OUTER JOIN  t2 ON (t1.id = t2.id);
337 /*+MergeJoin(t1 t2)*/
338 EXPLAIN (COSTS false) SELECT * FROM t1 FULL OUTER JOIN  t2 ON (t1.id = t2.id);
339 /*+NestLoop(t1 t2)*/
340 EXPLAIN (COSTS false) SELECT * FROM t1 FULL OUTER JOIN  t2 ON (t1.id = t2.id);
341
342 -- inheritance tables test
343 SET constraint_exclusion TO off;
344 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
345 SET constraint_exclusion TO on;
346 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
347 SET constraint_exclusion TO off;
348 /*+SeqScan(p1)*/
349 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
350 /*+IndexScan(p1)*/
351 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
352 /*+BitmapScan(p1)*/
353 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
354 /*+TidScan(p1)*/
355 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
356 SET constraint_exclusion TO on;
357 /*+SeqScan(p1)*/
358 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
359 /*+IndexScan(p1)*/
360 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
361 /*+BitmapScan(p1)*/
362 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
363 /*+TidScan(p1)*/
364 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
365
366 SET constraint_exclusion TO off;
367 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
368 SET constraint_exclusion TO on;
369 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
370 SET constraint_exclusion TO off;
371 /*+SeqScan(p1)*/
372 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
373 /*+IndexScan(p1)*/
374 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
375 /*+BitmapScan(p1)*/
376 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
377 /*+TidScan(p1)*/
378 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
379 /*+NestLoop(p1 t1)*/
380 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
381 /*+MergeJoin(p1 t1)*/
382 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
383 /*+HashJoin(p1 t1)*/
384 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
385 SET constraint_exclusion TO on;
386 /*+SeqScan(p1)*/
387 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
388 /*+IndexScan(p1)*/
389 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
390 /*+BitmapScan(p1)*/
391 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
392 /*+TidScan(p1)*/
393 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
394 /*+NestLoop(p1 t1)*/
395 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
396 /*+MergeJoin(p1 t1)*/
397 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
398 /*+HashJoin(p1 t1)*/
399 EXPLAIN (COSTS false) SELECT * FROM p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
400
401 SET constraint_exclusion TO off;
402 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
403 SET constraint_exclusion TO on;
404 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
405 SET constraint_exclusion TO off;
406 /*+SeqScan(p1)*/
407 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
408 /*+IndexScan(p1)*/
409 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
410 /*+BitmapScan(p1)*/
411 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
412 /*+TidScan(p1)*/
413 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
414 /*+NestLoop(p1 t1)*/
415 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
416 /*+MergeJoin(p1 t1)*/
417 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
418 /*+HashJoin(p1 t1)*/
419 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
420 SET constraint_exclusion TO on;
421 /*+SeqScan(p1)*/
422 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
423 /*+IndexScan(p1)*/
424 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
425 /*+BitmapScan(p1)*/
426 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
427 /*+TidScan(p1)*/
428 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
429 /*+NestLoop(p1 t1)*/
430 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
431 /*+MergeJoin(p1 t1)*/
432 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
433 /*+HashJoin(p1 t1)*/
434 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
435
436 SET constraint_exclusion TO off;
437 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
438 SET constraint_exclusion TO on;
439 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
440 SET constraint_exclusion TO off;
441 /*+SeqScan(p1)*/
442 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
443 /*+IndexScan(p1)*/
444 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
445 /*+BitmapScan(p1)*/
446 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
447 /*+TidScan(p1)*/
448 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
449 SET constraint_exclusion TO on;
450 /*+SeqScan(p1)*/
451 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
452 /*+IndexScan(p1)*/
453 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
454 /*+BitmapScan(p1)*/
455 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
456 /*+TidScan(p1)*/
457 EXPLAIN (COSTS false) SELECT * FROM ONLY p1, t1 WHERE p1.id >= 50 AND p1.id <= 51 AND p1.ctid = '(1,1)' AND p1.id = t1.id AND t1.id < 10;
458
459 -- quote test
460 /*+SeqScan("""t1 )      ")IndexScan("t  2 """)HashJoin("""t1 )  "T3"t   2 """)Leading("""t1 )   "T3"t   2 """)Set(application_name"a    a       a""     a       A")*/
461 EXPLAIN (COSTS false) SELECT * FROM t1 """t1 )  ", t2 "t        2 """, t3 "T3" WHERE """t1 )    ".id = "t       2 """.id AND """t1 )    ".id = "T3".id;
462
463 -- duplicate hint test
464 /*+SeqScan(t1)SeqScan(t2)IndexScan(t1)IndexScan(t2)BitmapScan(t1)BitmapScan(t2)TidScan(t1)TidScan(t2)HashJoin(t1 t2)NestLoop(t2 t1)MergeJoin(t1 t2)Leading(t1 t2)Leading(t2 t1)Set(enable_seqscan off)Set(enable_mergejoin on)Set(enable_seqscan on)*/
465 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
466
467 -- sub query Leading hint test
468 SET from_collapse_limit TO 100;
469 SET geqo_threshold TO 100;
470 EXPLAIN (COSTS false)
471 WITH c1_1(id) AS (
472 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
473 )
474 SELECT t1_1.id, (
475 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
476 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
477 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
478 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
479 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
480 );
481 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)*/
482 EXPLAIN (COSTS false)
483 WITH c1_1(id) AS (
484 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
485 )
486 SELECT t1_1.id, (
487 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
488 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
489 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
490 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
491 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
492 );
493 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(a t1_1 t1_2 t1_4 t1_5)*/
494 EXPLAIN (COSTS false)
495 WITH c1_1(id) AS (
496 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
497 )
498 SELECT t1_1.id, (
499 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
500 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
501 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
502 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
503 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
504 );
505 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(a t3_2 t3_5 t2_2 c1_1 t3_4 t3_3 t2_3 t2_4 t1_3 t2_5 t1_2 t3_1 t1_4 t2_1 t1_5 t1_1)*/
506 EXPLAIN (COSTS false)
507 WITH c1_1(id) AS (
508 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
509 )
510 SELECT t1_1.id, (
511 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
512 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
513 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
514 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
515 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
516 );
517 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(t3_5 t2_5 t1_5)Leading(t3_2 t2_2 t1_2)Leading(t3_4 t2_4 t1_4)Leading(c1_1 t3_3 t2_3 t1_3 t3_1 t2_1 t1_1)*/
518 EXPLAIN (COSTS false)
519 WITH c1_1(id) AS (
520 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
521 )
522 SELECT t1_1.id, (
523 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
524 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
525 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
526 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
527 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
528 );
529
530 SET from_collapse_limit TO 1;
531 EXPLAIN (COSTS false)
532 WITH c1_1(id) AS (
533 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
534 )
535 SELECT t1_1.id, (
536 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
537 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
538 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
539 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
540 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
541 );
542 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)*/
543 EXPLAIN (COSTS false)
544 WITH c1_1(id) AS (
545 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
546 )
547 SELECT t1_1.id, (
548 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
549 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
550 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
551 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
552 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
553 );
554 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(a t1_1 t1_2 t1_4 t1_5)*/
555 EXPLAIN (COSTS false)
556 WITH c1_1(id) AS (
557 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
558 )
559 SELECT t1_1.id, (
560 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
561 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
562 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
563 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
564 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
565 );
566 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(a t3_2 t3_5 t2_2 c1_1 t3_4 t3_3 t2_3 t2_4 t1_3 t2_5 t1_2 t3_1 t1_4 t2_1 t1_5 t1_1)*/
567 EXPLAIN (COSTS false)
568 WITH c1_1(id) AS (
569 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
570 )
571 SELECT t1_1.id, (
572 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
573 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
574 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
575 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
576 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
577 );
578 /*+HashJoin(t1_1 t3_1)MergeJoin(t1_3 t3_3)NestLoop(t1_2 t2_2)NestLoop(t1_4 t2_4)NestLoop(t1_5 t2_5)Leading(t3_5 t2_5 t1_5)Leading(t3_2 t2_2 t1_2)Leading(t3_4 t2_4 t1_4)Leading(c1_1 t3_3 t2_3 t1_3 t3_1 t2_1 t1_1)*/
579 EXPLAIN (COSTS false)
580 WITH c1_1(id) AS (
581 SELECT max(t1_5.id) FROM t1 t1_5, t2 t2_5, t3 t3_5 WHERE t1_5.id = t2_5.id AND t2_5.id = t3_5.id
582 )
583 SELECT t1_1.id, (
584 SELECT max(t1_2.id) FROM t1 t1_2, t2 t2_2, t3 t3_2 WHERE t1_2.id = t2_2.id AND t2_2.id = t3_2.id
585 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
586 SELECT t1_3.id FROM t1 t1_3, t2 t2_3, t3 t3_3 WHERE t1_3.id = t2_3.id AND t2_3.id = t3_3.id
587 ) v1_1(id), c1_1 WHERE t1_1.id = t2_1.id AND t2_1.id = t3_1.id AND t2_1.id = v1_1.id AND v1_1.id = c1_1.id AND t1_1.id = (
588 SELECT max(t1_4.id) FROM t1 t1_4, t2 t2_4, t3 t3_4 WHERE t1_4.id = t2_4.id AND t2_4.id = t3_4.id 
589 );
590
591 -- ambigous error
592 EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id;
593 /*+NestLoop(t1 t2)*/
594 EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id;
595 /*+Leading(t1 t2 t1)*/
596 EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id;
597
598 -- identifier length test
599 EXPLAIN (COSTS false) SELECT * FROM t1 "123456789012345678901234567890123456789012345678901234567890123" JOIN t2 ON ("123456789012345678901234567890123456789012345678901234567890123".id = t2.id) JOIN t3 ON (t2.id = t3.id);
600 /*+
601 Leading(123456789012345678901234567890123456789012345678901234567890123 t2 t3)
602 SeqScan(123456789012345678901234567890123456789012345678901234567890123)
603 MergeJoin(123456789012345678901234567890123456789012345678901234567890123 t2)
604 Set(123456789012345678901234567890123456789012345678901234567890123 1)
605 */
606 EXPLAIN (COSTS false) SELECT * FROM t1 "123456789012345678901234567890123456789012345678901234567890123" JOIN t2 ON ("123456789012345678901234567890123456789012345678901234567890123".id = t2.id) JOIN t3 ON (t2.id = t3.id);
607 /*+
608 Leading(1234567890123456789012345678901234567890123456789012345678901234 t2 t3)
609 SeqScan(1234567890123456789012345678901234567890123456789012345678901234)
610 MergeJoin(1234567890123456789012345678901234567890123456789012345678901234 t2)
611 Set(1234567890123456789012345678901234567890123456789012345678901234 1)
612 Set(cursor_tuple_fraction 0.1234567890123456789012345678901234567890123456789012345678901234)
613 */
614 EXPLAIN (COSTS false) SELECT * FROM t1 "1234567890123456789012345678901234567890123456789012345678901234" JOIN t2 ON ("1234567890123456789012345678901234567890123456789012345678901234".id = t2.id) JOIN t3 ON (t2.id = t3.id);
615 SET "123456789012345678901234567890123456789012345678901234567890123" TO 1;
616 SET "1234567890123456789012345678901234567890123456789012345678901234" TO 1;
617 SET cursor_tuple_fraction TO 1234567890123456789012345678901234567890123456789012345678901234;
618
619 -- multi error
620 /*+ Set(enable_seqscan 100)Set(seq_page_cost on)*/
621 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
622
623 -- debug log of candidate index to use IndexScan
624 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
625 /*+IndexScan(t5 t5_id2)*/
626 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
627 /*+IndexScan(t5 no_exist)*/
628 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
629 /*+IndexScan(t5 t5_id1 t5_id2)*/
630 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
631 /*+IndexScan(t5 no_exist t5_id2)*/
632 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
633 /*+IndexScan(t5 no_exist5 no_exist2)*/
634 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
635
636 -- outer inner
637 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
638
639 /*+Leading((t1))*/
640 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
641 /*+Leading((t1 t2))*/
642 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
643 /*+Leading((t1 t2 t3))*/
644 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
645
646 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.id < 10;
647 /*+Leading((t1 t2))*/
648 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.id < 10;
649
650 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
651 /*+Leading(((t1 t2) t3))*/
652 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
653
654 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10;
655 /*+Leading((((t1 t2) t3) t4))*/
656 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10;
657
658 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
659 /*+Leading(((t1 t2) t3))*/
660 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
661 /*+Leading((t1 (t2 t3)))*/
662 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
663
664 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10;
665 /*+Leading(((t1 t2) (t3 t4)))*/
666 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10;
667
668 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1);
669 /*+Leading(((t1 t2) t3)) Leading(((t3 t1) t2))*/
670 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t1.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1);
671 /*+Leading(((t1 t2) t3)) Leading((t1_2 t2_2))*/
672 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1);
673 /*+Leading(((((t1 t2) t3) t1_2) t2_2))*/
674 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < ( SELECT t1_2.id FROM t1 t1_2, t2 t2_2 WHERE t1_2.id = t2_2.id AND t2_2.val > 100 ORDER BY t1_2.id LIMIT 1);
675
676 -- Specified outer/inner leading hint and join method hint at the same time
677 /*+Leading(((t1 t2) t3))*/
678 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
679 /*+Leading(((t1 t2) t3)) MergeJoin(t1 t2)*/
680 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
681 /*+Leading(((t1 t2) t3)) MergeJoin(t1 t2 t3)*/
682 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
683 /*+Leading(((t1 t2) t3)) MergeJoin(t1 t3)*/
684 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
685
686 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10;
687 /*+Leading(((t1 t2) t3)) MergeJoin(t3 t4)*/
688 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10;
689 /*+Leading(((t1 t2) t3)) MergeJoin(t1 t2 t3 t4)*/
690 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t3.id = t4.id AND t1.val = t3.val AND t1.id < 10;
691
692 /*+ Leading ( ( t1 ( t2 t3 ) ) ) */
693 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
694 /*+Leading((t1(t2 t3)))*/
695 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
696 /*+Leading(("t1(t2" "t3)"))*/
697 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
698 /*+ Leading ( ( ( t1 t2 ) t3 ) ) */
699 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
700 /*+Leading(((t1 t2)t3))*/
701 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
702 /*+Leading(("(t1" "t2)t3"))*/
703 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
704
705 /*+Leading((t1(t2(t3(t4 t5)))))*/
706 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
707 /*+Leading((t5(t4(t3(t2 t1)))))*/
708 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
709 /*+Leading(((((t1 t2)t3)t4)t5))*/
710 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
711 /*+Leading(((((t5 t4)t3)t2)t1))*/
712 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
713 /*+Leading(((t1 t2)(t3(t4 t5))))*/
714 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
715 /*+Leading(((t5 t4)(t3(t2 t1))))*/
716 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
717 /*+Leading((((t1 t2)t3)(t4 t5)))*/
718 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
719 /*+Leading((((t5 t4)t3)(t2 t1)))*/
720 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4, t5 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id AND t1.id = t5.id;
721
722 -- inherite table test to specify the index's name
723 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
724 /*+IndexScan(p2 p2_pkey)*/
725 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
726 /*+IndexScan(p2 p2_id_val_idx)*/
727 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
728 /*+IndexScan(p2 p2_val_id_idx)*/
729 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
730
731 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
732
733 -- Inhibit parallel exection to avoid interfaring the hint
734 set max_parallel_workers_per_gather to 0;
735 /*+ IndexScan(p2 p2_val)*/
736 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
737 /*+IndexScan(p2 p2_pkey)*/
738 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
739 /*+IndexScan(p2 p2_id2_val)*/
740 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
741 /*+IndexScan(p2 p2_val2_id)*/
742 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
743
744 /*+IndexScan(p2 p2_pkey)*/
745 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
746 /*+IndexScan(p2 p2_c1_id_val_idx)*/
747 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
748 /*+IndexScan(p2 no_exist)*/
749 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
750 /*+IndexScan(p2 p2_pkey p2_c1_id_val_idx)*/
751 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
752 /*+IndexScan(p2 p2_pkey no_exist)*/
753 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
754 /*+IndexScan(p2 p2_c1_id_val_idx no_exist)*/
755 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
756 /*+IndexScan(p2 p2_pkey p2_c1_id_val_idx no_exist)*/
757 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
758
759 /*+IndexScan(p2 p2_val_idx)*/
760 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
761 /*+IndexScan(p2 p2_expr)*/
762 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
763 /*+IndexScan(p2 p2_val_idx6)*/
764 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
765 /*+IndexScan(p2 p2_val_idx p2_val_idx6)*/
766 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
767
768 -- regular expression
769 -- ordinary table
770 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
771 /*+ IndexScanRegexp(t5 t5_[^i].*)*/
772 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
773 /*+ IndexScanRegexp(t5 t5_id[0-9].*)*/
774 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
775 /*+ IndexScanRegexp(t5 t5[^_].*)*/
776 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
777 /*+ IndexScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/
778 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
779 /*+ IndexScan(t5 t5_id[0-9].*)*/
780 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
781 /*+ IndexOnlyScanRegexp(t5 t5_[^i].*)*/
782 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
783 /*+ IndexOnlyScanRegexp(t5 t5_id[0-9].*)*/
784 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
785 /*+ IndexOnlyScanRegexp(t5 t5[^_].*)*/
786 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
787 /*+ IndexOnlyScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/
788 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
789 /*+ IndexOnlyScan(t5 t5_id[0-9].*)*/
790 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
791 /*+ BitmapScanRegexp(t5 t5_[^i].*)*/
792 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
793 /*+ BitmapScanRegexp(t5 t5_id[0-9].*)*/
794 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
795 /*+ BitmapScanRegexp(t5 t5[^_].*)*/
796 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
797 /*+ BitmapScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/
798 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
799 /*+ BitmapScan(t5 t5_id[0-9].*)*/
800 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
801
802 -- Inheritance
803 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
804 /*+ IndexScanRegexp(p1 p1_.*[^0-9]$)*/
805 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
806 /*+ IndexScanRegexp(p1 p1_.*val2.*)*/
807 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
808 /*+ IndexScanRegexp(p1 p1[^_].*)*/
809 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
810 /*+ IndexScan(p1 p1_.*val2.*)*/
811 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
812 /*+ IndexOnlyScanRegexp(p1 p1_.*[^0-9]$)*/
813 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
814 /*+ IndexOnlyScanRegexp(p1 p1_.*val2.*)*/
815 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
816 /*+ IndexOnlyScanRegexp(p1 p1[^_].*)*/
817 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
818 /*+ IndexOnlyScan(p1 p1_.*val2.*)*/
819 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
820 /*+ BitmapScanRegexp(p1 p1_.*[^0-9]$)*/
821 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
822 /*+ BitmapScanRegexp(p1 p1_.*val2.*)*/
823 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
824 /*+ BitmapScanRegexp(p1 p1[^_].*)*/
825 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
826 /*+ BitmapScan(p1 p1_.*val2.*)*/
827 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
828
829 -- search from hint table
830 INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = ?;', '', 'SeqScan(t1)');
831 INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN (COSTS false) SELECT id FROM t1 WHERE t1.id = ?;', '', 'IndexScan(t1)');
832 INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN SELECT * FROM t1 WHERE t1.id = ?;', '', 'BitmapScan(t1)');
833 SELECT * FROM hint_plan.hints ORDER BY id;
834 SET pg_hint_plan.enable_hint_table = on;
835 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = 1;
836 SET pg_hint_plan.enable_hint_table = off;
837 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = 1;
838 TRUNCATE hint_plan.hints;
839 VACUUM ANALYZE hint_plan.hints;
840
841 -- plpgsql test
842 EXPLAIN (COSTS false) SELECT id FROM t1 WHERE t1.id = 1;
843
844 -- static function
845 CREATE FUNCTION testfunc() RETURNS RECORD AS $$
846 DECLARE
847   ret record;
848 BEGIN
849   SELECT /*+ SeqScan(t1) */ * INTO ret FROM t1 LIMIT 1;
850   RETURN ret;
851 END;
852 $$ LANGUAGE plpgsql;
853 SELECT testfunc();
854
855 -- dynamic function
856 DROP FUNCTION testfunc();
857 CREATE FUNCTION testfunc() RETURNS void AS $$
858 BEGIN
859   EXECUTE format('/*+ SeqScan(t1) */ SELECT * FROM t1');
860 END;
861 $$ LANGUAGE plpgsql;
862 SELECT testfunc();
863
864 -- This should not use SeqScan(t1)
865 /*+ IndexScan(t1) */ SELECT * from t1 LIMIT 1;
866
867 -- Perform
868 DROP FUNCTION testfunc();
869 CREATE FUNCTION testfunc() RETURNS void AS $$
870 BEGIN
871   PERFORM  1, /*+ SeqScan(t1) */ * from t1;
872 END;
873 $$ LANGUAGE plpgsql;
874 SELECT testfunc();
875
876 -- FOR loop
877 DROP FUNCTION testfunc();
878 CREATE FUNCTION testfunc() RETURNS int AS $$
879 DECLARE
880   sum int;
881   v int;
882 BEGIN
883   sum := 0;
884   FOR v IN SELECT /*+ SeqScan(t1) */ v FROM t1 ORDER BY id LOOP
885     sum := sum + v;
886   END LOOP;
887   RETURN v;
888 END;
889 $$ LANGUAGE plpgsql;
890 SELECT testfunc();
891
892 -- Dynamic FOR loop
893 DROP FUNCTION testfunc();
894 CREATE FUNCTION testfunc() RETURNS int AS $$
895 DECLARE
896   sum int;
897   v int;
898   i   int;
899 BEGIN
900   sum := 0;
901   FOR v IN EXECUTE 'SELECT /*+ SeqScan(t1) */ val FROM t1 ORDER BY id' LOOP
902     sum := sum + v;
903   END LOOP;
904   RETURN v;
905 END;
906 $$ LANGUAGE plpgsql;
907 SELECT testfunc();
908
909 -- Cursor FOR loop
910 DROP FUNCTION testfunc();
911 CREATE FUNCTION testfunc() RETURNS int AS $$
912 DECLARE
913   ref CURSOR FOR SELECT /*+ SeqScan(t1) */ * FROM t1 ORDER BY id;
914   rec record;
915   sum int := 0;
916 BEGIN
917   FOR rec IN ref LOOP
918     sum := sum + rec.val;
919   END LOOP;
920   RETURN sum;
921 END;
922 $$ LANGUAGE plpgsql;
923 SELECT testfunc();
924
925 -- RETURN QUERY
926 DROP FUNCTION testfunc();
927 CREATE FUNCTION testfunc() RETURNS SETOF t1 AS $$
928 BEGIN
929   RETURN QUERY SELECT /*+ SeqScan(t1) */ * FROM t1 ORDER BY id;
930 END;
931 $$ LANGUAGE plpgsql;
932 SELECT * FROM testfunc() LIMIT 1;
933
934 -- Test for error exit from inner SQL statement.
935 DROP FUNCTION testfunc();
936 CREATE FUNCTION testfunc() RETURNS SETOF t1 AS $$
937 BEGIN
938   RETURN QUERY SELECT /*+ SeqScan(t1) */ * FROM ttx ORDER BY id;
939 END;
940 $$ LANGUAGE plpgsql;
941 SELECT * FROM testfunc() LIMIT 1;
942
943 -- this should not use SeqScan(t1) hint.
944 /*+ IndexScan(t1) */ SELECT * from t1 LIMIT 1;
945
946 DROP FUNCTION testfunc();
947 DROP EXTENSION pg_hint_plan;
948
949 --
950 -- Rows hint tests
951 --
952 -- Explain result includes "Planning time" if COSTS is enabled, but
953 -- this test needs it enabled for get rows count. So do tests via psql
954 -- and grep -v the mutable line.
955
956 -- value types
957 \o results/pg_hint_plan.tmpout
958 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
959 \o
960 \! sql/maskout.sh results/pg_hint_plan.tmpout
961
962 \o results/pg_hint_plan.tmpout
963 /*+ Rows(t1 t2 #99) */
964 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
965 \o
966 \! sql/maskout.sh results/pg_hint_plan.tmpout
967
968 \o results/pg_hint_plan.tmpout
969 /*+ Rows(t1 t2 +99) */
970 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
971 \o
972 \! sql/maskout.sh results/pg_hint_plan.tmpout
973
974 \o results/pg_hint_plan.tmpout
975 /*+ Rows(t1 t2 -99) */
976 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
977 \o
978 \! sql/maskout.sh results/pg_hint_plan.tmpout
979
980 \o results/pg_hint_plan.tmpout
981 /*+ Rows(t1 t2 *99) */
982 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
983 \o
984 \! sql/maskout.sh results/pg_hint_plan.tmpout
985
986 \o results/pg_hint_plan.tmpout
987 /*+ Rows(t1 t2 *0.01) */
988 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
989 \o
990 \! sql/maskout.sh results/pg_hint_plan.tmpout
991
992 \o results/pg_hint_plan.tmpout
993 /*+ Rows(t1 t2 #aa) */
994 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id); -- ERROR
995 \o
996 \! sql/maskout.sh results/pg_hint_plan.tmpout
997
998 \o results/pg_hint_plan.tmpout
999 /*+ Rows(t1 t2 /99) */
1000 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id); -- ERROR
1001 \o
1002 \! sql/maskout.sh results/pg_hint_plan.tmpout
1003
1004 -- round up to 1
1005 \o results/pg_hint_plan.tmpout
1006 /*+ Rows(t1 t2 -99999) */
1007 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1008 \o
1009 \! sql/maskout.sh results/pg_hint_plan.tmpout
1010
1011 -- complex join tree
1012 \o results/pg_hint_plan.tmpout
1013 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id) JOIN t3 ON (t3.id = t2.id);
1014 \o
1015 \! sql/maskout.sh results/pg_hint_plan.tmpout
1016
1017 \o results/pg_hint_plan.tmpout
1018 /*+ Rows(t1 t2 #22) */
1019 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id) JOIN t3 ON (t3.id = t2.id);
1020 \o
1021 \! sql/maskout.sh results/pg_hint_plan.tmpout
1022
1023 \o results/pg_hint_plan.tmpout
1024 /*+ Rows(t1 t3 *10) */
1025 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id) JOIN t3 ON (t3.id = t2.id);
1026 \o
1027 set max_parallel_workers_per_gather to DEFAULT;
1028 \! sql/maskout.sh results/pg_hint_plan.tmpout
1029 \! rm results/pg_hint_plan.tmpout