diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index d598c1b..926a41a 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -2638,43 +2638,38 @@ is_dummy_plan(Plan *plan) * the only good way to distinguish baserels from appendrel children * is to see what is in the join tree. */ -static Bitmapset * -get_base_rel_indexes(Node *jtnode) +static void +get_base_rel_indexes(Node *jtnode, Bitmapset **result) { - Bitmapset *result; if (jtnode == NULL) - return NULL; + return; if (IsA(jtnode, RangeTblRef)) { int varno = ((RangeTblRef *) jtnode)->rtindex; - result = bms_make_singleton(varno); + *result = bms_add_member(*result, varno); } else if (IsA(jtnode, FromExpr)) { FromExpr *f = (FromExpr *) jtnode; ListCell *l; - result = NULL; foreach(l, f->fromlist) - result = bms_join(result, - get_base_rel_indexes(lfirst(l))); + get_base_rel_indexes(lfirst(l), result); } else if (IsA(jtnode, JoinExpr)) { JoinExpr *j = (JoinExpr *) jtnode; - result = bms_join(get_base_rel_indexes(j->larg), - get_base_rel_indexes(j->rarg)); + get_base_rel_indexes(j->larg, result); + get_base_rel_indexes(j->rarg, result); } else { elog(ERROR, "unrecognized node type: %d", (int) nodeTag(jtnode)); - result = NULL; /* keep compiler quiet */ } - return result; } /* @@ -2684,7 +2679,7 @@ static void preprocess_rowmarks(PlannerInfo *root) { Query *parse = root->parse; - Bitmapset *rels; + Bitmapset *rels = NULL; List *prowmarks; ListCell *l; int i; @@ -2716,7 +2711,7 @@ preprocess_rowmarks(PlannerInfo *root) * make a bitmapset of all base rels and then remove the items we don't * need or have FOR [KEY] UPDATE/SHARE marks for. */ - rels = get_base_rel_indexes((Node *) parse->jointree); + get_base_rel_indexes((Node *) parse->jointree, &rels); if (parse->resultRelation) rels = bms_del_member(rels, parse->resultRelation);