@@ -113,7 +113,10 @@ static MemoryContext changesStackContext = NULL;
113113 AssertMacro(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,
157160 scalar -> is_null = is_null ;
158161 if (!scalar -> is_null )
159162 {
160- oldcxt = MemoryContextSwitchTo (is_transactional ?
161- package -> hctxTransact :
162- package -> hctxRegular );
163+ oldcxt = MemoryContextSwitchTo (pack_hctx (package , is_transactional ));
163164 scalar -> value = datumCopy (value , scalar -> typbyval , scalar -> typlen );
164165 MemoryContextSwitchTo (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 }
363363 else
364364 check_attributes (variable , tupdesc );
@@ -1025,12 +1025,13 @@ get_packages_and_variables(PG_FUNCTION_ARGS)
10251025 {
10261026 HashVariableEntry * variable ;
10271027 HASH_SEQ_STATUS vstat ;
1028+ int i ;
10281029
10291030 /* Skip packages marked as deleted */
10301031 if (!get_actual_pack_state (package )-> is_valid )
10311032 continue ;
10321033 /* Get variables list for package */
1033- for ( int i = 0 ; i < 2 ; i ++ )
1034+ for ( i = 0 ; i < 2 ; i ++ )
10341035 {
10351036 hash_seq_init (& vstat , i ? package -> varHashTransact :
10361037 package -> varHashRegular );
@@ -1268,7 +1269,7 @@ makePackHTAB(HashPackageEntry *package, bool is_trans)
12681269 package -> hctxRegular = AllocSetContextCreate (ModuleContext ,
12691270 PGV_MCXT_VARS ,
12701271 ALLOCSET_DEFAULT_SIZES );
1271- sprintf (hash_name , "%s variables hash for package \"%s\"" ,
1272+ snprintf (hash_name , BUFSIZ , "%s variables hash for package \"%s\"" ,
12721273 is_trans ? "Transactional" : "Regular" , key );
12731274 ctl .keysize = NAMEDATALEN ;
12741275 ctl .entrysize = sizeof (HashVariableEntry );
@@ -1447,9 +1448,8 @@ createVariableInternal(HashPackageEntry *package, text *name, Oid typid,
14471448 errmsg ("variable \"%s\" already created as %sTRANSACTIONAL" ,
14481449 key , 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 ),
14531453 key , HASH_ENTER , & found );
14541454
14551455 /* Check variable type */
@@ -1486,9 +1486,7 @@ createVariableInternal(HashPackageEntry *package, text *name, Oid typid,
14861486 variable -> typid = typid ;
14871487 variable -> is_transactional = is_transactional ;
14881488 dlist_init (& variable -> data );
1489- historyEntry = MemoryContextAllocZero (is_transactional ?
1490- package -> hctxTransact :
1491- package -> hctxRegular ,
1489+ historyEntry = MemoryContextAllocZero (pack_hctx (package , is_transactional ),
14921490 sizeof (ValueHistoryEntry ));
14931491
14941492 dlist_push_head (& variable -> data , & historyEntry -> node );
@@ -1816,15 +1814,15 @@ pushChangesStack(void)
18161814 changesStackContext = AllocSetContextCreate (ModuleContext ,
18171815 PGV_MCXT_STACK ,
18181816 ALLOCSET_START_SMALL_SIZES );
1819-
1817+ Assert ( changesStackContext );
18201818 oldcxt = MemoryContextSwitchTo (changesStackContext );
18211819
18221820 if (!changesStack )
18231821 {
18241822 changesStack = palloc0 (sizeof (dlist_head ));
18251823 dlist_init (changesStack );
18261824 }
1827-
1825+ Assert ( changesStack );
18281826 csn = palloc0 (sizeof (ChangesStackNode ));
18291827 csn -> changedVarsList = palloc0 (sizeof (dlist_head ));
18301828 csn -> changedPacksList = palloc0 (sizeof (dlist_head ));
@@ -1841,13 +1839,11 @@ pushChangesStack(void)
18411839}
18421840
18431841/*
1844- * Add a package to list of created or removed packs in current transaction level
1842+ * Create a changesStack with the required depth.
18451843 */
18461844static void
1847- addToChangedPacks ( HashPackageEntry * package )
1845+ prepareChangesStack ( void )
18481846{
1849- ChangesStackNode * csn ;
1850-
18511847 if (!changesStack )
18521848 {
18531849 int level = GetCurrentTransactionNestLevel ();
@@ -1857,11 +1853,18 @@ addToChangedPacks(HashPackageEntry *package)
18571853 pushChangesStack ();
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 ();
18631865 if (!isPackChangedInCurrentTrans (package ))
18641866 {
1867+ ChangesStackNode * csn ;
18651868 ChangedPacksNode * cpn ;
18661869
18671870 csn = 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 ();
18961886 if (!isVarChangedInCurrentTrans (variable ))
18971887 {
1888+ ChangesStackNode * csn ;
18981889 ChangedVarsNode * cvn ;
18991890
19001891 csn = 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
19611952 ChangesStackNode * bottom_list ;
@@ -2093,10 +2084,10 @@ pgvSubTransCallback(SubXactEvent event, SubTransactionId mySubid,
20932084 pushChangesStack ();
20942085 break ;
20952086 case SUBXACT_EVENT_COMMIT_SUB :
2096- proceedChanges (RELEASE_SAVEPOINT );
2087+ processChanges (RELEASE_SAVEPOINT );
20972088 break ;
20982089 case SUBXACT_EVENT_ABORT_SUB :
2099- proceedChanges (ROLLBACK_TO_SAVEPOINT );
2090+ processChanges (ROLLBACK_TO_SAVEPOINT );
21002091 break ;
21012092 case SUBXACT_EVENT_PRE_COMMIT_SUB :
21022093 break ;
@@ -2115,16 +2106,16 @@ pgvTransCallback(XactEvent event, void *arg)
21152106 switch (event )
21162107 {
21172108 case XACT_EVENT_PRE_COMMIT :
2118- proceedChanges (RELEASE_SAVEPOINT );
2109+ processChanges (RELEASE_SAVEPOINT );
21192110 break ;
21202111 case XACT_EVENT_ABORT :
2121- proceedChanges (ROLLBACK_TO_SAVEPOINT );
2112+ processChanges (ROLLBACK_TO_SAVEPOINT );
21222113 break ;
21232114 case XACT_EVENT_PARALLEL_PRE_COMMIT :
2124- proceedChanges (RELEASE_SAVEPOINT );
2115+ processChanges (RELEASE_SAVEPOINT );
21252116 break ;
21262117 case XACT_EVENT_PARALLEL_ABORT :
2127- proceedChanges (ROLLBACK_TO_SAVEPOINT );
2118+ processChanges (ROLLBACK_TO_SAVEPOINT );
21282119 break ;
21292120 default :
21302121 break ;
0 commit comments