OSDN Git Service

Support PostgreSQL 14
[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() */ SELECT 1;
56 /*+SeqScan(t1 t2)*/
57 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
58 /*+SeqScan(t1)*/
59 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
60 /*+SeqScan(t1)IndexScan(t2)*/
61 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
62 /*+BitmapScan(t2)*/
63 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
64 /*+BitmapScan(t2)NoSeqScan(t1)*/
65 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
66 /*+NoIndexScan(t1)*/
67 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
68
69 /*+NoBitmapScan(t1)*/
70 EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
71 /*+TidScan(t4)*/
72 EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1,1)';
73 /*+NoTidScan(t1)*/
74 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)';
75
76 /*+ NestLoop() */ SELECT 1;
77 /*+ NestLoop(x) */ SELECT 1;
78 /*+HashJoin(t1 t2)*/
79 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
80 /*+NestLoop(t1 t2)*/
81 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
82 /*+NoMergeJoin(t1 t2)*/
83 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
84
85 /*+MergeJoin(t1 t3)*/
86 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
87 /*+NestLoop(t1 t3)*/
88 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
89 /*+NoHashJoin(t1 t3)*/
90 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
91
92 /*+MergeJoin(t4 t1 t2 t3)*/
93 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
94 /*+HashJoin(t3 t4 t1 t2)*/
95 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
96 /*+NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
97 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
98 /*+NoNestLoop(t4 t1 t3 t2)*/
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
101 /*+Leading( */
102 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
103 /*+Leading( )*/
104 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
105 /*+Leading( t3 )*/
106 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
107 /*+Leading( t3 t4 )*/
108 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
109 /*+Leading(t3 t4 t1)*/
110 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
111 /*+Leading(t3 t4 t1 t2)*/
112 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
113 /*+Leading(t3 t4 t1 t2 t1)*/
114 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
115 /*+Leading(t3 t4 t4)*/
116 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
117
118 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
119 /*+HashJoin(t1 t2)*/
120 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
121 /*+HashJoin(t1 *VALUES*)*/
122 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
123 /*+HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
124 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
125
126 -- single table scan hint test
127 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);
128 /*+BitmapScan(v_1)*/
129 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);
130 /*+BitmapScan(v_2)*/
131 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);
132 /*+BitmapScan(t1)*/
133 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);
134 /*+BitmapScan(v_1)BitmapScan(v_2)*/
135 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);
136 /*+BitmapScan(v_1)BitmapScan(t1)*/
137 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);
138 /*+BitmapScan(v_2)BitmapScan(t1)*/
139 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);
140 /*+BitmapScan(v_1)BitmapScan(v_2)BitmapScan(t1)*/
141 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);
142
143 -- full scan hint pattern test
144 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
145 /*+SeqScan(t1)*/
146 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
147 /*+IndexScan(t1)*/
148 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
149 /*+BitmapScan(t1)*/
150 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
151 /*+TidScan(t1)*/
152 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
153 /*+NoSeqScan(t1)*/
154 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
155 /*+NoIndexScan(t1)*/
156 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
157 /*+NoBitmapScan(t1)*/
158 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
159 /*+NoTidScan(t1)*/
160 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE id < 10 AND ctid = '(1,1)';
161
162 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
163 /*+SeqScan(t1)*/
164 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
165 /*+SeqScan(t2)*/
166 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
167 /*+SeqScan(t1) SeqScan(t2)*/
168 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
169 /*+SeqScan(t1) IndexScan(t2)*/
170 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
171 /*+SeqScan(t1) BitmapScan(t2)*/
172 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
173 /*+SeqScan(t1) TidScan(t2)*/
174 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
175 /*+SeqScan(t1) NoSeqScan(t2)*/
176 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
177 /*+SeqScan(t1) NoIndexScan(t2)*/
178 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
179 /*+SeqScan(t1) NoBitmapScan(t2)*/
180 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
181 /*+SeqScan(t1) NoTidScan(t2)*/
182 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
183
184 /*+IndexScan(t1)*/
185 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
186 /*+IndexScan(t2)*/
187 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
188 /*+IndexScan(t1) SeqScan(t2)*/
189 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
190 /*+IndexScan(t1) IndexScan(t2)*/
191 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
192 /*+IndexScan(t1) BitmapScan(t2)*/
193 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
194 /*+IndexScan(t1) TidScan(t2)*/
195 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
196 /*+IndexScan(t1) NoSeqScan(t2)*/
197 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
198 /*+IndexScan(t1) NoIndexScan(t2)*/
199 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
200 /*+IndexScan(t1) NoBitmapScan(t2)*/
201 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
202 /*+IndexScan(t1) NoTidScan(t2)*/
203 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
204
205 /*+BitmapScan(t1)*/
206 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
207 /*+BitmapScan(t2)*/
208 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
209 /*+BitmapScan(t2)*/
210 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
211 /*+BitmapScan(t1) SeqScan(t2)*/
212 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
213 /*+BitmapScan(t1) IndexScan(t2)*/
214 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
215 /*+BitmapScan(t1) BitmapScan(t2)*/
216 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
217 /*+BitmapScan(t1) TidScan(t2)*/
218 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
219 /*+BitmapScan(t1) NoSeqScan(t2)*/
220 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
221 /*+BitmapScan(t1) NoIndexScan(t2)*/
222 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
223 /*+BitmapScan(t1) NoBitmapScan(t2)*/
224 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
225 /*+BitmapScan(t1) NoTidScan(t2)*/
226 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
227
228 /*+TidScan(t1)*/
229 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
230 /*+TidScan(t2)*/
231 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
232 /*+TidScan(t1) SeqScan(t2)*/
233 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
234 /*+TidScan(t1) IndexScan(t2)*/
235 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
236 /*+TidScan(t1) BitmapScan(t2)*/
237 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
238 /*+TidScan(t1) TidScan(t2)*/
239 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
240 /*+TidScan(t1) NoSeqScan(t2)*/
241 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
242 /*+TidScan(t1) NoIndexScan(t2)*/
243 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
244 /*+TidScan(t1) NoBitmapScan(t2)*/
245 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
246 /*+TidScan(t1) NoTidScan(t2)*/
247 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
248
249 /*+NoSeqScan(t1)*/
250 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
251 /*+NoSeqScan(t2)*/
252 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
253 /*+NoSeqScan(t1) SeqScan(t2)*/
254 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
255 /*+NoSeqScan(t1) IndexScan(t2)*/
256 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
257 /*+NoSeqScan(t1) BitmapScan(t2)*/
258 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
259 /*+NoSeqScan(t1) TidScan(t2)*/
260 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
261 /*+NoSeqScan(t1) NoSeqScan(t2)*/
262 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
263 /*+NoSeqScan(t1) NoIndexScan(t2)*/
264 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
265 /*+NoSeqScan(t1) NoBitmapScan(t2)*/
266 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
267 /*+NoSeqScan(t1) NoTidScan(t2)*/
268 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
269
270 /*+NoIndexScan(t1)*/
271 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
272 /*+NoIndexScan(t2)*/
273 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
274 /*+NoIndexScan(t1) SeqScan(t2)*/
275 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
276 /*+NoIndexScan(t1) IndexScan(t2)*/
277 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
278 /*+NoIndexScan(t1) BitmapScan(t2)*/
279 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
280 /*+NoIndexScan(t1) TidScan(t2)*/
281 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
282 /*+NoIndexScan(t1) NoSeqScan(t2)*/
283 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
284 /*+NoIndexScan(t1) NoIndexScan(t2)*/
285 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
286 /*+NoIndexScan(t1) NoBitmapScan(t2)*/
287 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
288 /*+NoIndexScan(t1) NoTidScan(t2)*/
289 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
290
291 /*+NoBitmapScan(t1)*/
292 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
293 /*+NoBitmapScan(t2)*/
294 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
295 /*+NoBitmapScan(t1) SeqScan(t2)*/
296 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
297 /*+NoBitmapScan(t1) IndexScan(t2)*/
298 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
299 /*+NoBitmapScan(t1) BitmapScan(t2)*/
300 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
301 /*+NoBitmapScan(t1) TidScan(t2)*/
302 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
303 /*+NoBitmapScan(t1) NoSeqScan(t2)*/
304 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
305 /*+NoBitmapScan(t1) NoIndexScan(t2)*/
306 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
307 /*+NoBitmapScan(t1) NoBitmapScan(t2)*/
308 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
309 /*+NoBitmapScan(t1) NoTidScan(t2)*/
310 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
311
312 /*+NoTidScan(t1)*/
313 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
314 /*+NoTidScan(t2)*/
315 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
316 /*+NoTidScan(t1) SeqScan(t2)*/
317 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
318 /*+NoTidScan(t1) IndexScan(t2)*/
319 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
320 /*+NoTidScan(t1) BitmapScan(t2)*/
321 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
322 /*+NoTidScan(t1) TidScan(t2)*/
323 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
324 /*+NoTidScan(t1) NoSeqScan(t2)*/
325 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
326 /*+NoTidScan(t1) NoIndexScan(t2)*/
327 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
328 /*+NoTidScan(t1) NoBitmapScan(t2)*/
329 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
330 /*+NoTidScan(t1) NoTidScan(t2)*/
331 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
332
333 -- additional test
334 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;
335 /*+BitmapScan(t1) BitmapScan(t2)*/
336 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;
337
338 -- outer join test
339 EXPLAIN (COSTS false) SELECT * FROM t1 FULL OUTER JOIN  t2 ON (t1.id = t2.id);
340 /*+MergeJoin(t1 t2)*/
341 EXPLAIN (COSTS false) SELECT * FROM t1 FULL OUTER JOIN  t2 ON (t1.id = t2.id);
342 -- Cannot work
343 /*+NestLoop(t1 t2)*/
344 EXPLAIN (COSTS false) SELECT * FROM t1 FULL OUTER JOIN  t2 ON (t1.id = t2.id);
345
346 -- inheritance tables test
347 SET constraint_exclusion TO off;
348 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
349 SET constraint_exclusion TO on;
350 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
351 SET constraint_exclusion TO off;
352 /*+SeqScan(p1)*/
353 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
354 /*+IndexScan(p1)*/
355 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
356 /*+BitmapScan(p1)*/
357 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
358 /*+TidScan(p1)*/
359 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
360 SET constraint_exclusion TO on;
361 /*+SeqScan(p1)*/
362 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
363 /*+IndexScan(p1)*/
364 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
365 /*+BitmapScan(p1)*/
366 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
367 /*+TidScan(p1)*/
368 EXPLAIN (COSTS false) SELECT * FROM p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
369
370 SET constraint_exclusion TO off;
371 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;
372 SET constraint_exclusion TO on;
373 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;
374 SET constraint_exclusion TO off;
375 /*+SeqScan(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 /*+IndexScan(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 /*+BitmapScan(p1)*/
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 /*+TidScan(p1)*/
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 /*+NestLoop(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 /*+MergeJoin(p1 t1)*/
386 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;
387 /*+HashJoin(p1 t1)*/
388 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;
389 SET constraint_exclusion TO on;
390 /*+SeqScan(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 /*+IndexScan(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 /*+BitmapScan(p1)*/
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 /*+TidScan(p1)*/
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 /*+NestLoop(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 /*+MergeJoin(p1 t1)*/
401 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;
402 /*+HashJoin(p1 t1)*/
403 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;
404
405 SET constraint_exclusion TO off;
406 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
407 SET constraint_exclusion TO on;
408 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
409 SET constraint_exclusion TO off;
410 /*+SeqScan(p1)*/
411 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
412 /*+IndexScan(p1)*/
413 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
414 /*+BitmapScan(p1)*/
415 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
416 /*+TidScan(p1)*/
417 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
418 /*+NestLoop(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 /*+MergeJoin(p1 t1)*/
421 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;
422 /*+HashJoin(p1 t1)*/
423 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;
424 SET constraint_exclusion TO on;
425 /*+SeqScan(p1)*/
426 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
427 /*+IndexScan(p1)*/
428 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
429 /*+BitmapScan(p1)*/
430 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
431 /*+TidScan(p1)*/
432 EXPLAIN (COSTS false) SELECT * FROM ONLY p1 WHERE id >= 50 AND id <= 51 AND p1.ctid = '(1,1)';
433 /*+NestLoop(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 /*+MergeJoin(p1 t1)*/
436 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;
437 /*+HashJoin(p1 t1)*/
438 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;
439
440 SET constraint_exclusion TO off;
441 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;
442 SET constraint_exclusion TO on;
443 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;
444 SET constraint_exclusion TO off;
445 /*+SeqScan(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 /*+IndexScan(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 /*+BitmapScan(p1)*/
450 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;
451 /*+TidScan(p1)*/
452 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;
453 SET constraint_exclusion TO on;
454 /*+SeqScan(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 /*+IndexScan(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 /*+BitmapScan(p1)*/
459 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;
460 /*+TidScan(p1)*/
461 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;
462
463 -- quote test
464 /*+SeqScan("""t1 )      ")IndexScan("t  2 """)HashJoin("""t1 )  "T3"t   2 """)Leading("""t1 )   "T3"t   2 """)Set(application_name"a    a       a""     a       A")*/
465 EXPLAIN (COSTS false) SELECT * FROM t1 """t1 )  ", t2 "t        2 """, t3 "T3" WHERE """t1 )    ".id = "t       2 """.id AND """t1 )    ".id = "T3".id;
466
467 -- duplicate hint test
468 /*+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)*/
469 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)' AND t2.ctid = '(1,1)';
470
471 -- sub query Leading hint test
472 SET from_collapse_limit TO 100;
473 SET geqo_threshold TO 100;
474 EXPLAIN (COSTS false)
475 WITH c1_1(id) AS (
476 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
477 )
478 SELECT t1_1.id, (
479 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
480 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
481 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
482 ) 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 = (
483 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 
484 );
485 /*+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)*/
486 EXPLAIN (COSTS false)
487 WITH c1_1(id) AS (
488 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
489 )
490 SELECT t1_1.id, (
491 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
492 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
493 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
494 ) 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 = (
495 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 
496 );
497 /*+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)*/
498 EXPLAIN (COSTS false)
499 WITH c1_1(id) AS (
500 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
501 )
502 SELECT t1_1.id, (
503 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
504 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
505 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
506 ) 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 = (
507 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 
508 );
509 /*+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)*/
510 EXPLAIN (COSTS false)
511 WITH c1_1(id) AS (
512 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
513 )
514 SELECT t1_1.id, (
515 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
516 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
517 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
518 ) 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 = (
519 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 
520 );
521 /*+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)*/
522 EXPLAIN (COSTS false)
523 WITH c1_1(id) AS (
524 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
525 )
526 SELECT t1_1.id, (
527 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
528 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
529 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
530 ) 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 = (
531 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 
532 );
533
534 SET from_collapse_limit TO 1;
535 EXPLAIN (COSTS false)
536 WITH c1_1(id) AS (
537 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
538 )
539 SELECT t1_1.id, (
540 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
541 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
542 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
543 ) 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 = (
544 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 
545 );
546 /*+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)*/
547 EXPLAIN (COSTS false)
548 WITH c1_1(id) AS (
549 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
550 )
551 SELECT t1_1.id, (
552 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
553 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
554 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
555 ) 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 = (
556 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 
557 );
558 /*+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)*/
559 EXPLAIN (COSTS false)
560 WITH c1_1(id) AS (
561 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
562 )
563 SELECT t1_1.id, (
564 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
565 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
566 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
567 ) 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 = (
568 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 
569 );
570 /*+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)*/
571 EXPLAIN (COSTS false)
572 WITH c1_1(id) AS (
573 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
574 )
575 SELECT t1_1.id, (
576 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
577 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
578 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
579 ) 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 = (
580 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 
581 );
582 /*+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)*/
583 EXPLAIN (COSTS false)
584 WITH c1_1(id) AS (
585 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
586 )
587 SELECT t1_1.id, (
588 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
589 ) FROM t1 t1_1, t2 t2_1, t3 t3_1, (
590 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
591 ) 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 = (
592 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 
593 );
594
595 -- ambiguous error
596 EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id;
597 /*+MergeJoin(t1 t2)*/
598 EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id;
599 /*+Leading(t1 t2 t1)*/
600 EXPLAIN (COSTS false) SELECT * FROM t1, s0.t1, t2 WHERE public.t1.id = s0.t1.id AND public.t1.id = t2.id;
601
602 -- identifier length test
603 EXPLAIN (COSTS false) SELECT * FROM t1 "123456789012345678901234567890123456789012345678901234567890123" JOIN t2 ON ("123456789012345678901234567890123456789012345678901234567890123".id = t2.id) JOIN t3 ON (t2.id = t3.id);
604 /*+
605 Leading(123456789012345678901234567890123456789012345678901234567890123 t2 t3)
606 SeqScan(123456789012345678901234567890123456789012345678901234567890123)
607 MergeJoin(123456789012345678901234567890123456789012345678901234567890123 t2)
608 Set(123456789012345678901234567890123456789012345678901234567890123 1)
609 */
610 EXPLAIN (COSTS false) SELECT * FROM t1 "123456789012345678901234567890123456789012345678901234567890123" JOIN t2 ON ("123456789012345678901234567890123456789012345678901234567890123".id = t2.id) JOIN t3 ON (t2.id = t3.id);
611 /*+
612 Leading(1234567890123456789012345678901234567890123456789012345678901234 t2 t3)
613 SeqScan(1234567890123456789012345678901234567890123456789012345678901234)
614 MergeJoin(1234567890123456789012345678901234567890123456789012345678901234 t2)
615 Set(1234567890123456789012345678901234567890123456789012345678901234 1)
616 Set(cursor_tuple_fraction 0.1234567890123456789012345678901234567890123456789012345678901234)
617 */
618 EXPLAIN (COSTS false) SELECT * FROM t1 "1234567890123456789012345678901234567890123456789012345678901234" JOIN t2 ON ("1234567890123456789012345678901234567890123456789012345678901234".id = t2.id) JOIN t3 ON (t2.id = t3.id);
619 SET "123456789012345678901234567890123456789012345678901234567890123" TO 1;
620 SET "1234567890123456789012345678901234567890123456789012345678901234" TO 1;
621 SET cursor_tuple_fraction TO 1234567890123456789012345678901234567890123456789012345678901234;
622
623 -- multi error
624 /*+ Set(enable_seqscan 100)Set(seq_page_cost on)*/
625 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
626
627 -- debug log of candidate index to use IndexScan
628 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
629 /*+IndexScan(t5 t5_id2)*/
630 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
631 /*+IndexScan(t5 no_exist)*/
632 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
633 /*+IndexScan(t5 t5_id1 t5_id2)*/
634 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
635 /*+IndexScan(t5 no_exist t5_id2)*/
636 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
637 /*+IndexScan(t5 no_exist5 no_exist2)*/
638 EXPLAIN (COSTS false) SELECT * FROM t5 WHERE t5.id = 1;
639
640 -- outer inner
641 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
642
643 /*+Leading((t1))*/
644 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
645 /*+Leading((t1 t2))*/
646 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
647 /*+Leading((t1 t2 t3))*/
648 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
649
650 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.id < 10;
651 /*+Leading((t1 t2))*/
652 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.id < 10;
653
654 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
655 /*+Leading(((t1 t2) t3))*/
656 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
657
658 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;
659 /*+Leading((((t1 t2) t3) t4))*/
660 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;
661
662 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
663 /*+Leading(((t1 t2) t3))*/
664 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
665 /*+Leading((t1 (t2 t3)))*/
666 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
667
668 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;
669 /*+Leading(((t1 t2) (t3 t4)))*/
670 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;
671
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)) Leading(((t3 t1) t2))*/
674 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);
675 /*+Leading(((t1 t2) t3)) Leading((t1_2 t2_2))*/
676 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);
677 /*+Leading(((((t1 t2) t3) t1_2) t2_2))*/
678 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);
679
680 -- Specified outer/inner leading hint and join method hint at the same time
681 /*+Leading(((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 t2)*/
684 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
685 /*+Leading(((t1 t2) t3)) MergeJoin(t1 t2 t3)*/
686 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
687 /*+Leading(((t1 t2) t3)) MergeJoin(t1 t3)*/
688 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
689
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 /*+Leading(((t1 t2) t3)) MergeJoin(t3 t4)*/
692 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;
693 /*+Leading(((t1 t2) t3)) MergeJoin(t1 t2 t3 t4)*/
694 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;
695
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 /*+Leading(((t1 t2)t3))*/
705 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
706 /*+Leading(("(t1" "t2)t3"))*/
707 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3 WHERE t1.id = t2.id AND t2.val = t3.val AND t1.id < 10;
708
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 /*+Leading((((t1 t2)t3)(t4 t5)))*/
722 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;
723 /*+Leading((((t5 t4)t3)(t2 t1)))*/
724 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;
725
726 -- inherite table test to specify the index's name
727 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
728 /*+IndexScan(p2 p2_pkey)*/
729 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
730 /*+IndexScan(p2 p2_id_val_idx)*/
731 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
732 /*+IndexScan(p2 p2_val_id_idx)*/
733 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
734
735 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
736
737 -- Inhibit parallel exection to avoid interfaring the hint
738 set max_parallel_workers_per_gather to 0;
739 /*+ IndexScan(p2 p2_val)*/
740 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
741 /*+IndexScan(p2 p2_pkey)*/
742 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
743 /*+IndexScan(p2 p2_id2_val)*/
744 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
745 /*+IndexScan(p2 p2_val2_id)*/
746 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
747
748 /*+IndexScan(p2 p2_pkey)*/
749 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
750 /*+IndexScan(p2 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 no_exist)*/
753 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
754 /*+IndexScan(p2 p2_pkey p2_c1_id_val_idx)*/
755 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
756 /*+IndexScan(p2 p2_pkey no_exist)*/
757 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
758 /*+IndexScan(p2 p2_c1_id_val_idx no_exist)*/
759 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
760 /*+IndexScan(p2 p2_pkey p2_c1_id_val_idx no_exist)*/
761 EXPLAIN (COSTS false) SELECT * FROM p2 WHERE id >= 50 AND id <= 51 AND p2.ctid = '(1,1)';
762
763 /*+IndexScan(p2 p2_val_idx)*/
764 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
765 /*+IndexScan(p2 p2_expr)*/
766 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
767 /*+IndexScan(p2 p2_val_idx6)*/
768 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
769 /*+IndexScan(p2 p2_val_idx p2_val_idx6)*/
770 EXPLAIN (COSTS false) SELECT val FROM p2 WHERE val >= '50' AND val <= '51' AND p2.ctid = '(1,1)';
771
772 -- regular expression
773 -- ordinary table
774 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
775 /*+ IndexScanRegexp(t5 t5_[^i].*)*/
776 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
777 /*+ IndexScanRegexp(t5 t5_id[0-9].*)*/
778 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
779 /*+ IndexScanRegexp(t5 t5[^_].*)*/
780 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
781 /*+ IndexScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/
782 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
783 /*+ IndexScan(t5 t5_id[0-9].*)*/
784 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
785 /*+ IndexOnlyScanRegexp(t5 t5_[^i].*)*/
786 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
787 /*+ IndexOnlyScanRegexp(t5 t5_id[0-9].*)*/
788 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
789 /*+ IndexOnlyScanRegexp(t5 t5[^_].*)*/
790 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
791 /*+ IndexOnlyScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/
792 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
793 /*+ IndexOnlyScan(t5 t5_id[0-9].*)*/
794 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
795 /*+ BitmapScanRegexp(t5 t5_[^i].*)*/
796 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
797 /*+ BitmapScanRegexp(t5 t5_id[0-9].*)*/
798 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
799 /*+ BitmapScanRegexp(t5 t5[^_].*)*/
800 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
801 /*+ BitmapScanRegexp(t5 ^.*t5_idaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab)*/
802 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
803 /*+ BitmapScan(t5 t5_id[0-9].*)*/
804 EXPLAIN (COSTS false) SELECT id FROM t5 WHERE id = 1;
805
806 -- Inheritance
807 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
808 /*+ IndexScanRegexp(p1 p1_.*[^0-9]$)*/
809 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
810 /*+ IndexScanRegexp(p1 p1_.*val2.*)*/
811 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
812 /*+ IndexScanRegexp(p1 p1[^_].*)*/
813 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
814 /*+ IndexScan(p1 p1_.*val2.*)*/
815 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
816 /*+ IndexOnlyScanRegexp(p1 p1_.*[^0-9]$)*/
817 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
818 /*+ IndexOnlyScanRegexp(p1 p1_.*val2.*)*/
819 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
820 /*+ IndexOnlyScanRegexp(p1 p1[^_].*)*/
821 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
822 /*+ IndexOnlyScan(p1 p1_.*val2.*)*/
823 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
824 /*+ BitmapScanRegexp(p1 p1_.*[^0-9]$)*/
825 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
826 /*+ BitmapScanRegexp(p1 p1_.*val2.*)*/
827 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
828 /*+ BitmapScanRegexp(p1 p1[^_].*)*/
829 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
830 /*+ BitmapScan(p1 p1_.*val2.*)*/
831 EXPLAIN (COSTS false) SELECT val FROM p1 WHERE val = 1;
832
833 -- search from hint table
834 INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = ?;', '', 'SeqScan(t1)');
835 INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN (COSTS false) SELECT id FROM t1 WHERE t1.id = ?;', '', 'IndexScan(t1)');
836 INSERT INTO hint_plan.hints (norm_query_string, application_name, hints) VALUES ('EXPLAIN SELECT * FROM t1 WHERE t1.id = ?;', '', 'BitmapScan(t1)');
837 SELECT * FROM hint_plan.hints ORDER BY id;
838 SET pg_hint_plan.enable_hint_table = on;
839 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = 1;
840 SET pg_hint_plan.enable_hint_table = off;
841 EXPLAIN (COSTS false) SELECT * FROM t1 WHERE t1.id = 1;
842 TRUNCATE hint_plan.hints;
843 VACUUM ANALYZE hint_plan.hints;
844
845 -- plpgsql test
846 EXPLAIN (COSTS false) SELECT id FROM t1 WHERE t1.id = 1;
847
848 -- static function
849 CREATE FUNCTION testfunc() RETURNS RECORD AS $$
850 DECLARE
851   ret record;
852 BEGIN
853   SELECT /*+ SeqScan(t1) */ * INTO ret FROM t1 LIMIT 1;
854   RETURN ret;
855 END;
856 $$ LANGUAGE plpgsql;
857 SELECT testfunc();
858
859 -- dynamic function
860 DROP FUNCTION testfunc();
861 CREATE FUNCTION testfunc() RETURNS void AS $$
862 BEGIN
863   EXECUTE format('/*+ SeqScan(t1) */ SELECT * FROM t1');
864 END;
865 $$ LANGUAGE plpgsql;
866 SELECT testfunc();
867
868 -- This should not use SeqScan(t1)
869 /*+ IndexScan(t1) */ SELECT * from t1 LIMIT 1;
870
871 -- Perform
872 DROP FUNCTION testfunc();
873 CREATE FUNCTION testfunc() RETURNS void AS $$
874 BEGIN
875   PERFORM  1, /*+ SeqScan(t1) */ * from t1;
876 END;
877 $$ LANGUAGE plpgsql;
878 SELECT testfunc();
879
880 -- FOR loop
881 DROP FUNCTION testfunc();
882 CREATE FUNCTION testfunc() RETURNS int AS $$
883 DECLARE
884   sum int;
885   v int;
886 BEGIN
887   sum := 0;
888   FOR v IN SELECT /*+ SeqScan(t1) */ v FROM t1 ORDER BY id LOOP
889     sum := sum + v;
890   END LOOP;
891   RETURN v;
892 END;
893 $$ LANGUAGE plpgsql;
894 SELECT testfunc();
895
896 -- Dynamic FOR loop
897 DROP FUNCTION testfunc();
898 CREATE FUNCTION testfunc() RETURNS int AS $$
899 DECLARE
900   sum int;
901   v int;
902   i   int;
903 BEGIN
904   sum := 0;
905   FOR v IN EXECUTE 'SELECT /*+ SeqScan(t1) */ val FROM t1 ORDER BY id' LOOP
906     sum := sum + v;
907   END LOOP;
908   RETURN v;
909 END;
910 $$ LANGUAGE plpgsql;
911 SELECT testfunc();
912
913 -- Cursor FOR loop
914 DROP FUNCTION testfunc();
915 CREATE FUNCTION testfunc() RETURNS int AS $$
916 DECLARE
917   ref CURSOR FOR SELECT /*+ SeqScan(t1) */ * FROM t1 ORDER BY id;
918   rec record;
919   sum int := 0;
920 BEGIN
921   FOR rec IN ref LOOP
922     sum := sum + rec.val;
923   END LOOP;
924   RETURN sum;
925 END;
926 $$ LANGUAGE plpgsql;
927 SELECT testfunc();
928
929 -- RETURN QUERY
930 DROP FUNCTION testfunc();
931 CREATE FUNCTION testfunc() RETURNS SETOF t1 AS $$
932 BEGIN
933   RETURN QUERY SELECT /*+ SeqScan(t1) */ * FROM t1 ORDER BY id;
934 END;
935 $$ LANGUAGE plpgsql;
936 SELECT * FROM testfunc() LIMIT 1;
937
938 -- Test for error exit from inner SQL statement.
939 DROP FUNCTION testfunc();
940 CREATE FUNCTION testfunc() RETURNS SETOF t1 AS $$
941 BEGIN
942   RETURN QUERY SELECT /*+ SeqScan(t1) */ * FROM ttx ORDER BY id;
943 END;
944 $$ LANGUAGE plpgsql;
945 SELECT * FROM testfunc() LIMIT 1;
946
947 -- this should not use SeqScan(t1) hint.
948 /*+ IndexScan(t1) */ SELECT * from t1 LIMIT 1;
949
950 DROP FUNCTION testfunc();
951 DROP EXTENSION pg_hint_plan;
952
953 CREATE FUNCTION reset_stats_and_wait() RETURNS void AS $$
954 DECLARE
955   rows int;
956 BEGIN
957   rows = 1;
958   while rows > 0 LOOP
959    PERFORM pg_stat_reset();
960    PERFORM pg_sleep(0.5);
961    SELECT sum(seq_scan + idx_scan) from pg_stat_user_tables into rows;
962   END LOOP;
963 END;
964 $$ LANGUAGE plpgsql;
965
966 -- Dynamic query in pl/pgsql
967 CREATE OR REPLACE FUNCTION dynsql1(x int) RETURNS int AS $$
968 DECLARE c int;
969 BEGIN
970   EXECUTE '/*+ IndexScan(t1) */ SELECT count(*) FROM t1 WHERE id < $1'
971         INTO c USING x;
972   RETURN c;
973 END;
974 $$ VOLATILE LANGUAGE plpgsql;
975 vacuum analyze t1;
976 SET pg_hint_plan.enable_hint = false;
977 SELECT pg_sleep(1);
978 SELECT reset_stats_and_wait();
979 SELECT dynsql1(9000);
980 SELECT pg_sleep(1);
981 SELECT relname, seq_scan > 0 as seq_scan, idx_scan > 0 as idx_scan FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname = 't1';
982 SET pg_hint_plan.enable_hint = true;
983 SELECT reset_stats_and_wait();
984 SELECT dynsql1(9000);
985 SELECT pg_sleep(1);
986 SELECT relname, seq_scan > 0 as seq_scan, idx_scan > 0 as idx_scan FROM pg_stat_user_tables WHERE schemaname = 'public' AND relname = 't1';
987
988 -- Looped dynamic query in pl/pgsql
989 CREATE OR REPLACE FUNCTION dynsql2(x int, OUT r int) AS $$
990 DECLARE
991   c text;
992   s int;
993 BEGIN
994   r := 0;
995   FOR c IN SELECT f.f FROM (VALUES ('p1_c1'), ('p1_c2')) f(f) LOOP
996     FOR s IN EXECUTE '/*+ IndexScan(' || c || ' ' || c || '_pkey) */ SELECT sum(val) FROM ' || c || ' WHERE id < ' || x LOOP
997       r := r + s;
998     END LOOP;
999   END LOOP;
1000 END;
1001 $$ VOLATILE LANGUAGE plpgsql;
1002 SET pg_hint_plan.enable_hint = false;
1003 SELECT reset_stats_and_wait();
1004 SELECT dynsql2(9000);
1005 SELECT pg_sleep(1);
1006 -- one of the index scans happened while planning.
1007 SELECT relname, seq_scan, idx_scan FROM pg_stat_user_tables WHERE schemaname = 'public' AND (relname = 'p1_c1' OR relname = 'p1_c2');
1008 SET pg_hint_plan.enable_hint = true;
1009 SELECT reset_stats_and_wait();
1010 SELECT dynsql2(9000);
1011 SELECT pg_sleep(1);
1012 -- the index scan happened while planning.
1013 SELECT relname, seq_scan, idx_scan FROM pg_stat_user_tables WHERE schemaname = 'public' AND (relname = 'p1_c1' OR relname = 'p1_c2');
1014
1015 -- Subqueries on inheritance tables under UNION
1016 EXPLAIN (COSTS off) SELECT val FROM p1 WHERE val < 1000
1017 UNION ALL
1018 SELECT val::int FROM p2 WHERE id < 1000;
1019
1020 /*+ IndexScan(p1 p1_val2) */
1021 EXPLAIN (COSTS off) SELECT val FROM p1 WHERE val < 1000
1022 UNION ALL
1023 SELECT val::int FROM p2 WHERE id < 1000;
1024
1025 /*+ IndexScan(p1 p1_val2) IndexScan(p2 p2_id_val_idx) */
1026 EXPLAIN (COSTS off) SELECT val FROM p1 WHERE val < 1000
1027 UNION ALL
1028 SELECT val::int FROM p2 WHERE id < 1000;
1029
1030 -- union all case
1031 EXPLAIN (COSTS off) SELECT val FROM p1 WHERE val < 1000
1032 UNION
1033 SELECT val::int FROM p2 WHERE id < 1000;
1034
1035 /*+ IndexScan(p2 p2_id_val_idx) */
1036 EXPLAIN (COSTS off) SELECT val FROM p1 WHERE val < 1000
1037 UNION
1038 SELECT val::int FROM p2 WHERE id < 1000;
1039
1040 /*+ IndexScan(p1 p1_val2) IndexScan(p2 p2_id_val_idx) */
1041 EXPLAIN (COSTS off) SELECT val FROM p1 WHERE val < 1000
1042 UNION
1043 SELECT val::int FROM p2 WHERE id < 1000;
1044
1045 --
1046 -- Rows hint tests
1047 --
1048 -- Explain result includes "Planning time" if COSTS is enabled, but
1049 -- this test needs it enabled for get rows count. So do tests via psql
1050 -- and grep -v the mutable line.
1051
1052 -- Parse error check
1053 /*+ Rows() */ SELECT 1;
1054 /*+ Rows(x) */ SELECT 1;
1055
1056 -- value types
1057 \o results/pg_hint_plan.tmpout
1058 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1059 \o
1060 \! sql/maskout.sh results/pg_hint_plan.tmpout
1061
1062 \o results/pg_hint_plan.tmpout
1063 /*+ Rows(t1 t2 #99) */
1064 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1065 \o
1066 \! sql/maskout.sh results/pg_hint_plan.tmpout
1067
1068 \o results/pg_hint_plan.tmpout
1069 /*+ Rows(t1 t2 +99) */
1070 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1071 \o
1072 \! sql/maskout.sh results/pg_hint_plan.tmpout
1073
1074 \o results/pg_hint_plan.tmpout
1075 /*+ Rows(t1 t2 -99) */
1076 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1077 \o
1078 \! sql/maskout.sh results/pg_hint_plan.tmpout
1079
1080 \o results/pg_hint_plan.tmpout
1081 /*+ Rows(t1 t2 *99) */
1082 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1083 \o
1084 \! sql/maskout.sh results/pg_hint_plan.tmpout
1085
1086 \o results/pg_hint_plan.tmpout
1087 /*+ Rows(t1 t2 *0.01) */
1088 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1089 \o
1090 \! sql/maskout.sh results/pg_hint_plan.tmpout
1091
1092 \o results/pg_hint_plan.tmpout
1093 /*+ Rows(t1 t2 #aa) */
1094 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id); -- ERROR
1095 \o
1096 \! sql/maskout.sh results/pg_hint_plan.tmpout
1097
1098 \o results/pg_hint_plan.tmpout
1099 /*+ Rows(t1 t2 /99) */
1100 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id); -- ERROR
1101 \o
1102 \! sql/maskout.sh results/pg_hint_plan.tmpout
1103
1104 -- round up to 1
1105 \o results/pg_hint_plan.tmpout
1106 /*+ Rows(t1 t2 -99999) */
1107 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id);
1108 \o
1109 \! sql/maskout.sh results/pg_hint_plan.tmpout
1110
1111 -- complex join tree
1112 \o results/pg_hint_plan.tmpout
1113 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id) JOIN t3 ON (t3.id = t2.id);
1114 \o
1115 \! sql/maskout.sh results/pg_hint_plan.tmpout
1116
1117 \o results/pg_hint_plan.tmpout
1118 /*+ Rows(t1 t2 #22) */
1119 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id) JOIN t3 ON (t3.id = t2.id);
1120 \o
1121 \! sql/maskout.sh results/pg_hint_plan.tmpout
1122
1123 \o results/pg_hint_plan.tmpout
1124 /*+ Rows(t1 t3 *10) */
1125 EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id) JOIN t3 ON (t3.id = t2.id);
1126 \o
1127 set max_parallel_workers_per_gather to DEFAULT;
1128 \! sql/maskout.sh results/pg_hint_plan.tmpout
1129 \! rm results/pg_hint_plan.tmpout
1130
1131 -- hint error level
1132 set client_min_messages to 'DEBUG1';
1133 set pg_hint_plan.debug_level to 'verbose';
1134 /*+ SeqScan( */ SELECT 1;
1135 /*+ SeqScan(t1) */ SELECT * FROM t1 LIMIT 0;
1136 set pg_hint_plan.message_level to 'DEBUG1';
1137 set pg_hint_plan.parse_messages to 'NOTICE';
1138 /*+ SeqScan( */ SELECT 1;
1139 /*+ SeqScan(t1) */ SELECT * FROM t1 LIMIT 0;
1140
1141 -- all hint types together
1142 /*+ SeqScan(t1) MergeJoin(t1 t2) Leading(t1 t2) Rows(t1 t2 +10) Parallel(t1 8 hard) Set(random_page_cost 2.0)*/
1143 EXPLAIN (costs off) SELECT * FROM t1 JOIN t2 ON (t1.id = t2.id) JOIN t3 ON (t3.id = t2.id);