X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=pg_hint_plan.c;h=2897c0aa14187accef3b90049fab296080abe6f9;hb=d97cb05587931dfe5e71335a814fd2a3f84fa9ca;hp=d4fcf0025e13116e3c80ca00bda6175fdba0f038;hpb=588392c3177553f754d7fa5263aa4b9eb18a63bb;p=pghintplan%2Fpg_hint_plan.git diff --git a/pg_hint_plan.c b/pg_hint_plan.c index d4fcf00..2897c0a 100644 --- a/pg_hint_plan.c +++ b/pg_hint_plan.c @@ -49,10 +49,6 @@ PG_MODULE_MAGIC; #define HINT_NOINDEXSCAN "NoIndexScan" #define HINT_NOBITMAPSCAN "NoBitmapScan" #define HINT_NOTIDSCAN "NoTidScan" -#if PG_VERSION_NUM >= 90200 -#define HINT_INDEXONLYSCAN "IndexonlyScan" -#define HINT_NOINDEXONLYSCAN "NoIndexonlyScan" -#endif #define HINT_NESTLOOP "NestLoop" #define HINT_MERGEJOIN "MergeJoin" #define HINT_HASHJOIN "HashJoin" @@ -80,9 +76,6 @@ enum ENABLE_INDEXSCAN = 0x02, ENABLE_BITMAPSCAN = 0x04, ENABLE_TIDSCAN = 0x08, -#if PG_VERSION_NUM >= 90200 - ENABLE_INDEXONLYSCAN = 0x10 -#endif } SCAN_TYPE_BITS; enum @@ -94,10 +87,6 @@ enum #define ENABLE_ALL_SCAN (ENABLE_SEQSCAN | ENABLE_INDEXSCAN | ENABLE_BITMAPSCAN \ | ENABLE_TIDSCAN) -#if PG_VERSION_NUM >= 90200 -#define ENABLE_ALL_SCAN (ENABLE_SEQSCAN | ENABLE_INDEXSCAN | ENABLE_BITMAPSCAN \ - | ENABLE_TIDSCAN | ENABLE_INDEXONLYSCAN) -#endif #define ENABLE_ALL_JOIN (ENABLE_NESTLOOP | ENABLE_MERGEJOIN | ENABLE_HASHJOIN) #define DISABLE_ALL_SCAN 0 #define DISABLE_ALL_JOIN 0 @@ -335,10 +324,6 @@ static const HintParser parsers[] = { {HINT_NOINDEXSCAN, ScanMethodHintCreate}, {HINT_NOBITMAPSCAN, ScanMethodHintCreate}, {HINT_NOTIDSCAN, ScanMethodHintCreate}, -#if PG_VERSION_NUM >= 90200 - {HINT_INDEXONLYSCAN, ScanMethodHintCreate}, - {HINT_NOINDEXONLYSCAN, ScanMethodHintCreate}, -#endif {HINT_NESTLOOP, JoinMethodHintCreate}, {HINT_MERGEJOIN, JoinMethodHintCreate}, {HINT_HASHJOIN, JoinMethodHintCreate}, @@ -1131,9 +1116,6 @@ ScanMethodHintParse(ScanMethodHint *hint, PlanHint *plan, Query *parse, * する。 */ if (strcmp(keyword, HINT_INDEXSCAN) == 0 || -#if PG_VERSION_NUM >= 90200 - strcmp(keyword, HINT_INDEXONLYSCAN) == 0 || -#endif strcmp(keyword, HINT_BITMAPSCAN) == 0) { while (*str != ')' && *str != '\0') @@ -1160,10 +1142,6 @@ ScanMethodHintParse(ScanMethodHint *hint, PlanHint *plan, Query *parse, hint->enforce_mask = ENABLE_BITMAPSCAN; else if (strcasecmp(keyword, HINT_TIDSCAN) == 0) hint->enforce_mask = ENABLE_TIDSCAN; -#if PG_VERSION_NUM >= 90200 - else if (strcasecmp(keyword, HINT_INDEXONLYSCAN) == 0) - hint->enforce_mask = ENABLE_INDEXSCAN | ENABLE_INDEXONLYSCAN; -#endif else if (strcasecmp(keyword, HINT_NOSEQSCAN) == 0) hint->enforce_mask = ENABLE_ALL_SCAN ^ ENABLE_SEQSCAN; else if (strcasecmp(keyword, HINT_NOINDEXSCAN) == 0) @@ -1172,10 +1150,6 @@ ScanMethodHintParse(ScanMethodHint *hint, PlanHint *plan, Query *parse, hint->enforce_mask = ENABLE_ALL_SCAN ^ ENABLE_BITMAPSCAN; else if (strcasecmp(keyword, HINT_NOTIDSCAN) == 0) hint->enforce_mask = ENABLE_ALL_SCAN ^ ENABLE_TIDSCAN; -#if PG_VERSION_NUM >= 90200 - else if (strcasecmp(keyword, HINT_NOINDEXONLYSCAN) == 0) - hint->enforce_mask = ENABLE_ALL_SCAN ^ ENABLE_INDEXONLYSCAN; -#endif else { parse_ereport(str, ("Unrecognized hint keyword \"%s\".", keyword)); @@ -1285,7 +1259,6 @@ SetHintParse(SetHint *hint, PlanHint *plan, Query *parse, const char *str) * set GUC parameter functions */ -#if PG_VERSION_NUM < 90200 static int set_config_option_wrapper(const char *name, const char *value, GucContext context, GucSource source, @@ -1304,11 +1277,9 @@ set_config_option_wrapper(const char *name, const char *value, ErrorData *errdata; MemoryContext ecxt; - if (elevel >= ERROR) - PG_RE_THROW(); - ecxt = MemoryContextSwitchTo(ccxt); errdata = CopyErrorData(); + FlushErrorState(); ereport(elevel, (errcode(errdata->sqlerrcode), errmsg("%s", errdata->message), errdata->detail ? errdetail("%s", errdata->detail) : 0, @@ -1322,12 +1293,6 @@ set_config_option_wrapper(const char *name, const char *value, return result; } -#define set_config_option(name, value, context, source, \ - action, changeVal, elevel) \ - set_config_option_wrapper(name, value, context, source, \ - action, changeVal, elevel) -#endif - static int set_config_options(SetHint **options, int noptions, GucContext context) { @@ -1344,9 +1309,9 @@ set_config_options(SetHint **options, int noptions, GucContext context) if (!hint_state_enabled(hint)) continue; - result = set_config_option(hint->name, hint->value, context, - PGC_S_SESSION, GUC_ACTION_SAVE, true, - pg_hint_plan_parse_messages); + result = set_config_option_wrapper(hint->name, hint->value, context, + PGC_S_SESSION, GUC_ACTION_SAVE, true, + pg_hint_plan_parse_messages); if (result != 0) hint->base.state = HINT_STATE_USED; else @@ -1357,25 +1322,39 @@ 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", \ + set_config_option_wrapper((name), \ + (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 + ) + 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); SET_CONFIG_OPTION("enable_tidscan", ENABLE_TIDSCAN); -#if PG_VERSION_NUM >= 90200 - SET_CONFIG_OPTION("enable_indexonlyscan", ENABLE_INDEXONLYSCAN); -#endif } 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_join_mask; + SET_CONFIG_OPTION("enable_nestloop", ENABLE_NESTLOOP); SET_CONFIG_OPTION("enable_mergejoin", ENABLE_MERGEJOIN); SET_CONFIG_OPTION("enable_hashjoin", ENABLE_HASHJOIN); @@ -1500,10 +1479,6 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams) global->init_scan_mask |= ENABLE_BITMAPSCAN; if (enable_tidscan) global->init_scan_mask |= ENABLE_TIDSCAN; -#if PG_VERSION_NUM >= 90200 - if (enable_indexonlyscan) - global->init_scan_mask |= ENABLE_INDEXONLYSCAN; -#endif if (enable_nestloop) global->init_join_mask |= ENABLE_NESTLOOP; if (enable_mergejoin)