From eafda78fc404c706da4cfa254dafb3e97f6cd111 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 17 Oct 2024 08:36:14 +0200 Subject: [PATCH] Improve node type forward reference Instead of using Node *, we can use an incomplete struct. That way, everything has the correct type and fewer casts are required. This technique is already used elsewhere in node type definitions. Reviewed-by: Nathan Bossart Reviewed-by: Tender Wang Discussion: https://www.postgresql.org/message-id/flat/637eeea8-5663-460b-a114-39572c0f6c6e%40eisentraut.org --- src/backend/commands/createas.c | 2 +- src/backend/parser/analyze.c | 2 +- src/include/nodes/primnodes.h | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index 0b629b1f79..68ec122dbf 100644 --- a/src/backend/commands/createas.c +++ b/src/backend/commands/createas.c @@ -133,7 +133,7 @@ create_ctas_internal(List *attrList, IntoClause *into) if (is_matview) { /* StoreViewQuery scribbles on tree, so make a copy */ - Query *query = (Query *) copyObject(into->viewQuery); + Query *query = copyObject(into->viewQuery); StoreViewQuery(intoRelationAddr.objectId, query, false); CommandCounterIncrement(); diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 2d3d8fcf76..8a6ba1692e 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -3077,7 +3077,7 @@ transformCreateTableAsStmt(ParseState *pstate, CreateTableAsStmt *stmt) * in the IntoClause because that's where intorel_startup() can * conveniently get it from. */ - stmt->into->viewQuery = (Node *) copyObject(query); + stmt->into->viewQuery = copyObject(query); } /* represent the command as a utility Query */ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index ea47652adb..5b7b87dea5 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -152,8 +152,8 @@ typedef struct TableFunc * For CREATE MATERIALIZED VIEW, viewQuery is the parsed-but-not-rewritten * SELECT Query for the view; otherwise it's NULL. This is irrelevant in * the query jumbling as CreateTableAsStmt already includes a reference to - * its own Query, so ignore it. (Although it's actually Query*, we declare - * it as Node* to avoid a forward reference.) + * its own Query, so ignore it. (We declare it as struct Query* to avoid a + * forward reference.) */ typedef struct IntoClause { @@ -166,7 +166,7 @@ typedef struct IntoClause OnCommitAction onCommit; /* what do we do at COMMIT? */ char *tableSpaceName; /* table space to use, or NULL */ /* materialized view's SELECT query */ - Node *viewQuery pg_node_attr(query_jumble_ignore); + struct Query *viewQuery pg_node_attr(query_jumble_ignore); bool skipData; /* true for WITH NO DATA */ } IntoClause;