@@ -2532,6 +2532,46 @@ typedef enum Action
25322532ROLLBACK_TO_SAVEPOINT
25332533}Action ;
25342534
2535+ /*
2536+ * Apply savepoint actions on list of variables or packages.
2537+ */
2538+ static void
2539+ applyAction (Action action ,TransObjectType type ,dlist_head * list )
2540+ {
2541+ dlist_iter iter ;
2542+
2543+ dlist_foreach (iter ,list )
2544+ {
2545+ ChangedObject * co = dlist_container (ChangedObject ,node ,iter .cur );
2546+ TransObject * object = co -> object ;
2547+
2548+ switch (action )
2549+ {
2550+ case ROLLBACK_TO_SAVEPOINT :
2551+ rollbackSavepoint (object ,type );
2552+ break ;
2553+ case RELEASE_SAVEPOINT :
2554+
2555+ /*
2556+ * If package was removed in current transaction level mark
2557+ * var as removed. We do not check pack_state->level, because
2558+ * var cannot get in list of changes until pack is removed.
2559+ */
2560+ if (type == TRANS_VARIABLE )
2561+ {
2562+ Variable * variable = (Variable * )object ;
2563+ Package * package = variable -> package ;
2564+
2565+ if (!GetActualState (package )-> is_valid )
2566+ GetActualState (variable )-> is_valid = false;
2567+ }
2568+
2569+ releaseSavepoint (object ,type );
2570+ break ;
2571+ }
2572+ }
2573+ }
2574+
25352575/*
25362576 * Iterate variables and packages from list of changes and
25372577 * apply corresponding action on them
@@ -2540,53 +2580,14 @@ static void
25402580processChanges (Action action )
25412581{
25422582ChangesStackNode * bottom_list ;
2543- int i ;
25442583
25452584Assert (changesStack && changesStackContext );
25462585/* List removed from stack but we still can use it */
25472586bottom_list = dlist_container (ChangesStackNode ,node ,
25482587dlist_pop_head_node (changesStack ));
25492588
2550- /*
2551- * i: 1 - manage variables 0 - manage packages
2552- */
2553- for (i = 1 ;i > -1 ;i -- )
2554- {
2555- dlist_iter iter ;
2556-
2557- dlist_foreach (iter ,i ?bottom_list -> changedVarsList :
2558- bottom_list -> changedPacksList )
2559- {
2560- ChangedObject * co = dlist_container (ChangedObject ,node ,iter .cur );
2561- TransObject * object = co -> object ;
2562-
2563- switch (action )
2564- {
2565- case ROLLBACK_TO_SAVEPOINT :
2566- rollbackSavepoint (object ,i ?TRANS_VARIABLE :TRANS_PACKAGE );
2567- break ;
2568- case RELEASE_SAVEPOINT :
2569-
2570- /*
2571- * If package was removed in current transaction level
2572- * mark var as removed. We do not check pack_state->level,
2573- * because var cannot get in list of changes until pack is
2574- * removed.
2575- */
2576- if (i )
2577- {
2578- Variable * variable = (Variable * )object ;
2579- Package * package = variable -> package ;
2580-
2581- if (!GetActualState (package )-> is_valid )
2582- GetActualState (variable )-> is_valid = false;
2583- }
2584-
2585- releaseSavepoint (object ,i ?TRANS_VARIABLE :TRANS_PACKAGE );
2586- break ;
2587- }
2588- }
2589- }
2589+ applyAction (action ,TRANS_VARIABLE ,bottom_list -> changedVarsList );
2590+ applyAction (action ,TRANS_PACKAGE ,bottom_list -> changedPacksList );
25902591
25912592/* Remove changes list of current level */
25922593MemoryContextDelete (bottom_list -> ctx );