diff options
-rw-r--r-- | src/backend/tcop/postgres.c | 2 | ||||
-rw-r--r-- | src/include/nodes/nodes.h | 22 |
2 files changed, 23 insertions, 1 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index da4bc3b52d4..fa17316cd8d 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -823,7 +823,7 @@ pg_plan_queries(List *querytrees, int cursorOptions, ParamListInfo boundParams) foreach(query_list, querytrees) { - Query *query = (Query *) lfirst(query_list); + Query *query = castNode(Query, lfirst(query_list)); Node *stmt; if (query->commandType == CMD_UTILITY) diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index 5dcc66f27ff..7adb2e1a20f 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -493,6 +493,28 @@ extern PGDLLIMPORT Node *newNodeMacroHolder; #define IsA(nodeptr,_type_) (nodeTag(nodeptr) == T_##_type_) +/* + * castNode(type, ptr) casts ptr to type and, if cassert is enabled, verifies + * that the the c actually has the appropriate type (using it's nodeTag()). + * + * Use an inline function when assertions are enabled, to avoid multiple + * evaluations of the ptr argument (which could e.g. be a function call). If + * inline functions are not available - only a small number of platforms - + * don't Assert, but use the non-checking version. + */ +#if defined(USE_ASSERT_CHECKING) && defined(PG_USE_INLINE) +static inline Node* +castNodeImpl(enum NodeTag type, void *ptr) +{ + Assert(ptr == NULL || nodeTag(ptr) == type); + return ptr; +} +#define castNode(_type_, nodeptr) ((_type_ *) castNodeImpl(T_##_type_, nodeptr)) +#else +#define castNode(_type_,nodeptr) ((_type_ *)(nodeptr)) +#endif + + /* ---------------------------------------------------------------- * extern declarations follow * ---------------------------------------------------------------- |