OSDN Git Service

リグレッションテストのリファクタリングを実施した。
[pghintplan/pg_hint_plan.git] / sql / ut-A.sql
1 LOAD 'pg_hint_plan';
2 SET pg_hint_plan.enable_hint TO on;
3 SET pg_hint_plan.debug_print TO on;
4 SET client_min_messages TO LOG;
5 SET search_path TO public;
6
7 ----
8 ---- No. A-5-1 hint format
9 ----
10
11 -- No. A-5-1-1
12 /*+SeqScan(t1)*/
13 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
14
15 -- No. A-5-1-2
16 /* +SeqScan(t1)*/
17 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
18
19 -- No. A-5-1-3
20 --+SeqScan(t1)
21 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
22
23 -- No. A-5-1-4
24 --+SeqScan(t1)
25 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
26
27 -- No. A-5-1-5
28 -- +SeqScan(t1)
29 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
30
31 -- No. A-5-1-6
32 --SeqScan(t1)
33 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
34
35 -- No. A-5-1-7
36 /*+SeqScan(t1) /* nest comment */ */
37 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
38
39 -- No. A-5-1-8
40 /* +SeqScan(t1) /* nest comment */ */
41 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
42
43 -- No. A-5-1-9
44 /*SeqScan(t1) /* nest comment */ */
45 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
46
47 ----
48 ---- No. A-5-2 hint position
49 ----
50
51 -- No. A-5-2-1
52 /*+SeqScan(t1)*/
53 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
54
55 -- No. A-5-2-2
56 /* normal comment */
57 /*+SeqScan(t1)*/
58 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
59
60 -- No. A-5-2-3
61 EXPLAIN (COSTS false) SELECT /*+SeqScan(t1)*/ * FROM s1.t1 WHERE t1.c1 = 1;
62
63 ----
64 ---- No. A-5-4 hint delimiter
65 ----
66
67 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
68 -- No. A-5-4-1
69 -- No. A-5-4-2
70 -- No. A-5-4-3
71 -- No. A-5-4-4
72 -- No. A-5-4-5
73 -- No. A-5-4-6
74 -- No. A-5-4-7
75 /*+Set(enable_indexscan"off")Set(enable_bitmapscan"off")*/
76 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
77
78 -- No. A-5-4-8
79 /*+ Set(enable_indexscan"off")Set(enable_bitmapscan"off")*/
80 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
81
82 -- No. A-5-4-9
83 /*+Set(enable_indexscan"off")Set(enable_bitmapscan"off") */
84 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
85
86 -- No. A-5-4-10
87 /*+ Set (enable_indexscan"off") Set (enable_bitmapscan"off")*/
88 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
89
90 -- No. A-5-4-11
91 /*+Set ( enable_indexscan"off")Set ( enable_bitmapscan"off")*/
92 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
93
94 -- No. A-5-4-12
95 /*+Set(enable_indexscan"off" ) Set(enable_bitmapscan"off" ) */
96 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
97
98 -- No. A-5-4-13
99 /*+Set( enable_indexscan "off" )Set( enable_bitmapscan "off" )*/
100 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
101
102 -- No. A-5-4-14
103 /*+ Set ( enable_indexscan "off" ) Set ( enable_bitmapscan "off" ) */
104 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
105
106 -- No. A-5-4-15
107 /*+     Set(enable_indexscan"off")Set(enable_bitmapscan"off")*/
108 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
109
110 -- No. A-5-4-16
111 /*+Set(enable_indexscan"off")Set(enable_bitmapscan"off")        */
112 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
113
114 -- No. A-5-4-17
115 /*+     Set     (enable_indexscan"off") Set     (enable_bitmapscan"off")*/
116 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
117
118 -- No. A-5-4-18
119 /*+Set  (       enable_indexscan"off")Set       (       enable_bitmapscan"off")*/
120 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
121
122 -- No. A-5-4-19
123 /*+Set(enable_indexscan"off"    )       Set(enable_bitmapscan"off"      )       */
124 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
125
126 -- No. A-5-4-20
127 /*+Set( enable_indexscan        "off"   )Set(   enable_bitmapscan       "off"   )*/
128 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
129
130 -- No. A-5-4-21
131 /*+     Set     (       enable_indexscan        "off"   )       Set     (       enable_bitmapscan       "off"   )       */
132 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
133
134 -- No. A-5-4-22
135 /*+
136 Set(enable_indexscan"off")Set(enable_bitmapscan"off")*/
137 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
138
139 -- No. A-5-4-23
140 /*+Set(enable_indexscan"off")Set(enable_bitmapscan"off")
141 */
142 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
143
144 -- No. A-5-4-24
145 /*+
146 Set
147 (enable_indexscan"off")
148 Set
149 (enable_bitmapscan"off")*/
150 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
151
152 -- No. A-5-4-25
153 /*+Set
154 (
155 enable_indexscan"off")Set
156 (
157 enable_bitmapscan"off")*/
158 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
159
160 -- No. A-5-4-26
161 /*+Set(enable_indexscan"off"
162 )
163 Set(enable_bitmapscan"off"
164 )
165 */
166 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
167
168 -- No. A-5-4-27
169 /*+Set(
170 enable_indexscan
171 "off"
172 )Set(
173 enable_bitmapscan
174 "off"
175 )*/
176 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
177
178 -- No. A-5-4-28
179 /*+
180 Set
181 (
182 enable_indexscan
183 "off"
184 )
185 Set
186 (
187 enable_bitmapscan
188 "off"
189 )
190 */
191 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
192
193 -- No. A-5-4-29
194 /*+     
195          Set(enable_indexscan"off")Set(enable_bitmapscan"off")*/
196 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
197
198 -- No. A-5-4-30
199 /*+Set(enable_indexscan"off")Set(enable_bitmapscan"off")        
200          */
201 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
202
203 -- No. A-5-4-31
204 /*+     
205          Set    
206          (enable_indexscan"off")        
207          Set    
208          (enable_bitmapscan"off")*/
209 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
210
211 -- No. A-5-4-32
212 /*+Set  
213          (      
214          enable_indexscan"off")Set      
215          (      
216          enable_bitmapscan"off")*/
217 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
218
219 -- No. A-5-4-33
220 /*+Set(enable_indexscan"off"    
221          )      
222          Set(enable_bitmapscan"off"     
223          )      
224          */
225 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
226
227 -- No. A-5-4-34
228 /*+Set(         
229          enable_indexscan       
230          "off"  
231          )Set(  
232          enable_bitmapscan      
233          "off"  
234          )*/
235 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
236
237 -- No. A-5-4-35
238 /*+     
239          Set    
240          (      
241          enable_indexscan       
242          "off"  
243          )      
244          Set    
245          (      
246          enable_bitmapscan      
247          "off"  
248          )      
249          */
250 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
251
252 ----
253 ---- No. A-5-5 hint object pattern
254 ---- No. A-7-2 message object pattern
255 ----
256
257 -- No. A-5-5-1
258 -- No. A-7-2-1
259 /*+SeqScan(t)*/
260 EXPLAIN (COSTS false) SELECT * FROM s1.t1 t WHERE t.c1 = 1;
261 /*+SeqScan(ttt)*/
262 EXPLAIN (COSTS false) SELECT * FROM s1.t1 ttt WHERE ttt.c1 = 1;
263 /*+SeqScan("t")*/
264 EXPLAIN (COSTS false) SELECT * FROM s1.t1 t WHERE t.c1 = 1;
265 /*+SeqScan("ttt")*/
266 EXPLAIN (COSTS false) SELECT * FROM s1.t1 ttt WHERE ttt.c1 = 1;
267
268 -- No. A-5-5-2
269 -- No. A-7-2-2
270 /*+SeqScan(T)*/
271 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "T" WHERE "T".c1 = 1;
272 /*+SeqScan(TTT)*/
273 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "TTT" WHERE "TTT".c1 = 1;
274 /*+SeqScan("T")*/
275 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "T" WHERE "T".c1 = 1;
276 /*+SeqScan("TTT")*/
277 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "TTT" WHERE "TTT".c1 = 1;
278
279 -- No. A-5-5-3
280 -- No. A-7-2-3
281 /*+SeqScan(()*/
282 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "(" WHERE "(".c1 = 1;
283 /*+SeqScan(((()*/
284 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "(((" WHERE "(((".c1 = 1;
285 /*+SeqScan("(")*/
286 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "(" WHERE "(".c1 = 1;
287 /*+SeqScan("(((")*/
288 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "(((" WHERE "(((".c1 = 1;
289
290 -- No. A-5-5-4
291 -- No. A-7-2-4
292 /*+SeqScan())*/
293 EXPLAIN (COSTS false) SELECT * FROM s1.t1 ")" WHERE ")".c1 = 1;
294 /*+SeqScan(")")*/
295 EXPLAIN (COSTS false) SELECT * FROM s1.t1 ")" WHERE ")".c1 = 1;
296 /*+SeqScan(")))")*/
297 EXPLAIN (COSTS false) SELECT * FROM s1.t1 ")))" WHERE ")))".c1 = 1;
298
299 -- No. A-5-5-5
300 -- No. A-7-2-5
301 /*+SeqScan(")*/
302 EXPLAIN (COSTS false) SELECT * FROM s1.t1 """" WHERE """".c1 = 1;
303 /*+SeqScan("""")*/
304 EXPLAIN (COSTS false) SELECT * FROM s1.t1 """" WHERE """".c1 = 1;
305 /*+SeqScan("""""""")*/
306 EXPLAIN (COSTS false) SELECT * FROM s1.t1 """""""" WHERE """""""".c1 = 1;
307
308 -- No. A-5-5-6
309 -- No. A-7-2-6
310 /*+SeqScan( )*/
311 EXPLAIN (COSTS false) SELECT * FROM s1.t1 " " WHERE " ".c1 = 1;
312 /*+SeqScan(" ")*/
313 EXPLAIN (COSTS false) SELECT * FROM s1.t1 " " WHERE " ".c1 = 1;
314 /*+SeqScan("   ")*/
315 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "   " WHERE "   ".c1 = 1;
316
317 -- No. A-5-5-7
318 -- No. A-7-2-7
319 /*+SeqScan(     )*/
320 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "     " WHERE "       ".c1 = 1;
321 /*+SeqScan("    ")*/
322 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "     " WHERE "       ".c1 = 1;
323 /*+SeqScan("                    ")*/
324 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "                     " WHERE "                       ".c1 = 1;
325
326 -- No. A-5-5-8
327 -- No. A-7-2-8
328 /*+SeqScan(
329 )*/
330 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "
331 " WHERE "
332 ".c1 = 1;
333 /*+SeqScan("
334 ")*/
335 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "
336 " WHERE "
337 ".c1 = 1;
338 /*+SeqScan("
339
340
341 ")*/
342 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "
343
344
345 " WHERE "
346
347
348 ".c1 = 1;
349
350 -- No. A-5-5-9
351 -- No. A-7-2-9
352 /*+SeqScan(Set)*/
353 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "Set" WHERE "Set".c1 = 1;
354 /*+SeqScan("Set")*/
355 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "Set" WHERE "Set".c1 = 1;
356 /*+SeqScan("Set SeqScan Leading")*/
357 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "Set SeqScan Leading" WHERE "Set SeqScan Leading".c1 = 1;
358
359 -- No. A-5-5-10
360 -- No. A-7-2-10
361 /*+SeqScan(あ)*/
362 EXPLAIN (COSTS false) SELECT * FROM s1.t1 あ WHERE あ.c1 = 1;
363 /*+SeqScan(あいう)*/
364 EXPLAIN (COSTS false) SELECT * FROM s1.t1 あいう WHERE あいう.c1 = 1;
365 /*+SeqScan("あ")*/
366 EXPLAIN (COSTS false) SELECT * FROM s1.t1 あ WHERE あ.c1 = 1;
367 /*+SeqScan("あいう")*/
368 EXPLAIN (COSTS false) SELECT * FROM s1.t1 あいう WHERE あいう.c1 = 1;
369
370 -- No. A-5-5-11
371 -- No. A-7-2-11
372 /*+SeqScan(/**/)*/
373 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "/**/" WHERE "/**/".c1 = 1;
374 /*+SeqScan(/**//**//**/)*/
375 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "/**//**//**/" WHERE "/**//**//**/".c1 = 1;
376
377 -- No. A-5-5-12
378 -- No. A-7-2-12
379 /*+SeqScan("tT()""      
380 Set/**/あ")*/
381 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "tT()""       
382 Set/**/あ" WHERE "tT()""       
383 Set/**/あ".c1 = 1;
384 --"
385
386 /*+SeqScan("tT()""      
387 Setあ")*/
388 EXPLAIN (COSTS false) SELECT * FROM s1.t1 "tT()""       
389 Setあ" WHERE "tT()""   
390 Setあ".c1 = 1;
391
392 ----
393 ---- No. A-5-6 hint parse error
394 ----
395
396 -- No. A-5-6-1
397 /*+Set(enable_indexscan off)Set enable_tidscan off)Set(enable_bitmapscan off)SeqScan(t1)*/
398 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
399
400 -- No. A-5-6-2
401 /*+Set(enable_indexscan off)Set(enable_tidscan off Set(enable_bitmapscan off)SeqScan(t1)*/
402 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
403
404 -- No. A-5-6-3
405 /*+Set(enable_indexscan off)Set(enable_tidscan "off)Set(enable_bitmapscan off)SeqScan(t1)*/
406 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
407
408 -- No. A-5-6-4
409 /*+Set(enable_indexscan off)SeqScan("")Set(enable_bitmapscan off)*/
410 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
411
412 -- No. A-5-6-5
413 /*+Set(enable_indexscan off)NoSet(enable_tidscan off)Set(enable_bitmapscan off)SeqScan(t1)*/
414 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
415
416 -- No. A-5-6-6
417 /*+Set(enable_indexscan off)"Set"(enable_tidscan off)Set(enable_bitmapscan off)SeqScan(t1)*/
418 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
419
420 -- No. A-5-6-7
421 /*+Set(enable_indexscan off)Set(enable_tidscan /* value */off)Set(enable_bitmapscan off)SeqScan(t1)*/
422 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
423
424 ----
425 ---- No. A-6-1 original GUC parameter
426 ----
427
428 -- No. A-6-1-1
429 SET ROLE super_user;
430 SET pg_hint_plan.debug_print TO off;
431 SHOW pg_hint_plan.enable_hint;
432 SHOW pg_hint_plan.debug_print;
433 SHOW pg_hint_plan.parse_messages;
434 SET pg_hint_plan.enable_hint TO off;
435 SET pg_hint_plan.debug_print TO on;
436 SET pg_hint_plan.parse_messages TO error;
437 SHOW pg_hint_plan.enable_hint;
438 SHOW pg_hint_plan.debug_print;
439 SHOW pg_hint_plan.parse_messages;
440 RESET pg_hint_plan.enable_hint;
441 RESET pg_hint_plan.debug_print;
442 RESET pg_hint_plan.parse_messages;
443 SHOW pg_hint_plan.enable_hint;
444 SHOW pg_hint_plan.debug_print;
445 SHOW pg_hint_plan.parse_messages;
446
447 -- No. A-6-1-2
448 SET ROLE normal_user;
449 SHOW pg_hint_plan.enable_hint;
450 SHOW pg_hint_plan.debug_print;
451 SHOW pg_hint_plan.parse_messages;
452 SET pg_hint_plan.enable_hint TO off;
453 SET pg_hint_plan.debug_print TO on;
454 SET pg_hint_plan.parse_messages TO error;
455 SHOW pg_hint_plan.enable_hint;
456 SHOW pg_hint_plan.debug_print;
457 SHOW pg_hint_plan.parse_messages;
458 RESET pg_hint_plan.enable_hint;
459 RESET pg_hint_plan.debug_print;
460 RESET pg_hint_plan.parse_messages;
461 SHOW pg_hint_plan.enable_hint;
462 SHOW pg_hint_plan.debug_print;
463 SHOW pg_hint_plan.parse_messages;
464
465 RESET ROLE;
466
467 ----
468 ---- No. A-6-2 original GUC parameter pg_hint_plan.enable_hint
469 ----
470
471 -- No. A-6-2-1
472 SET pg_hint_plan.enable_hint TO on;
473 SHOW pg_hint_plan.enable_hint;
474 /*+Set(enable_indexscan off)*/
475 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
476
477 -- No. A-6-2-2
478 SET pg_hint_plan.enable_hint TO off;
479 SHOW pg_hint_plan.enable_hint;
480 /*+Set(enable_indexscan off)*/
481 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
482
483 -- No. A-6-2-3
484 SET pg_hint_plan.enable_hint TO DEFAULT;
485 SHOW pg_hint_plan.enable_hint;
486 /*+Set(enable_indexscan off)*/
487 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
488
489 -- No. A-6-2-4
490 SET pg_hint_plan.enable_hint TO enable;
491 SHOW pg_hint_plan.enable_hint;
492
493 ----
494 ---- No. A-6-3 original GUC parameter pg_hint_plan.debug_print
495 ----
496
497 -- No. A-6-3-1
498 SET pg_hint_plan.debug_print TO on;
499 SHOW pg_hint_plan.debug_print;
500 /*+Set(enable_indexscan off)*/
501 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
502
503 -- No. A-6-3-2
504 SET pg_hint_plan.debug_print TO off;
505 SHOW pg_hint_plan.debug_print;
506 /*+Set(enable_indexscan off)*/
507 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
508
509 -- No. A-6-3-3
510 SET pg_hint_plan.debug_print TO DEFAULT;
511 SHOW pg_hint_plan.debug_print;
512 /*+Set(enable_indexscan off)*/
513 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
514
515 -- No. A-6-3-4
516 SET pg_hint_plan.debug_print TO enable;
517 SHOW pg_hint_plan.debug_print;
518
519 ----
520 ---- No. A-6-4 original GUC parameter pg_hint_plan.parse_messages
521 ----
522
523 SET client_min_messages TO debug5;
524
525 -- No. A-6-4-1
526 SET pg_hint_plan.parse_messages TO debug5;
527 SHOW pg_hint_plan.parse_messages;
528 /*+Set*/SELECT 1;
529 SET client_min_messages TO debug4;
530 /*+Set*/SELECT 1;
531
532 -- No. A-6-4-2
533 SET pg_hint_plan.parse_messages TO debug4;
534 SHOW pg_hint_plan.parse_messages;
535 /*+Set*/SELECT 1;
536 SET client_min_messages TO debug3;
537 /*+Set*/SELECT 1;
538
539 -- No. A-6-4-3
540 SET pg_hint_plan.parse_messages TO debug3;
541 SHOW pg_hint_plan.parse_messages;
542 /*+Set*/SELECT 1;
543 SET client_min_messages TO debug2;
544 /*+Set*/SELECT 1;
545
546 -- No. A-6-4-4
547 SET pg_hint_plan.parse_messages TO debug2;
548 SHOW pg_hint_plan.parse_messages;
549 /*+Set*/SELECT 1;
550 SET client_min_messages TO debug1;
551 /*+Set*/SELECT 1;
552
553 -- No. A-6-4-5
554 SET pg_hint_plan.parse_messages TO debug1;
555 SHOW pg_hint_plan.parse_messages;
556 /*+Set*/SELECT 1;
557 SET client_min_messages TO log;
558 /*+Set*/SELECT 1;
559
560 -- No. A-6-4-6
561 SET pg_hint_plan.parse_messages TO log;
562 SHOW pg_hint_plan.parse_messages;
563 /*+Set*/SELECT 1;
564 SET client_min_messages TO info;
565 /*+Set*/SELECT 1;
566
567 -- No. A-6-4-7
568 SET pg_hint_plan.parse_messages TO info;
569 SHOW pg_hint_plan.parse_messages;
570 /*+Set*/SELECT 1;
571 SET client_min_messages TO notice;
572 /*+Set*/SELECT 1;
573
574 -- No. A-6-4-8
575 SET pg_hint_plan.parse_messages TO notice;
576 SHOW pg_hint_plan.parse_messages;
577 /*+Set*/SELECT 1;
578 SET client_min_messages TO warning;
579 /*+Set*/SELECT 1;
580
581 -- No. A-6-4-9
582 SET pg_hint_plan.parse_messages TO warning;
583 SHOW pg_hint_plan.parse_messages;
584 /*+Set*/SELECT 1;
585 SET client_min_messages TO error;
586 /*+Set*/SELECT 1;
587
588 -- No. A-6-4-10
589 SET pg_hint_plan.parse_messages TO error;
590 SHOW pg_hint_plan.parse_messages;
591 /*+Set*/SELECT 1;
592 SET client_min_messages TO fatal;
593 /*+Set*/SELECT 1;
594
595 -- No. A-6-4-11
596 RESET client_min_messages;
597 SET pg_hint_plan.parse_messages TO DEFAULT;
598 SHOW pg_hint_plan.parse_messages;
599 /*+Set*/SELECT 1;
600
601 -- No. A-6-4-12
602 SET pg_hint_plan.parse_messages TO fatal;
603 SHOW pg_hint_plan.parse_messages;
604
605 -- No. A-6-4-13
606 SET pg_hint_plan.parse_messages TO panic;
607 SHOW pg_hint_plan.parse_messages;
608
609 -- No. A-6-4-14
610 SET pg_hint_plan.parse_messages TO on;
611 SHOW pg_hint_plan.parse_messages;
612
613 ----
614 ---- No. A-7-1 parse error message output
615 ----
616
617 -- No. A-7-1-1
618 /*+"Set"(enable_indexscan on)*/SELECT 1;
619 /*+Set()(enable_indexscan on)*/SELECT 1;
620 /*+Set(enable_indexscan on*/SELECT 1;
621
622 ----
623 ---- No. A-7-3 hint state output
624 ----
625
626 SET pg_hint_plan.debug_print TO on;
627 SET client_min_messages TO LOG;
628
629 -- No. A-7-3-1
630 /*+SeqScan(t1)*/
631 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
632
633 -- No. A-7-3-2
634 /*+SeqScan(no_table)*/
635 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
636
637 -- No. A-7-3-3
638 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1 AND t1.ctid = '(1,1)';
639 /*+TidScan(t1)BitmapScan(t1)*/
640 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1 AND t1.ctid = '(1,1)';
641 /*+TidScan(t1)BitmapScan(t1)IndexScan(t1)*/
642 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1 AND t1.ctid = '(1,1)';
643 /*+TidScan(t1)BitmapScan(t1)IndexScan(t1)SeqScan(t1)*/
644 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1 AND t1.ctid = '(1,1)';
645
646 -- No. A-7-3-4
647 /*+Set(enable_indexscan enable)*/
648 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
649
650 ----
651 ---- No. A-8-1 hint state output
652 ----
653
654 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 = 1;
655 EXPLAIN (COSTS false) EXECUTE p1;
656 DEALLOCATE p1;
657
658 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 < $1;
659 EXPLAIN (COSTS false) EXECUTE p1 (1000);
660 EXPLAIN (COSTS false) EXECUTE p1 (1000);
661 EXPLAIN (COSTS false) EXECUTE p1 (1000);
662 EXPLAIN (COSTS false) EXECUTE p1 (1000);
663 EXPLAIN (COSTS false) EXECUTE p1 (1000);
664 EXPLAIN (COSTS false) EXECUTE p1 (1000);
665 DEALLOCATE p1;
666
667 -- No. A-8-1-1
668 -- No. A-8-1-2
669 /*+SeqScan(t1)*/
670 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 = 1;
671 /*+BitmapScan(t1)*/
672 EXPLAIN (COSTS false) EXECUTE p1;
673 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
674 /*+BitmapScan(t1)*/
675 EXPLAIN (COSTS false) EXECUTE p1;
676 DEALLOCATE p1;
677
678 /*+BitmapScan(t1)*/
679 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 < $1;
680 /*+SeqScan(t1)*/
681 EXPLAIN (COSTS false) EXECUTE p1 (1000);
682 /*+SeqScan(t1)*/
683 EXPLAIN (COSTS false) EXECUTE p1 (1000);
684 /*+SeqScan(t1)*/
685 EXPLAIN (COSTS false) EXECUTE p1 (1000);
686 /*+SeqScan(t1)*/
687 EXPLAIN (COSTS false) EXECUTE p1 (1000);
688 /*+SeqScan(t1)*/
689 EXPLAIN (COSTS false) EXECUTE p1 (1000);
690 /*+SeqScan(t1)*/
691 EXPLAIN (COSTS false) EXECUTE p1 (1000);
692 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
693 /*+SeqScan(t1)*/
694 EXPLAIN (COSTS false) EXECUTE p1 (1000);
695 DEALLOCATE p1;
696
697 -- No. A-8-1-3
698 -- No. A-8-1-4
699 /*+SeqScan(t1)*/
700 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 = 1;
701 EXPLAIN (COSTS false) EXECUTE p1;
702 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
703 EXPLAIN (COSTS false) EXECUTE p1;
704 DEALLOCATE p1;
705
706 /*+BitmapScan(t1)*/
707 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 < $1;
708 EXPLAIN (COSTS false) EXECUTE p1 (1000);
709 EXPLAIN (COSTS false) EXECUTE p1 (1000);
710 EXPLAIN (COSTS false) EXECUTE p1 (1000);
711 EXPLAIN (COSTS false) EXECUTE p1 (1000);
712 EXPLAIN (COSTS false) EXECUTE p1 (1000);
713 EXPLAIN (COSTS false) EXECUTE p1 (1000);
714 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
715 EXPLAIN (COSTS false) EXECUTE p1 (1000);
716 DEALLOCATE p1;
717
718 -- No. A-8-1-5
719 -- No. A-8-1-6
720 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 = 1;
721 /*+BitmapScan(t1)*/
722 EXPLAIN (COSTS false) EXECUTE p1;
723 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
724 /*+BitmapScan(t1)*/
725 EXPLAIN (COSTS false) EXECUTE p1;
726 DEALLOCATE p1;
727
728 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 < $1;
729 /*+BitmapScan(t1)*/
730 EXPLAIN (COSTS false) EXECUTE p1 (1000);
731 EXPLAIN (COSTS false) EXECUTE p1 (1000);
732 EXPLAIN (COSTS false) EXECUTE p1 (1000);
733 EXPLAIN (COSTS false) EXECUTE p1 (1000);
734 EXPLAIN (COSTS false) EXECUTE p1 (1000);
735 EXPLAIN (COSTS false) EXECUTE p1 (1000);
736 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
737 /*+BitmapScan(t1)*/
738 EXPLAIN (COSTS false) EXECUTE p1 (1000);
739 DEALLOCATE p1;
740
741 -- No. A-8-1-9
742 -- No. A-8-1-10
743 /*+SeqScan(t1)*/
744 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 = 1;
745 /*+BitmapScan(t1)*/
746 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1;
747 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
748 /*+BitmapScan(t1)*/
749 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1;
750 DEALLOCATE p1;
751
752 /*+BitmapScan(t1)*/
753 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 < $1;
754 /*+SeqScan(t1)*/
755 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
756 /*+SeqScan(t1)*/
757 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
758 /*+SeqScan(t1)*/
759 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
760 /*+SeqScan(t1)*/
761 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
762 /*+SeqScan(t1)*/
763 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
764 /*+SeqScan(t1)*/
765 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
766 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
767 /*+SeqScan(t1)*/
768 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
769 DEALLOCATE p1;
770
771 -- No. A-8-1-11
772 -- No. A-8-1-12
773 /*+SeqScan(t1)*/
774 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 = 1;
775 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1;
776 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
777 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1;
778 DEALLOCATE p1;
779
780 /*+BitmapScan(t1)*/
781 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 < $1;
782 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
783 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
784 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
785 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
786 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
787 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
788 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
789 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
790 DEALLOCATE p1;
791
792 -- No. A-8-1-13
793 -- No. A-8-1-14
794 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 = 1;
795 /*+BitmapScan(t1)*/
796 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1;
797 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
798 /*+BitmapScan(t1)*/
799 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1;
800 DEALLOCATE p1;
801
802 PREPARE p1 AS SELECT * FROM s1.t1 WHERE t1.c1 < $1;
803 /*+BitmapScan(t1)*/
804 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
805 /*+BitmapScan(t1)*/
806 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
807 /*+BitmapScan(t1)*/
808 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
809 /*+BitmapScan(t1)*/
810 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
811 /*+BitmapScan(t1)*/
812 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
813 /*+BitmapScan(t1)*/
814 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
815 UPDATE pg_catalog.pg_class SET relpages = relpages WHERE relname = 't1';
816 /*+BitmapScan(t1)*/
817 EXPLAIN (COSTS false) CREATE TABLE test AS EXECUTE p1 (1000);
818 DEALLOCATE p1;
819
820 ----
821 ---- No. A-8-4 EXECUTE statement name error
822 ----
823
824 -- No. A-8-4-1
825 EXECUTE p1;
826 SHOW pg_hint_plan.debug_print;
827
828 ----
829 ---- No. A-9-5 EXECUTE statement name error
830 ----
831
832 -- No. A-9-5-1
833 SELECT pg_stat_statements_reset();
834 SELECT * FROM s1.t1 WHERE t1.c1 = 1;
835 /*+Set(enable_seqscan off)*/ SELECT * FROM s1.t1 WHERE t1.c1 = 1;
836 /*+SeqScan(t1)*/ SELECT * FROM s1.t1 WHERE t1.c1 = 1;
837 SELECT s.query, s.calls
838   FROM public.pg_stat_statements s
839   JOIN pg_catalog.pg_database d
840     ON (s.dbid = d.oid)
841  ORDER BY 1;
842
843 ----
844 ---- No. A-10-1 duplicate hint
845 ----
846
847 -- No. A-10-1-1
848 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2, s1.t3, s1.t4 WHERE t1.ctid = '(1,1)' AND t1.c1 = t2.c1 AND t2.ctid = '(1,1)' AND t1.c1 = t3.c1 AND t3.ctid = '(1,1)' AND t1.c1 = t4.c1 AND t4.ctid = '(1,1)';
849 /*+
850 Set(enable_tidscan aaa)
851 Set(enable_tidscan on)
852 Set(enable_tidscan off)
853 SeqScan(t4)
854 IndexScan(t4)
855 BitmapScan(t4)
856 TidScan(t4)
857 NestLoop(t4 t3)
858 MergeJoin(t4 t3)
859 HashJoin(t4 t3)
860 Leading(t2 t1 t4 t3)
861 Leading(t1 t4 t3 t2)
862 Leading(t4 t3 t2 t1)
863 */
864 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2, s1.t3, s1.t4 WHERE t1.ctid = '(1,1)' AND t1.c1 = t2.c1 AND t2.ctid = '(1,1)' AND t1.c1 = t3.c1 AND t3.ctid = '(1,1)' AND t1.c1 = t4.c1 AND t4.ctid = '(1,1)';
865
866 -- No. A-10-1-2
867 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2, s1.t3, s1.t4 WHERE t1.ctid = '(1,1)' AND t1.c1 = t2.c1 AND t2.ctid = '(1,1)' AND t1.c1 = t3.c1 AND t3.ctid = '(1,1)' AND t1.c1 = t4.c1 AND t4.ctid = '(1,1)';
868 /*+
869 SeqScan(t4)
870 Set(enable_tidscan aaa)
871 IndexScan(t4)
872 NestLoop(t4 t3)
873 Leading(t2 t1 t4 t3)
874 Set(enable_tidscan on)
875 BitmapScan(t4)
876 MergeJoin(t4 t3)
877 Leading(t1 t4 t3 t2)
878 Set(enable_tidscan off)
879 TidScan(t4)
880 HashJoin(t4 t3)
881 Leading(t4 t3 t2 t1)
882 */
883 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2, s1.t3, s1.t4 WHERE t1.ctid = '(1,1)' AND t1.c1 = t2.c1 AND t2.ctid = '(1,1)' AND t1.c1 = t3.c1 AND t3.ctid = '(1,1)' AND t1.c1 = t4.c1 AND t4.ctid = '(1,1)';
884
885 ----
886 ---- No. A-10-2 restrict query type
887 ----
888
889 -- No. A-10-2-1
890 EXPLAIN (COSTS false) SELECT * FROM s1.t1 FULL OUTER JOIN s1.t2 ON (t1.c1 = t2.c1);
891 /*+NestLoop(t1 t2)*/
892 EXPLAIN (COSTS true) SELECT * FROM s1.t1 FULL OUTER JOIN s1.t2 ON (t1.c1 = t2.c1);
893
894 -- No. A-10-2-2
895 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c3 = 1;
896 /*+IndexScan(t1 t1_i1)*/
897 EXPLAIN (COSTS true) SELECT * FROM s1.t1 WHERE t1.c3 = 1;
898
899 -- No. A-10-2-3
900 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
901 /*+TidScan(t1)*/
902 EXPLAIN (COSTS true) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
903
904 ----
905 ---- No. A-10-3 VIEW, RULE multi specified
906 ----
907
908 -- No. A-10-3-1
909 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1 v2 WHERE v1.c1 = v2.c1;
910 /*+Leading(v1t1 v1t1)HashJoin(v1t1 v1t1)BitmapScan(v1t1)*/
911 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1 v2 WHERE v1.c1 = v2.c1;
912
913 -- No. A-10-3-2
914 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1_ v2 WHERE v1.c1 = v2.c1;
915 /*+Leading(v1t1 v1t1_)NestLoop(v1t1 v1t1_)SeqScan(v1t1)BitmapScan(v1t1_)*/
916 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1_ v2 WHERE v1.c1 = v2.c1;
917
918 -- No. A-10-3-3
919 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r4 t2 WHERE t1.c1 = t2.c1;
920 /*+Leading(r4t1 r4t1)HashJoin(r4t1 r4t1)BitmapScan(r4t1)*/
921 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r4 t2 WHERE t1.c1 = t2.c1;
922
923 -- No. A-10-3-4
924 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r5 t2 WHERE t1.c1 = t2.c1;
925 /*+Leading(r4t1 r5t1)NestLoop(r4t1 r5t1)SeqScan(r4t1)BitmapScan(r5t1)*/
926 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r5 t2 WHERE t1.c1 = t2.c1;
927
928 ----
929 ---- No. A-11-1 psql command
930 ----
931
932 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
933 /*+SeqScan(t1)*/
934 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
935 -- No. A-11-1-4
936 \set FETCH_COUNT 0
937 /*+SeqScan(t1)*/
938 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
939 -- No. A-11-1-5
940 \set FETCH_COUNT 1
941 /*+SeqScan(t1)*/
942 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
943 \unset FETCH_COUNT
944
945 ----
946 ---- No. A-11-4 PL/pgSQL function
947 ----
948
949 -- No. A-11-4-1
950 CREATE OR REPLACE FUNCTION f1() RETURNS SETOF text LANGUAGE plpgsql AS $$
951 DECLARE
952     r text;
953 BEGIN
954     FOR r IN EXPLAIN SELECT c4 FROM s1.t1 WHERE t1.c1 = 1
955     LOOP
956         RETURN NEXT r; -- return current row of SELECT
957     END LOOP;
958     RETURN;
959 END
960 $$;
961 SELECT f1();
962 /*+SeqScan(t1)*/
963 SELECT f1();
964
965 -- No. A-11-4-2
966 /*+SeqScan(t1)*/CREATE OR REPLACE FUNCTION f1() RETURNS SETOF text LANGUAGE plpgsql AS $$
967 DECLARE
968     r text;
969 BEGIN
970     /*+SeqScan(t1)*/FOR r IN EXPLAIN /*+SeqScan(t1)*/SELECT c4 FROM s1.t1 WHERE t1.c1 = 1
971     LOOP
972         /*+SeqScan(t1)*/RETURN NEXT r; -- return current row of SELECT
973     END LOOP;
974     /*+SeqScan(t1)*/RETURN;
975 END
976 $$;
977 SELECT f1();
978
979 ----
980 ---- No. A-12-1 reset of global variable of core at the error
981 ---- No. A-12-2 reset of global variable of original at the error
982 ----
983
984 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
985 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
986 PREPARE p1 AS SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
987 EXPLAIN (COSTS false) EXECUTE p1;
988
989 -- No. A-12-1-1
990 -- No. A-12-2-1
991 SELECT name, setting FROM settings;
992 SET pg_hint_plan.parse_messages TO error;
993 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
994 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
995 SELECT name, setting FROM settings;
996 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)*/
997 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
998
999 -- No. A-12-1-2
1000 -- No. A-12-2-2
1001 SELECT name, setting FROM settings;
1002 SET pg_hint_plan.parse_messages TO error;
1003 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
1004 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1005 SELECT name, setting FROM settings;
1006 EXPLAIN (COSTS false) EXECUTE p1;
1007
1008 -- No. A-12-1-3
1009 -- No. A-12-2-3
1010 SELECT name, setting FROM settings;
1011 SET pg_hint_plan.parse_messages TO error;
1012 EXPLAIN (COSTS false) EXECUTE p2;
1013 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)*/
1014 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1015 EXPLAIN (COSTS false) EXECUTE p1;
1016 SELECT name, setting FROM settings;
1017
1018 -- No. A-12-1-4
1019 -- No. A-12-2-4
1020 SELECT name, setting FROM settings;
1021 SET pg_hint_plan.parse_messages TO error;
1022 EXPLAIN (COSTS false) EXECUTE p2;
1023 EXPLAIN (COSTS false) EXECUTE p1;
1024 SELECT name, setting FROM settings;
1025
1026 DEALLOCATE p1;
1027 SET pg_hint_plan.parse_messages TO LOG;
1028
1029 ----
1030 ---- No. A-12-3 effective range of the hint
1031 ----
1032
1033 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1034
1035 -- No. A-12-3-1
1036 SET enable_indexscan TO off;
1037 SET enable_mergejoin TO off;
1038 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1039 SELECT name, setting FROM settings;
1040 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
1041 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1042 SELECT name, setting FROM settings;
1043 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1044
1045 -- No. A-12-3-2
1046 SET enable_indexscan TO off;
1047 SET enable_mergejoin TO off;
1048 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1049 SELECT name, setting FROM settings;
1050 BEGIN;
1051 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
1052 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1053 COMMIT;
1054 BEGIN;
1055 SELECT name, setting FROM settings;
1056 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1057 COMMIT;
1058
1059 -- No. A-12-3-3
1060 SET enable_indexscan TO off;
1061 SET enable_mergejoin TO off;
1062 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1063 SELECT name, setting FROM settings;
1064 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
1065 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1066 \connect
1067 SET enable_indexscan TO off;
1068 SET enable_mergejoin TO off;
1069 LOAD 'pg_hint_plan';
1070 SELECT name, setting FROM settings;
1071 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1072
1073 SET pg_hint_plan.enable_hint TO on;
1074 SET pg_hint_plan.debug_print TO on;
1075 SET client_min_messages TO LOG;
1076 SET search_path TO public;
1077 RESET enable_indexscan;
1078 RESET enable_mergejoin;
1079
1080 ----
1081 ---- No. A-13 call planner recursively
1082 ----
1083
1084 CREATE OR REPLACE FUNCTION nested_planner(cnt int) RETURNS int AS $$
1085 DECLARE
1086     new_cnt int;
1087 BEGIN
1088     RAISE NOTICE 'nested_planner(%)', cnt;
1089
1090     /* 再帰終了の判断 */
1091     IF cnt <= 1 THEN
1092         RETURN 0;
1093     END IF;
1094
1095     EXECUTE '/*+ IndexScan(t_1) */'
1096             ' SELECT nested_planner($1) FROM s1.t1 t_1'
1097             ' JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)'
1098             ' ORDER BY t_1.c1 LIMIT 1'
1099         INTO new_cnt USING cnt - 1;
1100
1101     RETURN new_cnt;
1102 END;
1103 $$ LANGUAGE plpgsql IMMUTABLE;
1104
1105 ----
1106 ---- No. A-13-2 use hint of main query
1107 ----
1108
1109 --No.13-2-1
1110 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1111 /*+SeqScan(t_1)*/
1112 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1113
1114 ----
1115 ---- No. A-13-3 output number of times of debugging log
1116 ----
1117
1118 --No.13-3-1
1119 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1120 /*+SeqScan(t_2)*/
1121 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1122
1123 --No.13-3-2
1124 EXPLAIN (COSTS false) SELECT nested_planner(2) FROM s1.t1 t_1 ORDER BY t_1.c1;
1125 /*+SeqScan(t_2)*/
1126 EXPLAIN (COSTS false) SELECT nested_planner(2) FROM s1.t1 t_1 ORDER BY t_1.c1;
1127
1128 --No.13-3-3
1129 EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
1130 /*+SeqScan(t_2)*/
1131 EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
1132
1133 ----
1134 ---- No. A-13-4 output of debugging log on hint status
1135 ----
1136
1137 --No.13-4-1
1138 /*+HashJoin(t_1 t_2)*/
1139 EXPLAIN (COSTS false)
1140  SELECT nested_planner(2) FROM s1.t1 t_1
1141    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1142   ORDER BY t_1.c1;
1143
1144 --No.13-4-2
1145 /*+HashJoin(st_1 st_2)*/
1146 EXPLAIN (COSTS false)
1147  SELECT nested_planner(2) FROM s1.t1 st_1
1148    JOIN s1.t2 st_2 ON (st_1.c1 = st_2.c1)
1149   ORDER BY st_1.c1;
1150
1151 --No.13-4-3
1152 /*+HashJoin(t_1 t_2)*/
1153 EXPLAIN (COSTS false)
1154  SELECT nested_planner(2) FROM s1.t1 st_1
1155    JOIN s1.t2 st_2 ON (st_1.c1 = st_2.c1)
1156   ORDER BY st_1.c1;
1157
1158 --No.13-4-4
1159 /*+HashJoin(st_1 st_2)*/
1160 EXPLAIN (COSTS false)
1161  SELECT nested_planner(2) FROM s1.t1 t_1
1162    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1163   ORDER BY t_1.c1;
1164
1165 --No.13-4-5
1166 /*+HashJoin(t_1 t_1)*/
1167 EXPLAIN (COSTS false)
1168  SELECT nested_planner(2) FROM s1.t1 t_1
1169   ORDER BY t_1.c1;
1170
1171 --No.13-4-6
1172 CREATE OR REPLACE FUNCTION nested_planner_one_t(cnt int) RETURNS int AS $$
1173 DECLARE
1174     new_cnt int;
1175 BEGIN
1176     RAISE NOTICE 'nested_planner_one_t(%)', cnt;
1177
1178     IF cnt <= 1 THEN
1179         RETURN 0;
1180     END IF;
1181
1182     EXECUTE '/*+ IndexScan(t_1) */'
1183             ' SELECT nested_planner_one_t($1) FROM s1.t1 t_1'
1184             ' ORDER BY t_1.c1 LIMIT 1'
1185         INTO new_cnt USING cnt - 1;
1186
1187     RETURN new_cnt;
1188 END;
1189 $$ LANGUAGE plpgsql IMMUTABLE;
1190
1191 EXPLAIN (COSTS false)
1192  SELECT nested_planner_one_t(2) FROM s1.t1 t_1
1193    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1194   ORDER BY t_1.c1;
1195 /*+HashJoin(t_1 t_1)*/
1196 EXPLAIN (COSTS false)
1197  SELECT nested_planner_one_t(2) FROM s1.t1 t_1
1198    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1199   ORDER BY t_1.c1;
1200
1201 DROP FUNCTION nested_planner_one_t(int);
1202
1203 --No.13-4-7
1204 /*+HashJoin(t_1 t_1)*/
1205 EXPLAIN (COSTS false)
1206  SELECT nested_planner(2) FROM s1.t1 t_1
1207    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1208   ORDER BY t_1.c1;
1209
1210 --No.13-4-8
1211 /*+MergeJoin(t_1 t_2)HashJoin(t_1 t_2)*/
1212 EXPLAIN (COSTS false)
1213  SELECT nested_planner(2) FROM s1.t1 t_1
1214    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1215   ORDER BY t_1.c1;