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