@@ -77,6 +77,7 @@ static HashVariableEntry *createVariableInternal(HashPackageEntry *package,
7777bool is_transactional );
7878static void createSavepoint (HashPackageEntry * package ,HashVariableEntry * variable );
7979static bool isVarChangedInCurrentTrans (HashVariableEntry * variable );
80+ static bool isVarChangedInUpperTrans (HashVariableEntry * variable );
8081static void addToChangedVars (HashPackageEntry * package ,HashVariableEntry * variable );
8182
8283#define CHECK_ARGS_FOR_NULL () \
@@ -1768,6 +1769,10 @@ releaseSavepoint(HashVariableEntry *variable)
17681769dlist_delete (nodeToDelete );
17691770pfree (historyEntryToDelete );
17701771}
1772+ /*
1773+ * If variable was changed in subtransaction, so it is considered it
1774+ * was changed in parent transaction.
1775+ */
17711776(get_actual_value (variable )-> level )-- ;
17721777}
17731778
@@ -1819,8 +1824,7 @@ isVarChangedInUpperTrans(HashVariableEntry *variable)
18191824var_prev_state = get_history_entry (var_state -> node .next );
18201825return (var_prev_state -> level == (GetCurrentTransactionNestLevel ()- 1 ));
18211826}
1822- else
1823- return false;
1827+ return false;
18241828}
18251829
18261830/*
@@ -1901,12 +1905,12 @@ popChangedVarsStack()
19011905{
19021906if (changedVarsStack )
19031907{
1904- ChangedVarsStackNode * cvse ;
1908+ ChangedVarsStackNode * cvsn ;
19051909
19061910Assert (!dlist_is_empty (changedVarsStack ));
1907- cvse = dlist_container (ChangedVarsStackNode ,node ,
1911+ cvsn = dlist_container (ChangedVarsStackNode ,node ,
19081912dlist_pop_head_node (changedVarsStack ));
1909- MemoryContextDelete (cvse -> ctx );
1913+ MemoryContextDelete (cvsn -> ctx );
19101914if (dlist_is_empty (changedVarsStack ))
19111915{
19121916MemoryContextDelete (changedVarsContext );
@@ -1916,6 +1920,20 @@ popChangedVarsStack()
19161920}
19171921}
19181922
1923+ /*
1924+ * Initialize an instance of ChangedVarsNode datatype
1925+ */
1926+ static inline ChangedVarsNode *
1927+ initChangedVarsNode (MemoryContext ctx ,HashPackageEntry * package ,HashVariableEntry * variable )
1928+ {
1929+ ChangedVarsNode * cvn ;
1930+
1931+ cvn = MemoryContextAllocZero (ctx ,sizeof (ChangedVarsNode ));
1932+ cvn -> package = package ;
1933+ cvn -> variable = variable ;
1934+ return cvn ;
1935+ }
1936+
19191937/*
19201938 * Add a variable to list of changed vars in current transaction level
19211939 */
@@ -1941,16 +1959,14 @@ addToChangedVars(HashPackageEntry *package, HashVariableEntry *variable)
19411959ChangedVarsNode * cvn ;
19421960
19431961cvsn = dlist_head_element (ChangedVarsStackNode ,node ,changedVarsStack );
1944- cvn = MemoryContextAllocZero (cvsn -> ctx ,sizeof (ChangedVarsNode ));
1945- cvn -> package = package ;
1946- cvn -> variable = variable ;
1962+ cvn = initChangedVarsNode (cvsn -> ctx ,package ,variable );
19471963dlist_push_head (cvsn -> changedVarsList ,& cvn -> node );
19481964get_actual_value (cvn -> variable )-> level = GetCurrentTransactionNestLevel ();
19491965}
19501966}
19511967
19521968/*
1953- * If variable waschenged in some subtransaction, it is considered that it was
1969+ * If variable waschanged in some subtransaction, it is considered that it was
19541970 * changed in parent transaction. So it is important to add this variable to
19551971 * list of changes of parent transaction. But if var was already changed in
19561972 * upper level, it has savepoint there, so we need to release it.
@@ -1984,9 +2000,7 @@ levelUpOrRelease()
19842000 * it was created in another context
19852001 */
19862002cvsn = dlist_head_element (ChangedVarsStackNode ,node ,changedVarsStack );
1987- cvn_new = MemoryContextAllocZero (cvsn -> ctx ,sizeof (ChangedVarsNode ));
1988- cvn_new -> package = cvn_old -> package ;
1989- cvn_new -> variable = cvn_old -> variable ;
2003+ cvn_new = initChangedVarsNode (cvsn -> ctx ,cvn_old -> package ,cvn_old -> variable );
19902004dlist_push_head (cvsn -> changedVarsList ,& cvn_new -> node );
19912005(get_actual_value (cvn_new -> variable )-> level )-- ;
19922006}