From 6e427aa4e5f3ad79a79b463c470daf93fa15767b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 5 Sep 2017 15:57:48 -0400 Subject: [PATCH] Use lfirst_node() and linitial_node() where appropriate in planner.c. There's no particular reason to target this module for the first wholesale application of these macros; but we gotta start somewhere. Ashutosh Bapat and Jeevan Chalke Discussion: https://postgr.es/m/CAFjFpRcNr3r=u0ni=7A4GD9NnHQVq+dkFafzqo2rS6zy=dt1eg@mail.gmail.com --- src/backend/optimizer/plan/planner.c | 122 +++++++++++++-------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 966230256e..6b79b3ad99 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -411,7 +411,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams) forboth(lp, glob->subplans, lr, glob->subroots) { Plan *subplan = (Plan *) lfirst(lp); - PlannerInfo *subroot = (PlannerInfo *) lfirst(lr); + PlannerInfo *subroot = lfirst_node(PlannerInfo, lr); SS_finalize_plan(subroot, subplan); } @@ -430,7 +430,7 @@ standard_planner(Query *parse, int cursorOptions, ParamListInfo boundParams) forboth(lp, glob->subplans, lr, glob->subroots) { Plan *subplan = (Plan *) lfirst(lp); - PlannerInfo *subroot = (PlannerInfo *) lfirst(lr); + PlannerInfo *subroot = lfirst_node(PlannerInfo, lr); lfirst(lp) = set_plan_references(subroot, subplan); } @@ -586,7 +586,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, hasOuterJoins = false; foreach(l, parse->rtable) { - RangeTblEntry *rte = (RangeTblEntry *) lfirst(l); + RangeTblEntry *rte = lfirst_node(RangeTblEntry, l); if (rte->rtekind == RTE_JOIN) { @@ -643,7 +643,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, newWithCheckOptions = NIL; foreach(l, parse->withCheckOptions) { - WithCheckOption *wco = (WithCheckOption *) lfirst(l); + WithCheckOption *wco = lfirst_node(WithCheckOption, l); wco->qual = preprocess_expression(root, wco->qual, EXPRKIND_QUAL); @@ -663,7 +663,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, foreach(l, parse->windowClause) { - WindowClause *wc = (WindowClause *) lfirst(l); + WindowClause *wc = lfirst_node(WindowClause, l); /* partitionClause/orderClause are sort/group expressions */ wc->startOffset = preprocess_expression(root, wc->startOffset, @@ -705,7 +705,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, /* Also need to preprocess expressions within RTEs */ foreach(l, parse->rtable) { - RangeTblEntry *rte = (RangeTblEntry *) lfirst(l); + RangeTblEntry *rte = lfirst_node(RangeTblEntry, l); int kind; ListCell *lcsq; @@ -1080,7 +1080,7 @@ inheritance_planner(PlannerInfo *root) rti = 1; foreach(lc, parse->rtable) { - RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); + RangeTblEntry *rte = lfirst_node(RangeTblEntry, lc); if (rte->rtekind == RTE_SUBQUERY) subqueryRTindexes = bms_add_member(subqueryRTindexes, rti); @@ -1102,7 +1102,7 @@ inheritance_planner(PlannerInfo *root) { foreach(lc, root->append_rel_list) { - AppendRelInfo *appinfo = (AppendRelInfo *) lfirst(lc); + AppendRelInfo *appinfo = lfirst_node(AppendRelInfo, lc); if (bms_is_member(appinfo->parent_relid, subqueryRTindexes) || bms_is_member(appinfo->child_relid, subqueryRTindexes) || @@ -1130,7 +1130,7 @@ inheritance_planner(PlannerInfo *root) */ foreach(lc, root->append_rel_list) { - AppendRelInfo *appinfo = (AppendRelInfo *) lfirst(lc); + AppendRelInfo *appinfo = lfirst_node(AppendRelInfo, lc); PlannerInfo *subroot; RangeTblEntry *child_rte; RelOptInfo *sub_final_rel; @@ -1192,7 +1192,7 @@ inheritance_planner(PlannerInfo *root) subroot->append_rel_list = NIL; foreach(lc2, root->append_rel_list) { - AppendRelInfo *appinfo2 = (AppendRelInfo *) lfirst(lc2); + AppendRelInfo *appinfo2 = lfirst_node(AppendRelInfo, lc2); if (bms_is_member(appinfo2->child_relid, modifiableARIindexes)) appinfo2 = copyObject(appinfo2); @@ -1227,7 +1227,7 @@ inheritance_planner(PlannerInfo *root) rti = 1; foreach(lr, parse->rtable) { - RangeTblEntry *rte = (RangeTblEntry *) lfirst(lr); + RangeTblEntry *rte = lfirst_node(RangeTblEntry, lr); if (bms_is_member(rti, subqueryRTindexes)) { @@ -1249,7 +1249,7 @@ inheritance_planner(PlannerInfo *root) foreach(lc2, subroot->append_rel_list) { - AppendRelInfo *appinfo2 = (AppendRelInfo *) lfirst(lc2); + AppendRelInfo *appinfo2 = lfirst_node(AppendRelInfo, lc2); if (bms_is_member(appinfo2->child_relid, modifiableARIindexes)) @@ -1407,7 +1407,7 @@ inheritance_planner(PlannerInfo *root) rti = 1; foreach(lc, final_rtable) { - RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); + RangeTblEntry *rte = lfirst_node(RangeTblEntry, lc); root->simple_rte_array[rti++] = rte; } @@ -1556,8 +1556,8 @@ grouping_planner(PlannerInfo *root, bool inheritance_update, /*------ translator: %s is a SQL row locking clause such as FOR UPDATE */ errmsg("%s is not allowed with UNION/INTERSECT/EXCEPT", - LCS_asString(((RowMarkClause *) - linitial(parse->rowMarks))->strength)))); + LCS_asString(linitial_node(RowMarkClause, + parse->rowMarks)->strength)))); /* * Calculate pathkeys that represent result ordering requirements @@ -1687,7 +1687,7 @@ grouping_planner(PlannerInfo *root, bool inheritance_update, qp_extra.tlist = tlist; qp_extra.activeWindows = activeWindows; qp_extra.groupClause = (gset_data - ? (gset_data->rollups ? ((RollupData *) linitial(gset_data->rollups))->groupClause : NIL) + ? (gset_data->rollups ? linitial_node(RollupData, gset_data->rollups)->groupClause : NIL) : parse->groupClause); /* @@ -1757,25 +1757,25 @@ grouping_planner(PlannerInfo *root, bool inheritance_update, split_pathtarget_at_srfs(root, final_target, sort_input_target, &final_targets, &final_targets_contain_srfs); - final_target = (PathTarget *) linitial(final_targets); + final_target = linitial_node(PathTarget, final_targets); Assert(!linitial_int(final_targets_contain_srfs)); /* likewise for sort_input_target vs. grouping_target */ split_pathtarget_at_srfs(root, sort_input_target, grouping_target, &sort_input_targets, &sort_input_targets_contain_srfs); - sort_input_target = (PathTarget *) linitial(sort_input_targets); + sort_input_target = linitial_node(PathTarget, sort_input_targets); Assert(!linitial_int(sort_input_targets_contain_srfs)); /* likewise for grouping_target vs. scanjoin_target */ split_pathtarget_at_srfs(root, grouping_target, scanjoin_target, &grouping_targets, &grouping_targets_contain_srfs); - grouping_target = (PathTarget *) linitial(grouping_targets); + grouping_target = linitial_node(PathTarget, grouping_targets); Assert(!linitial_int(grouping_targets_contain_srfs)); /* scanjoin_target will not have any SRFs precomputed for it */ split_pathtarget_at_srfs(root, scanjoin_target, NULL, &scanjoin_targets, &scanjoin_targets_contain_srfs); - scanjoin_target = (PathTarget *) linitial(scanjoin_targets); + scanjoin_target = linitial_node(PathTarget, scanjoin_targets); Assert(!linitial_int(scanjoin_targets_contain_srfs)); } else @@ -2106,7 +2106,7 @@ preprocess_grouping_sets(PlannerInfo *root) foreach(lc, parse->groupClause) { - SortGroupClause *gc = lfirst(lc); + SortGroupClause *gc = lfirst_node(SortGroupClause, lc); Index ref = gc->tleSortGroupRef; if (ref > maxref) @@ -2135,7 +2135,7 @@ preprocess_grouping_sets(PlannerInfo *root) foreach(lc, parse->groupingSets) { - List *gset = lfirst(lc); + List *gset = (List *) lfirst(lc); if (bms_overlap_list(gd->unsortable_refs, gset)) { @@ -2194,7 +2194,7 @@ preprocess_grouping_sets(PlannerInfo *root) /* * Get the initial (and therefore largest) grouping set. */ - gs = linitial(current_sets); + gs = linitial_node(GroupingSetData, current_sets); /* * Order the groupClause appropriately. If the first grouping set is @@ -2269,7 +2269,7 @@ remap_to_groupclause_idx(List *groupClause, foreach(lc, groupClause) { - SortGroupClause *gc = lfirst(lc); + SortGroupClause *gc = lfirst_node(SortGroupClause, lc); tleref_to_colnum_map[gc->tleSortGroupRef] = ref++; } @@ -2278,7 +2278,7 @@ remap_to_groupclause_idx(List *groupClause, { List *set = NIL; ListCell *lc2; - GroupingSetData *gs = lfirst(lc); + GroupingSetData *gs = lfirst_node(GroupingSetData, lc); foreach(lc2, gs->set) { @@ -2344,8 +2344,8 @@ preprocess_rowmarks(PlannerInfo *root) * CTIDs invalid. This is also checked at parse time, but that's * insufficient because of rule substitution, query pullup, etc. */ - CheckSelectLocking(parse, ((RowMarkClause *) - linitial(parse->rowMarks))->strength); + CheckSelectLocking(parse, linitial_node(RowMarkClause, + parse->rowMarks)->strength); } else { @@ -2373,7 +2373,7 @@ preprocess_rowmarks(PlannerInfo *root) prowmarks = NIL; foreach(l, parse->rowMarks) { - RowMarkClause *rc = (RowMarkClause *) lfirst(l); + RowMarkClause *rc = lfirst_node(RowMarkClause, l); RangeTblEntry *rte = rt_fetch(rc->rti, parse->rtable); PlanRowMark *newrc; @@ -2413,7 +2413,7 @@ preprocess_rowmarks(PlannerInfo *root) i = 0; foreach(l, parse->rtable) { - RangeTblEntry *rte = (RangeTblEntry *) lfirst(l); + RangeTblEntry *rte = lfirst_node(RangeTblEntry, l); PlanRowMark *newrc; i++; @@ -2772,7 +2772,7 @@ remove_useless_groupby_columns(PlannerInfo *root) (list_length(parse->rtable) + 1)); foreach(lc, parse->groupClause) { - SortGroupClause *sgc = (SortGroupClause *) lfirst(lc); + SortGroupClause *sgc = lfirst_node(SortGroupClause, lc); TargetEntry *tle = get_sortgroupclause_tle(sgc, parse->targetList); Var *var = (Var *) tle->expr; @@ -2805,7 +2805,7 @@ remove_useless_groupby_columns(PlannerInfo *root) relid = 0; foreach(lc, parse->rtable) { - RangeTblEntry *rte = (RangeTblEntry *) lfirst(lc); + RangeTblEntry *rte = lfirst_node(RangeTblEntry, lc); Bitmapset *relattnos; Bitmapset *pkattnos; Oid constraintOid; @@ -2863,7 +2863,7 @@ remove_useless_groupby_columns(PlannerInfo *root) foreach(lc, parse->groupClause) { - SortGroupClause *sgc = (SortGroupClause *) lfirst(lc); + SortGroupClause *sgc = lfirst_node(SortGroupClause, lc); TargetEntry *tle = get_sortgroupclause_tle(sgc, parse->targetList); Var *var = (Var *) tle->expr; @@ -2938,11 +2938,11 @@ preprocess_groupclause(PlannerInfo *root, List *force) */ foreach(sl, parse->sortClause) { - SortGroupClause *sc = (SortGroupClause *) lfirst(sl); + SortGroupClause *sc = lfirst_node(SortGroupClause, sl); foreach(gl, parse->groupClause) { - SortGroupClause *gc = (SortGroupClause *) lfirst(gl); + SortGroupClause *gc = lfirst_node(SortGroupClause, gl); if (equal(gc, sc)) { @@ -2971,7 +2971,7 @@ preprocess_groupclause(PlannerInfo *root, List *force) */ foreach(gl, parse->groupClause) { - SortGroupClause *gc = (SortGroupClause *) lfirst(gl); + SortGroupClause *gc = lfirst_node(SortGroupClause, gl); if (list_member_ptr(new_groupclause, gc)) continue; /* it matched an ORDER BY item */ @@ -3071,7 +3071,7 @@ extract_rollup_sets(List *groupingSets) for_each_cell(lc, lc1) { - List *candidate = lfirst(lc); + List *candidate = (List *) lfirst(lc); Bitmapset *candidate_set = NULL; ListCell *lc2; int dup_of = 0; @@ -3228,7 +3228,7 @@ reorder_grouping_sets(List *groupingsets, List *sortclause) foreach(lc, groupingsets) { - List *candidate = lfirst(lc); + List *candidate = (List *) lfirst(lc); List *new_elems = list_difference_int(candidate, previous); GroupingSetData *gs = makeNode(GroupingSetData); @@ -3296,7 +3296,7 @@ standard_qp_callback(PlannerInfo *root, void *extra) /* We consider only the first (bottom) window in pathkeys logic */ if (activeWindows != NIL) { - WindowClause *wc = (WindowClause *) linitial(activeWindows); + WindowClause *wc = linitial_node(WindowClause, activeWindows); root->window_pathkeys = make_pathkeys_for_window(root, wc, @@ -3384,7 +3384,7 @@ get_number_of_groups(PlannerInfo *root, foreach(lc, gd->rollups) { - RollupData *rollup = lfirst(lc); + RollupData *rollup = lfirst_node(RollupData, lc); ListCell *lc; groupExprs = get_sortgrouplist_exprs(rollup->groupClause, @@ -3395,7 +3395,7 @@ get_number_of_groups(PlannerInfo *root, forboth(lc, rollup->gsets, lc2, rollup->gsets_data) { List *gset = (List *) lfirst(lc); - GroupingSetData *gs = lfirst(lc2); + GroupingSetData *gs = lfirst_node(GroupingSetData, lc2); double numGroups = estimate_num_groups(root, groupExprs, path_rows, @@ -3420,7 +3420,7 @@ get_number_of_groups(PlannerInfo *root, forboth(lc, gd->hash_sets_idx, lc2, gd->unsortable_sets) { List *gset = (List *) lfirst(lc); - GroupingSetData *gs = lfirst(lc2); + GroupingSetData *gs = lfirst_node(GroupingSetData, lc2); double numGroups = estimate_num_groups(root, groupExprs, path_rows, @@ -4194,7 +4194,7 @@ consider_groupingsets_paths(PlannerInfo *root, if (pathkeys_contained_in(root->group_pathkeys, path->pathkeys)) { - unhashed_rollup = lfirst(l_start); + unhashed_rollup = lfirst_node(RollupData, l_start); exclude_groups = unhashed_rollup->numGroups; l_start = lnext(l_start); } @@ -4219,7 +4219,7 @@ consider_groupingsets_paths(PlannerInfo *root, for_each_cell(lc, l_start) { - RollupData *rollup = lfirst(lc); + RollupData *rollup = lfirst_node(RollupData, lc); /* * If we find an unhashable rollup that's not been skipped by the @@ -4239,7 +4239,7 @@ consider_groupingsets_paths(PlannerInfo *root, } foreach(lc, sets_data) { - GroupingSetData *gs = lfirst(lc); + GroupingSetData *gs = lfirst_node(GroupingSetData, lc); List *gset = gs->set; RollupData *rollup; @@ -4381,7 +4381,7 @@ consider_groupingsets_paths(PlannerInfo *root, i = 0; for_each_cell(lc, lnext(list_head(gd->rollups))) { - RollupData *rollup = lfirst(lc); + RollupData *rollup = lfirst_node(RollupData, lc); if (rollup->hashable) { @@ -4415,7 +4415,7 @@ consider_groupingsets_paths(PlannerInfo *root, i = 0; for_each_cell(lc, lnext(list_head(gd->rollups))) { - RollupData *rollup = lfirst(lc); + RollupData *rollup = lfirst_node(RollupData, lc); if (rollup->hashable) { @@ -4437,7 +4437,7 @@ consider_groupingsets_paths(PlannerInfo *root, foreach(lc, hash_sets) { - GroupingSetData *gs = lfirst(lc); + GroupingSetData *gs = lfirst_node(GroupingSetData, lc); RollupData *rollup = makeNode(RollupData); Assert(gs->set != NIL); @@ -4616,7 +4616,7 @@ create_one_window_path(PlannerInfo *root, foreach(l, activeWindows) { - WindowClause *wc = (WindowClause *) lfirst(l); + WindowClause *wc = lfirst_node(WindowClause, l); List *window_pathkeys; window_pathkeys = make_pathkeys_for_window(root, @@ -5280,7 +5280,7 @@ postprocess_setop_tlist(List *new_tlist, List *orig_tlist) foreach(l, new_tlist) { - TargetEntry *new_tle = (TargetEntry *) lfirst(l); + TargetEntry *new_tle = lfirst_node(TargetEntry, l); TargetEntry *orig_tle; /* ignore resjunk columns in setop result */ @@ -5288,7 +5288,7 @@ postprocess_setop_tlist(List *new_tlist, List *orig_tlist) continue; Assert(orig_tlist_item != NULL); - orig_tle = (TargetEntry *) lfirst(orig_tlist_item); + orig_tle = lfirst_node(TargetEntry, orig_tlist_item); orig_tlist_item = lnext(orig_tlist_item); if (orig_tle->resjunk) /* should not happen */ elog(ERROR, "resjunk output columns are not implemented"); @@ -5316,7 +5316,7 @@ select_active_windows(PlannerInfo *root, WindowFuncLists *wflists) actives = NIL; foreach(lc, root->parse->windowClause) { - WindowClause *wc = (WindowClause *) lfirst(lc); + WindowClause *wc = lfirst_node(WindowClause, lc); /* It's only active if wflists shows some related WindowFuncs */ Assert(wc->winref <= wflists->maxWinRef); @@ -5339,7 +5339,7 @@ select_active_windows(PlannerInfo *root, WindowFuncLists *wflists) result = NIL; while (actives != NIL) { - WindowClause *wc = (WindowClause *) linitial(actives); + WindowClause *wc = linitial_node(WindowClause, actives); ListCell *prev; ListCell *next; @@ -5351,7 +5351,7 @@ select_active_windows(PlannerInfo *root, WindowFuncLists *wflists) prev = NULL; for (lc = list_head(actives); lc; lc = next) { - WindowClause *wc2 = (WindowClause *) lfirst(lc); + WindowClause *wc2 = lfirst_node(WindowClause, lc); next = lnext(lc); /* framing options are NOT to be compared here! */ @@ -5424,18 +5424,18 @@ make_window_input_target(PlannerInfo *root, sgrefs = NULL; foreach(lc, activeWindows) { - WindowClause *wc = (WindowClause *) lfirst(lc); + WindowClause *wc = lfirst_node(WindowClause, lc); ListCell *lc2; foreach(lc2, wc->partitionClause) { - SortGroupClause *sortcl = (SortGroupClause *) lfirst(lc2); + SortGroupClause *sortcl = lfirst_node(SortGroupClause, lc2); sgrefs = bms_add_member(sgrefs, sortcl->tleSortGroupRef); } foreach(lc2, wc->orderClause) { - SortGroupClause *sortcl = (SortGroupClause *) lfirst(lc2); + SortGroupClause *sortcl = lfirst_node(SortGroupClause, lc2); sgrefs = bms_add_member(sgrefs, sortcl->tleSortGroupRef); } @@ -5444,7 +5444,7 @@ make_window_input_target(PlannerInfo *root, /* Add in sortgroupref numbers of GROUP BY clauses, too */ foreach(lc, parse->groupClause) { - SortGroupClause *grpcl = (SortGroupClause *) lfirst(lc); + SortGroupClause *grpcl = lfirst_node(SortGroupClause, lc); sgrefs = bms_add_member(sgrefs, grpcl->tleSortGroupRef); } @@ -5864,7 +5864,7 @@ adjust_paths_for_srfs(PlannerInfo *root, RelOptInfo *rel, Assert(subpath->param_info == NULL); forboth(lc1, targets, lc2, targets_contain_srfs) { - PathTarget *thistarget = (PathTarget *) lfirst(lc1); + PathTarget *thistarget = lfirst_node(PathTarget, lc1); bool contains_srfs = (bool) lfirst_int(lc2); /* If this level doesn't contain SRFs, do regular projection */ @@ -5897,7 +5897,7 @@ adjust_paths_for_srfs(PlannerInfo *root, RelOptInfo *rel, Assert(subpath->param_info == NULL); forboth(lc1, targets, lc2, targets_contain_srfs) { - PathTarget *thistarget = (PathTarget *) lfirst(lc1); + PathTarget *thistarget = lfirst_node(PathTarget, lc1); bool contains_srfs = (bool) lfirst_int(lc2); /* If this level doesn't contain SRFs, do regular projection */ @@ -6023,7 +6023,7 @@ plan_cluster_use_sort(Oid tableOid, Oid indexOid) indexInfo = NULL; foreach(lc, rel->indexlist) { - indexInfo = (IndexOptInfo *) lfirst(lc); + indexInfo = lfirst_node(IndexOptInfo, lc); if (indexInfo->indexoid == indexOid) break; } @@ -6086,7 +6086,7 @@ get_partitioned_child_rels(PlannerInfo *root, Index rti) foreach(l, root->pcinfo_list) { - PartitionedChildRelInfo *pc = lfirst(l); + PartitionedChildRelInfo *pc = lfirst_node(PartitionedChildRelInfo, l); if (pc->parent_relid == rti) {