OSDN Git Service

クリーンアップ。
authorMitsuru Hasegawa <hasegawa@metrosystems.co.jp>
Thu, 5 Jul 2012 01:55:30 +0000 (10:55 +0900)
committerMitsuru Hasegawa <hasegawa@metrosystems.co.jp>
Thu, 5 Jul 2012 01:55:30 +0000 (10:55 +0900)
expected/pg_hint_plan.out
pg_hint_plan.c
sql/pg_hint_plan.sql
sql/prepare.sql

index 3e0d6da..ddf6dc9 100644 (file)
@@ -18,6 +18,8 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
 (5 rows)
 
 LOAD 'pg_hint_plan';
+SET pg_hint_plan.debug_print TO on;
+SET client_min_messages TO LOG;
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
               QUERY PLAN              
 --------------------------------------
@@ -63,6 +65,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 SET pg_hint_plan.enable TO on;
 /*+Set(enable_indexscan off)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+Set(enable_indexscan off)
+
           QUERY PLAN          
 ------------------------------
  Hash Join
@@ -74,6 +80,11 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+ Set(enable_indexscan off) Set(enable_hashjoin off) */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+Set(enable_indexscan off)
+Set(enable_hashjoin off)
+
           QUERY PLAN           
 -------------------------------
  Merge Join
@@ -88,6 +99,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+     Set     (       enable_indexscan        off     )       */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+Set(enable_indexscan off)
+
           QUERY PLAN          
 ------------------------------
  Hash Join
@@ -105,6 +120,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
                )        
                */              
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+Set(enable_indexscan off)
+
           QUERY PLAN          
 ------------------------------
  Hash Join
@@ -118,6 +137,13 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
                Set(enable_seqscan off)
                */
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+Set(enable_indexscan off)
+Set(enable_nestloop off)
+Set(enable_mergejoin off)
+Set(enable_seqscan off)
+
                  QUERY PLAN                 
 --------------------------------------------
  Hash Join
@@ -131,6 +157,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 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".
+LOG:  pg_hint_plan:
+used hint:
+Set(work_mem 1M)
+
               QUERY PLAN              
 --------------------------------------
  Merge Join
@@ -141,6 +171,10 @@ HINT:  Valid units for this parameter are "kB", "MB", and "GB".
 
 /*+Set(work_mem "1MB")*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+Set(work_mem 1MB)
+
               QUERY PLAN              
 --------------------------------------
  Merge Join
@@ -175,6 +209,10 @@ DETAIL:  Closed parenthesis is necessary.
 
 /*+SeqScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+SeqScan(t1)
+
           QUERY PLAN          
 ------------------------------
  Hash Join
@@ -186,6 +224,11 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+SeqScan(t1)IndexScan(t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+SeqScan(t1)
+IndexScan(t2)
+
                  QUERY PLAN                 
 --------------------------------------------
  Hash Join
@@ -197,6 +240,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+BitmapScan(t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+BitmapScan(t2)
+
               QUERY PLAN              
 --------------------------------------
  Nested Loop
@@ -207,6 +254,11 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+BitmapScan(t2)NoSeqScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+NoSeqScan(t1)
+BitmapScan(t2)
+
               QUERY PLAN              
 --------------------------------------
  Nested Loop
@@ -217,6 +269,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+NoIndexScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+NoIndexScan(t1)
+
           QUERY PLAN          
 ------------------------------
  Hash Join
@@ -228,6 +284,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+NoBitmapScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
+LOG:  pg_hint_plan:
+used hint:
+NoBitmapScan(t1)
+
          QUERY PLAN         
 ----------------------------
  Nested Loop
@@ -239,6 +299,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t4 WHERE t1.val < 10;
 
 /*+TidScan(t4)*/
 EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1,1)';
+LOG:  pg_hint_plan:
+used hint:
+TidScan(t4)
+
                   QUERY PLAN                   
 -----------------------------------------------
  Merge Join
