Skip to content

Commit 8f0530f

Browse files
committed
Improve castNode notation by introducing list-extraction-specific variants.
This extends the castNode() notation introduced by commit 5bcab11 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
1 parent 56dd8e8 commit 8f0530f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+176
-168
lines changed

contrib/pg_stat_statements/pg_stat_statements.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2393,7 +2393,7 @@ JumbleRangeTable(pgssJumbleState *jstate, List *rtable)
23932393

23942394
foreach(lc, rtable)
23952395
{
2396-
RangeTblEntry *rte = castNode(RangeTblEntry, lfirst(lc));
2396+
RangeTblEntry *rte = lfirst_node(RangeTblEntry, lc);
23972397

23982398
APP_JUMB(rte->rtekind);
23992399
switch (rte->rtekind)
@@ -2656,7 +2656,7 @@ JumbleExpr(pgssJumbleState *jstate, Node *node)
26562656
JumbleExpr(jstate, (Node *) caseexpr->arg);
26572657
foreach(temp, caseexpr->args)
26582658
{
2659-
CaseWhen *when = castNode(CaseWhen, lfirst(temp));
2659+
CaseWhen *when = lfirst_node(CaseWhen, temp);
26602660

26612661
JumbleExpr(jstate, (Node *) when->expr);
26622662
JumbleExpr(jstate, (Node *) when->result);

contrib/postgres_fdw/deparse.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1350,7 +1350,7 @@ deparseExplicitTargetList(List *tlist, List **retrieved_attrs,
13501350

13511351
foreach(lc, tlist)
13521352
{
1353-
TargetEntry *tle = castNode(TargetEntry, lfirst(lc));
1353+
TargetEntry *tle = lfirst_node(TargetEntry, lc);
13541354

13551355
if (i > 0)
13561356
appendStringInfoString(buf, ", ");

contrib/postgres_fdw/postgres_fdw.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,7 +1169,7 @@ postgresGetForeignPlan(PlannerInfo *root,
11691169
*/
11701170
foreach(lc, scan_clauses)
11711171
{
1172-
RestrictInfo *rinfo = castNode(RestrictInfo, lfirst(lc));
1172+
RestrictInfo *rinfo = lfirst_node(RestrictInfo, lc);
11731173

11741174
/* Ignore any pseudoconstants, they're dealt with elsewhere */
11751175
if (rinfo->pseudoconstant)
@@ -5022,8 +5022,8 @@ conversion_error_callback(void *arg)
50225022
EState *estate = fsstate->ss.ps.state;
50235023
TargetEntry *tle;
50245024

5025-
tle = castNode(TargetEntry, list_nth(fsplan->fdw_scan_tlist,
5026-
errpos->cur_attno - 1));
5025+
tle = list_nth_node(TargetEntry, fsplan->fdw_scan_tlist,
5026+
errpos->cur_attno - 1);
50275027

50285028
/*
50295029
* Target list can have Vars and expressions. For Vars, we can get

src/backend/catalog/objectaddress.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ get_object_address(ObjectType objtype, Node *object,
854854

855855
objlist = castNode(List, object);
856856
domaddr = get_object_address_type(OBJECT_DOMAIN,
857-
castNode(TypeName, linitial(objlist)),
857+
linitial_node(TypeName, objlist),
858858
missing_ok);
859859
constrname = strVal(lsecond(objlist));
860860

@@ -932,8 +932,8 @@ get_object_address(ObjectType objtype, Node *object,
932932
break;
933933
case OBJECT_CAST:
934934
{
935-
TypeName *sourcetype = castNode(TypeName, linitial(castNode(List, object)));
936-
TypeName *targettype = castNode(TypeName, lsecond(castNode(List, object)));
935+
TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
936+
TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
937937
Oid sourcetypeid;
938938
Oid targettypeid;
939939

@@ -947,7 +947,7 @@ get_object_address(ObjectType objtype, Node *object,
947947
break;
948948
case OBJECT_TRANSFORM:
949949
{
950-
TypeName *typename = castNode(TypeName, linitial(castNode(List, object)));
950+
TypeName *typename = linitial_node(TypeName, castNode(List, object));
951951
char *langname = strVal(lsecond(castNode(List, object)));
952952
Oid type_id = LookupTypeNameOid(NULL, typename, missing_ok);
953953
Oid lang_id = get_language_oid(langname, missing_ok);
@@ -1597,7 +1597,7 @@ get_object_address_opf_member(ObjectType objtype,
15971597
{
15981598
ObjectAddress typaddr;
15991599

1600-
typenames[i] = castNode(TypeName, lfirst(cell));
1600+
typenames[i] = lfirst_node(TypeName, cell);
16011601
typaddr = get_object_address_type(OBJECT_TYPE, typenames[i], missing_ok);
16021602
typeoids[i] = typaddr.objectId;
16031603
if (++i >= 2)
@@ -2319,8 +2319,8 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
23192319
case OBJECT_CAST:
23202320
{
23212321
/* We can only check permissions on the source/target types */
2322-
TypeName *sourcetype = castNode(TypeName, linitial(castNode(List, object)));
2323-
TypeName *targettype = castNode(TypeName, lsecond(castNode(List, object)));
2322+
TypeName *sourcetype = linitial_node(TypeName, castNode(List, object));
2323+
TypeName *targettype = lsecond_node(TypeName, castNode(List, object));
23242324
Oid sourcetypeid = typenameTypeId(NULL, sourcetype);
23252325
Oid targettypeid = typenameTypeId(NULL, targettype);
23262326

@@ -2345,7 +2345,7 @@ check_object_ownership(Oid roleid, ObjectType objtype, ObjectAddress address,
23452345
break;
23462346
case OBJECT_TRANSFORM:
23472347
{
2348-
TypeName *typename = castNode(TypeName, linitial(castNode(List, object)));
2348+
TypeName *typename = linitial_node(TypeName, castNode(List, object));
23492349
Oid typeid = typenameTypeId(NULL, typename);
23502350

23512351
if (!pg_type_ownercheck(typeid, roleid))

src/backend/catalog/pg_proc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@ fmgr_sql_validator(PG_FUNCTION_ARGS)
928928
querytree_list = NIL;
929929
foreach(lc, raw_parsetree_list)
930930
{
931-
RawStmt *parsetree = castNode(RawStmt, lfirst(lc));
931+
RawStmt *parsetree = lfirst_node(RawStmt, lc);
932932
List *querytree_sublist;
933933

934934
querytree_sublist = pg_analyze_and_rewrite_params(parsetree,

src/backend/commands/aggregatecmds.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,13 @@ DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle, List
109109
aggKind = AGGKIND_ORDERED_SET;
110110
else
111111
numDirectArgs = 0;
112-
args = castNode(List, linitial(args));
112+
args = linitial_node(List, args);
113113
}
114114

115115
/* Examine aggregate's definition clauses */
116116
foreach(pl, parameters)
117117
{
118-
DefElem *defel = castNode(DefElem, lfirst(pl));
118+
DefElem *defel = lfirst_node(DefElem, pl);
119119

120120
/*
121121
* sfunc1, stype1, and initcond1 are accepted as obsolete spellings

src/backend/commands/async.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1636,7 +1636,7 @@ AtSubCommit_Notify(void)
16361636
List *parentPendingActions;
16371637
List *parentPendingNotifies;
16381638

1639-
parentPendingActions = castNode(List, linitial(upperPendingActions));
1639+
parentPendingActions = linitial_node(List, upperPendingActions);
16401640
upperPendingActions = list_delete_first(upperPendingActions);
16411641

16421642
Assert(list_length(upperPendingActions) ==
@@ -1647,7 +1647,7 @@ AtSubCommit_Notify(void)
16471647
*/
16481648
pendingActions = list_concat(parentPendingActions, pendingActions);
16491649

1650-
parentPendingNotifies = castNode(List, linitial(upperPendingNotifies));
1650+
parentPendingNotifies = linitial_node(List, upperPendingNotifies);
16511651
upperPendingNotifies = list_delete_first(upperPendingNotifies);
16521652

16531653
Assert(list_length(upperPendingNotifies) ==
@@ -1679,13 +1679,13 @@ AtSubAbort_Notify(void)
16791679
*/
16801680
while (list_length(upperPendingActions) > my_level - 2)
16811681
{
1682-
pendingActions = castNode(List, linitial(upperPendingActions));
1682+
pendingActions = linitial_node(List, upperPendingActions);
16831683
upperPendingActions = list_delete_first(upperPendingActions);
16841684
}
16851685

16861686
while (list_length(upperPendingNotifies) > my_level - 2)
16871687
{
1688-
pendingNotifies = castNode(List, linitial(upperPendingNotifies));
1688+
pendingNotifies = linitial_node(List, upperPendingNotifies);
16891689
upperPendingNotifies = list_delete_first(upperPendingNotifies);
16901690
}
16911691
}

src/backend/commands/collationcmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e
7171

7272
foreach(pl, parameters)
7373
{
74-
DefElem *defel = castNode(DefElem, lfirst(pl));
74+
DefElem *defel = lfirst_node(DefElem, pl);
7575
DefElem **defelp;
7676

7777
if (pg_strcasecmp(defel->defname, "from") == 0)

src/backend/commands/copy.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ ProcessCopyOptions(ParseState *pstate,
10341034
/* Extract options from the statement node tree */
10351035
foreach(option, options)
10361036
{
1037-
DefElem *defel = castNode(DefElem, lfirst(option));
1037+
DefElem *defel = lfirst_node(DefElem, option);
10381038

10391039
if (strcmp(defel->defname, "format") == 0)
10401040
{
@@ -1488,7 +1488,7 @@ BeginCopy(ParseState *pstate,
14881488
/* examine queries to determine which error message to issue */
14891489
foreach(lc, rewritten)
14901490
{
1491-
Query *q = castNode(Query, lfirst(lc));
1491+
Query *q = lfirst_node(Query, lc);
14921492

14931493
if (q->querySource == QSRC_QUAL_INSTEAD_RULE)
14941494
ereport(ERROR,
@@ -1505,7 +1505,7 @@ BeginCopy(ParseState *pstate,
15051505
errmsg("multi-statement DO INSTEAD rules are not supported for COPY")));
15061506
}
15071507

1508-
query = castNode(Query, linitial(rewritten));
1508+
query = linitial_node(Query, rewritten);
15091509

15101510
/* The grammar allows SELECT INTO, but we don't support that */
15111511
if (query->utilityStmt != NULL &&

src/backend/commands/createas.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
323323
elog(ERROR, "unexpected rewrite result for %s",
324324
is_matview ? "CREATE MATERIALIZED VIEW" :
325325
"CREATE TABLE AS SELECT");
326-
query = castNode(Query, linitial(rewritten));
326+
query = linitial_node(Query, rewritten);
327327
Assert(query->commandType == CMD_SELECT);
328328

329329
/* plan the query --- note we disallow parallelism */

src/backend/commands/dropcmds.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ type_in_list_does_not_exist_skipping(List *typenames, const char **msg,
214214

215215
foreach(l, typenames)
216216
{
217-
TypeName *typeName = castNode(TypeName, lfirst(l));
217+
TypeName *typeName = lfirst_node(TypeName, l);
218218

219219
if (typeName != NULL)
220220
{
@@ -371,16 +371,16 @@ does_not_exist_skipping(ObjectType objtype, Node *object)
371371
{
372372
/* XXX quote or no quote? */
373373
msg = gettext_noop("cast from type %s to type %s does not exist, skipping");
374-
name = TypeNameToString(castNode(TypeName, linitial(castNode(List, object))));
375-
args = TypeNameToString(castNode(TypeName, lsecond(castNode(List, object))));
374+
name = TypeNameToString(linitial_node(TypeName, castNode(List, object)));
375+
args = TypeNameToString(lsecond_node(TypeName, castNode(List, object)));
376376
}
377377
}
378378
break;
379379
case OBJECT_TRANSFORM:
380380
if (!type_in_list_does_not_exist_skipping(list_make1(linitial(castNode(List, object))), &msg, &name))
381381
{
382382
msg = gettext_noop("transform for type %s language \"%s\" does not exist, skipping");
383-
name = TypeNameToString(castNode(TypeName, linitial(castNode(List, object))));
383+
name = TypeNameToString(linitial_node(TypeName, castNode(List, object)));
384384
args = strVal(lsecond(castNode(List, object)));
385385
}
386386
break;

src/backend/commands/explain.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ ExplainQuery(ParseState *pstate, ExplainStmt *stmt, const char *queryString,
253253
/* Explain every plan */
254254
foreach(l, rewritten)
255255
{
256-
ExplainOneQuery(castNode(Query, lfirst(l)),
256+
ExplainOneQuery(lfirst_node(Query, l),
257257
CURSOR_OPT_PARALLEL_OK, NULL, es,
258258
queryString, params, queryEnv);
259259

@@ -408,7 +408,7 @@ ExplainOneUtility(Node *utilityStmt, IntoClause *into, ExplainState *es,
408408

409409
rewritten = QueryRewrite(castNode(Query, copyObject(ctas->query)));
410410
Assert(list_length(rewritten) == 1);
411-
ExplainOneQuery(castNode(Query, linitial(rewritten)),
411+
ExplainOneQuery(linitial_node(Query, rewritten),
412412
0, ctas->into, es,
413413
queryString, params, queryEnv);
414414
}
@@ -427,7 +427,7 @@ ExplainOneUtility(Node *utilityStmt, IntoClause *into, ExplainState *es,
427427

428428
rewritten = QueryRewrite(castNode(Query, copyObject(dcs->query)));
429429
Assert(list_length(rewritten) == 1);
430-
ExplainOneQuery(castNode(Query, linitial(rewritten)),
430+
ExplainOneQuery(linitial_node(Query, rewritten),
431431
dcs->options, NULL, es,
432432
queryString, params, queryEnv);
433433
}

src/backend/commands/extension.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ execute_sql_string(const char *sql, const char *filename)
714714
*/
715715
foreach(lc1, raw_parsetree_list)
716716
{
717-
RawStmt *parsetree = castNode(RawStmt, lfirst(lc1));
717+
RawStmt *parsetree = lfirst_node(RawStmt, lc1);
718718
List *stmt_list;
719719
ListCell *lc2;
720720

@@ -727,7 +727,7 @@ execute_sql_string(const char *sql, const char *filename)
727727

728728
foreach(lc2, stmt_list)
729729
{
730-
PlannedStmt *stmt = castNode(PlannedStmt, lfirst(lc2));
730+
PlannedStmt *stmt = lfirst_node(PlannedStmt, lc2);
731731

732732
CommandCounterIncrement();
733733

src/backend/commands/foreigncmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1589,7 +1589,7 @@ ImportForeignSchema(ImportForeignSchemaStmt *stmt)
15891589
*/
15901590
foreach(lc2, raw_parsetree_list)
15911591
{
1592-
RawStmt *rs = castNode(RawStmt, lfirst(lc2));
1592+
RawStmt *rs = lfirst_node(RawStmt, lc2);
15931593
CreateForeignTableStmt *cstmt = (CreateForeignTableStmt *) rs->stmt;
15941594
PlannedStmt *pstmt;
15951595

src/backend/commands/functioncmds.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ update_proconfig_value(ArrayType *a, List *set_items)
578578

579579
foreach(l, set_items)
580580
{
581-
VariableSetStmt *sstmt = castNode(VariableSetStmt, lfirst(l));
581+
VariableSetStmt *sstmt = lfirst_node(VariableSetStmt, l);
582582

583583
if (sstmt->kind == VAR_RESET_ALL)
584584
a = NULL;
@@ -972,7 +972,8 @@ CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
972972

973973
foreach(lc, castNode(List, transformDefElem))
974974
{
975-
Oid typeid = typenameTypeId(NULL, lfirst(lc));
975+
Oid typeid = typenameTypeId(NULL,
976+
lfirst_node(TypeName, lc));
976977
Oid elt = get_base_element_type(typeid);
977978

978979
typeid = elt ? elt : typeid;

src/backend/commands/matview.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString,
264264
* The stored query was rewritten at the time of the MV definition, but
265265
* has not been scribbled on by the planner.
266266
*/
267-
dataQuery = castNode(Query, linitial(actions));
267+
dataQuery = linitial_node(Query, actions);
268268

269269
/*
270270
* Check for active uses of the relation in the current transaction, such

src/backend/commands/opclasscmds.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
460460
*/
461461
foreach(l, stmt->items)
462462
{
463-
CreateOpClassItem *item = castNode(CreateOpClassItem, lfirst(l));
463+
CreateOpClassItem *item = lfirst_node(CreateOpClassItem, l);
464464
Oid operOid;
465465
Oid funcOid;
466466
Oid sortfamilyOid;
@@ -834,7 +834,7 @@ AlterOpFamilyAdd(AlterOpFamilyStmt *stmt, Oid amoid, Oid opfamilyoid,
834834
*/
835835
foreach(l, items)
836836
{
837-
CreateOpClassItem *item = castNode(CreateOpClassItem, lfirst(l));
837+
CreateOpClassItem *item = lfirst_node(CreateOpClassItem, l);
838838
Oid operOid;
839839
Oid funcOid;
840840
Oid sortfamilyOid;
@@ -959,7 +959,7 @@ AlterOpFamilyDrop(AlterOpFamilyStmt *stmt, Oid amoid, Oid opfamilyoid,
959959
*/
960960
foreach(l, items)
961961
{
962-
CreateOpClassItem *item = castNode(CreateOpClassItem, lfirst(l));
962+
CreateOpClassItem *item = lfirst_node(CreateOpClassItem, l);
963963
Oid lefttype,
964964
righttype;
965965
OpFamilyMember *member;

src/backend/commands/portalcmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ PerformCursorOpen(DeclareCursorStmt *cstmt, ParamListInfo params,
8383
if (list_length(rewritten) != 1)
8484
elog(ERROR, "non-SELECT statement in DECLARE CURSOR");
8585

86-
query = castNode(Query, linitial(rewritten));
86+
query = linitial_node(Query, rewritten);
8787

8888
if (query->commandType != CMD_SELECT)
8989
elog(ERROR, "non-SELECT statement in DECLARE CURSOR");

src/backend/commands/prepare.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ ExecuteQuery(ExecuteStmt *stmt, IntoClause *intoClause,
267267
ereport(ERROR,
268268
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
269269
errmsg("prepared statement is not a SELECT")));
270-
pstmt = castNode(PlannedStmt, linitial(plan_list));
270+
pstmt = linitial_node(PlannedStmt, plan_list);
271271
if (pstmt->commandType != CMD_SELECT)
272272
ereport(ERROR,
273273
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
@@ -679,7 +679,7 @@ ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into, ExplainState *es,
679679
/* Explain each query */
680680
foreach(p, plan_list)
681681
{
682-
PlannedStmt *pstmt = castNode(PlannedStmt, lfirst(p));
682+
PlannedStmt *pstmt = lfirst_node(PlannedStmt, p);
683683

684684
if (pstmt->commandType != CMD_UTILITY)
685685
ExplainOnePlan(pstmt, into, es, query_string, paramLI, queryEnv,

src/backend/commands/tablecmds.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5942,7 +5942,7 @@ ATExecSetIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmod
59425942

59435943
foreach(option, castNode(List, def))
59445944
{
5945-
DefElem *defel = castNode(DefElem, lfirst(option));
5945+
DefElem *defel = lfirst_node(DefElem, option);
59465946

59475947
if (strcmp(defel->defname, "generated") == 0)
59485948
{
@@ -9547,7 +9547,7 @@ ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd,
95479547
querytree_list = NIL;
95489548
foreach(list_item, raw_parsetree_list)
95499549
{
9550-
RawStmt *rs = castNode(RawStmt, lfirst(list_item));
9550+
RawStmt *rs = lfirst_node(RawStmt, list_item);
95519551
Node *stmt = rs->stmt;
95529552

95539553
if (IsA(stmt, IndexStmt))

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy