From 25ae53d7f72a54a03ec90206c7e5579a562a121c Mon Sep 17 00:00:00 2001
From: Ashutosh Bapat <ashutosh.bapat@enterprisedb.com>
Date: Tue, 5 Sep 2017 16:50:58 +0530
Subject: [PATCH 1/2] Use lfirst_node() instead of lfirst() wherever suitable
 in planner.c

Ashutosh Bapat, reviewed by Jeevan Chalke
---
 src/backend/optimizer/plan/planner.c |   94 +++++++++++++++++-----------------
 1 file changed, 47 insertions(+), 47 deletions(-)

diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 9662302..a1dd157 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;
 	}
@@ -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)
@@ -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)
 		{
@@ -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 */
@@ -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,
@@ -5203,7 +5203,7 @@ make_partial_grouping_target(PlannerInfo *root, PathTarget *grouping_target)
 	 */
 	foreach(lc, partial_target->exprs)
 	{
-		Aggref	   *aggref = (Aggref *) lfirst(lc);
+		Aggref	   *aggref = lfirst(lc);
 
 		if (IsA(aggref, Aggref))
 		{
@@ -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);
@@ -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)
 		{
-- 
1.7.9.5