@@ -252,6 +316,10 @@ EXPLAIN (COSTS false) SELECT * FROM t3, t4 WHERE t3.id = t4.id AND t4.ctid = '(1
 
 /*+NoTidScan(t1)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1,1)';
+LOG:  pg_hint_plan:
+used hint:
+NoTidScan(t1)
+
               QUERY PLAN               
 ---------------------------------------
  Nested Loop
@@ -263,6 +331,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id AND t1.ctid = '(1
 
 /*+HashJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+HashJoin(t1 t2)
+
           QUERY PLAN          
 ------------------------------
  Hash Join
@@ -274,6 +346,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+NestLoop(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+NestLoop(t1 t2)
+
               QUERY PLAN              
 --------------------------------------
  Nested Loop
@@ -284,6 +360,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+NoMergeJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
+LOG:  pg_hint_plan:
+used hint:
+NoMergeJoin(t1 t2)
+
           QUERY PLAN          
 ------------------------------
  Hash Join
@@ -295,6 +375,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 
 /*+MergeJoin(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
+LOG:  pg_hint_plan:
+used hint:
+MergeJoin(t1 t3)
+
              QUERY PLAN              
 -------------------------------------
  Merge Join
@@ -307,6 +391,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
 
 /*+NestLoop(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
+LOG:  pg_hint_plan:
+used hint:
+NestLoop(t1 t3)
+
              QUERY PLAN              
 -------------------------------------
  Nested Loop
@@ -317,6 +405,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
 
 /*+NoHashJoin(t1 t3)*/
 EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
+LOG:  pg_hint_plan:
+used hint:
+NoHashJoin(t1 t3)
+
              QUERY PLAN              
 -------------------------------------
  Nested Loop
@@ -327,6 +419,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t3 WHERE t1.val = t3.val;
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+MergeJoin(t1 t2 t3 t4)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Merge Join
@@ -345,6 +441,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+HashJoin(t1 t2 t3 t4)
+
                        QUERY PLAN                       
 --------------------------------------------------------
  Hash Join
@@ -364,6 +464,11 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+IndexScan(t3)
+NestLoop(t1 t2 t3 t4)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Nested Loop
@@ -382,6 +487,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+NoNestLoop(t1 t2 t3 t4)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Merge Join
@@ -400,6 +509,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+Leading(t3 t4)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Nested Loop
@@ -418,6 +531,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+Leading(t3 t4 t1)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Nested Loop
@@ -436,6 +553,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+Leading(t3 t4 t1 t2)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Nested Loop
@@ -456,6 +577,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2, t3, t4 WHERE t1.id = t2.id AND t1.id
 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.
+LOG:  pg_hint_plan:
+used hint:
+Leading(t3 t4 t1 t2 t1)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Nested Loop
@@ -474,6 +599,10 @@ DETAIL:  In Leading hint, specified relation name 4 or less.
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+Leading(t3 t4 t4)
+
                     QUERY PLAN                    
 --------------------------------------------------
  Nested Loop
@@ -503,6 +632,10 @@ EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val)
 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.
+LOG:  pg_hint_plan:
+used hint:
+HashJoin(t1 t2)
+
                   QUERY PLAN                   
 -----------------------------------------------
  Nested Loop
@@ -513,6 +646,10 @@ DETAIL:  Relation "t2" does not exist.
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+HashJoin(*VALUES* t1)
+
                 QUERY PLAN                 
 -------------------------------------------
  Hash Join
@@ -524,6 +661,12 @@ EXPLAIN (COSTS false) SELECT * FROM t1, (VALUES(1,1),(2,2),(3,3)) AS t2(id,val)
 
 /*+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;
+LOG:  pg_hint_plan:
+used hint:
+IndexScan(*VALUES*)
+IndexScan(t1)
+HashJoin(*VALUES* t1)
+
                 QUERY PLAN                 
 -------------------------------------------
  Hash Join
index 599fff4..ea724e1 100644 (file)
@@ -94,7 +94,7 @@ typedef enum HintStatus
 {
        HINT_STATE_NOTUSED = 0, /* specified relation not used in query */
        HINT_STATE_DUPLICATION, /* specified hint duplication */
