Small refactoring around ExecCreateTableAs().
authorJeff Davis <[email protected]>
Fri, 2 Aug 2024 18:49:03 +0000 (11:49 -0700)
committerJeff Davis <[email protected]>
Fri, 2 Aug 2024 19:52:56 +0000 (12:52 -0700)
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

src/backend/commands/createas.c

index 36e192b79b25289f1bb71a4b7a703b2794545218..c71ff80188878ddae18a12dbdc5e85aacbf41e89 100644 (file)
@@ -228,9 +228,6 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
    bool        do_refresh = false;
    DestReceiver *dest;
    ObjectAddress address;
-   List       *rewritten;
-   PlannedStmt *plan;
-   QueryDesc  *queryDesc;
 
    /* Check if the relation exists or not */
    if (CreateTableAsRelExists(stmt))
@@ -279,9 +276,25 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
         * from running the planner before all dependencies are set up.
         */
        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
    {
+       List       *rewritten;
+       PlannedStmt *plan;
+       QueryDesc  *queryDesc;
+
+       Assert(!is_matview);
+
        /*
         * Parse analysis was done already, but we still have to run the rule
         * 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 */
        if (list_length(rewritten) != 1)
-           elog(ERROR, "unexpected rewrite result for %s",
-                is_matview ? "CREATE MATERIALIZED VIEW" :
-                "CREATE TABLE AS SELECT");
+           elog(ERROR, "unexpected rewrite result for CREATE TABLE AS SELECT");
        query = linitial_node(Query, rewritten);
        Assert(query->commandType == CMD_SELECT);
 
@@ -339,17 +350,6 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt,
        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;
 }