OSDN Git Service

否定形のヒントを指定した場合に、ヒントで指定した以外のenable_*
authorMitsuru Hasegawa <hasegawa@metrosystems.co.jp>
Thu, 23 Aug 2012 13:04:42 +0000 (22:04 +0900)
committerMitsuru Hasegawa <hasegawa@metrosystems.co.jp>
Thu, 23 Aug 2012 13:04:42 +0000 (22:04 +0900)
パラメータをonにしていたために、GUC設定で無効化されているプランが
選択されてしまう場合があるバグを修正した。

pg_hint_plan.c

index d4fcf00..c1b7bc2 100644 (file)
@@ -1358,12 +1358,24 @@ set_config_options(SetHint **options, int noptions, GucContext context)
 
 #define SET_CONFIG_OPTION(name, type_bits) \
        set_config_option((name), \
-               (enforce_mask & (type_bits)) ? "true" : "false", \
+               (mask & (type_bits)) ? "true" : "false", \
                context, PGC_S_SESSION, GUC_ACTION_SAVE, true, ERROR)
 
 static void
 set_scan_config_options(unsigned char enforce_mask, GucContext context)
 {
+       unsigned char   mask;
+
+       if (enforce_mask == ENABLE_SEQSCAN || enforce_mask == ENABLE_INDEXSCAN ||
+               enforce_mask == ENABLE_BITMAPSCAN || enforce_mask == ENABLE_TIDSCAN
+#if PG_VERSION_NUM >= 90200
+               || enforce_mask == ENABLE_INDEXONLYSCAN
+#endif
+               )
+               mask = enforce_mask;
+       else
+               mask = enforce_mask & global->init_scan_mask;
+
        SET_CONFIG_OPTION("enable_seqscan", ENABLE_SEQSCAN);
        SET_CONFIG_OPTION("enable_indexscan", ENABLE_INDEXSCAN);
        SET_CONFIG_OPTION("enable_bitmapscan", ENABLE_BITMAPSCAN);
@@ -1376,6 +1388,14 @@ set_scan_config_options(unsigned char enforce_mask, GucContext context)
 static void
 set_join_config_options(unsigned char enforce_mask, GucContext context)
 {
+       unsigned char   mask;
+
+       if (enforce_mask == ENABLE_NESTLOOP || enforce_mask == ENABLE_MERGEJOIN ||
+               enforce_mask == ENABLE_HASHJOIN)
+               mask = enforce_mask;
+       else
+               mask = enforce_mask & global->init_scan_mask;
+
        SET_CONFIG_OPTION("enable_nestloop", ENABLE_NESTLOOP);
        SET_CONFIG_OPTION("enable_mergejoin", ENABLE_MERGEJOIN);
        SET_CONFIG_OPTION("enable_hashjoin", ENABLE_HASHJOIN);