Changeset: f031ede634bc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f031ede634bc
Modified Files:
sql/include/sql_catalog.h
sql/storage/objectset.c
sql/storage/store.c
Branch: Jul2021
Log Message:
fixing leaks
diffs (truncated from 442 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
@@ -247,7 +247,7 @@ typedef int (*tc_commit_fptr) (struct sq
typedef int (*tc_cleanup_fptr) (sql_store store, struct sql_change *c, ulng
commit_ts, ulng oldest); /* garbage collection, ie cleanup structures when
possible */
typedef void (*destroy_fptr)(sql_store store, sql_base *b);
-extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool
temporary, bool unique);
+extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool
temporary, bool unique, sql_store store);
extern struct objectset *os_dup(struct objectset *os);
extern void os_destroy(struct objectset *os, sql_store store);
extern int /*ok, error (name existed) and conflict (added before) */
os_add(struct objectset *os, struct sql_trans *tr, const char *name, sql_base
*b);
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -61,6 +61,7 @@ typedef struct objectset {
struct sql_hash *id_map;
bool temporary;
bool unique; /* names are unique */
+ sql_store store;
} objectset;
static int
@@ -614,7 +615,7 @@ tc_commit_objectversion(sql_trans *tr, s
}
objectset *
-os_new(sql_allocator *sa, destroy_fptr destroy, bool temporary, bool unique)
+os_new(sql_allocator *sa, destroy_fptr destroy, bool temporary, bool unique,
sql_store store)
{
objectset *os = SA_NEW(sa, objectset);
*os = (objectset) {
@@ -622,7 +623,8 @@ os_new(sql_allocator *sa, destroy_fptr d
.sa = sa,
.destroy = destroy,
.temporary = temporary,
- .unique = unique
+ .unique = unique,
+ .store = store
};
os->destroy = destroy;
MT_rwlock_init(&os->rw_lock, "sa_readers_lock");
@@ -850,6 +852,8 @@ os_add_(objectset *os, struct sql_trans
ov->os = os;
if ((res = os_add_id_based(os, tr, b->id, ov))) {
+ if (os->destroy)
+ os->destroy(os->store, ov->b);
_DELETE(ov);
return res;
}
@@ -946,6 +950,8 @@ os_del_(objectset *os, struct sql_trans
ov->os = os;
if ((res = os_del_id_based(os, tr, b->id, ov))) {
+ if (os->destroy)
+ os->destroy(os->store, ov->b);
_DELETE(ov);
return res;
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -726,7 +726,6 @@ load_table(sql_trans *tr, sql_schema *s,
ol_add(t->idxs, &i->base);
if (os_add(s->idxs, tr, i->base.name, dup_base(&i->base))) {
- idx_destroy(store, i);
table_destroy(store, t);
store->table_api.rids_destroy(rs);
return NULL;
@@ -742,7 +741,6 @@ load_table(sql_trans *tr, sql_schema *s,
ol_add(t->keys, &k->base);
if (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))) {
- key_destroy(store, k);
table_destroy(store, t);
store->table_api.rids_destroy(rs);
return NULL;
@@ -757,7 +755,6 @@ load_table(sql_trans *tr, sql_schema *s,
ol_add(t->triggers, &k->base);
if (os_add(s->triggers, tr, k->base.name, dup_base(&k->base))) {
- trigger_destroy(store, k);
table_destroy(store, t);
store->table_api.rids_destroy(rs);
}
@@ -1001,14 +998,14 @@ load_schema(sql_trans *tr, oid rid)
s->system = (bit) store->table_api.column_find_bte(tr,
find_sql_column(ss, "system"), rid);
s->owner = store->table_api.column_find_sqlid(tr,
find_sql_column(ss, "owner"), rid);
- s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy,
false, true);
- s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false,
false);
- s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false,
false);
- s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false,
true);
- s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false,
true);
- s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false,
true);
- s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy,
false, true);
- s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false,
false);
+ s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy,
false, true, store);
+ s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false,
false, store);
+ s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false,
false, store);
+ s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false,
true, store);
+ s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false,
true, store);
+ s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false,
true, store);
+ s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy,
false, true, store);
+ s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false,
false, store);
}
TRC_DEBUG(SQL_STORE, "Load schema: %s %d\n", s->base.name, s->base.id);
@@ -1022,7 +1019,6 @@ load_schema(sql_trans *tr, oid rid)
for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid =
store->table_api.rids_next(rs)) {
sql_type *t = load_type(tr, s, rid);
if (os_add(s->types, tr, t->base.name, &t->base)) {
- type_destroy(store, t);
schema_destroy(store, s);
store->table_api.rids_destroy(rs);
return NULL;
@@ -1052,7 +1048,6 @@ load_schema(sql_trans *tr, oid rid)
return NULL;
}
if (os_add(s->tables, tr, t->base.name,
&t->base)) {
- table_destroy(store, t);
schema_destroy(store, s);
return NULL;
}
@@ -1085,7 +1080,6 @@ load_schema(sql_trans *tr, oid rid)
return NULL;
}
if (os_add(s->funcs, tr, f->base.name, &f->base)) {
- func_destroy(store, f);
schema_destroy(store, s);
return NULL;
}
@@ -1104,7 +1098,6 @@ load_schema(sql_trans *tr, oid rid)
if (os_add(s->funcs, tr, f->base.name, &f->base)) {
store->table_api.subrids_destroy(nrs);
store->table_api.rids_destroy(rs);
- func_destroy(store, f);
schema_destroy(store, s);
return NULL;
}
@@ -1120,7 +1113,6 @@ load_schema(sql_trans *tr, oid rid)
for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid =
store->table_api.rids_next(rs)) {
sql_sequence *seq = load_seq(tr, s, rid);
if (os_add(s->seqs, tr, seq->base.name, &seq->base)) {
- seq_destroy(store, seq);
schema_destroy(store, s);
store->table_api.rids_destroy(rs);
return NULL;
@@ -1147,7 +1139,6 @@ load_schema(sql_trans *tr, oid rid)
load_value_partition(tr, syss, pt);
}
if (os_add(s->parts, tr, pt->base.name,
dup_base(&pt->base))) {
- part_destroy(store, pt);
schema_destroy(store, s);
store->table_api.rids_destroy(rs);
return NULL;
@@ -1519,13 +1510,11 @@ bootstrap_create_table(sql_trans *tr, sq
t->base.flags = s->base.flags;
t->query = NULL;
t->s = s;
- if (os_add(s->tables, tr, name, &t->base)) {
+ if (isTable(t) && store->storage_api.create_del(tr, t) != LOG_OK) {
table_destroy(store, t);
return NULL;
}
-
- if (isTable(t) && store->storage_api.create_del(tr, t) != LOG_OK) {
- table_destroy(store, t);
+ if (os_add(s->tables, tr, name, &t->base)) {
return NULL;
}
return t;
@@ -1549,16 +1538,15 @@ bootstrap_create_schema(sql_trans *tr, c
s->auth_id = auth_id;
s->owner = owner;
s->system = TRUE;
- s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, false, true);
- s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, false);
- s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, false);
- s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, true);
- s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, true);
- s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, true);
- s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, false,
true);
- s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, false);
+ s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, false, true,
store);
+ s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, false,
store);
+ s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, false,
store);
+ s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, true,
store);
+ s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, true,
store);
+ s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, true,
store);
+ s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, false,
true, store);
+ s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, false,
store);
if (os_add(tr->cat->schemas, tr, s->base.name, &s->base)) {
- schema_destroy(store, s);
return NULL;
}
if (isTempSchema(s))
@@ -2654,7 +2642,6 @@ key_dup(sql_trans *tr, sql_key *k, sql_t
if (isGlobal(t) &&
((res = os_add(t->s->keys, tr, nk->base.name,
dup_base(&nk->base))) ||
(res = os_add(tr->cat->objects, tr, nk->base.name,
dup_base(&nk->base))))) {
- key_destroy(tr->store, nk);
return res;
}
*kres = nk;
@@ -2693,7 +2680,6 @@ idx_dup(sql_trans *tr, sql_idx * i, sql_
list_append(ni->columns, kc_dup(tr, okc, t));
}
if (isGlobal(t) && (res = os_add(t->s->idxs, tr, ni->base.name,
dup_base(&ni->base)))) {
- idx_destroy(store, ni);
return res;
}
*ires = ni;
@@ -2731,7 +2717,6 @@ part_dup(sql_trans *tr, sql_part *op, sq
}
}
if ((res = os_add(mt->s->parts, tr, p->base.name, dup_base(&p->base))))
{
- part_destroy(tr->store, p);
return res;
}
*pres = p;
@@ -2767,7 +2752,6 @@ trigger_dup(sql_trans *tr, sql_trigger *
list_append(nt->columns, kc_dup(tr, okc, t));
}
if (isGlobal(t) && (res = os_add(t->s->triggers, tr, nt->base.name,
dup_base(&nt->base)))) {
- trigger_destroy(tr->store, nt);
return res;
}
*tres = nt;
@@ -2867,7 +2851,6 @@ table_dup(sql_trans *tr, sql_table *ot,
cleanup:
if (res) {
- table_destroy(store, t);
t = NULL;
}
*tres = t;
@@ -2992,10 +2975,6 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
}
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))))
{
- idx_destroy(store, ni);
- return res;
- }
if (isDeclaredTable(i->t))
if (!isDeclaredTable(t) && isTable(ni->t) &&
idx_has_column(ni->type))
@@ -3008,6 +2987,11 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
idx_destroy(store, ni);
return res;
}
+
+ if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base))))
{
+ return res;
+ }
+
if (ires)
*ires = ni;
return res;
@@ -3052,10 +3036,6 @@ sql_trans_copy_trigger( sql_trans *tr, s
}
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)))) {
- trigger_destroy(store, nt);
- 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,
@@ -3064,6 +3044,11 @@ sql_trans_copy_trigger( sql_trans *tr, s
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;
@@ -3288,7 +3273,6 @@ sql_trans_rollback(sql_trans *tr)
if (tr->localtmps.nelm) {
for(node *n=tr->localtmps.nelm; n; ) {
node *next = n->next;
- //sql_table *tt = n->data;
list_remove_node(tr->localtmps.set, store, n);
n = next;
}
@@ -3332,7 +3316,6 @@ sql_trans_create_(sqlstore *store, sql_t
if (!tr)
return NULL;
- //tr->sa = store->sa;
tr->sa = NULL;
tr->store = store;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list