• R/O
  • HTTP
  • SSH
  • HTTPS

pg_hint_plan: コミット

firtst release


コミットメタ情報

リビジョンbe1a756dc318ac8f39f67716c0be3a765834bdb3 (tree)
日時2017-02-07 12:55:54
作者Kyotaro Horiguchi <horiguchi.kyotaro@lab....>
コミッターKyotaro Horiguchi

ログメッセージ

Rename current_hint to current_hint_state

The name current_hint is quite confusing so change the name to less
confusing one.

変更サマリ

差分

--- a/make_join_rel.c
+++ b/make_join_rel.c
@@ -127,9 +127,9 @@ make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
127127 RowsHint *domultiply = NULL;
128128
129129 /* Search for applicable rows hint for this join node */
130- for (i = 0; i < current_hint->num_hints[HINT_TYPE_ROWS]; i++)
130+ for (i = 0; i < current_hint_state->num_hints[HINT_TYPE_ROWS]; i++)
131131 {
132- rows_hint = current_hint->rows_hints[i];
132+ rows_hint = current_hint_state->rows_hints[i];
133133
134134 /*
135135 * Skip this rows_hint if it is invalid from the first or it
--- a/pg_hint_plan.c
+++ b/pg_hint_plan.c
@@ -488,11 +488,12 @@ static get_relation_info_hook_type prev_get_relation_info = NULL;
488488 static join_search_hook_type prev_join_search = NULL;
489489
490490 /* Hold reference to currently active hint */
491-static HintState *current_hint = NULL;
491+static HintState *current_hint_state = NULL;
492492
493493 /*
494494 * List of hint contexts. We treat the head of the list as the Top of the
495- * context stack, so current_hint always points the first element of this list.
495+ * context stack, so current_hint_state always points the first element of this
496+ * list.
496497 */
497498 static List *HintStateStack = NIL;
498499
@@ -2286,7 +2287,7 @@ set_scan_config_options(unsigned char enforce_mask, GucContext context)
22862287 )
22872288 mask = enforce_mask;
22882289 else
2289- mask = enforce_mask & current_hint->init_scan_mask;
2290+ mask = enforce_mask & current_hint_state->init_scan_mask;
22902291
22912292 SET_CONFIG_OPTION("enable_seqscan", ENABLE_SEQSCAN);
22922293 SET_CONFIG_OPTION("enable_indexscan", ENABLE_INDEXSCAN);
@@ -2304,7 +2305,7 @@ set_join_config_options(unsigned char enforce_mask, GucContext context)
23042305 enforce_mask == ENABLE_HASHJOIN)
23052306 mask = enforce_mask;
23062307 else
2307- mask = enforce_mask & current_hint->init_join_mask;
2308+ mask = enforce_mask & current_hint_state->init_join_mask;
23082309
23092310 SET_CONFIG_OPTION("enable_nestloop", ENABLE_NESTLOOP);
23102311 SET_CONFIG_OPTION("enable_mergejoin", ENABLE_MERGEJOIN);
@@ -2448,7 +2449,7 @@ push_hint(HintState *hstate)
24482449 HintStateStack = lcons(hstate, HintStateStack);
24492450
24502451 /* Pushed hint is the one which should be used hereafter. */
2451- current_hint = hstate;
2452+ current_hint_state = hstate;
24522453 }
24532454
24542455 /* Pop a hint from hint stack. Popped hint is automatically discarded. */
@@ -2460,15 +2461,15 @@ pop_hint(void)
24602461 elog(ERROR, "hint stack is empty");
24612462
24622463 /*
2463- * Take a hint at the head from the list, and free it. Switch current_hint
2464- * to point new head (NULL if the list is empty).
2464+ * Take a hint at the head from the list, and free it. Switch
2465+ * current_hint_state to point new head (NULL if the list is empty).
24652466 */
24662467 HintStateStack = list_delete_first(HintStateStack);
2467- HintStateDelete(current_hint);
2468+ HintStateDelete(current_hint_state);
24682469 if(HintStateStack == NIL)
2469- current_hint = NULL;
2470+ current_hint_state = NULL;
24702471 else
2471- current_hint = (HintState *) lfirst(list_head(HintStateStack));
2472+ current_hint_state = (HintState *) lfirst(list_head(HintStateStack));
24722473 }
24732474
24742475 static PlannedStmt *
@@ -2493,7 +2494,7 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
24932494 /*
24942495 * Use standard planner if pg_hint_plan is disabled or current nesting
24952496 * depth is nesting depth of SPI calls. Other hook functions try to change
2496- * plan with current_hint if any, so set it to NULL.
2497+ * plan with current_hint_state if any, so set it to NULL.
24972498 */
24982499 if (!pg_hint_plan_enable_hint || hint_inhibit_level > 0)
24992500 {
@@ -2589,8 +2590,8 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
25892590
25902591 /*
25912592 * Use standard planner if the statement has not valid hint. Other hook
2592- * functions try to change plan with current_hint if any, so set it to
2593- * NULL.
2593+ * functions try to change plan with current_hint_state if any, so set it
2594+ * to NULL.
25942595 */
25952596 if (!hstate)
25962597 goto standard_planner_proc;
@@ -2601,26 +2602,28 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
26012602 push_hint(hstate);
26022603
26032604 /* Set GUC parameters which are specified with Set hint. */
2604- save_nestlevel = set_config_options(current_hint->set_hints,
2605- current_hint->num_hints[HINT_TYPE_SET],
2606- current_hint->context);
2607-
2605+ save_nestlevel =
2606+ set_config_options(current_hint_state->set_hints,
2607+ current_hint_state->num_hints[HINT_TYPE_SET],
2608+ current_hint_state->context);
2609+
2610+ /* save current status to current_hint_state */
26082611 if (enable_seqscan)
2609- current_hint->init_scan_mask |= ENABLE_SEQSCAN;
2612+ current_hint_state->init_scan_mask |= ENABLE_SEQSCAN;
26102613 if (enable_indexscan)
2611- current_hint->init_scan_mask |= ENABLE_INDEXSCAN;
2614+ current_hint_state->init_scan_mask |= ENABLE_INDEXSCAN;
26122615 if (enable_bitmapscan)
2613- current_hint->init_scan_mask |= ENABLE_BITMAPSCAN;
2616+ current_hint_state->init_scan_mask |= ENABLE_BITMAPSCAN;
26142617 if (enable_tidscan)
2615- current_hint->init_scan_mask |= ENABLE_TIDSCAN;
2618+ current_hint_state->init_scan_mask |= ENABLE_TIDSCAN;
26162619 if (enable_indexonlyscan)
2617- current_hint->init_scan_mask |= ENABLE_INDEXONLYSCAN;
2620+ current_hint_state->init_scan_mask |= ENABLE_INDEXONLYSCAN;
26182621 if (enable_nestloop)
2619- current_hint->init_join_mask |= ENABLE_NESTLOOP;
2622+ current_hint_state->init_join_mask |= ENABLE_NESTLOOP;
26202623 if (enable_mergejoin)
2621- current_hint->init_join_mask |= ENABLE_MERGEJOIN;
2624+ current_hint_state->init_join_mask |= ENABLE_MERGEJOIN;
26222625 if (enable_hashjoin)
2623- current_hint->init_join_mask |= ENABLE_HASHJOIN;
2626+ current_hint_state->init_join_mask |= ENABLE_HASHJOIN;
26242627
26252628 if (debug_level > 1)
26262629 {
@@ -2632,8 +2635,8 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
26322635 }
26332636
26342637 /*
2635- * Use PG_TRY mechanism to recover GUC parameters and current_hint to the
2636- * state when this planner started when error occurred in planner.
2638+ * Use PG_TRY mechanism to recover GUC parameters and current_hint_state to
2639+ * the state when this planner started when error occurred in planner.
26372640 */
26382641 PG_TRY();
26392642 {
@@ -2656,9 +2659,9 @@ pg_hint_plan_planner(Query *parse, int cursorOptions, ParamListInfo boundParams)
26562659
26572660 /* Print hint in debug mode. */
26582661 if (debug_level == 1)
2659- HintStateDump(current_hint);
2662+ HintStateDump(current_hint_state);
26602663 else if (debug_level > 1)
2661- HintStateDump2(current_hint);
2664+ HintStateDump2(current_hint_state);
26622665
26632666 /*
26642667 * Rollback changes of GUC parameters, and pop current hint context from
@@ -2678,7 +2681,7 @@ standard_planner_proc:
26782681 qnostr, msgstr)));
26792682 hidestmt = true;
26802683 }
2681- current_hint = NULL;
2684+ current_hint_state = NULL;
26822685 if (prev_planner)
26832686 return (*prev_planner) (parse, cursorOptions, boundParams);
26842687 else
@@ -2709,9 +2712,9 @@ find_scan_hint(PlannerInfo *root, Index relid, RelOptInfo *rel)
27092712 return NULL;
27102713
27112714 /* Find scan method hint, which matches given names, from the list. */
2712- for (i = 0; i < current_hint->num_hints[HINT_TYPE_SCAN_METHOD]; i++)
2715+ for (i = 0; i < current_hint_state->num_hints[HINT_TYPE_SCAN_METHOD]; i++)
27132716 {
2714- ScanMethodHint *hint = current_hint->scan_hints[i];
2717+ ScanMethodHint *hint = current_hint_state->scan_hints[i];
27152718
27162719 /* We ignore disabled hints. */
27172720 if (!hint_state_enabled(hint))
@@ -2821,11 +2824,11 @@ delete_indexes(ScanMethodHint *hint, RelOptInfo *rel, Oid relationObjectId)
28212824
28222825 /*
28232826 * to make the index a candidate when definition of this index is
2824- * matched with the index's definition of current_hint.
2827+ * matched with the index's definition of current_hint_state.
28252828 */
28262829 if (OidIsValid(relationObjectId) && !use_index)
28272830 {
2828- foreach(l, current_hint->parent_index_infos)
2831+ foreach(l, current_hint_state->parent_index_infos)
28292832 {
28302833 int i;
28312834 HeapTuple ht_idx;
@@ -3103,7 +3106,7 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
31033106 * Do nothing if we don't have a valid hint in this context or current
31043107 * nesting depth is at SPI calls.
31053108 */
3106- if (!current_hint || hint_inhibit_level > 0)
3109+ if (!current_hint_state || hint_inhibit_level > 0)
31073110 {
31083111 if (debug_level > 1)
31093112 ereport(pg_hint_plan_message_level,
@@ -3113,7 +3116,8 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
31133116 " current_hint=%p, hint_inhibit_level=%d",
31143117 qnostr, relationObjectId,
31153118 get_rel_name(relationObjectId),
3116- inhparent, current_hint, hint_inhibit_level)));
3119+ inhparent, current_hint_state,
3120+ hint_inhibit_level)));
31173121 return;
31183122 }
31193123
@@ -3131,10 +3135,10 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
31313135 (errhidestmt(true),
31323136 errmsg ("pg_hint_plan%s: get_relation_info"
31333137 " skipping inh parent: relation=%u(%s), inhparent=%d,"
3134- " current_hint=%p, hint_inhibit_level=%d",
3138+ " current_hint_state=%p, hint_inhibit_level=%d",
31353139 qnostr, relationObjectId,
31363140 get_rel_name(relationObjectId),
3137- inhparent, current_hint, hint_inhibit_level)));
3141+ inhparent, current_hint_state, hint_inhibit_level)));
31383142 return;
31393143 }
31403144
@@ -3145,7 +3149,7 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
31453149
31463150 if (appinfo->child_relid == rel->relid)
31473151 {
3148- if (current_hint->parent_relid != appinfo->parent_relid)
3152+ if (current_hint_state->parent_relid != appinfo->parent_relid)
31493153 new_parent_relid = appinfo->parent_relid;
31503154 break;
31513155 }
@@ -3153,9 +3157,9 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
31533157
31543158 if (!l)
31553159 {
3156- /* This relation doesn't have a parent. Cancel current_hint. */
3157- current_hint->parent_relid = 0;
3158- current_hint->parent_hint = NULL;
3160+ /* This relation doesn't have a parent. Cancel current_hint_state. */
3161+ current_hint_state->parent_relid = 0;
3162+ current_hint_state->parent_hint = NULL;
31593163 }
31603164
31613165 if (new_parent_relid > 0)
@@ -3165,22 +3169,22 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
31653169 * Remember it, apply the scan mask of it and then resolve the index
31663170 * restriction in order to be used by its children.
31673171 */
3168- int scanmask = current_hint->init_scan_mask;
3172+ int scanmask = current_hint_state->init_scan_mask;
31693173 ScanMethodHint *parent_hint;
31703174
3171- current_hint->parent_relid = new_parent_relid;
3175+ current_hint_state->parent_relid = new_parent_relid;
31723176
31733177 /*
31743178 * Get and apply the hint for the new parent relation. It should be an
31753179 * ordinary relation so calling find_scan_hint with rel == NULL is
31763180 * safe.
31773181 */
3178- current_hint->parent_hint = parent_hint =
3179- find_scan_hint(root, current_hint->parent_relid, NULL);
3182+ current_hint_state->parent_hint = parent_hint =
3183+ find_scan_hint(root, current_hint_state->parent_relid, NULL);
31803184
31813185 if (parent_hint)
31823186 {
3183- scanmask = current_hint->parent_hint->enforce_mask;
3187+ scanmask = current_hint_state->parent_hint->enforce_mask;
31843188 parent_hint->base.state = HINT_STATE_USED;
31853189
31863190 /* Resolve index name mask (if any) using the parent. */
@@ -3190,7 +3194,7 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
31903194 Relation parent_rel;
31913195
31923196 parentrel_oid =
3193- root->simple_rte_array[current_hint->parent_relid]->relid;
3197+ root->simple_rte_array[current_hint_state->parent_relid]->relid;
31943198 parent_rel = heap_open(parentrel_oid, NoLock);
31953199
31963200 /* Search the parent relation for indexes match the hint spec */
@@ -3211,19 +3215,19 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
32113215
32123216 parent_index_info =
32133217 get_parent_index_info(indexoid, parentrel_oid);
3214- current_hint->parent_index_infos =
3215- lappend(current_hint->parent_index_infos, parent_index_info);
3218+ current_hint_state->parent_index_infos =
3219+ lappend(current_hint_state->parent_index_infos, parent_index_info);
32163220 }
32173221 heap_close(parent_rel, NoLock);
32183222 }
32193223 }
32203224
3221- set_scan_config_options(scanmask, current_hint->context);
3225+ set_scan_config_options(scanmask, current_hint_state->context);
32223226 }
32233227
3224- if (current_hint->parent_hint != 0)
3228+ if (current_hint_state->parent_hint != 0)
32253229 {
3226- delete_indexes(current_hint->parent_hint, rel,
3230+ delete_indexes(current_hint_state->parent_hint, rel,
32273231 relationObjectId);
32283232
32293233 /* Scan fixation status is the same to the parent. */
@@ -3232,18 +3236,19 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
32323236 (errhidestmt(true),
32333237 errmsg("pg_hint_plan%s: get_relation_info:"
32343238 " index deletion by parent hint: "
3235- "relation=%u(%s), inhparent=%d, current_hint=%p,"
3239+ "relation=%u(%s), inhparent=%d, current_hint_state=%p,"
32363240 " hint_inhibit_level=%d",
32373241 qnostr, relationObjectId,
32383242 get_rel_name(relationObjectId),
3239- inhparent, current_hint, hint_inhibit_level)));
3243+ inhparent, current_hint_state, hint_inhibit_level)));
32403244 return;
32413245 }
32423246
32433247 /* This table doesn't have a parent hint. Apply its own hint if any. */
32443248 if ((hint = find_scan_hint(root, rel->relid, rel)) != NULL)
32453249 {
3246- set_scan_config_options(hint->enforce_mask, current_hint->context);
3250+ set_scan_config_options(hint->enforce_mask,
3251+ current_hint_state->context);
32473252 hint->base.state = HINT_STATE_USED;
32483253
32493254 delete_indexes(hint, rel, InvalidOid);
@@ -3257,7 +3262,7 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
32573262 " hint_inhibit_level=%d, scanmask=0x%x",
32583263 qnostr, relationObjectId,
32593264 get_rel_name(relationObjectId),
3260- inhparent, current_hint, hint_inhibit_level,
3265+ inhparent, current_hint_state, hint_inhibit_level,
32613266 hint->enforce_mask)));
32623267 }
32633268 else
@@ -3271,10 +3276,10 @@ pg_hint_plan_get_relation_info(PlannerInfo *root, Oid relationObjectId,
32713276 " hint_inhibit_level=%d, scanmask=0x%x",
32723277 qnostr, relationObjectId,
32733278 get_rel_name(relationObjectId),
3274- inhparent, current_hint, hint_inhibit_level,
3275- current_hint->init_scan_mask)));
3276- set_scan_config_options(current_hint->init_scan_mask,
3277- current_hint->context);
3279+ inhparent, current_hint_state, hint_inhibit_level,
3280+ current_hint_state->init_scan_mask)));
3281+ set_scan_config_options(current_hint_state->init_scan_mask,
3282+ current_hint_state->context);
32783283 }
32793284 return;
32803285 }
@@ -3346,7 +3351,7 @@ find_join_hint(Relids joinrelids)
33463351 List *join_hint;
33473352 ListCell *l;
33483353
3349- join_hint = current_hint->join_hint_level[bms_num_members(joinrelids)];
3354+ join_hint = current_hint_state->join_hint_level[bms_num_members(joinrelids)];
33503355
33513356 foreach(l, join_hint)
33523357 {
@@ -3715,7 +3720,7 @@ transform_join_hints(HintState *hstate, PlannerInfo *root, int nbaserel,
37153720
37163721 if (hint_state_enabled(lhint))
37173722 {
3718- set_join_config_options(DISABLE_ALL_JOIN, current_hint->context);
3723+ set_join_config_options(DISABLE_ALL_JOIN, current_hint_state->context);
37193724 return true;
37203725 }
37213726 return false;
@@ -3752,6 +3757,10 @@ set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
37523757 create_tidscan_paths(root, rel);
37533758 }
37543759
3760+/*
3761+ * Clear exiting access paths and create new ones applying hints.
3762+ * This does the similar to set_rel_pathlist
3763+ */
37553764 static void
37563765 rebuild_scan_path(HintState *hstate, PlannerInfo *root, int level,
37573766 List *initial_rels)
@@ -3834,7 +3843,8 @@ make_join_rel_wrapper(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2)
38343843 {
38353844 save_nestlevel = NewGUCNestLevel();
38363845
3837- set_join_config_options(hint->enforce_mask, current_hint->context);
3846+ set_join_config_options(hint->enforce_mask,
3847+ current_hint_state->context);
38383848
38393849 rel = pg_hint_plan_make_join_rel(root, rel1, rel2);
38403850 hint->base.state = HINT_STATE_USED;
@@ -3869,7 +3879,8 @@ add_paths_to_joinrel_wrapper(PlannerInfo *root,
38693879
38703880 if ((scan_hint = find_scan_hint(root, innerrel->relid, innerrel)) != NULL)
38713881 {
3872- set_scan_config_options(scan_hint->enforce_mask, current_hint->context);
3882+ set_scan_config_options(scan_hint->enforce_mask,
3883+ current_hint_state->context);
38733884 scan_hint->base.state = HINT_STATE_USED;
38743885 }
38753886
@@ -3885,7 +3896,7 @@ add_paths_to_joinrel_wrapper(PlannerInfo *root,
38853896 {
38863897
38873898 set_join_config_options(join_hint->enforce_mask,
3888- current_hint->context);
3899+ current_hint_state->context);
38893900
38903901 add_paths_to_joinrel(root, joinrel, outerrel, innerrel, jointype,
38913902 sjinfo, restrictlist);
@@ -3893,7 +3904,8 @@ add_paths_to_joinrel_wrapper(PlannerInfo *root,
38933904 }
38943905 else
38953906 {
3896- set_join_config_options(DISABLE_ALL_JOIN, current_hint->context);
3907+ set_join_config_options(DISABLE_ALL_JOIN,
3908+ current_hint_state->context);
38973909 add_paths_to_joinrel(root, joinrel, outerrel, innerrel, jointype,
38983910 sjinfo, restrictlist);
38993911 }
@@ -3908,8 +3920,8 @@ add_paths_to_joinrel_wrapper(PlannerInfo *root,
39083920 sjinfo, restrictlist);
39093921
39103922 if (scan_hint != NULL)
3911- set_scan_config_options(current_hint->init_scan_mask,
3912- current_hint->context);
3923+ set_scan_config_options(current_hint_state->init_scan_mask,
3924+ current_hint_state->context);
39133925 }
39143926
39153927 static int
@@ -3951,7 +3963,7 @@ pg_hint_plan_join_search(PlannerInfo *root, int levels_needed,
39513963 * valid hint is supplied or current nesting depth is nesting depth of SPI
39523964 * calls.
39533965 */
3954- if (!current_hint || hint_inhibit_level > 0)
3966+ if (!current_hint_state || hint_inhibit_level > 0)
39553967 {
39563968 if (prev_join_search)
39573969 return (*prev_join_search) (root, levels_needed, initial_rels);
@@ -3961,8 +3973,8 @@ pg_hint_plan_join_search(PlannerInfo *root, int levels_needed,
39613973 return standard_join_search(root, levels_needed, initial_rels);
39623974 }
39633975
3964- /* We apply scan method hint rebuild scan path. */
3965- rebuild_scan_path(current_hint, root, levels_needed, initial_rels);
3976+ /* apply scan method hint rebuild scan path. */
3977+ rebuild_scan_path(current_hint_state, root, levels_needed, initial_rels);
39663978
39673979 /*
39683980 * In the case using GEQO, only scan method hints and Set hints have
@@ -3972,29 +3984,31 @@ pg_hint_plan_join_search(PlannerInfo *root, int levels_needed,
39723984 return geqo(root, levels_needed, initial_rels);
39733985
39743986 nbaserel = get_num_baserels(initial_rels);
3975- current_hint->join_hint_level = palloc0(sizeof(List *) * (nbaserel + 1));
3987+ current_hint_state->join_hint_level =
3988+ palloc0(sizeof(List *) * (nbaserel + 1));
39763989 join_method_hints = palloc0(sizeof(JoinMethodHint *) * (nbaserel + 1));
39773990
3978- leading_hint_enable = transform_join_hints(current_hint, root, nbaserel,
3991+ leading_hint_enable = transform_join_hints(current_hint_state,
3992+ root, nbaserel,
39793993 initial_rels, join_method_hints);
39803994
39813995 rel = pg_hint_plan_standard_join_search(root, levels_needed, initial_rels);
39823996
39833997 for (i = 2; i <= nbaserel; i++)
39843998 {
3985- list_free(current_hint->join_hint_level[i]);
3999+ list_free(current_hint_state->join_hint_level[i]);
39864000
39874001 /* free Leading hint only */
39884002 if (join_method_hints[i] != NULL &&
39894003 join_method_hints[i]->enforce_mask == ENABLE_ALL_JOIN)
39904004 JoinMethodHintDelete(join_method_hints[i]);
39914005 }
3992- pfree(current_hint->join_hint_level);
4006+ pfree(current_hint_state->join_hint_level);
39934007 pfree(join_method_hints);
39944008
39954009 if (leading_hint_enable)
3996- set_join_config_options(current_hint->init_join_mask,
3997- current_hint->context);
4010+ set_join_config_options(current_hint_state->init_join_mask,
4011+ current_hint_state->context);
39984012
39994013 return rel;
40004014 }
旧リポジトリブラウザで表示