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 <nathandbossart@gmail.com>
Reviewed-by: Tender Wang <tndrwang@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/637eeea8-5663-460b-a114-39572c0f6c6e%40eisentraut.org
This commit is contained in:
Peter Eisentraut 2024-10-17 08:36:14 +02:00
parent 41b023946d
commit eafda78fc4
3 changed files with 5 additions and 5 deletions

View File

@ -133,7 +133,7 @@ create_ctas_internal(List *attrList, IntoClause *into)
if (is_matview) if (is_matview)
{ {
/* StoreViewQuery scribbles on tree, so make a copy */ /* StoreViewQuery scribbles on tree, so make a copy */
Query *query = (Query *) copyObject(into->viewQuery); Query *query = copyObject(into->viewQuery);
StoreViewQuery(intoRelationAddr.objectId, query, false); StoreViewQuery(intoRelationAddr.objectId, query, false);
CommandCounterIncrement(); CommandCounterIncrement();

View File

@ -3077,7 +3077,7 @@ transformCreateTableAsStmt(ParseState *pstate, CreateTableAsStmt *stmt)
* in the IntoClause because that's where intorel_startup() can * in the IntoClause because that's where intorel_startup() can
* conveniently get it from. * conveniently get it from.
*/ */
stmt->into->viewQuery = (Node *) copyObject(query); stmt->into->viewQuery = copyObject(query);
} }
/* represent the command as a utility Query */ /* represent the command as a utility Query */

View File

@ -152,8 +152,8 @@ typedef struct TableFunc
* For CREATE MATERIALIZED VIEW, viewQuery is the parsed-but-not-rewritten * For CREATE MATERIALIZED VIEW, viewQuery is the parsed-but-not-rewritten
* SELECT Query for the view; otherwise it's NULL. This is irrelevant in * SELECT Query for the view; otherwise it's NULL. This is irrelevant in
* the query jumbling as CreateTableAsStmt already includes a reference to * the query jumbling as CreateTableAsStmt already includes a reference to
* its own Query, so ignore it. (Although it's actually Query*, we declare * its own Query, so ignore it. (We declare it as struct Query* to avoid a
* it as Node* to avoid a forward reference.) * forward reference.)
*/ */
typedef struct IntoClause typedef struct IntoClause
{ {
@ -166,7 +166,7 @@ typedef struct IntoClause
OnCommitAction onCommit; /* what do we do at COMMIT? */ OnCommitAction onCommit; /* what do we do at COMMIT? */
char *tableSpaceName; /* table space to use, or NULL */ char *tableSpaceName; /* table space to use, or NULL */
/* materialized view's SELECT query */ /* 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 */ bool skipData; /* true for WITH NO DATA */
} IntoClause; } IntoClause;