OSDN Git Service

parse_scan_method を ParseScanMethod にマージした。
authorShigeru Hanada <shigeru.hanada@gmail.com>
Wed, 18 Apr 2012 07:43:40 +0000 (16:43 +0900)
committerShigeru Hanada <shigeru.hanada@gmail.com>
Wed, 18 Apr 2012 07:57:37 +0000 (16:57 +0900)
併せて、ParseIndexScanMethod を ParseScanMethod に統合した。

pg_hint_plan.c

index 339e300..12f88fb 100644 (file)
@@ -157,7 +157,6 @@ static RelOptInfo *pg_hint_plan_join_search(PlannerInfo *root, int levels_needed
                                                                  List *initial_rels);
 
 static const char *ParseScanMethod(PlanHint *plan, Query *parse, char *keyword, const char *str);
-static const char *ParseIndexScanMethod(PlanHint *plan, Query *parse, char *keyword, const char *str);
 static const char *ParseJoinMethod(PlanHint *plan, Query *parse, char *keyword, const char *str);
 static const char *ParseLeading(PlanHint *plan, Query *parse, char *keyword, const char *str);
 static const char *ParseSet(PlanHint *plan, Query *parse, char *keyword, const char *str);
@@ -207,16 +206,16 @@ static PlanHint *global = NULL;
 
 static const HintParser parsers[] = {
        {HINT_SEQSCAN, true, ParseScanMethod},
-       {HINT_INDEXSCAN, true, ParseIndexScanMethod},
-       {HINT_BITMAPSCAN, true, ParseIndexScanMethod},
+       {HINT_INDEXSCAN, true, ParseScanMethod},
+       {HINT_BITMAPSCAN, true, ParseScanMethod},
        {HINT_TIDSCAN, true, ParseScanMethod},
        {HINT_NOSEQSCAN, true, ParseScanMethod},
        {HINT_NOINDEXSCAN, true, ParseScanMethod},
        {HINT_NOBITMAPSCAN, true, ParseScanMethod},
        {HINT_NOTIDSCAN, true, ParseScanMethod},
 #if PG_VERSION_NUM >= 90200
-       {HINT_INDEXONLYSCAN, true, ParseIndexScanMethod},
-       {HINT_NOINDEXONLYSCAN, true, ParseIndexScanMethod},
+       {HINT_INDEXONLYSCAN, true, ParseScanMethod},
+       {HINT_NOINDEXONLYSCAN, true, ParseScanMethod},
 #endif
        {HINT_NESTLOOP, true, ParseJoinMethod},
        {HINT_MERGEJOIN, true, ParseJoinMethod},
@@ -1010,10 +1009,10 @@ parse_head_comment(Query *parse)
 }
 
 /*
- * ã\82¹ã\82­ã\83£ã\83³æ\96¹å¼\8fã\83\92ã\83³ã\83\88ã\81®ã\83\91ã\83¼ã\82¹ã\81§ã\81®å\85±é\80\9aå\87¦ç\90\86
+ * ã\82¹ã\82­ã\83£ã\83³æ\96¹å¼\8fã\83\92ã\83³ã\83\88ã\81®ã\82«ã\83\83ã\82³å\86\85ã\82\92ã\83\91ã\83¼ã\82¹ã\81\99ã\82\8b
  */
 static const char *
-parse_scan_method(PlanHint *plan, Query *parse, char *keyword, const char *str)
+ParseScanMethod(PlanHint *plan, Query *parse, char *keyword, const char *str)
 {
        ScanHint   *hint;
 
@@ -1030,6 +1029,40 @@ parse_scan_method(PlanHint *plan, Query *parse, char *keyword, const char *str)
        }
 
        /*
+        * インデックスリストを受け付けるヒントであれば、インデックス参照をパース
+        * する。
+        */
+       if (strcmp(keyword, HINT_INDEXSCAN) == 0 ||
+               strcmp(keyword, HINT_BITMAPSCAN) == 0 ||
+               strcmp(keyword, HINT_INDEXONLYSCAN) == 0)
+       {
+               skip_space(str);
+               while (*str != ')' && *str != '\0')
+               {
+                       char       *indexname;
+
+                       str = parse_quote_value(str, &indexname, "index name");
+                       if (str == NULL)
+                       {
+                               ScanHintDelete(hint);
+                               return NULL;
+                       }
+
+                       hint->indexnames = lappend(hint->indexnames, indexname);
+                       skip_space(str);
+               }
+       }
+
+       /* カッコが閉じていなければヒント無効。 */
+       skip_space(str);
+       if (*str != ')')
+       {
+               parse_ereport(str, ("Closed parenthesis is necessary."));
+               ScanHintDelete(hint);
+               return NULL;
+       }
+
+       /*
         * ヒントごとに決まっている許容スキャン方式をビットマスクとして設定
         */
        if (strcasecmp(keyword, HINT_SEQSCAN) == 0)
@@ -1069,7 +1102,6 @@ parse_scan_method(PlanHint *plan, Query *parse, char *keyword, const char *str)
                plan->scan_hints = repalloc(plan->scan_hints,
                                                                sizeof(JoinHint *) * plan->max_scan_hints);
        }
-
        plan->scan_hints[plan->nscan_hints] = hint;
        plan->nscan_hints++;
 
@@ -1077,62 +1109,6 @@ parse_scan_method(PlanHint *plan, Query *parse, char *keyword, const char *str)
 }
 
 static const char *
-ParseScanMethod(PlanHint *plan, Query *parse, char *keyword, const char *str)
-{
-       ScanHint   *hint;
-
-       if ((str = parse_scan_method(plan, parse, keyword, str)) == NULL)
-               return NULL;
-
-       hint = plan->scan_hints[plan->nscan_hints - 1];
-
-       skip_space(str);
-       if (*str != ')')
-       {
-               parse_ereport(str, ("Closed parenthesis is necessary."));
-               plan->nscan_hints--;
-               ScanHintDelete(hint);
-               return NULL;
-       }
-
-       return str;
-}
-
-static const char *
-ParseIndexScanMethod(PlanHint *plan, Query *parse, char *keyword, const char *str)
-{
-       char       *indexname;
-       ScanHint   *hint;
-
-       if ((str = parse_scan_method(plan, parse, keyword, str)) == NULL)
-               return NULL;
-
-       hint = plan->scan_hints[plan->nscan_hints - 1];
-
-       /* インデックス参照をパースする。 */
-       while (true)
-       {
-               /*
-                * TODO 直前のオブジェクト名がクウォート処理されていた場合の処理を実装
-                */
-               skip_space(str);
-               if (*str == ')')
-                       break;
-
-               if ((str = parse_quote_value(str, &indexname, "index name")) == NULL)
-               {
-                       plan->nscan_hints--;
-                       ScanHintDelete(hint);
-                       return NULL;
-               }
-
-               hint->indexnames = lappend(hint->indexnames, indexname);
-       }
-
-       return str;
-}
-
-static const char *
 ParseJoinMethod(PlanHint *plan, Query *parse, char *keyword, const char *str)
 {
        char       *relname;