-       HINT_STATE_USED,                        /* hint is used */
+       HINT_STATE_USED,                /* hint is used */
        /* execute error (parse error does not include it) */
        HINT_STATE_ERROR
 } HintStatus;
@@ -104,7 +104,7 @@ struct Hint
 {
        const char                 *hint_str;           /* must not do pfree */
        const char                 *keyword;            /* must not do pfree */
-       bool                            used;
+       HintStatus                      state;
        HintDeleteFunction      delete_func;
        HintParseFunction       parser_func;
 };
@@ -343,7 +343,7 @@ ScanMethodHintCreate(char *hint_str, char *keyword)
        hint = palloc(sizeof(ScanMethodHint));
        hint->base.hint_str = hint_str;
        hint->base.keyword = keyword;
-       hint->base.used = false;
+       hint->base.state = HINT_STATE_NOTUSED;
        hint->base.delete_func = (HintDeleteFunction) ScanMethodHintDelete;
        hint->base.parser_func = (HintParseFunction) ScanMethodHintParse;
        hint->relname = NULL;
@@ -373,7 +373,7 @@ JoinMethodHintCreate(char *hint_str, char *keyword)
        hint = palloc(sizeof(JoinMethodHint));
        hint->base.hint_str = hint_str;
        hint->base.keyword = keyword;
-       hint->base.used = false;
+       hint->base.state = HINT_STATE_NOTUSED;
        hint->base.delete_func = (HintDeleteFunction) JoinMethodHintDelete;
        hint->base.parser_func = (HintParseFunction) JoinMethodHintParse;
        hint->nrels = 0;
@@ -410,7 +410,7 @@ LeadingHintCreate(char *hint_str, char *keyword)
        hint = palloc(sizeof(LeadingHint));
        hint->base.hint_str = hint_str;
        hint->base.keyword = keyword;
-       hint->base.used = false;
+       hint->base.state = HINT_STATE_NOTUSED;
        hint->base.delete_func = (HintDeleteFunction)LeadingHintDelete;
        hint->base.parser_func = (HintParseFunction) LeadingHintParse;
        hint->relations = NIL;
@@ -436,7 +436,7 @@ SetHintCreate(char *hint_str, char *keyword)
        hint = palloc(sizeof(SetHint));
        hint->base.hint_str = hint_str;
        hint->base.keyword = keyword;
-       hint->base.used = false;
+       hint->base.state = HINT_STATE_NOTUSED;
        hint->base.delete_func = (HintDeleteFunction) SetHintDelete;
        hint->base.parser_func = (HintParseFunction) SetHintParse;
        hint->name = NULL;
@@ -517,7 +517,7 @@ PlanHintDelete(PlanHint *hint)
 }
 
 static bool
