@@ -73,7 +73,7 @@ static bool isObjectChangedInUpperTrans(TransObject *object);
73
73
74
74
static void addToChangesStack (TransObject * object , TransObjectType type );
75
75
static void pushChangesStack (void );
76
- static void removeFromChangedVars ( Package * package );
76
+ static void removeFromChangesStack ( TransObject * object , TransObjectType type );
77
77
78
78
/* Constructors */
79
79
static void makePackHTAB (Package * package , bool is_trans );
@@ -1658,16 +1658,16 @@ removeObject(TransObject *object, TransObjectType type)
1658
1658
bool found ;
1659
1659
HTAB * hash ;
1660
1660
1661
+ /*
1662
+ * Delete an object from the change history of the overlying
1663
+ * transaction level (head of 'changesStack' at this point).
1664
+ */
1665
+ if (!dlist_is_empty (changesStack ))
1666
+ removeFromChangesStack (object , type );
1661
1667
if (type == TRANS_PACKAGE )
1662
1668
{
1663
1669
Package * package = (Package * ) object ;
1664
1670
1665
- /*
1666
- * Delete a variable from the change history of the overlying
1667
- * transaction level (head of 'changesStack' at this point)
1668
- */
1669
- if (!dlist_is_empty (changesStack ))
1670
- removeFromChangedVars (package );
1671
1671
/* Regular variables had already removed */
1672
1672
MemoryContextDelete (package -> hctxTransact );
1673
1673
hash = packagesHash ;
@@ -1691,24 +1691,24 @@ removeObject(TransObject *object, TransObjectType type)
1691
1691
* Create a new state of object
1692
1692
*/
1693
1693
static void
1694
- createSavepoint (TransObject * transObj , TransObjectType type )
1694
+ createSavepoint (TransObject * object , TransObjectType type )
1695
1695
{
1696
1696
TransState * newState ,
1697
1697
* prevState ;
1698
1698
1699
- prevState = GetActualState (transObj );
1699
+ prevState = GetActualState (object );
1700
1700
if (type == TRANS_PACKAGE )
1701
1701
newState = (TransState * ) MemoryContextAllocZero (ModuleContext ,
1702
1702
sizeof (PackState ));
1703
1703
else
1704
1704
{
1705
- Variable * var = (Variable * ) transObj ;
1705
+ Variable * var = (Variable * ) object ;
1706
1706
1707
1707
newState = (TransState * ) MemoryContextAllocZero (var -> package -> hctxTransact ,
1708
1708
sizeof (VarState ));
1709
1709
copyValue ((VarState * ) prevState , (VarState * ) newState , var );
1710
1710
}
1711
- dlist_push_head (& transObj -> states , & newState -> node );
1711
+ dlist_push_head (& object -> states , & newState -> node );
1712
1712
newState -> is_valid = prevState -> is_valid ;
1713
1713
}
1714
1714
@@ -1809,14 +1809,14 @@ releaseSavepoint(TransObject *object, TransObjectType type)
1809
1809
* Check if object was changed in current transaction level
1810
1810
*/
1811
1811
static bool
1812
- isObjectChangedInCurrentTrans (TransObject * transObj )
1812
+ isObjectChangedInCurrentTrans (TransObject * object )
1813
1813
{
1814
1814
TransState * state ;
1815
1815
1816
1816
if (!changesStack )
1817
1817
return false;
1818
1818
1819
- state = GetActualState (transObj );
1819
+ state = GetActualState (object );
1820
1820
return state -> level == GetCurrentTransactionNestLevel ();
1821
1821
}
1822
1822
@@ -1916,56 +1916,63 @@ makeChangedObject(TransObject *object, MemoryContext ctx)
1916
1916
* in current transaction level
1917
1917
*/
1918
1918
static void
1919
- addToChangesStack (TransObject * transObj , TransObjectType type )
1919
+ addToChangesStack (TransObject * object , TransObjectType type )
1920
1920
{
1921
1921
prepareChangesStack ();
1922
1922
1923
- if (!isObjectChangedInCurrentTrans (transObj ))
1923
+ if (!isObjectChangedInCurrentTrans (object ))
1924
1924
{
1925
1925
ChangesStackNode * csn ;
1926
1926
ChangedObject * co ;
1927
1927
1928
1928
csn = get_actual_changes_list ();
1929
- co = makeChangedObject (transObj , csn -> ctx );
1929
+ co = makeChangedObject (object , csn -> ctx );
1930
1930
dlist_push_head (type == TRANS_PACKAGE ? csn -> changedPacksList :
1931
1931
csn -> changedVarsList , & co -> node );
1932
1932
1933
1933
/* Give this object current subxact level */
1934
- GetActualState (transObj )-> level = GetCurrentTransactionNestLevel ();
1934
+ GetActualState (object )-> level = GetCurrentTransactionNestLevel ();
1935
1935
}
1936
1936
}
1937
1937
1938
1938
/*
1939
1939
* Remove from the changes list a deleted package
1940
1940
*/
1941
1941
static void
1942
- removeFromChangedVars ( Package * package )
1942
+ removeFromChangesStack ( TransObject * object , TransObjectType type )
1943
1943
{
1944
1944
dlist_mutable_iter var_miter ,
1945
- pack_miter ;
1946
- dlist_head * changedVarsList ,
1947
- * changedPacksList ;
1945
+ pack_miter ;
1946
+ dlist_head * changesList ;
1947
+ ChangesStackNode * csn = get_actual_changes_list () ;
1948
1948
1949
- /* First remove corresponding variables from changedVarsList */
1950
- changedVarsList = get_actual_changes_list ()-> changedVarsList ;
1951
- dlist_foreach_modify (var_miter , changedVarsList )
1949
+ /*
1950
+ * If we remove package, we should remove corresponding variables
1951
+ * from changedVarsList first.
1952
+ */
1953
+ if (type == TRANS_PACKAGE )
1952
1954
{
1953
- ChangedObject * co_cur = dlist_container (ChangedObject , node ,
1954
- var_miter .cur );
1955
- Variable * var = (Variable * ) co_cur -> object ;
1955
+ changesList = csn -> changedVarsList ;
1956
+ dlist_foreach_modify (var_miter , changesList )
1957
+ {
1958
+ ChangedObject * co_cur = dlist_container (ChangedObject , node ,
1959
+ var_miter .cur );
1960
+ Variable * var = (Variable * ) co_cur -> object ;
1956
1961
1957
- if (var -> package == package )
1958
- dlist_delete (& co_cur -> node );
1962
+ if (var -> package == (Package * )object )
1963
+ dlist_delete (& co_cur -> node );
1964
+ }
1959
1965
}
1960
- /* Now remove package itself from changedPacksList */
1961
- changedPacksList = get_actual_changes_list ()-> changedPacksList ;
1962
- dlist_foreach_modify (pack_miter , changedPacksList )
1966
+ /* Now remove object itself from changes list */
1967
+ changesList = (type == TRANS_PACKAGE ? csn -> changedPacksList :
1968
+ csn -> changedVarsList );
1969
+ dlist_foreach_modify (pack_miter , changesList )
1963
1970
{
1964
1971
ChangedObject * co_cur = dlist_container (ChangedObject , node ,
1965
1972
pack_miter .cur );
1966
- Package * pack = ( Package * ) co_cur -> object ;
1973
+ TransObject * obj = co_cur -> object ;
1967
1974
1968
- if (pack == package )
1975
+ if (obj == object )
1969
1976
{
1970
1977
dlist_delete (& co_cur -> node );
1971
1978
break ;
0 commit comments