@@ -73,7 +73,7 @@ static bool isObjectChangedInUpperTrans(TransObject *object);
7373
7474static void addToChangesStack (TransObject * object ,TransObjectType type );
7575static void pushChangesStack (void );
76- static void removeFromChangedVars ( Package * package );
76+ static void removeFromChangesStack ( TransObject * transObj , TransObjectType type );
7777
7878/* Constructors */
7979static void makePackHTAB (Package * package ,bool is_trans );
@@ -1658,16 +1658,16 @@ removeObject(TransObject *object, TransObjectType type)
16581658bool found ;
16591659HTAB * hash ;
16601660
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 );
16611667if (type == TRANS_PACKAGE )
16621668{
16631669Package * package = (Package * )object ;
16641670
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 );
16711671/* Regular variables had already removed */
16721672MemoryContextDelete (package -> hctxTransact );
16731673hash = packagesHash ;
@@ -1939,33 +1939,40 @@ addToChangesStack(TransObject *transObj, TransObjectType type)
19391939 * Remove from the changes list a deleted package
19401940 */
19411941static void
1942- removeFromChangedVars ( Package * package )
1942+ removeFromChangesStack ( TransObject * object , TransObjectType type )
19431943{
19441944dlist_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 () ;
19481948
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 )
19521954{
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 ;
19561961
1957- if (var -> package == package )
1958- dlist_delete (& co_cur -> node );
1962+ if (var -> package == (Package * )object )
1963+ dlist_delete (& co_cur -> node );
1964+ }
19591965}
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 )
19631970{
19641971ChangedObject * co_cur = dlist_container (ChangedObject ,node ,
19651972pack_miter .cur );
1966- Package * pack = ( Package * ) co_cur -> object ;
1973+ TransObject * obj = co_cur -> object ;
19671974
1968- if (pack == package )
1975+ if (obj == object )
19691976{
19701977dlist_delete (& co_cur -> node );
19711978break ;