]> granicus.if.org Git - postgresql/commitdiff
Have CREATE TABLE AS and REFRESH return an OID
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 25 Aug 2014 19:32:18 +0000 (15:32 -0400)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 25 Aug 2014 19:32:18 +0000 (15:32 -0400)
Other DDL commands are already returning the OID, which is required for
future additional event trigger work.  This is merely making these
commands in line with the rest of utility command support.

src/backend/commands/createas.c
src/backend/commands/matview.c
src/include/commands/createas.h
src/include/commands/matview.h

index 96806eed98bc3fd4ff51341b74f2a51781ad8204..52451716f4612d5cc63767f4a382470123d582c9 100644 (file)
@@ -55,6 +55,9 @@ typedef struct
        BulkInsertState bistate;        /* bulk insert state */
 } DR_intorel;
 
+/* the OID of the created table, for ExecCreateTableAs consumption */
+static Oid     CreateAsRelid = InvalidOid;
+
 static void intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo);
 static void intorel_receive(TupleTableSlot *slot, DestReceiver *self);
 static void intorel_shutdown(DestReceiver *self);
@@ -64,7 +67,7 @@ static void intorel_destroy(DestReceiver *self);
 /*
  * ExecCreateTableAs -- execute a CREATE TABLE AS command
  */
-void
+Oid
 ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
                                  ParamListInfo params, char *completionTag)
 {
@@ -75,6 +78,7 @@ ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
        Oid                     save_userid = InvalidOid;
        int                     save_sec_context = 0;
        int                     save_nestlevel = 0;
+       Oid                     relOid;
        List       *rewritten;
        PlannedStmt *plan;
        QueryDesc  *queryDesc;
@@ -98,7 +102,9 @@ ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
                Assert(!is_matview);    /* excluded by syntax */
                ExecuteQuery(estmt, into, queryString, params, dest, completionTag);
 
-               return;
+               relOid = CreateAsRelid;
+               CreateAsRelid = InvalidOid;
+               return relOid;
        }
        Assert(query->commandType == CMD_SELECT);
 
@@ -190,6 +196,11 @@ ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
                /* Restore userid and security context */
                SetUserIdAndSecContext(save_userid, save_sec_context);
        }
+
+       relOid = CreateAsRelid;
+       CreateAsRelid = InvalidOid;
+
+       return relOid;
 }
 
 /*
@@ -421,6 +432,9 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
        myState->rel = intoRelationDesc;
        myState->output_cid = GetCurrentCommandId(true);
 
+       /* and remember the new relation's OID for ExecCreateTableAs */
+       CreateAsRelid = RelationGetRelid(myState->rel);
+
        /*
         * We can skip WAL-logging the insertions, unless PITR or streaming
         * replication is in use. We can skip the FSM in any case.
index a49e66f5da9161f8e973fac5c4de1124f4820508..d8d3c0833a6693186581804f5dab7dd13f369844 100644 (file)
@@ -132,7 +132,7 @@ SetMatViewPopulatedState(Relation relation, bool newstate)
  * The matview's "populated" state is changed based on whether the contents
  * reflect the result set of the materialized view's query.
  */
-void
+Oid
 ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString,
                                   ParamListInfo params, char *completionTag)
 {
@@ -281,6 +281,8 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString,
        }
        else
                refresh_by_heap_swap(matviewOid, OIDNewHeap);
+
+       return matviewOid;
 }
 
 /*
index c17d829a3ca8abd40c432d9c0b0f869c438b4ec9..477339d29192dbaac759f004c73a4cf5bbdde950 100644 (file)
@@ -19,7 +19,7 @@
 #include "tcop/dest.h"
 
 
-extern void ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
+extern Oid     ExecCreateTableAs(CreateTableAsStmt *stmt, const char *queryString,
                                  ParamListInfo params, char *completionTag);
 
 extern int     GetIntoRelEFlags(IntoClause *intoClause);
index 476b285078d899e69378730c3dc3fd4439a2ac65..2c468b2a44ee3fc983bccd26969252da5b59e877 100644 (file)
@@ -22,7 +22,7 @@
 
 extern void SetMatViewPopulatedState(Relation relation, bool newstate);
 
-extern void ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString,
+extern Oid ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString,
                                   ParamListInfo params, char *completionTag);
 
 extern DestReceiver *CreateTransientRelDestReceiver(Oid oid);