Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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

+2-2
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

+1-1
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

+3-3
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

+8-8
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

+1-1
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

+2-2
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

+4-4
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

+1-1
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

+3-3
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

+1-1
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

+4-4
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

+3-3
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

+2-2
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

+1-1
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

+3-2
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

+1-1
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

+3-3
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

+1-1
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

+2-2
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

+2-2
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)