Changeset: a4c157940282 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a4c157940282
Modified Files:
        sql/include/sql_catalog.h
        sql/storage/objlist.c
        sql/storage/store.c
Branch: Jul2021
Log Message:

more leak fixing


diffs (truncated from 402 to 300 lines):

diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -196,6 +196,7 @@ typedef enum commit_action_t {
 } ca_t;
 
 typedef int sqlid;
+typedef void *sql_store;
 
 typedef struct sql_base {
        int flags;                      /* todo change into bool new */
@@ -224,10 +225,9 @@ typedef struct changeset {
 typedef struct objlist {
        list *l;
        sql_hash *h;
+       sql_store store;
 } objlist;
 
-typedef void *sql_store;
-
 struct sql_trans;
 struct sql_change;
 struct objectset;
@@ -262,7 +262,7 @@ extern void os_iterator(struct os_iter *
 extern sql_base *oi_next(struct os_iter *oi);
 extern bool os_obj_intransaction(struct objectset *os, struct sql_trans *tr, 
sql_base *b);
 
-extern objlist *ol_new(sql_allocator *sa, destroy_fptr destroy);
+extern objlist *ol_new(sql_allocator *sa, destroy_fptr destroy, sql_store 
store);
 extern void ol_destroy(objlist *ol, sql_store store);
 extern int ol_add(objlist *ol, sql_base *data);
 extern void ol_del(objlist *ol, sql_store store, node *data);
diff --git a/sql/storage/objlist.c b/sql/storage/objlist.c
--- a/sql/storage/objlist.c
+++ b/sql/storage/objlist.c
@@ -20,12 +20,13 @@ node_key( node *n )
 }
 
 objlist *
-ol_new(sql_allocator *sa, destroy_fptr destroy)
+ol_new(sql_allocator *sa, destroy_fptr destroy, sql_store store)
 {
        objlist *ol = SA_NEW(sa, objlist);
        *ol = (objlist) {
                .l = list_new(sa, (fdestroy)destroy),
-               .h = hash_new(sa, 16, (fkeyvalue)&node_key)
+               .h = hash_new(sa, 16, (fkeyvalue)&node_key),
+               .store = store
        };
        return ol;
 }
@@ -44,8 +45,11 @@ int
 ol_add(objlist *ol, sql_base *data)
 {
        list *l = list_append(ol->l, data);
-       if (!l)
+       if (!l) {
+               if (ol->l->destroy)
+                       ol->l->destroy(ol->store, data);
                return -1;
+       }
        node *n = l->t;
        assert(n->data == data);
        int sz = list_length(ol->l);
@@ -54,10 +58,12 @@ ol_add(objlist *ol, sql_base *data)
                ol->h = hash_new(ol->l->sa, 4*sz, (fkeyvalue)&node_key);
                for (node *n = ol->l->h; n; n = n->next) {
                        if (hash_add(ol->h, base_key(n->data), n) == NULL)
+                               /* No need too clean, ie expect a full 
transaction rollback */
                                return -1;
                }
        } else {
                if (hash_add(ol->h, base_key(data), n) == NULL)
+                       /* No need too clean, ie expect a full transaction 
rollback */
                        return -1;
        }
        return 0;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -666,10 +666,10 @@ load_table(sql_trans *tr, sql_schema *s,
        t->s = s;
        t->sz = COLSIZE;
 
-       t->columns = ol_new(tr->sa, (destroy_fptr) &column_destroy);
-       t->idxs = ol_new(tr->sa, (destroy_fptr) &idx_destroy);
-       t->keys = ol_new(tr->sa, (destroy_fptr) &key_destroy);
-       t->triggers = ol_new(tr->sa, (destroy_fptr) &trigger_destroy);
+       t->columns = ol_new(tr->sa, (destroy_fptr) &column_destroy, store);
+       t->idxs = ol_new(tr->sa, (destroy_fptr) &idx_destroy, store);
+       t->keys = ol_new(tr->sa, (destroy_fptr) &key_destroy, store);
+       t->triggers = ol_new(tr->sa, (destroy_fptr) &trigger_destroy, store);
        if (isMergeTable(t) || isReplicaTable(t))
                t->members = list_new(tr->sa, (fdestroy) &part_destroy);
 
@@ -709,7 +709,10 @@ load_table(sql_trans *tr, sql_schema *s,
                sql_column* next = load_column(tr, t, rid);
                if (next == NULL)
                        return NULL;
-               ol_add(t->columns, &next->base);
+               if (ol_add(t->columns, &next->base)) {
+                       table_destroy(store, t);
+                       return NULL;
+               }
                if (pcolid == next->base.id) {
                        t->part.pcol = next;
                }
@@ -724,8 +727,8 @@ load_table(sql_trans *tr, sql_schema *s,
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                sql_idx *i = load_idx(tr, t, rid);
 
-               ol_add(t->idxs, &i->base);
-               if (os_add(s->idxs, tr, i->base.name, dup_base(&i->base))) {
+               if (ol_add(t->idxs, &i->base) ||
+                   os_add(s->idxs, tr, i->base.name, dup_base(&i->base))) {
                        table_destroy(store, t);
                        store->table_api.rids_destroy(rs);
                        return NULL;
@@ -738,8 +741,8 @@ load_table(sql_trans *tr, sql_schema *s,
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                sql_key *k = load_key(tr, t, rid);
 
-               ol_add(t->keys, &k->base);
-               if (os_add(s->keys, tr, k->base.name, dup_base(&k->base)) ||
+               if (ol_add(t->keys, &k->base) ||
+                   os_add(s->keys, tr, k->base.name, dup_base(&k->base)) ||
                        os_add(tr->cat->objects, tr, k->base.name, 
dup_base(&k->base))) {
                        table_destroy(store, t);
                        store->table_api.rids_destroy(rs);
@@ -753,8 +756,8 @@ load_table(sql_trans *tr, sql_schema *s,
        for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid = 
store->table_api.rids_next(rs)) {
                sql_trigger *k = load_trigger(tr, t, rid);
 
-               ol_add(t->triggers, &k->base);
-               if (os_add(s->triggers, tr, k->base.name, dup_base(&k->base))) {
+               if (ol_add(t->triggers, &k->base) ||
+                   os_add(s->triggers, tr, k->base.name, dup_base(&k->base))) {
                        table_destroy(store, t);
                        store->table_api.rids_destroy(rs);
                }
@@ -1334,7 +1337,8 @@ bootstrap_create_column(sql_trans *tr, s
        col->t = t;
        col->unique = 0;
        col->storage_type = NULL;
-       ol_add(t->columns, &col->base);
+       if (ol_add(t->columns, &col->base))
+               return NULL;
 
        if (isTable(col->t))
                store->storage_api.create_col(tr, col);
@@ -1357,10 +1361,10 @@ create_sql_table_with_id(sql_allocator *
        t->commit_action = (ca_t)commit_action;
        t->query = NULL;
        t->access = 0;
-       t->columns = ol_new(sa, (destroy_fptr) &column_destroy);
-       t->idxs = ol_new(sa, (destroy_fptr) &idx_destroy);
-       t->keys = ol_new(sa, (destroy_fptr) &key_destroy);
-       t->triggers = ol_new(sa, (destroy_fptr) &trigger_destroy);
+       t->columns = ol_new(sa, (destroy_fptr) &column_destroy, NULL);
+       t->idxs = ol_new(sa, (destroy_fptr) &idx_destroy, NULL);
+       t->keys = ol_new(sa, (destroy_fptr) &key_destroy, NULL);
+       t->triggers = ol_new(sa, (destroy_fptr) &trigger_destroy, NULL);
        if (isMergeTable(t) || isReplicaTable(t))
                t->members = list_new(sa, (fdestroy) &part_destroy);
        t->pkey = NULL;
@@ -1418,7 +1422,8 @@ dup_sql_column(sql_allocator *sa, sql_ta
                col->storage_type = SA_STRDUP(sa, c->storage_type);
        col->sorted = c->sorted;
        col->dcount = c->dcount;
-       ol_add(t->columns, &col->base);
+       if (ol_add(t->columns, &col->base))
+               return NULL;
        return col;
 }
 
@@ -2777,10 +2782,10 @@ table_dup(sql_trans *tr, sql_table *ot, 
        t->query = (ot->query) ? SA_STRDUP(sa, ot->query) : NULL;
        t->properties = ot->properties;
 
-       t->columns = ol_new(sa, (destroy_fptr) &column_destroy);
-       t->idxs = ol_new(sa, (destroy_fptr) &idx_destroy);
-       t->keys = ol_new(sa, (destroy_fptr) &key_destroy);
-       t->triggers = ol_new(sa, (destroy_fptr) &trigger_destroy);
+       t->columns = ol_new(sa, (destroy_fptr) &column_destroy, store);
+       t->idxs = ol_new(sa, (destroy_fptr) &idx_destroy, store);
+       t->keys = ol_new(sa, (destroy_fptr) &key_destroy, store);
+       t->triggers = ol_new(sa, (destroy_fptr) &trigger_destroy, store);
        if (ot->members)
                t->members = list_new(sa, (fdestroy) &part_destroy);
 
@@ -2945,12 +2950,12 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        sql_table *sysic = find_sql_table(tr, syss, "objects");
        node *n;
        int nr, unique = 0, res = 0;
-       sql_idx *ni = SA_ZNEW(tr->sa, sql_idx);
        sql_table *dup = NULL;
 
        if ((res = new_table(tr, t, &dup)))
                return res;
        t = dup;
+       sql_idx *ni = SA_ZNEW(tr->sa, sql_idx);
        base_init(tr->sa, &ni->base, i->base.id?i->base.id:next_oid(tr->store), 
TR_NEW, i->base.name);
 
        ni->columns = list_new(tr->sa, (fdestroy) &kc_destroy);
@@ -2967,30 +2972,28 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
                if (ic->c->unique != (unique & !okc->c->null))
                        okc->c->unique = ic->c->unique = (unique & 
(!okc->c->null));
 
-               if ((res = store->table_api.table_insert(tr, sysic, 
&ni->base.id, &ic->c->base.name, &nr, ATOMnilptr(TYPE_int))))
+               if ((res = store->table_api.table_insert(tr, sysic, 
&ni->base.id, &ic->c->base.name, &nr, ATOMnilptr(TYPE_int)))) {
+                       idx_destroy(store, ni);
                        return res;
-
-               if ((res = sql_trans_create_dependency(tr, ic->c->base.id, 
ni->base.id, INDEX_DEPENDENCY)))
+               }
+               if ((res = sql_trans_create_dependency(tr, ic->c->base.id, 
ni->base.id, INDEX_DEPENDENCY))) {
+                       idx_destroy(store, ni);
                        return res;
+               }
        }
        if ((res = ol_add(t->idxs, &ni->base)))
                return res;
 
+       if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base))))
+               return res;
+
        if (isDeclaredTable(i->t))
                if (!isDeclaredTable(t) && isTable(ni->t) && 
idx_has_column(ni->type))
-                       if ((res = store->storage_api.create_idx(tr, ni))) {
-                               idx_destroy(store, ni);
+                       if ((res = store->storage_api.create_idx(tr, ni)))
                                return res;
-                       }
        if (!isDeclaredTable(t))
-               if ((res = store->table_api.table_insert(tr, sysidx, 
&ni->base.id, &t->base.id, &ni->type, &ni->base.name))) {
-                       idx_destroy(store, ni);
+               if ((res = store->table_api.table_insert(tr, sysidx, 
&ni->base.id, &t->base.id, &ni->type, &ni->base.name)))
                        return res;
-               }
-
-       if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base)))) 
{
-               return res;
-       }
 
        if (ires)
                *ires = ni;
@@ -3029,26 +3032,28 @@ sql_trans_copy_trigger( sql_trans *tr, s
                sql_kc *okc = n->data, *ic;
 
                list_append(nt->columns, ic = kc_dup(tr, okc, t));
-               if ((res = store->table_api.table_insert(tr, sysic, 
&nt->base.id, &ic->c->base.name, &nr, ATOMnilptr(TYPE_int))))
+               if ((res = store->table_api.table_insert(tr, sysic, 
&nt->base.id, &ic->c->base.name, &nr, ATOMnilptr(TYPE_int)))) {
+                       trigger_destroy(store, nt);
                        return res;
-               if ((res = sql_trans_create_dependency(tr, ic->c->base.id, 
nt->base.id, TRIGGER_DEPENDENCY)))
+               }
+               if ((res = sql_trans_create_dependency(tr, ic->c->base.id, 
nt->base.id, TRIGGER_DEPENDENCY))) {
+                       trigger_destroy(store, nt);
                        return res;
+               }
        }
        if ((res = ol_add(t->triggers, &nt->base)))
                return res;
 
+       if ((res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base))))
+               return res;
+
        if (!isDeclaredTable(t))
                if ((res = store->table_api.table_insert(tr, systr, 
&nt->base.id, &nt->base.name, &t->base.id, &nt->time, &nt->orientation,
                                &nt->event, 
(nt->old_name)?&nt->old_name:&strnil, (nt->new_name)?&nt->new_name:&strnil,
                                (nt->condition)?&nt->condition:&strnil, 
&nt->statement))) {
-                       trigger_destroy(store, nt);
                        return res;
                }
 
-       if ((res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base)))) {
-               return res;
-       }
-
        if (tres)
                *tres = nt;
        return res;
@@ -3181,24 +3186,20 @@ sql_trans_copy_column( sql_trans *tr, sq
 
        if (isDeclaredTable(c->t))
                if (isTable(t))
-                       if ((res = store->storage_api.create_col(tr, col))) {
-                               column_destroy(store, col);
+                       if ((res = store->storage_api.create_col(tr, col)))
                                return res;
-                       }
+
        if (!isDeclaredTable(t)) {
                char *strnil = (char*)ATOMnilptr(TYPE_str);
                if ((res = store->table_api.table_insert(tr, syscolumn, 
&col->base.id, &col->base.name, &col->type.type->sqlname,
                                        &col->type.digits, &col->type.scale, 
&t->base.id,
                                        (col->def) ? &col->def : &strnil, 
&col->null, &col->colnr,
                                        (col->storage_type) ? 
&col->storage_type : &strnil))) {
-                       column_destroy(store, col);
                        return res;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to