OSDN Git Service

CREATE TABLE AS EXECUTE の試験を【機能に依存しない】試験ファイル内に移動した。
[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 /*+HashJoin(t1 t2)*/
892 EXPLAIN (COSTS false) SELECT * FROM s1.t1 FULL OUTER JOIN s1.t2 ON (t1.c1 = t2.c1);
893 /*+MergeJoin(t1 t2)*/
894 EXPLAIN (COSTS false) SELECT * FROM s1.t1 FULL OUTER JOIN s1.t2 ON (t1.c1 = t2.c1);
895 /*+NestLoop(t1 t2)*/
896 EXPLAIN (COSTS true) SELECT * FROM s1.t1 FULL OUTER JOIN s1.t2 ON (t1.c1 = t2.c1);
897
898 -- No. A-10-2-2
899 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c3 = 1 AND t1.ctid = '(1,1)';
900 /*+IndexScan(t1)*/
901 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c3 = 1 AND t1.ctid = '(1,1)';
902 /*+IndexScan(t1 t1_i)*/
903 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c3 = 1 AND t1.ctid = '(1,1)';
904 /*+IndexScan(t1 t1_i1)*/
905 EXPLAIN (COSTS true) SELECT * FROM s1.t1 WHERE t1.c3 = 1 AND t1.ctid = '(1,1)';
906
907 -- No. A-10-2-3
908 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
909 /*+TidScan(t1)*/
910 EXPLAIN (COSTS true) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
911 /*+TidScan(t1)*/
912 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1 AND t1.ctid = '(1,1)';
913
914 ----
915 ---- No. A-10-3 VIEW, RULE multi specified
916 ----
917
918 -- No. A-10-3-1
919 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1 v2 WHERE v1.c1 = v2.c1;
920 /*+Leading(v1t1 v1t1)HashJoin(v1t1 v1t1)BitmapScan(v1t1)*/
921 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1 v2 WHERE v1.c1 = v2.c1;
922
923 -- No. A-10-3-2
924 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1_ v2 WHERE v1.c1 = v2.c1;
925 /*+Leading(v1t1 v1t1_)NestLoop(v1t1 v1t1_)SeqScan(v1t1)BitmapScan(v1t1_)*/
926 EXPLAIN (COSTS false) SELECT * FROM s1.v1 v1, s1.v1_ v2 WHERE v1.c1 = v2.c1;
927
928 -- No. A-10-3-3
929 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r4 t2 WHERE t1.c1 = t2.c1;
930 /*+Leading(r4t1 r4t1)HashJoin(r4t1 r4t1)BitmapScan(r4t1)*/
931 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r4 t2 WHERE t1.c1 = t2.c1;
932
933 -- No. A-10-3-4
934 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r5 t2 WHERE t1.c1 = t2.c1;
935 /*+Leading(r4t1 r5t1)NestLoop(r4t1 r5t1)SeqScan(r4t1)BitmapScan(r5t1)*/
936 EXPLAIN (COSTS false) SELECT * FROM s1.r4 t1, s1.r5 t2 WHERE t1.c1 = t2.c1;
937
938 ----
939 ---- No. A-11-1 psql command
940 ----
941
942 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
943 /*+SeqScan(t1)*/
944 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
945 -- No. A-11-1-4
946 \set FETCH_COUNT 0
947 /*+SeqScan(t1)*/
948 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
949 -- No. A-11-1-5
950 \set FETCH_COUNT 1
951 /*+SeqScan(t1)*/
952 SELECT count(*) FROM s1.t1 WHERE t1.c1 = 1;
953 \unset FETCH_COUNT
954
955 ----
956 ---- No. A-12-4 PL/pgSQL function
957 ----
958
959 -- No. A-12-4-1
960 CREATE OR REPLACE FUNCTION f1() RETURNS SETOF text LANGUAGE plpgsql AS $$
961 DECLARE
962     r text;
963 BEGIN
964     FOR r IN EXPLAIN SELECT c4 FROM s1.t1 WHERE t1.c1 = 1
965     LOOP
966         RETURN NEXT r; -- return current row of SELECT
967     END LOOP;
968     RETURN;
969 END
970 $$;
971 SELECT f1();
972 /*+SeqScan(t1)*/
973 SELECT f1();
974
975 -- No. A-12-4-2
976 /*+SeqScan(t1)*/CREATE OR REPLACE FUNCTION f1() RETURNS SETOF text LANGUAGE plpgsql AS $$
977 DECLARE
978     r text;
979 BEGIN
980     /*+SeqScan(t1)*/FOR r IN EXPLAIN /*+SeqScan(t1)*/SELECT c4 FROM s1.t1 WHERE t1.c1 = 1
981     LOOP
982         /*+SeqScan(t1)*/RETURN NEXT r; -- return current row of SELECT
983     END LOOP;
984     /*+SeqScan(t1)*/RETURN;
985 END
986 $$;
987 SELECT f1();
988
989 ----
990 ---- No. A-12-1 reset of global variable of core at the error
991 ---- No. A-12-2 reset of global variable of original at the error
992 ----
993
994 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
995 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
996 PREPARE p1 AS SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
997 EXPLAIN (COSTS false) EXECUTE p1;
998
999 -- No. A-12-1-1
1000 -- No. A-12-2-1
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 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)*/
1007 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1008
1009 -- No. A-12-1-2
1010 -- No. A-12-2-2
1011 SELECT name, setting FROM settings;
1012 SET pg_hint_plan.parse_messages TO error;
1013 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
1014 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1015 SELECT name, setting FROM settings;
1016 EXPLAIN (COSTS false) EXECUTE p1;
1017
1018 -- No. A-12-1-3
1019 -- No. A-12-2-3
1020 SELECT name, setting FROM settings;
1021 SET pg_hint_plan.parse_messages TO error;
1022 EXPLAIN (COSTS false) EXECUTE p2;
1023 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)*/
1024 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1025 EXPLAIN (COSTS false) EXECUTE p1;
1026 SELECT name, setting FROM settings;
1027
1028 -- No. A-12-1-4
1029 -- No. A-12-2-4
1030 SELECT name, setting FROM settings;
1031 SET pg_hint_plan.parse_messages TO error;
1032 EXPLAIN (COSTS false) EXECUTE p2;
1033 EXPLAIN (COSTS false) EXECUTE p1;
1034 SELECT name, setting FROM settings;
1035
1036 DEALLOCATE p1;
1037 SET pg_hint_plan.parse_messages TO LOG;
1038
1039 ----
1040 ---- No. A-12-3 effective range of the hint
1041 ----
1042
1043 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1044
1045 -- No. A-12-3-1
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 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
1051 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1052 SELECT name, setting FROM settings;
1053 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1054
1055 -- No. A-12-3-2
1056 SET enable_indexscan TO off;
1057 SET enable_mergejoin TO off;
1058 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1059 SELECT name, setting FROM settings;
1060 BEGIN;
1061 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
1062 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1063 COMMIT;
1064 BEGIN;
1065 SELECT name, setting FROM settings;
1066 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1067 COMMIT;
1068
1069 -- No. A-12-3-3
1070 SET enable_indexscan TO off;
1071 SET enable_mergejoin TO off;
1072 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1073 SELECT name, setting FROM settings;
1074 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
1075 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1076 \connect
1077 LOAD 'pg_hint_plan';
1078 SELECT name, setting FROM settings;
1079 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
1080
1081 SET pg_hint_plan.enable_hint TO on;
1082 SET pg_hint_plan.debug_print TO on;
1083 SET client_min_messages TO LOG;
1084 SET search_path TO public;
1085
1086 ----
1087 ---- No. A-13 call planner recursively
1088 ----
1089
1090 CREATE OR REPLACE FUNCTION nested_planner(cnt int) RETURNS int AS $$
1091 DECLARE
1092     new_cnt int;
1093 BEGIN
1094     RAISE NOTICE 'nested_planner(%)', cnt;
1095
1096     /* 再帰終了の判断 */
1097     IF cnt <= 1 THEN
1098         RETURN 0;
1099     END IF;
1100
1101     EXECUTE '/*+ IndexScan(t_1) */'
1102             ' SELECT nested_planner($1) FROM s1.t1 t_1'
1103             ' JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)'
1104             ' ORDER BY t_1.c1 LIMIT 1'
1105         INTO new_cnt USING cnt - 1;
1106
1107     RETURN new_cnt;
1108 END;
1109 $$ LANGUAGE plpgsql IMMUTABLE;
1110
1111 ----
1112 ---- No. A-13-2 use hint of main query
1113 ----
1114
1115 --No.13-2-1
1116 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1117 /*+SeqScan(t_1)*/
1118 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1119
1120 ----
1121 ---- No. A-13-3 output number of times of debugging log
1122 ----
1123
1124 --No.13-3-1
1125 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1126 /*+SeqScan(t_2)*/
1127 EXPLAIN (COSTS false) SELECT nested_planner(1) FROM s1.t1 t_1 ORDER BY t_1.c1;
1128
1129 --No.13-3-2
1130 EXPLAIN (COSTS false) SELECT nested_planner(2) FROM s1.t1 t_1 ORDER BY t_1.c1;
1131 /*+SeqScan(t_2)*/
1132 EXPLAIN (COSTS false) SELECT nested_planner(2) FROM s1.t1 t_1 ORDER BY t_1.c1;
1133
1134 --No.13-3-3
1135 EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
1136 /*+SeqScan(t_2)*/
1137 EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
1138
1139 ----
1140 ---- No. A-13-4 output of debugging log on hint status
1141 ----
1142
1143 --No.13-4-1
1144 /*+HashJoin(t_1 t_2)*/
1145 EXPLAIN (COSTS false)
1146  SELECT nested_planner(2) FROM s1.t1 t_1
1147    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1148   ORDER BY t_1.c1;
1149
1150 --No.13-4-2
1151 /*+HashJoin(st_1 st_2)*/
1152 EXPLAIN (COSTS false)
1153  SELECT nested_planner(2) FROM s1.t1 st_1
1154    JOIN s1.t2 st_2 ON (st_1.c1 = st_2.c1)
1155   ORDER BY st_1.c1;
1156
1157 --No.13-4-3
1158 /*+HashJoin(t_1 t_2)*/
1159 EXPLAIN (COSTS false)
1160  SELECT nested_planner(2) FROM s1.t1 st_1
1161    JOIN s1.t2 st_2 ON (st_1.c1 = st_2.c1)
1162   ORDER BY st_1.c1;
1163
1164 --No.13-4-4
1165 /*+HashJoin(st_1 st_2)*/
1166 EXPLAIN (COSTS false)
1167  SELECT nested_planner(2) FROM s1.t1 t_1
1168    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1169   ORDER BY t_1.c1;
1170
1171 --No.13-4-5
1172 /*+HashJoin(t_1 t_1)*/
1173 EXPLAIN (COSTS false)
1174  SELECT nested_planner(2) FROM s1.t1 t_1
1175   ORDER BY t_1.c1;
1176
1177 --No.13-4-6
1178 CREATE OR REPLACE FUNCTION nested_planner_one_t(cnt int) RETURNS int AS $$
1179 DECLARE
1180     new_cnt int;
1181 BEGIN
1182     RAISE NOTICE 'nested_planner_one_t(%)', cnt;
1183
1184     IF cnt <= 1 THEN
1185         RETURN 0;
1186     END IF;
1187
1188     EXECUTE '/*+ IndexScan(t_1) */'
1189             ' SELECT nested_planner_one_t($1) FROM s1.t1 t_1'
1190             ' ORDER BY t_1.c1 LIMIT 1'
1191         INTO new_cnt USING cnt - 1;
1192
1193     RETURN new_cnt;
1194 END;
1195 $$ LANGUAGE plpgsql IMMUTABLE;
1196
1197 EXPLAIN (COSTS false)
1198  SELECT nested_planner_one_t(2) FROM s1.t1 t_1
1199    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1200   ORDER BY t_1.c1;
1201 /*+HashJoin(t_1 t_1)*/
1202 EXPLAIN (COSTS false)
1203  SELECT nested_planner_one_t(2) FROM s1.t1 t_1
1204    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1205   ORDER BY t_1.c1;
1206
1207 DROP FUNCTION nested_planner_one_t(int);
1208
1209 --No.13-4-7
1210 /*+HashJoin(t_1 t_1)*/
1211 EXPLAIN (COSTS false)
1212  SELECT nested_planner(2) FROM s1.t1 t_1
1213    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1214   ORDER BY t_1.c1;
1215
1216 --No.13-4-8
1217 /*+MergeJoin(t_1 t_2)HashJoin(t_1 t_2)*/
1218 EXPLAIN (COSTS false)
1219  SELECT nested_planner(2) FROM s1.t1 t_1
1220    JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
1221   ORDER BY t_1.c1;