diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 2988c11..75b96e8 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -397,7 +397,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);
 		}
@@ -416,7 +416,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);
 	}
@@ -572,7 +572,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)
 		{
@@ -629,7 +629,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);
@@ -649,7 +649,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,
@@ -691,7 +691,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;
 
@@ -1066,7 +1066,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);
@@ -1088,7 +1088,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) ||
@@ -1116,7 +1116,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;
@@ -1178,7 +1178,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);
@@ -1213,7 +1213,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))
 				{
@@ -1235,7 +1235,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))
@@ -1393,7 +1393,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;
 	}
@@ -2092,7 +2092,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)
@@ -2255,7 +2255,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++;
 	}
@@ -2264,7 +2264,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)
 		{
@@ -2359,7 +2359,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;
 
@@ -2399,7 +2399,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++;
@@ -2758,7 +2758,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;
 
@@ -2791,7 +2791,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;
@@ -2849,7 +2849,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;
 
@@ -2924,11 +2924,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))
 			{
@@ -2957,7 +2957,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 */
@@ -3370,7 +3370,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,
@@ -3381,7 +3381,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,
@@ -3406,7 +3406,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,
@@ -4180,7 +4180,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);
 		}
@@ -4205,7 +4205,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
@@ -4225,7 +4225,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;
 
@@ -4367,7 +4367,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)
 				{
@@ -4401,7 +4401,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)
 					{
@@ -4423,7 +4423,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);
@@ -4602,7 +4602,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,
@@ -5189,7 +5189,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))
 		{
@@ -5266,7 +5266,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 */
@@ -5274,7 +5274,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");
@@ -5302,7 +5302,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);
@@ -5337,7 +5337,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! */
@@ -5410,18 +5410,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);
 		}
@@ -5430,7 +5430,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);
 	}
@@ -5850,7 +5850,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 */
@@ -5883,7 +5883,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 */
@@ -6009,7 +6009,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;
 	}
@@ -6072,7 +6072,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)
 		{
