-#define SET_CONFIG_OPTION(name, type_bits) \
- 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)
-{
+/*
+ * Setup parallel execution environment.
+ *
+ * If hint is not NULL, set up using it, elsewise reset to initial environment.
+ */
+static void
+setup_parallel_plan_enforcement(ParallelHint *hint, HintState *state)
+{
+ if (hint)
+ {
+ hint->base.state = HINT_STATE_USED;
+ set_config_int32_option("max_parallel_workers_per_gather",
+ hint->nworkers, state->context);
+ }
+ else
+ set_config_int32_option("max_parallel_workers_per_gather",
+ state->init_nworkers, state->context);
+
+ /* force means that enforce parallel as far as possible */
+ if (hint && hint->force_parallel && hint->nworkers > 0)
+ {
+ set_config_double_option("parallel_tuple_cost", 0.0, state->context);
+ set_config_double_option("parallel_setup_cost", 0.0, state->context);
+ set_config_int32_option("min_parallel_table_scan_size", 0,
+ state->context);
+ set_config_int32_option("min_parallel_index_scan_size", 0,
+ state->context);
+ }
+ else
+ {
+ set_config_double_option("parallel_tuple_cost",
+ state->init_paratup_cost, state->context);
+ set_config_double_option("parallel_setup_cost",
+ state->init_parasetup_cost, state->context);
+ set_config_int32_option("min_parallel_table_scan_size",
+ state->init_min_para_tablescan_size,
+ state->context);
+ set_config_int32_option("min_parallel_index_scan_size",
+ state->init_min_para_indexscan_size,
+ state->context);
+ }
+}
+
+#define SET_CONFIG_OPTION(name, type_bits) \
+ set_config_option_noerror((name), \
+ (mask & (type_bits)) ? "true" : "false", \
+ context, PGC_S_SESSION, GUC_ACTION_SAVE, true, ERROR)
+
+
+/*
+ * Setup GUC environment to enforce scan methods. If scanhint is NULL, reset
+ * GUCs to the saved state in state.
+ */
+static void
+setup_scan_method_enforcement(ScanMethodHint *scanhint, HintState *state)
+{
+ unsigned char enforce_mask = state->init_scan_mask;
+ GucContext context = state->context;