Small refactoring around ExecCreateTableAs().
authorJeff Davis <jdavis@postgresql.org>
Fri, 2 Aug 2024 18:49:03 +0000 (11:49 -0700)
committerJeff Davis <jdavis@postgresql.org>
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;
 }