Changeset: aa9d7c8f996c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/aa9d7c8f996c
Modified Files:
        sql/storage/store.c
Branch: iso
Log Message:

Don't propagate predicates to the parent on rollback, also check for allocation 
failures


diffs (85 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3328,16 +3328,18 @@ sql_trans_copy_column( sql_trans *tr, sq
        return res;
 }
 
-static void
+static int
 clean_predicates_and_propagate_to_parent(sql_trans *tr)
 {
+       int res = LOG_OK;
+
        if (!list_empty(tr->predicates)) {
                if (tr->parent) { /* propagate to the parent */
-                       for(node *n=tr->predicates->h; n ; n = n->next) {
+                       for(node *n=tr->predicates->h; n && res == LOG_OK ; n = 
n->next) {
                                pl *p = (pl*) n->data;
                                atom *e1 = p->r ? atom_dup(NULL, p->r) : NULL, 
*e2 = p->f ? atom_dup(NULL, p->f) : NULL;
 
-                               sql_trans_add_predicate(tr->parent, p->c, 
p->cmp, e1, e2, p->anti, p->semantics);
+                               res = sql_trans_add_predicate(tr->parent, p->c, 
p->cmp, e1, e2, p->anti, p->semantics);
                        }
                }
                list_destroy(tr->predicates);
@@ -3345,9 +3347,9 @@ clean_predicates_and_propagate_to_parent
        }
        if (!list_empty(tr->dependencies)) {
                if (tr->parent) { /* propagate to the parent */
-                       for(node *n=tr->dependencies->h; n ; n = n->next) {
+                       for(node *n=tr->dependencies->h; n && res == LOG_OK ; n 
= n->next) {
                                sql_dependency_change *dp = 
(sql_dependency_change*)n->data;
-                               sql_trans_add_dependency(tr->parent, dp->objid, 
dp->type);
+                               res = sql_trans_add_dependency(tr->parent, 
dp->objid, dp->type);
                        }
                }
                list_destroy(tr->dependencies);
@@ -3355,14 +3357,15 @@ clean_predicates_and_propagate_to_parent
        }
        if (!list_empty(tr->depchanges)) {
                if (tr->parent) { /* propagate to the parent */
-                       for(node *n=tr->depchanges->h; n ; n = n->next) {
+                       for(node *n=tr->depchanges->h; n && res == LOG_OK ; n = 
n->next) {
                                sql_dependency_change *dp = 
(sql_dependency_change*)n->data;
-                               sql_trans_add_dependency_change(tr->parent, 
dp->objid, dp->type);
+                               res = 
sql_trans_add_dependency_change(tr->parent, dp->objid, dp->type);
                        }
                }
                list_destroy(tr->depchanges);
                tr->depchanges = NULL;
        }
+       return res;
 }
 
 static void
@@ -3457,7 +3460,18 @@ sql_trans_rollback(sql_trans *tr)
                }
        }
 
-       clean_predicates_and_propagate_to_parent(tr);
+       if (!list_empty(tr->predicates)) {
+               list_destroy(tr->predicates);
+               tr->predicates = NULL;
+       }
+       if (!list_empty(tr->dependencies)) {
+               list_destroy(tr->dependencies);
+               tr->dependencies = NULL;
+       }
+       if (!list_empty(tr->depchanges)) {
+               list_destroy(tr->depchanges);
+               tr->depchanges = NULL;
+       }
 }
 
 sql_trans *
@@ -3804,7 +3818,8 @@ sql_trans_commit(sql_trans *tr)
        }
        tr->localtmps.nelm = NULL;
 
-       clean_predicates_and_propagate_to_parent(tr);
+       if (ok == LOG_OK)
+               ok = clean_predicates_and_propagate_to_parent(tr);
        return (ok==LOG_OK)?SQL_OK:SQL_ERR;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to