Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5bcab11

Browse files
committed
Add castNode(type, ptr) for safe casting between NodeTag based types.
The new function allows to cast from one NodeTag based type toanother, while asserting that the conversion is valid. This replacesthe common pattern of doing a cast and a Assert(IsA(ptr, type))close-by.As this seems likely to be used pervasively, we decided to backpatchthis change the addition of this macro. Otherwise backpatched fixesare more likely not to work on back-branches.On branches before 9.6, where we do not yet rely on inline functionsbeing available, the type assertion is only performed if PG_USE_INLINEsupport is detected. The cast obviously is performed regardless.For the benefit of verifying the macro compiles in the back-branches,this commit contains a single use of the new macro. On master, asomewhat larger conversion will be committed separately.Author: Peter Eisentraut and Andres FreundReviewed-By: Tom LaneDiscussion:https://postgr.es/m/c5d387d9-3440-f5e0-f9d4-71d53b9fbe52@2ndquadrant.comBackpatch: 9.2-
1 parent331f8c3 commit5bcab11

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

‎src/backend/tcop/postgres.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ pg_plan_queries(List *querytrees, int cursorOptions, ParamListInfo boundParams)
846846

847847
foreach(query_list,querytrees)
848848
{
849-
Query*query= (Query*)lfirst(query_list);
849+
Query*query=castNode(Query,lfirst(query_list));
850850
PlannedStmt*stmt;
851851

852852
if (query->commandType==CMD_UTILITY)

‎src/include/nodes/nodes.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,26 @@ extern PGDLLIMPORT Node *newNodeMacroHolder;
558558

559559
#defineIsA(nodeptr,_type_)(nodeTag(nodeptr) == T_##_type_)
560560

561+
/*
562+
* castNode(type, ptr) casts ptr to type and, if cassert is enabled, verifies
563+
* that the the c actually has the appropriate type (using it's nodeTag()).
564+
*
565+
* Use an inline function when assertions are enabled, to avoid multiple
566+
* evaluations of the ptr argument (which could e.g. be a function call).
567+
*/
568+
#ifdefUSE_ASSERT_CHECKING
569+
staticinlineNode*
570+
castNodeImpl(enumNodeTagtype,void*ptr)
571+
{
572+
Assert(ptr==NULL||nodeTag(ptr)==type);
573+
returnptr;
574+
}
575+
#definecastNode(_type_,nodeptr) ((_type_ *) castNodeImpl(T_##_type_, nodeptr))
576+
#else
577+
#definecastNode(_type_,nodeptr) ((_type_ *)(nodeptr))
578+
#endif
579+
580+
561581
/* ----------------------------------------------------------------
562582
* extern declarations follow
563583
* ----------------------------------------------------------------

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp