OSDN Git Service

ヒント句の開始キーワードに+(プラス)を追加し、/*+でヒント句の
authorMitsuru Hasegawa <hasegawa@metrosystems.co.jp>
Tue, 3 Jul 2012 05:03:14 +0000 (14:03 +0900)
committerMitsuru Hasegawa <hasegawa@metrosystems.co.jp>
Tue, 3 Jul 2012 05:03:14 +0000 (14:03 +0900)
開始となるように修正した。

doc/pg_hint_plan-ja.html
expected/pg_hint_plan.out
expected/prepare-9.1.out
expected/prepare-9.2.out
pg_hint_plan.c
sql/pg_hint_plan.sql
sql/prepare.sql

index fd4d102..95840a7 100644 (file)
@@ -87,11 +87,11 @@ LOAD
 postgres=# </pre>
 
 <h3 id="hint-rule">ヒントの記述方法</h3>
-<p>ヒントはクエリの前のブロックコメント内に、スペース、タブ、または改行のいずれかで区切って記述してください。ヒントの対象は、カッコ内にオブジェクト名または別名(エイリアス)で指定してください。</p>
+<p>ã\83\92ã\83³ã\83\88ã\81¯ã\82¯ã\82¨ã\83ªã\81®å\89\8dã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88å\86\85ã\81«ã\80\81ã\82¹ã\83\9aã\83¼ã\82¹ã\80\81ã\82¿ã\83\96ã\80\81ã\81¾ã\81\9fã\81¯æ\94¹è¡\8cã\81®ã\81\84ã\81\9aã\82\8cã\81\8bã\81§å\8cºå\88\87ã\81£ã\81¦è¨\98è¿°ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\83\96ã\83­ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88ã\82\92ã\83\92ã\83³ã\83\88ã\81¨ã\81\97ã\81¦èª\8dè­\98ã\81\95ã\81\9bã\82\8bã\81«ã\81¯ã\80\81ã\83\96ã\83­ã\83\83ã\82¯ã\82³ã\83¡ã\83³ã\83\88ã\81®é\96\8bå§\8bç\9b´å¾\8cã\81«+ï¼\88ã\83\97ã\83©ã\82¹ï¼\89ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82ã\83\92ã\83³ã\83\88ã\81®å¯¾è±¡ã\81¯ã\80\81ã\82«ã\83\83ã\82³å\86\85ã\81«ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\90\8dã\81¾ã\81\9fã\81¯å\88¥å\90\8d\82¨ã\82¤ã\83ªã\82¢ã\82¹)ã\81§æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82</p>
 
 <p>以下の例では、HashJoinとSeqScanヒントにより、pgbench_accountsテーブルに対するSeq Scanの結果をHash Joinする実行計画が選択されています。</p>
 <pre>
-postgres=# /*
+postgres=# /*+
 postgres*#    <span class="strong">HashJoin(a b)</span>
 postgres*#    <span class="strong">SeqScan(a)</span>
 postgres*#  */
@@ -152,12 +152,12 @@ postgres=# </pre>
 <dt>ヒントの記述位置</dt>
 <dd>クエリの前に複数のブロックコメントを記述する場合は、最初のブロックコメントにのみヒントを記述してください。二番目以降のブロックコメントは、ヒントと見なされず無視されます。以下の例では、HashJoin(a b)とSeqScan(a)がヒントと見なされ、IndexScan(a)とMergeJoin(a b)は無視されています。</p>
 <pre>
-postgres=# /*
+postgres=# /*+
 postgres*#    <span class="strong">HashJoin(a b)</span>
 postgres*#    <span class="strong">SeqScan(a)</span>
 postgres*#  */
-postgres-# /* IndexScan(a) */
-postgres-# EXPLAIN SELECT /* MergeJoin(a b) */ *
+postgres-# /*+ IndexScan(a) */
+postgres-# EXPLAIN SELECT /*+ MergeJoin(a b) */ *
 postgres-#    FROM pgbench_branches b
 postgres-#    JOIN pgbench_accounts a ON b.bid = a.bid
 postgres-#   ORDER BY a.aid;