-PlanHintIsempty(PlanHint *hint)
+PlanHintIsEmpty(PlanHint *hint)
 {
        if (hint->nscan_hints == 0 &&
                hint->njoin_hints == 0 &&
@@ -539,47 +539,18 @@ PlanHintDump(PlanHint *hint)
 
        if (!hint)
        {
-               elog(LOG, "no hint");
+               elog(LOG, "pg_hint_plan:\nno hint");
                return;
        }
 
        initStringInfo(&buf);
-       appendStringInfo(&buf, "/*\n");
+       appendStringInfo(&buf, "pg_hint_plan:\nused hint:\n");
        for (i = 0; i < hint->nscan_hints; i++)
        {
                ScanMethodHint *h = hint->scan_hints[i];
                ListCell           *n;
-               switch(h->enforce_mask)
-               {
-                       case(ENABLE_SEQSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_SEQSCAN);
-                               break;
-                       case(ENABLE_INDEXSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_INDEXSCAN);
-                               break;
-                       case(ENABLE_BITMAPSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_BITMAPSCAN);
-                               break;
-                       case(ENABLE_TIDSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_TIDSCAN);
-                               break;
-                       case(ENABLE_INDEXSCAN | ENABLE_BITMAPSCAN | ENABLE_TIDSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_NOSEQSCAN);
-                               break;
-                       case(ENABLE_SEQSCAN | ENABLE_BITMAPSCAN | ENABLE_TIDSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_NOINDEXSCAN);
-                               break;
-                       case(ENABLE_SEQSCAN | ENABLE_INDEXSCAN | ENABLE_TIDSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_NOBITMAPSCAN);
-                               break;
-                       case(ENABLE_SEQSCAN | ENABLE_INDEXSCAN | ENABLE_BITMAPSCAN):
-                               appendStringInfo(&buf, "%s(", HINT_NOTIDSCAN);
-                               break;
-                       default:
-                               appendStringInfoString(&buf, "\?\?\?(");
-                               break;
-               }
-               appendStringInfo(&buf, "%s", h->relname);
+
+               appendStringInfo(&buf, "%s(%s", h->base.keyword, h->relname);
                foreach(n, h->indexnames)
                        appendStringInfo(&buf, " %s", (char *) lfirst(n));
                appendStringInfoString(&buf, ")\n");
@@ -589,33 +560,11 @@ PlanHintDump(PlanHint *hint)
        {
                JoinMethodHint *h = hint->join_hints[i];
                int                             i;
-               switch(h->enforce_mask)
-               {
-                       case(ENABLE_NESTLOOP):
-                               appendStringInfo(&buf, "%s(", HINT_NESTLOOP);
-                               break;
-                       case(ENABLE_MERGEJOIN):
-                               appendStringInfo(&buf, "%s(", HINT_MERGEJOIN);
-                               break;
-                       case(ENABLE_HASHJOIN):
-                               appendStringInfo(&buf, "%s(", HINT_HASHJOIN);
-                               break;
-                       case(ENABLE_ALL_JOIN ^ ENABLE_NESTLOOP):
-                               appendStringInfo(&buf, "%s(", HINT_NONESTLOOP);
-                               break;
-                       case(ENABLE_ALL_JOIN ^ ENABLE_MERGEJOIN):
-                               appendStringInfo(&buf, "%s(", HINT_NOMERGEJOIN);
-                               break;
-                       case(ENABLE_ALL_JOIN ^ ENABLE_HASHJOIN):
-                               appendStringInfo(&buf, "%s(", HINT_NOHASHJOIN);
-                               break;
-                       case(ENABLE_ALL_JOIN):
-                               continue;
-                       default:
-                               appendStringInfoString(&buf, "\?\?\?(");
-                               break;
-               }
-               appendStringInfo(&buf, "%s", h->relnames[0]);
+
+               if (h->enforce_mask == ENABLE_ALL_JOIN)
+                       continue;
+
+               appendStringInfo(&buf, "%s(%s", h->base.keyword, h->relnames[0]);
                for (i = 1; i < h->nrels; i++)
                        appendStringInfo(&buf, " %s", h->relnames[i]);
                appendStringInfoString(&buf, ")\n");
@@ -640,8 +589,6 @@ PlanHintDump(PlanHint *hint)
        if (!is_first)
                appendStringInfoString(&buf, ")\n");
 
-       appendStringInfoString(&buf, "*/");
-
        elog(LOG, "%s", buf.data);
 
        pfree(buf.data);
@@ -684,25 +631,23 @@ JoinMethodHintCmp(const void *a, const void *b, bool order)
 {
        const JoinMethodHint   *hinta = *((const JoinMethodHint **) a);
        const JoinMethodHint   *hintb = *((const JoinMethodHint **) b);
+       int                                             i;
 
-       if (hinta->nrels == hintb->nrels)
-       {
-               int     i;
-               for (i = 0; i < hinta->nrels; i++)
-               {
-                       int     result;
-                       if ((result = RelnameCmp(&hinta->relnames[i], &hintb->relnames[i])) != 0)
-                               return result;
-               }
+       if (hinta->nrels != hintb->nrels)
+               return hinta->nrels - hintb->nrels;
 
-               /* ヒント句で指定した順を返す */
-               if (order)
-                       return hinta->base.hint_str - hintb->base.hint_str;
-               else
-                       return 0;
+       for (i = 0; i < hinta->nrels; i++)
+       {
+               int     result;
+               if ((result = RelnameCmp(&hinta->relnames[i], &hintb->relnames[i])) != 0)
+                       return result;
        }
 
-       return hinta->nrels - hintb->nrels;
+       /* ヒント句で指定した順を返す */
+       if (order)
+               return hinta->base.hint_str - hintb->base.hint_str;
+       else
+               return 0;
 }
 
 static int
@@ -776,28 +721,28 @@ set_config_options(List *options, GucContext context)
        return save_nestlevel;
 }
 
-#define SET_CONFIG_OPTION(name, enforce_mask, type_bits) \
+#define SET_CONFIG_OPTION(name, type_bits) \
        set_config_option((name), \
-               ((enforce_mask) & (type_bits)) ? "true" : "false", \
+               (enforce_mask & (type_bits)) ? "true" : "false", \
                context, PGC_S_SESSION, GUC_ACTION_SAVE, true, ERROR)
 
 static void
 set_join_config_options(unsigned char enforce_mask, GucContext context)
 {
-       SET_CONFIG_OPTION("enable_nestloop", enforce_mask, ENABLE_NESTLOOP);
-       SET_CONFIG_OPTION("enable_mergejoin", enforce_mask, ENABLE_MERGEJOIN);
-       SET_CONFIG_OPTION("enable_hashjoin", enforce_mask, ENABLE_HASHJOIN);
+       SET_CONFIG_OPTION("enable_nestloop", ENABLE_NESTLOOP);
+       SET_CONFIG_OPTION("enable_mergejoin", ENABLE_MERGEJOIN);
+       SET_CONFIG_OPTION("enable_hashjoin", ENABLE_HASHJOIN);
 }
 
 static void
 set_scan_config_options(unsigned char enforce_mask, GucContext context)
 {
-       SET_CONFIG_OPTION("enable_seqscan", enforce_mask, ENABLE_SEQSCAN);
-       SET_CONFIG_OPTION("enable_indexscan", enforce_mask, ENABLE_INDEXSCAN);
-       SET_CONFIG_OPTION("enable_bitmapscan", enforce_mask, ENABLE_BITMAPSCAN);
-       SET_CONFIG_OPTION("enable_tidscan", enforce_mask, ENABLE_TIDSCAN);
+       SET_CONFIG_OPTION("enable_seqscan", ENABLE_SEQSCAN);
+       SET_CONFIG_OPTION("enable_indexscan", ENABLE_INDEXSCAN);
+       SET_CONFIG_OPTION("enable_bitmapscan", ENABLE_BITMAPSCAN);
+       SET_CONFIG_OPTION("enable_tidscan", ENABLE_TIDSCAN);
 #if PG_VERSION_NUM >= 90200
-       SET_CONFIG_OPTION("enable_indexonlyscan", enforce_mask, ENABLE_INDEXSCAN);
+       SET_CONFIG_OPTION("enable_indexonlyscan", ENABLE_INDEXSCAN);
 #endif
 }
 
@@ -1355,7 +1300,7 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
         */
        if (!pg_hint_plan_enable ||
                (global = parse_head_comment(parse)) == NULL ||
-               PlanHintIsempty(global))
+               PlanHintIsEmpty(global))
        {
                PlanHintDelete(global);
                global = NULL;
index bed10b9..544a20c 100644 (file)
@@ -2,6 +2,8 @@ EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
 
 LOAD 'pg_hint_plan';
+SET pg_hint_plan.debug_print TO on;
+SET client_min_messages TO LOG;
 
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
index 892faf8..4f216ca 100644 (file)
@@ -1,7 +1,7 @@
 LOAD 'pg_hint_plan';
 SET pg_hint_plan.enable TO on;
-SET pg_hint_plan.debug_print TO true;
-SET client_min_messages TO 'LOG';
+SET pg_hint_plan.debug_print TO on;
+SET client_min_messages TO LOG;
 
 EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id;
 EXPLAIN (COSTS false) SELECT count(*) FROM t1, t2 WHERE t1.id = t2.id AND t1.id > 10;