diff options
author | Tom Lane | 2017-04-10 17:51:29 +0000 |
---|---|---|
committer | Tom Lane | 2017-04-10 17:51:53 +0000 |
commit | 8f0530f58061b185dc385df42e62d78a18d4ae3e (patch) | |
tree | 63d038ae4012dcdcff3b556dde4c654959f8448e /src/backend/parser | |
parent | 56dd8e85c40fef3e3c2c10afa186ee30416ec507 (diff) |
Improve castNode notation by introducing list-extraction-specific variants.
This extends the castNode() notation introduced by commit 5bcab1114 to
provide, in one step, extraction of a list cell's pointer and coercion to
a concrete node type. For example, "lfirst_node(Foo, lc)" is the same
as "castNode(Foo, lfirst(lc))". Almost half of the uses of castNode
that have appeared so far include a list extraction call, so this is
pretty widely useful, and it saves a few more keystrokes compared to the
old way.
As with the previous patch, back-patch the addition of these macros to
pg_list.h, so that the notation will be available when back-patching.
Patch by me, after an idea of Andrew Gierth's.
Discussion: https://postgr.es/m/14197.1491841216@sss.pgh.pa.us
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/analyze.c | 6 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 2 | ||||
-rw-r--r-- | src/backend/parser/parse_collate.c | 8 | ||||
-rw-r--r-- | src/backend/parser/parse_expr.c | 4 | ||||
-rw-r--r-- | src/backend/parser/parse_node.c | 2 | ||||
-rw-r--r-- | src/backend/parser/parse_relation.c | 2 | ||||
-rw-r--r-- | src/backend/parser/parse_type.c | 4 | ||||
-rw-r--r-- | src/backend/parser/parse_utilcmd.c | 18 |
8 files changed, 23 insertions, 23 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index c4140a65d2..567dd54c6c 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -829,7 +829,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt) AttrNumber attr_num; TargetEntry *tle; - col = castNode(ResTarget, lfirst(icols)); + col = lfirst_node(ResTarget, icols); attr_num = (AttrNumber) lfirst_int(attnos); tle = makeTargetEntry(expr, @@ -954,7 +954,7 @@ transformInsertRow(ParseState *pstate, List *exprlist, Expr *expr = (Expr *) lfirst(lc); ResTarget *col; - col = castNode(ResTarget, lfirst(icols)); + col = lfirst_node(ResTarget, icols); expr = transformAssignedExpr(pstate, expr, EXPR_KIND_INSERT_TARGET, @@ -2300,7 +2300,7 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist) } if (orig_tl == NULL) elog(ERROR, "UPDATE target count mismatch --- internal error"); - origTarget = castNode(ResTarget, lfirst(orig_tl)); + origTarget = lfirst_node(ResTarget, orig_tl); attrno = attnameAttNum(pstate->p_target_relation, origTarget->name, true); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 29ca5f13ea..89d2836c49 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -798,7 +798,7 @@ stmtmulti: stmtmulti ';' stmt if ($1 != NIL) { /* update length of previous stmt */ - updateRawStmtEnd(castNode(RawStmt, llast($1)), @2); + updateRawStmtEnd(llast_node(RawStmt, $1), @2); } if ($3 != NULL) $$ = lappend($1, makeRawStmt($3, @2 + 1)); diff --git a/src/backend/parser/parse_collate.c b/src/backend/parser/parse_collate.c index cc235d422f..aa443f23ad 100644 --- a/src/backend/parser/parse_collate.c +++ b/src/backend/parser/parse_collate.c @@ -514,7 +514,7 @@ assign_collations_walker(Node *node, assign_collations_context *context) if (qtree->targetList == NIL) return false; - tent = castNode(TargetEntry, linitial(qtree->targetList)); + tent = linitial_node(TargetEntry, qtree->targetList); if (tent->resjunk) return false; @@ -649,7 +649,7 @@ assign_collations_walker(Node *node, assign_collations_context *context) foreach(lc, expr->args) { - CaseWhen *when = castNode(CaseWhen, lfirst(lc)); + CaseWhen *when = lfirst_node(CaseWhen, lc); /* * The condition expressions mustn't affect @@ -865,7 +865,7 @@ assign_aggregate_collations(Aggref *aggref, /* Process aggregated args, holding resjunk ones at arm's length */ foreach(lc, aggref->args) { - TargetEntry *tle = castNode(TargetEntry, lfirst(lc)); + TargetEntry *tle = lfirst_node(TargetEntry, lc); if (tle->resjunk) assign_expr_collations(loccontext->pstate, (Node *) tle); @@ -909,7 +909,7 @@ assign_ordered_set_collations(Aggref *aggref, /* Process aggregated args appropriately */ foreach(lc, aggref->args) { - TargetEntry *tle = castNode(TargetEntry, lfirst(lc)); + TargetEntry *tle = lfirst_node(TargetEntry, lc); if (merge_sort_collations) (void) assign_collations_walker((Node *) tle, loccontext); diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 323be23bca..4f9b1a76b0 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -1669,7 +1669,7 @@ transformCaseExpr(ParseState *pstate, CaseExpr *c) resultexprs = NIL; foreach(l, c->args) { - CaseWhen *w = castNode(CaseWhen, lfirst(l)); + CaseWhen *w = lfirst_node(CaseWhen, l); CaseWhen *neww = makeNode(CaseWhen); Node *warg; @@ -2334,7 +2334,7 @@ transformXmlExpr(ParseState *pstate, XmlExpr *x) foreach(lc, x->named_args) { - ResTarget *r = castNode(ResTarget, lfirst(lc)); + ResTarget *r = lfirst_node(ResTarget, lc); Node *expr; char *argname; diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c index 34006c70cd..fb3d117a7d 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -337,7 +337,7 @@ transformArraySubscripts(ParseState *pstate, */ foreach(idx, indirection) { - A_Indices *ai = castNode(A_Indices, lfirst(idx)); + A_Indices *ai = lfirst_node(A_Indices, idx); Node *subexpr; if (isSlice) diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 062b8a1d22..f960f3844c 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -931,7 +931,7 @@ markRTEForSelectPriv(ParseState *pstate, RangeTblEntry *rte, JoinExpr *j; if (rtindex > 0 && rtindex <= list_length(pstate->p_joinexprs)) - j = castNode(JoinExpr, list_nth(pstate->p_joinexprs, rtindex - 1)); + j = list_nth_node(JoinExpr, pstate->p_joinexprs, rtindex - 1); else j = NULL; if (j == NULL) diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index 0d7a2b1e1b..b71b17bd2a 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -478,7 +478,7 @@ TypeNameListToString(List *typenames) initStringInfo(&string); foreach(l, typenames) { - TypeName *typeName = castNode(TypeName, lfirst(l)); + TypeName *typeName = lfirst_node(TypeName, l); if (l != list_head(typenames)) appendStringInfoChar(&string, ','); @@ -719,7 +719,7 @@ typeStringToTypeName(const char *str) */ if (list_length(raw_parsetree_list) != 1) goto fail; - stmt = (SelectStmt *) castNode(RawStmt, linitial(raw_parsetree_list))->stmt; + stmt = (SelectStmt *) linitial_node(RawStmt, raw_parsetree_list)->stmt; if (stmt == NULL || !IsA(stmt, SelectStmt) || stmt->distinctClause != NIL || diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index 926699608b..e5461944e2 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -388,7 +388,7 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, foreach(option, seqoptions) { - DefElem *defel = castNode(DefElem, lfirst(option)); + DefElem *defel = lfirst_node(DefElem, option); if (strcmp(defel->defname, "sequence_name") == 0) { @@ -605,7 +605,7 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column) foreach(clist, column->constraints) { - Constraint *constraint = castNode(Constraint, lfirst(clist)); + Constraint *constraint = lfirst_node(Constraint, clist); switch (constraint->contype) { @@ -1635,7 +1635,7 @@ transformIndexConstraints(CreateStmtContext *cxt) */ foreach(lc, cxt->ixconstraints) { - Constraint *constraint = castNode(Constraint, lfirst(lc)); + Constraint *constraint = lfirst_node(Constraint, lc); Assert(constraint->contype == CONSTR_PRIMARY || constraint->contype == CONSTR_UNIQUE || @@ -1956,8 +1956,8 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) List *opname; Assert(list_length(pair) == 2); - elem = castNode(IndexElem, linitial(pair)); - opname = castNode(List, lsecond(pair)); + elem = linitial_node(IndexElem, pair); + opname = lsecond_node(List, pair); index->indexParams = lappend(index->indexParams, elem); index->excludeOpNames = lappend(index->excludeOpNames, opname); @@ -1984,7 +1984,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) foreach(columns, cxt->columns) { - column = castNode(ColumnDef, lfirst(columns)); + column = lfirst_node(ColumnDef, columns); if (strcmp(column->colname, key) == 0) { found = true; @@ -2013,7 +2013,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) foreach(inher, cxt->inhRelations) { - RangeVar *inh = castNode(RangeVar, lfirst(inher)); + RangeVar *inh = lfirst_node(RangeVar, inher); Relation rel; int count; @@ -2823,7 +2823,7 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, */ foreach(lc, castNode(List, cmd->def)) { - DefElem *def = castNode(DefElem, lfirst(lc)); + DefElem *def = lfirst_node(DefElem, lc); if (strcmp(def->defname, "generated") == 0) newdef = lappend(newdef, def); @@ -2900,7 +2900,7 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, */ foreach(l, cxt.alist) { - IndexStmt *idxstmt = castNode(IndexStmt, lfirst(l)); + IndexStmt *idxstmt = lfirst_node(IndexStmt, l); idxstmt = transformIndexStmt(relid, idxstmt, queryString); newcmd = makeNode(AlterTableCmd); |