@@ -113,7 +113,10 @@ static MemoryContext changesStackContext = NULL;
113113AssertMacro(changesStack != NULL), \
114114(dlist_head_element(ChangesStackNode, node, changesStack)) \
115115)
116-
116+ #define pack_hctx (pack ,is_trans ) \
117+ (is_trans ? pack->hctxTransact : pack->hctxRegular)
118+ #define pack_htab (pack ,is_trans ) \
119+ (is_trans ? pack->varHashTransact : pack->varHashRegular)
117120
118121#define PGV_MCXT_MAIN "pg_variables: main memory context"
119122#define PGV_MCXT_VARS "pg_variables: variables hash"
@@ -157,9 +160,7 @@ variable_set(text *package_name, text *var_name,
157160scalar -> is_null = is_null ;
158161if (!scalar -> is_null )
159162{
160- oldcxt = MemoryContextSwitchTo (is_transactional ?
161- package -> hctxTransact :
162- package -> hctxRegular );
163+ oldcxt = MemoryContextSwitchTo (pack_hctx (package ,is_transactional ));
163164scalar -> value = datumCopy (value ,scalar -> typbyval ,scalar -> typlen );
164165MemoryContextSwitchTo (oldcxt );
165166}
@@ -357,8 +358,7 @@ variable_insert(PG_FUNCTION_ARGS)
357358/*
358359 * This is the first record for the var_name. Initialize attributes.
359360 */
360- init_attributes (variable ,tupdesc ,is_transactional ?
361- package -> hctxTransact :package -> hctxRegular );
361+ init_attributes (variable ,tupdesc ,pack_hctx (package ,is_transactional ));
362362}
363363else
364364check_attributes (variable ,tupdesc );
@@ -1025,12 +1025,13 @@ get_packages_and_variables(PG_FUNCTION_ARGS)
10251025{
10261026HashVariableEntry * variable ;
10271027HASH_SEQ_STATUS vstat ;
1028+ int i ;
10281029
10291030/* Skip packages marked as deleted */
10301031if (!get_actual_pack_state (package )-> is_valid )
10311032continue ;
10321033/* Get variables list for package */
1033- for ( int i = 0 ;i < 2 ;i ++ )
1034+ for ( i = 0 ;i < 2 ;i ++ )
10341035{
10351036hash_seq_init (& vstat ,i ?package -> varHashTransact :
10361037package -> varHashRegular );
@@ -1268,7 +1269,7 @@ makePackHTAB(HashPackageEntry *package, bool is_trans)
12681269package -> hctxRegular = AllocSetContextCreate (ModuleContext ,
12691270PGV_MCXT_VARS ,
12701271ALLOCSET_DEFAULT_SIZES );
1271- sprintf (hash_name ,"%s variables hash for package \"%s\"" ,
1272+ snprintf (hash_name , BUFSIZ ,"%s variables hash for package \"%s\"" ,
12721273is_trans ?"Transactional" :"Regular" ,key );
12731274ctl .keysize = NAMEDATALEN ;
12741275ctl .entrysize = sizeof (HashVariableEntry );
@@ -1447,9 +1448,8 @@ createVariableInternal(HashPackageEntry *package, text *name, Oid typid,
14471448errmsg ("variable \"%s\" already created as %sTRANSACTIONAL" ,
14481449key ,is_transactional ?"NOT " :"" )));
14491450
1450- variable = (HashVariableEntry * )hash_search (is_transactional ?
1451- package -> varHashTransact :
1452- package -> varHashRegular ,
1451+ variable = (HashVariableEntry * )hash_search (
1452+ pack_htab (package ,is_transactional ),
14531453key ,HASH_ENTER ,& found );
14541454
14551455/* Check variable type */
@@ -1486,9 +1486,7 @@ createVariableInternal(HashPackageEntry *package, text *name, Oid typid,
14861486variable -> typid = typid ;
14871487variable -> is_transactional = is_transactional ;
14881488dlist_init (& variable -> data );
1489- historyEntry = MemoryContextAllocZero (is_transactional ?
1490- package -> hctxTransact :
1491- package -> hctxRegular ,
1489+ historyEntry = MemoryContextAllocZero (pack_hctx (package ,is_transactional ),
14921490sizeof (ValueHistoryEntry ));
14931491
14941492dlist_push_head (& variable -> data ,& historyEntry -> node );
@@ -1816,15 +1814,15 @@ pushChangesStack(void)
18161814changesStackContext = AllocSetContextCreate (ModuleContext ,
18171815PGV_MCXT_STACK ,
18181816ALLOCSET_START_SMALL_SIZES );
1819-
1817+ Assert ( changesStackContext );
18201818oldcxt = MemoryContextSwitchTo (changesStackContext );
18211819
18221820if (!changesStack )
18231821{
18241822changesStack = palloc0 (sizeof (dlist_head ));
18251823dlist_init (changesStack );
18261824}
1827-
1825+ Assert ( changesStack );
18281826csn = palloc0 (sizeof (ChangesStackNode ));
18291827csn -> changedVarsList = palloc0 (sizeof (dlist_head ));
18301828csn -> changedPacksList = palloc0 (sizeof (dlist_head ));
@@ -1841,13 +1839,11 @@ pushChangesStack(void)
18411839}
18421840
18431841/*
1844- *Add apackage to list of created or removed packs in current transaction level
1842+ *Create achangesStack with the required depth.
18451843 */
18461844static void
1847- addToChangedPacks ( HashPackageEntry * package )
1845+ prepareChangesStack ( void )
18481846{
1849- ChangesStackNode * csn ;
1850-
18511847if (!changesStack )
18521848{
18531849int level = GetCurrentTransactionNestLevel ();
@@ -1857,11 +1853,18 @@ addToChangedPacks(HashPackageEntry *package)
18571853pushChangesStack ();
18581854}
18591855}
1856+ }
18601857
1861- Assert (changesStack && changesStackContext );
1862-
1858+ /*
1859+ * Add a package to list of created or removed packs in current transaction level
1860+ */
1861+ static void
1862+ addToChangedPacks (HashPackageEntry * package )
1863+ {
1864+ prepareChangesStack ();
18631865if (!isPackChangedInCurrentTrans (package ))
18641866{
1867+ ChangesStackNode * csn ;
18651868ChangedPacksNode * cpn ;
18661869
18671870csn = get_actual_changes_list ();
@@ -1879,22 +1882,10 @@ addToChangedPacks(HashPackageEntry *package)
18791882static void
18801883addToChangedVars (HashPackageEntry * package ,HashVariableEntry * variable )
18811884{
1882- ChangesStackNode * csn ;
1883-
1884- if (!changesStack )
1885- {
1886- int level = GetCurrentTransactionNestLevel ();
1887-
1888- while (level -- > 0 )
1889- {
1890- pushChangesStack ();
1891- }
1892- }
1893-
1894- Assert (changesStack && changesStackContext );
1895-
1885+ prepareChangesStack ();
18961886if (!isVarChangedInCurrentTrans (variable ))
18971887{
1888+ ChangesStackNode * csn ;
18981889ChangedVarsNode * cvn ;
18991890
19001891csn = get_actual_changes_list ();
@@ -1955,7 +1946,7 @@ typedef enum Action
19551946 * apply corresponding action on them
19561947 */
19571948static void
1958- proceedChanges (Action action )
1949+ processChanges (Action action )
19591950{
19601951
19611952ChangesStackNode * bottom_list ;
@@ -2093,10 +2084,10 @@ pgvSubTransCallback(SubXactEvent event, SubTransactionId mySubid,
20932084pushChangesStack ();
20942085break ;
20952086case SUBXACT_EVENT_COMMIT_SUB :
2096- proceedChanges (RELEASE_SAVEPOINT );
2087+ processChanges (RELEASE_SAVEPOINT );
20972088break ;
20982089case SUBXACT_EVENT_ABORT_SUB :
2099- proceedChanges (ROLLBACK_TO_SAVEPOINT );
2090+ processChanges (ROLLBACK_TO_SAVEPOINT );
21002091break ;
21012092case SUBXACT_EVENT_PRE_COMMIT_SUB :
21022093break ;
@@ -2115,16 +2106,16 @@ pgvTransCallback(XactEvent event, void *arg)
21152106switch (event )
21162107{
21172108case XACT_EVENT_PRE_COMMIT :
2118- proceedChanges (RELEASE_SAVEPOINT );
2109+ processChanges (RELEASE_SAVEPOINT );
21192110break ;
21202111case XACT_EVENT_ABORT :
2121- proceedChanges (ROLLBACK_TO_SAVEPOINT );
2112+ processChanges (ROLLBACK_TO_SAVEPOINT );
21222113break ;
21232114case XACT_EVENT_PARALLEL_PRE_COMMIT :
2124- proceedChanges (RELEASE_SAVEPOINT );
2115+ processChanges (RELEASE_SAVEPOINT );
21252116break ;
21262117case XACT_EVENT_PARALLEL_ABORT :
2127- proceedChanges (ROLLBACK_TO_SAVEPOINT );
2118+ processChanges (ROLLBACK_TO_SAVEPOINT );
21282119break ;
21292120default :
21302121break ;