Use lfirst_node() and linitial_node() where appropriate in planner.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 5 Sep 2017 19:57:48 +0000 (15:57 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 5 Sep 2017 19:57:48 +0000 (15:57 -0400)
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

index 966230256eaaa2437eaacab40ac052cb64fbb216..6b79b3ad994b8c6f351e8aff8981dae2b3d33188 100644 (file)
@@ -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)
        {