@@ -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 * transObj , 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 ;
@@ -1939,33 +1939,40 @@ addToChangesStack(TransObject *transObj, TransObjectType type)
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