diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index ac7719e..333d3cc 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -48,8 +48,8 @@ static void transientrel_startup(DestReceiver *self, int operation, TupleDesc ty static void transientrel_receive(TupleTableSlot *slot, DestReceiver *self); static void transientrel_shutdown(DestReceiver *self); static void transientrel_destroy(DestReceiver *self); -static void refresh_matview_datafill(DestReceiver *dest, Query *query, - const char *queryString); +static uint32 refresh_matview_datafill(DestReceiver *dest, Query *query, + const char *queryString); /* * SetMatViewToPopulated @@ -118,6 +118,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, Oid tableSpace; Oid OIDNewHeap; DestReceiver *dest; + uint32 nprocessed = 0; /* * Get a lock until end of transaction. @@ -193,7 +194,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, dest = CreateTransientRelDestReceiver(OIDNewHeap); if (!stmt->skipData) - refresh_matview_datafill(dest, dataQuery, queryString); + nprocessed = refresh_matview_datafill(dest, dataQuery, queryString); /* * Swap the physical files of the target and transient tables, then @@ -202,13 +203,21 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, finish_heap_swap(matviewOid, OIDNewHeap, false, false, true, true, RecentXmin, ReadNextMultiXactId()); + /* Set back completionTag */ + if (completionTag) + { + snprintf(completionTag, COMPLETION_TAG_BUFSIZE, + "REFRESH MATERIALIZED VIEW %u", nprocessed); +elog(INFO, "nprocessed: %u", nprocessed); + } + RelationCacheInvalidateEntry(matviewOid); } /* * refresh_matview_datafill */ -static void +static uint32 refresh_matview_datafill(DestReceiver *dest, Query *query, const char *queryString) { @@ -218,6 +227,7 @@ refresh_matview_datafill(DestReceiver *dest, Query *query, List *rtable; RangeTblEntry *initial_rte; RangeTblEntry *second_rte; + uint32 nprocessed; rewritten = QueryRewrite((Query *) copyObject(query)); @@ -271,6 +281,7 @@ refresh_matview_datafill(DestReceiver *dest, Query *query, /* run the plan */ ExecutorRun(queryDesc, ForwardScanDirection, 0L); + nprocessed = queryDesc->estate->es_processed; /* and clean up */ ExecutorFinish(queryDesc); @@ -279,6 +290,8 @@ refresh_matview_datafill(DestReceiver *dest, Query *query, FreeQueryDesc(queryDesc); PopActiveSnapshot(); + + return nprocessed; } DestReceiver * diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index cc7764d..63862cb 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -2125,8 +2125,8 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI, else if (IsA(stmt, RefreshMatViewStmt)) { Assert(strncmp(completionTag, - "REFRESH MATERIALIZED VIEW ", 23) == 0); - _SPI_current->processed = strtoul(completionTag + 23, + "REFRESH MATERIALIZED VIEW ", 26) == 0); + _SPI_current->processed = strtoul(completionTag + 26, NULL, 10); } else if (IsA(stmt, CopyStmt))