mirror of
https://github.com/postgres/postgres.git
synced 2025-07-12 21:01:52 +03:00
Small refactoring around ExecCreateTableAs().
Since commit 4b74ebf726
, the refresh logic is used to populate
materialized views, so we can simplify the error message in
ExecCreateTableAs().
Also, RefreshMatViewByOid() is moved to just after
create_ctas_nodata() call to improve code readability.
Author: Yugo Nagata
Discussion: https://postgr.es/m/20240802161301.d975daca9ba7a706fa05ecd7@sraoss.co.jp
This commit is contained in:
@ -228,9 +228,6 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
|
|||||||
bool do_refresh = false;
|
bool do_refresh = false;
|
||||||
DestReceiver *dest;
|
DestReceiver *dest;
|
||||||
ObjectAddress address;
|
ObjectAddress address;
|
||||||
List *rewritten;
|
|
||||||
PlannedStmt *plan;
|
|
||||||
QueryDesc *queryDesc;
|
|
||||||
|
|
||||||
/* Check if the relation exists or not */
|
/* Check if the relation exists or not */
|
||||||
if (CreateTableAsRelExists(stmt))
|
if (CreateTableAsRelExists(stmt))
|
||||||
@ -279,9 +276,25 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
|
|||||||
* from running the planner before all dependencies are set up.
|
* from running the planner before all dependencies are set up.
|
||||||
*/
|
*/
|
||||||
address = create_ctas_nodata(query->targetList, into);
|
address = create_ctas_nodata(query->targetList, into);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For materialized views, reuse the REFRESH logic, which locks down
|
||||||
|
* security-restricted operations and restricts the search_path. This
|
||||||
|
* reduces the chance that a subsequent refresh will fail.
|
||||||
|
*/
|
||||||
|
if (do_refresh)
|
||||||
|
RefreshMatViewByOid(address.objectId, true, false, false,
|
||||||
|
pstate->p_sourcetext, qc);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
List *rewritten;
|
||||||
|
PlannedStmt *plan;
|
||||||
|
QueryDesc *queryDesc;
|
||||||
|
|
||||||
|
Assert(!is_matview);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse analysis was done already, but we still have to run the rule
|
* Parse analysis was done already, but we still have to run the rule
|
||||||
* rewriter. We do not do AcquireRewriteLocks: we assume the query
|
* rewriter. We do not do AcquireRewriteLocks: we assume the query
|
||||||
@ -292,9 +305,7 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
|
|||||||
|
|
||||||
/* SELECT should never rewrite to more or less than one SELECT query */
|
/* SELECT should never rewrite to more or less than one SELECT query */
|
||||||
if (list_length(rewritten) != 1)
|
if (list_length(rewritten) != 1)
|
||||||
elog(ERROR, "unexpected rewrite result for %s",
|
elog(ERROR, "unexpected rewrite result for CREATE TABLE AS SELECT");
|
||||||
is_matview ? "CREATE MATERIALIZED VIEW" :
|
|
||||||
"CREATE TABLE AS SELECT");
|
|
||||||
query = linitial_node(Query, rewritten);
|
query = linitial_node(Query, rewritten);
|
||||||
Assert(query->commandType == CMD_SELECT);
|
Assert(query->commandType == CMD_SELECT);
|
||||||
|
|
||||||
@ -339,17 +350,6 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
|
|||||||
PopActiveSnapshot();
|
PopActiveSnapshot();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* For materialized views, reuse the REFRESH logic, which locks down
|
|
||||||
* security-restricted operations and restricts the search_path. This
|
|
||||||
* reduces the chance that a subsequent refresh will fail.
|
|
||||||
*/
|
|
||||||
if (do_refresh)
|
|
||||||
{
|
|
||||||
RefreshMatViewByOid(address.objectId, true, false, false,
|
|
||||||
pstate->p_sourcetext, qc);
|
|
||||||
}
|
|
||||||
|
|
||||||
return address;
|
return address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user