OSDN Git Service

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