@@ -308,6 +308,7 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
308308 ListCell * le1 = NULL ;
309309 int successCount = 0 , failCount = 0 ;
310310 StringInfoData failNames ;
311+ ResourceOwner owner , oldOwner ;
311312
312313 /**
313314 * Ensure that an ANALYZE is requested.
@@ -476,6 +477,13 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
476477 MemoryContextSwitchTo (analyzeStatementContext );
477478 }
478479
480+ /**
481+ * Create a resource owner to keep track of our resources even not in trasaction block
482+ */
483+ owner = ResourceOwnerCreate (CurrentResourceOwner , "analyzeStmt" );
484+ oldOwner = CurrentResourceOwner ;
485+ CurrentResourceOwner = owner ;
486+
479487 /**
480488 * we use preferred_seg_num as default and
481489 * compute target_seg_num based on data size and distributed type
@@ -773,6 +781,12 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
773781 resource = NULL ;
774782 UnsetActiveQueryResource ();
775783 SetActiveQueryResource (savedResource );
784+
785+ ResourceOwnerRelease (owner ,
786+ RESOURCE_RELEASE_BEFORE_LOCKS ,
787+ false, true);
788+ CurrentResourceOwner = oldOwner ;
789+ ResourceOwnerDelete (owner );
776790
777791 /* Carry on with error handling. */
778792 PG_RE_THROW ();
@@ -787,6 +801,12 @@ void analyzeStmt(VacuumStmt *stmt, List *relids, int preferred_seg_num)
787801 UnsetActiveQueryResource ();
788802 SetActiveQueryResource (savedResource );
789803
804+ ResourceOwnerRelease (owner ,
805+ RESOURCE_RELEASE_BEFORE_LOCKS ,
806+ false, true);
807+ CurrentResourceOwner = oldOwner ;
808+ ResourceOwnerDelete (owner );
809+
790810 if (bUseOwnXacts )
791811 {
792812 /**
0 commit comments