From df3f09a1d12c91595ad0702a17a2a7d884f5193f Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 14 Oct 2024 08:52:34 +0200 Subject: [PATCH 1/2] 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. --- src/backend/commands/createas.c | 2 +- src/backend/parser/analyze.c | 2 +- src/include/nodes/primnodes.h | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index 0b629b1f79c..68ec122dbf9 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 e901203424d..5e5e0b1c5cf 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -3076,7 +3076,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 ea47652adb8..f2677b2da1d 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -152,8 +152,7 @@ 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. */ typedef struct IntoClause { @@ -166,7 +165,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; -- 2.47.0