diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index 96806eed98..52451716f4 100644 --- a/src/backend/commands/createas.c +++ b/src/backend/commands/createas.c @@ -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. diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index a49e66f5da..d8d3c0833a 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -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; } /* diff --git a/src/include/commands/createas.h b/src/include/commands/createas.h index c17d829a3c..477339d291 100644 --- a/src/include/commands/createas.h +++ b/src/include/commands/createas.h @@ -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); diff --git a/src/include/commands/matview.h b/src/include/commands/matview.h index 476b285078..2c468b2a44 100644 --- a/src/include/commands/matview.h +++ b/src/include/commands/matview.h @@ -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);