@@ -180,7 +180,7 @@ postgres=# </pre>
 <dd>スキーマ違いや同一テーブルの複数回使用などでクエリ中に同一名称のテーブルが複数回出現する場合は、テーブルに別名をつけてそれぞれのテーブルを区別してください。以下の例の1つ目のSQL文では、MergeJoin(t1 t1)をヒントに指定したとき、ヒント対象のオブジェクトが特定できずにエラーになっています。2つ目のSQL文では、各テーブルにptやstという別名をつけているため、実行計画作成時にヒントで指定した通りにMerge Joinを選択しています。
 </p>
 <pre>
-postgres=# /* <span class="strong">MergeJoin(t1 t1)</span>*/
+postgres=# /*+ <span class="strong">MergeJoin(t1 t1)</span>*/
 postgres-# EXPLAIN SELECT * FROM s1.t1
 postgres-# JOIN public.t1 ON (s1.t1.id=public.t1.id);
 INFO:  hint syntax error at or near "t1 t1)"
@@ -196,7 +196,7 @@ INFO:  hint syntax error at or near "t1 t1)"
          ->  Seq Scan on t1  (cost=0.00..145.00 rows=10000 width=8)
 (5 rows)
 
-postgres=# /* <span class="strong">MergeJoin(pt st)</span> */
+postgres=# /*+ <span class="strong">MergeJoin(pt st)</span> */
 postgres-# EXPLAIN SELECT * FROM s1.t1 st
 postgres-# JOIN public.t1 pt ON (st.id=pt.id);
                                     QUERY PLAN
index abc34a7..3e0d6da 100644 (file)
@@ -37,7 +37,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
          ->  Index Scan using t1_val on t1
 (5 rows)
 
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 INFO:  hint syntax error at or near "Test (t1 t2) "
 DETAIL:  Keyword "Test" does not exist.
@@ -50,7 +50,7 @@ DETAIL:  Keyword "Test" does not exist.
 (4 rows)
 
 SET pg_hint_plan.enable TO off;
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
               QUERY PLAN              
 --------------------------------------
@@ -61,7 +61,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 (4 rows)
 
 SET pg_hint_plan.enable TO on;
-/*Set(enable_indexscan off)*/
+/*+Set(enable_indexscan off)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
           QUERY PLAN          
 ------------------------------
@@ -72,7 +72,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (5 rows)
 
-/* Set(enable_indexscan off) Set(enable_hashjoin off) */
+/*+ Set(enable_indexscan off) Set(enable_hashjoin off) */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
           QUERY PLAN           
 -------------------------------
@@ -86,7 +86,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (8 rows)
 
-/*      Set     (       enable_indexscan        off     )       */
+/*+     Set     (       enable_indexscan        off     )       */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
           QUERY PLAN          
 ------------------------------
@@ -97,7 +97,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (5 rows)
 
-/*      
+/*+     
                Set      
                (        
                enable_indexscan         
@@ -114,7 +114,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (5 rows)
 
-/* Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)          
+/*+ Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)         
                Set(enable_seqscan off)
                */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
@@ -127,7 +127,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Index Scan using t2_pkey on t2
 (5 rows)
 
