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))
