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:
parent
3cffe7946c
commit
7926a9a80f
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user