-/*Set(work_mem "1M")*/
+/*+Set(work_mem "1M")*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 INFO:  invalid value for parameter "work_mem": "1M"
 HINT:  Valid units for this parameter are "kB", "MB", and "GB".
@@ -139,7 +139,7 @@ HINT:  Valid units for this parameter are "kB", "MB", and "GB".
    ->  Index Scan using t2_pkey on t2
 (4 rows)
 
-/*Set(work_mem "1MB")*/
+/*+Set(work_mem "1MB")*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
               QUERY PLAN              
 --------------------------------------
@@ -149,7 +149,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
    ->  Index Scan using t2_pkey on t2
 (4 rows)
 
-/*Set(work_mem TO "1MB")*/
+/*+Set(work_mem TO "1MB")*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 INFO:  hint syntax error at or near ""1MB")"
 DETAIL:  Closed parenthesis is necessary.
@@ -161,7 +161,7 @@ DETAIL:  Closed parenthesis is necessary.
    ->  Index Scan using t2_pkey on t2
 (4 rows)
 
-/*SeqScan(t1 t2)*/
+/*+SeqScan(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 INFO:  hint syntax error at or near "t2)"
 DETAIL:  Closed parenthesis is necessary.
@@ -173,7 +173,7 @@ DETAIL:  Closed parenthesis is necessary.
    ->  Index Scan using t2_pkey on t2
 (4 rows)
 
-/*SeqScan(t1)*/
+/*+SeqScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
           QUERY PLAN          
 ------------------------------
@@ -184,7 +184,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (5 rows)
 
-/*SeqScan(t1)IndexScan(t2)*/
+/*+SeqScan(t1)IndexScan(t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
                  QUERY PLAN                 
 --------------------------------------------
@@ -195,7 +195,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Index Scan using t2_pkey on t2
 (5 rows)
 
-/*BitmapScan(t2)*/
+/*+BitmapScan(t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
               QUERY PLAN              
 --------------------------------------
@@ -205,7 +205,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          Index Cond: (id = t1.id)
 (4 rows)
 
-/*BitmapScan(t2)NoSeqScan(t1)*/
+/*+BitmapScan(t2)NoSeqScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
               QUERY PLAN              
 --------------------------------------
@@ -215,7 +215,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          Index Cond: (id = t1.id)
 (4 rows)
 
-/*NoIndexScan(t1)*/
+/*+NoIndexScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
           QUERY PLAN          
 ------------------------------
@@ -226,7 +226,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (5 rows)
 
-/*NoBitmapScan(t1)*/
+/*+NoBitmapScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
          QUERY PLAN         
 ----------------------------
@@ -237,7 +237,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
          ->  Seq Scan on t4
 (5 rows)
 
-/*TidScan(t4)*/
+/*+TidScan(t4)*/
 EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1,1)';
                   QUERY PLAN                   
 -----------------------------------------------
@@ -250,7 +250,7 @@ EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1
                TID Cond: (ctid = '(1,1)'::tid)
 (7 rows)
 
-/*NoTidScan(t1)*/
+/*+NoTidScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)';
               QUERY PLAN               
 ---------------------------------------
@@ -261,7 +261,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1
          Index Cond: (id = t1.id)
 (5 rows)
 
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
           QUERY PLAN          
 ------------------------------
@@ -272,7 +272,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (5 rows)
 
-/*NestLoop(t1 t2)*/
+/*+NestLoop(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
               QUERY PLAN              
 --------------------------------------
@@ -282,7 +282,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          Index Cond: (id = t2.id)
 (4 rows)
 
-/*NoMergeJoin(t1 t2)*/
+/*+NoMergeJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
           QUERY PLAN          
 ------------------------------
@@ -293,7 +293,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
          ->  Seq Scan on t2
 (5 rows)
 
-/*MergeJoin(t1 t3)*/
+/*+MergeJoin(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
              QUERY PLAN              
 -------------------------------------
@@ -305,7 +305,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
          ->  Seq Scan on t3
 (6 rows)
 
-/*NestLoop(t1 t3)*/
+/*+NestLoop(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
              QUERY PLAN              
 -------------------------------------
@@ -315,7 +315,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
          Index Cond: (val = t3.val)
 (4 rows)
 
-/*NoHashJoin(t1 t3)*/
+/*+NoHashJoin(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
              QUERY PLAN              
 -------------------------------------
@@ -325,7 +325,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
          Index Cond: (val = t3.val)
 (4 rows)
 
-/*MergeJoin(t4 t1 t2 t3)*/
+/*+MergeJoin(t4 t1 t2 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                     QUERY PLAN                    
 --------------------------------------------------
@@ -343,7 +343,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
          ->  Seq Scan on t4
 (12 rows)
 
-/*HashJoin(t3 t4 t1 t2)*/
+/*+HashJoin(t3 t4 t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -362,7 +362,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
                      ->  Seq Scan on t4
 (13 rows)
 
-/*NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
+/*+NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                     QUERY PLAN                    
 --------------------------------------------------
@@ -380,7 +380,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
          Index Cond: (id = t1.id)
 (12 rows)
 
-/*NoNestLoop(t4 t1 t3 t2)*/
+/*+NoNestLoop(t4 t1 t3 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                     QUERY PLAN                    
 --------------------------------------------------
@@ -398,7 +398,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
          ->  Seq Scan on t4
 (12 rows)
 
-/*Leading(t3 t4)*/
+/*+Leading(t3 t4)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                     QUERY PLAN                    
 --------------------------------------------------
@@ -416,7 +416,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
          Index Cond: (id = t2.id)
 (12 rows)
 
-/*Leading(t3 t4 t1)*/
+/*+Leading(t3 t4 t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                     QUERY PLAN                    
 --------------------------------------------------
@@ -434,7 +434,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
          Index Cond: (id = t1.id)
 (12 rows)
 
-/*Leading(t3 t4 t1 t2)*/
+/*+Leading(t3 t4 t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                     QUERY PLAN                    
 --------------------------------------------------
@@ -452,7 +452,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
          Index Cond: (id = t1.id)
 (12 rows)
 
-/*Leading(t3 t4 t1 t2 t1)*/
+/*+Leading(t3 t4 t1 t2 t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
 INFO:  hint syntax error at or near "Leading(t3 t4 t1 t2 t1)"
 DETAIL:  In Leading hint, specified relation name 4 or less.
@@ -472,7 +472,7 @@ DETAIL:  In Leading hint, specified relation name 4 or less.
          Index Cond: (id = t1.id)
 (12 rows)
 
-/*Leading(t3 t4 t4)*/
+/*+Leading(t3 t4 t4)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
                     QUERY PLAN                    
 --------------------------------------------------
@@ -499,7 +499,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val)
          Index Cond: (id = "*VALUES*".column1)
 (4 rows)
 
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
 INFO:  hint syntax error at or near "HashJoin(t1 t2)"
 DETAIL:  Relation "t2" does not exist.
@@ -511,7 +511,7 @@ DETAIL:  Relation "t2" does not exist.
          Index Cond: (id = "*VALUES*".column1)
 (4 rows)
 
-/*HashJoin(t1 *VALUES*)*/
+/*+HashJoin(t1 *VALUES*)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
                 QUERY PLAN                 
 -------------------------------------------
@@ -522,7 +522,7 @@ EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val)
          ->  Values Scan on "*VALUES*"
 (5 rows)
 
-/*HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
+/*+HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
                 QUERY PLAN                 
 -------------------------------------------
index 89f4328..1d05e67 100644 (file)
@@ -25,7 +25,7 @@ EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:PREPAREでヒント句を指定しても、実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p1 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
 LOG:  /*
 NestLoop(t1 t2)
@@ -42,12 +42,12 @@ EXPLAIN (COSTS false) EXECUTE p1;
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:パラメータがない場合は、1回目のEXPLAINで実行計画が決定する
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p2 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
 LOG:  /*
 NestLoop(t1 t2)
 */
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p2;
                  QUERY PLAN                 
 --------------------------------------------
@@ -80,12 +80,12 @@ EXPLAIN (COSTS false) EXECUTE p2;
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:5回目のEXPLAINまでヒント句を指定しても、6回目以降は本来の実行計画に戻る
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p3 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 LOG:  /*
 NestLoop(t1 t2)
 */
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -96,7 +96,7 @@ EXPLAIN (COSTS false) EXECUTE p3 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -107,7 +107,7 @@ EXPLAIN (COSTS false) EXECUTE p3 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -118,7 +118,7 @@ EXPLAIN (COSTS false) EXECUTE p3 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -129,7 +129,7 @@ EXPLAIN (COSTS false) EXECUTE p3 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -172,12 +172,12 @@ EXPLAIN (COSTS false) EXECUTE p3 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:6回目のEXPLAINまでヒント句を指定すると、7回目以降も実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p4 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 LOG:  /*
 NestLoop(t1 t2)
 */
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -188,7 +188,7 @@ EXPLAIN (COSTS false) EXECUTE p4 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -199,7 +199,7 @@ EXPLAIN (COSTS false) EXECUTE p4 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -210,7 +210,7 @@ EXPLAIN (COSTS false) EXECUTE p4 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -221,7 +221,7 @@ EXPLAIN (COSTS false) EXECUTE p4 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -232,7 +232,7 @@ EXPLAIN (COSTS false) EXECUTE p4 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -265,7 +265,7 @@ EXPLAIN (COSTS false) EXECUTE p4 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:6回目のEXPLAINでヒント句を指定すると、7回目以降も実行計画を制御できる
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p5 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 LOG:  /*
 NestLoop(t1 t2)
@@ -320,7 +320,7 @@ EXPLAIN (COSTS false) EXECUTE p5 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -331,7 +331,7 @@ EXPLAIN (COSTS false) EXECUTE p5 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -342,7 +342,7 @@ EXPLAIN (COSTS false) EXECUTE p5 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -355,7 +355,7 @@ EXPLAIN (COSTS false) EXECUTE p5 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:7回目以降のEXPLAINでヒント句を指定しても、以降も実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p6 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 LOG:  /*
 NestLoop(t1 t2)
@@ -420,7 +420,7 @@ EXPLAIN (COSTS false) EXECUTE p6 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p6 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -431,7 +431,7 @@ EXPLAIN (COSTS false) EXECUTE p6 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p6 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -444,12 +444,12 @@ EXPLAIN (COSTS false) EXECUTE p6 (10);
 
 -- 9.1:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
 -- 9.2:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p7 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 LOG:  /*
 NestLoop(t1 t2)
 */
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -460,7 +460,7 @@ EXPLAIN (COSTS false) EXECUTE p7 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -471,7 +471,7 @@ EXPLAIN (COSTS false) EXECUTE p7 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -482,7 +482,7 @@ EXPLAIN (COSTS false) EXECUTE p7 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -493,7 +493,7 @@ EXPLAIN (COSTS false) EXECUTE p7 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -504,7 +504,7 @@ EXPLAIN (COSTS false) EXECUTE p7 (10);
                Index Cond: ((id > $1) AND (id = t2.id))
 (5 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                        QUERY PLAN                       
 --------------------------------------------------------
@@ -559,7 +559,7 @@ EXPLAIN (COSTS false) EXECUTE p7 (10);
          ->  Index Scan using t2_pkey on t2
 (6 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                  QUERY PLAN                 
 --------------------------------------------
@@ -584,7 +584,7 @@ EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id
          ->  Index Scan using t2_pkey on t2
 (6 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -600,7 +600,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                  QUERY PLAN                 
 --------------------------------------------
index 748c6a5..471f4bd 100644 (file)
@@ -25,7 +25,7 @@ EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:PREPAREでヒント句を指定しても、実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p1 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
 EXPLAIN (COSTS false) EXECUTE p1;
                    QUERY PLAN                    
@@ -39,9 +39,9 @@ EXPLAIN (COSTS false) EXECUTE p1;
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:パラメータがない場合は、1回目のEXPLAINで実行計画が決定する
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p2 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p2;
 LOG:  /*
 HashJoin(t1 t2)
@@ -80,9 +80,9 @@ EXPLAIN (COSTS false) EXECUTE p2;
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:5回目のEXPLAINまでヒント句を指定しても、6回目以降は本来の実行計画に戻る
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p3 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -98,7 +98,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -114,7 +114,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -130,7 +130,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -146,7 +146,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -197,9 +197,9 @@ EXPLAIN (COSTS false) EXECUTE p3 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:6回目のEXPLAINまでヒント句を指定すると、7回目以降も実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p4 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -215,7 +215,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -231,7 +231,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -247,7 +247,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -263,7 +263,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -279,7 +279,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -321,7 +321,7 @@ EXPLAIN (COSTS false) EXECUTE p4 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:6回目のEXPLAINでヒント句を指定すると、7回目以降も実行計画を制御できる
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p5 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 EXPLAIN (COSTS false) EXECUTE p5 (10);
                    QUERY PLAN                    
@@ -378,7 +378,7 @@ EXPLAIN (COSTS false) EXECUTE p5 (10);
          ->  Index Only Scan using t2_pkey on t2
 (6 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -397,7 +397,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -413,7 +413,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -431,7 +431,7 @@ HashJoin(t1 t2)
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:7回目以降のEXPLAINでヒント句を指定しても、以降も実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p6 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 EXPLAIN (COSTS false) EXECUTE p6 (10);
                    QUERY PLAN                    
@@ -499,7 +499,7 @@ EXPLAIN (COSTS false) EXECUTE p6 (10);
          ->  Index Only Scan using t2_pkey on t2
 (6 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p6 (10);
                    QUERY PLAN                    
 -------------------------------------------------
@@ -511,7 +511,7 @@ EXPLAIN (COSTS false) EXECUTE p6 (10);
          ->  Index Only Scan using t2_pkey on t2
 (6 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p6 (10);
                    QUERY PLAN                    
 -------------------------------------------------
@@ -525,9 +525,9 @@ EXPLAIN (COSTS false) EXECUTE p6 (10);
 
 -- 9.1:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
 -- 9.2:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p7 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -543,7 +543,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -559,7 +559,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -575,7 +575,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -591,7 +591,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -607,7 +607,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -671,7 +671,7 @@ EXPLAIN (COSTS false) EXECUTE p7 (10);
          ->  Index Only Scan using t2_pkey on t2
 (6 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                    QUERY PLAN                    
 -------------------------------------------------
@@ -696,7 +696,7 @@ EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id
          ->  Index Only Scan using t2_pkey on t2
 (6 rows)
 
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 LOG:  /*
 HashJoin(t1 t2)
@@ -712,7 +712,7 @@ HashJoin(t1 t2)
                ->  Seq Scan on t2
 (7 rows)
 
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
                    QUERY PLAN                    
 -------------------------------------------------
index 5f62b4c..599fff4 100644 (file)
@@ -27,8 +27,11 @@ PG_MODULE_MAGIC;
 #error unsupported PostgreSQL version
 #endif
 
-#define HINT_START     "/*"
-#define HINT_END       "*/"
+#define BLOCK_COMMENT_START            "/*"
+#define BLOCK_COMMENT_END              "*/"
+#define HINT_COMMENT_KEYWORD   "+"
+#define HINT_START             BLOCK_COMMENT_START HINT_COMMENT_KEYWORD
+#define HINT_END               BLOCK_COMMENT_END
 
 /* hint keywords */
 #define HINT_SEQSCAN                   "SeqScan"
@@ -1029,17 +1032,19 @@ parse_head_comment(Query *parse)
        if (strncmp(p, HINT_START, len))
                return NULL;
 
+       head = (char *) p;
        p += len;
        skip_space(p);
 
+       /* find hint end keyword. */
        if ((tail = strstr(p, HINT_END)) == NULL)
        {
-               parse_ereport(debug_query_string, ("unterminated /* comment"));
+               parse_ereport(head, ("unterminated block comment"));
                return NULL;
        }
 
        /* 入れ子にしたブロックコメントはサポートしない */
-       if ((head = strstr(p, HINT_START)) != NULL && head < tail)
+       if ((head = strstr(p, BLOCK_COMMENT_START)) != NULL && head < tail)
                parse_ereport(head, ("block comments nest doesn't supported"));
 
        /* ヒント句部分を切り出す */
index 83838bf..bed10b9 100644 (file)
@@ -6,21 +6,21 @@ LOAD 'pg_hint_plan';
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
 
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 SET pg_hint_plan.enable TO off;
-/* Test (t1 t2) */
+/*+ Test (t1 t2) */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 SET pg_hint_plan.enable TO on;
 
-/*Set(enable_indexscan off)*/
+/*+Set(enable_indexscan off)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/* Set(enable_indexscan off) Set(enable_hashjoin off) */
+/*+ Set(enable_indexscan off) Set(enable_hashjoin off) */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
-/*      Set     (       enable_indexscan        off     )       */
+/*+     Set     (       enable_indexscan        off     )       */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*      
+/*+     
                Set      
                (        
                enable_indexscan         
@@ -28,75 +28,75 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
                )        
                */              
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/* Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)          
+/*+ Set(enable_indexscan off)Set(enable_nestloop off)Set(enable_mergejoin off)         
                Set(enable_seqscan off)
                */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*Set(work_mem "1M")*/
+/*+Set(work_mem "1M")*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*Set(work_mem "1MB")*/
+/*+Set(work_mem "1MB")*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*Set(work_mem TO "1MB")*/
+/*+Set(work_mem TO "1MB")*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
-/*SeqScan(t1 t2)*/
+/*+SeqScan(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*SeqScan(t1)*/
+/*+SeqScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*SeqScan(t1)IndexScan(t2)*/
+/*+SeqScan(t1)IndexScan(t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*BitmapScan(t2)*/
+/*+BitmapScan(t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*BitmapScan(t2)NoSeqScan(t1)*/
+/*+BitmapScan(t2)NoSeqScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*NoIndexScan(t1)*/
+/*+NoIndexScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
-/*NoBitmapScan(t1)*/
+/*+NoBitmapScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
-/*TidScan(t4)*/
+/*+TidScan(t4)*/
 EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1,1)';
-/*NoTidScan(t1)*/
+/*+NoTidScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)';
 
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*NestLoop(t1 t2)*/
+/*+NestLoop(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
-/*NoMergeJoin(t1 t2)*/
+/*+NoMergeJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
-/*MergeJoin(t1 t3)*/
+/*+MergeJoin(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
-/*NestLoop(t1 t3)*/
+/*+NestLoop(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
-/*NoHashJoin(t1 t3)*/
+/*+NoHashJoin(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
 
-/*MergeJoin(t4 t1 t2 t3)*/
+/*+MergeJoin(t4 t1 t2 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*HashJoin(t3 t4 t1 t2)*/
+/*+HashJoin(t3 t4 t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
+/*+NestLoop(t2 t3 t4 t1) IndexScan(t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*NoNestLoop(t4 t1 t3 t2)*/
+/*+NoNestLoop(t4 t1 t3 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
 
-/*Leading(t3 t4)*/
+/*+Leading(t3 t4)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t1)*/
+/*+Leading(t3 t4 t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t1 t2)*/
+/*+Leading(t3 t4 t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t1 t2 t1)*/
+/*+Leading(t3 t4 t1 t2 t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
-/*Leading(t3 t4 t4)*/
+/*+Leading(t3 t4 t4)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id = t3.id AND t1.id = t4.id;
 
 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
-/*HashJoin(t1 t2)*/
+/*+HashJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
-/*HashJoin(t1 *VALUES*)*/
+/*+HashJoin(t1 *VALUES*)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
-/*HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
+/*+HashJoin(t1 *VALUES*) IndexScan(t1) IndexScan(*VALUES*)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val) WHERE t1.id = t2.id;
index e1af461..892faf8 100644 (file)
@@ -8,32 +8,32 @@ EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:PREPAREでヒント句を指定しても、実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p1 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
 EXPLAIN (COSTS false) EXECUTE p1;
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:パラメータがない場合は、1回目のEXPLAINで実行計画が決定する
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p2 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p2;
 EXPLAIN (COSTS false) EXECUTE p2;
 EXPLAIN (COSTS false) EXECUTE p2;
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:5回目のEXPLAINまでヒント句を指定しても、6回目以降は本来の実行計画に戻る
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p3 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p3 (10);
 EXPLAIN (COSTS false) EXECUTE p3 (10);
 EXPLAIN (COSTS false) EXECUTE p3 (10);
@@ -41,42 +41,42 @@ EXPLAIN (COSTS false) EXECUTE p3 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:6回目のEXPLAINまでヒント句を指定すると、7回目以降も実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p4 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 EXPLAIN (COSTS false) EXECUTE p4 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:6回目のEXPLAINでヒント句を指定すると、7回目以降も実行計画を制御できる
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p5 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 EXPLAIN (COSTS false) EXECUTE p5 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p5 (10);
 
 -- 9.1:PREPAREで指定したヒント句で実行計画が固定される
 -- 9.2:7回目以降のEXPLAINでヒント句を指定しても、以降も実行計画は制御できない
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p6 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
 EXPLAIN (COSTS false) EXECUTE p6 (10);
 EXPLAIN (COSTS false) EXECUTE p6 (10);
@@ -84,26 +84,26 @@ EXPLAIN (COSTS false) EXECUTE p6 (10);
 EXPLAIN (COSTS false) EXECUTE p6 (10);
 EXPLAIN (COSTS false) EXECUTE p6 (10);
 EXPLAIN (COSTS false) EXECUTE p6 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p6 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p6 (10);
 
 -- 9.1:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
 -- 9.2:実行計画が固定されたあと、ANALYZEをすると1回目のEXECUTEで実行計画が固定される
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 PREPARE p7 AS SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > $1;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 EXPLAIN (COSTS false) EXECUTE p7 (10);
@@ -112,13 +112,13 @@ TRUNCATE t1;
 ANALYZE t1;
 EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > 10;
 EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
 
 INSERT INTO t1 SELECT i, i % 100 FROM (SELECT generate_series(1, 10000) i) t;
 ANALYZE t1;
 EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > 10;
-/* HashJoin(t1 t2) */
+/*+ HashJoin(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);
-/* NestLoop(t1 t2) */
+/*+ NestLoop(t1 t2) */
 EXPLAIN (COSTS false) EXECUTE p7 (10);