Changeset: 2fed52e693c6 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2fed52e693c6 Modified Files: sql/backends/monet5/sql_cat.c sql/common/sql_list.c sql/storage/store.c Branch: nospare Log Message:
cleanup continues. improved partition ranges /value list cleanup diffs (193 lines): diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -330,8 +330,8 @@ alter_table_add_value_partition(mvc *sql str msg = MAL_SUCCEED; sql_part *err = NULL; int errcode = 0, i = 0, ninserts = 0; - list *values = list_new(sql->session->tr->sa, (fdestroy) &part_value_destroy); sql_subtype tpe; + list *values = NULL; assert(with_nills == false || with_nills == true); /* No nills allowed here */ if ((msg = validate_alter_table_add_table(sql, "sql.alter_table_add_value_partition", msname, mtname, psname, ptname, @@ -355,6 +355,7 @@ alter_table_add_value_partition(mvc *sql msg = createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000) "ALTER TABLE: no values in the list"); goto finish; } + values = list_new(sql->session->tr->sa, (fdestroy) &part_value_destroy); for ( i = pci->retc+6; i < pci->argc; i++){ sql_part_value *nextv = NULL; ValRecord *vnext = &(stk)->stk[(pci)->argv[i]]; @@ -364,6 +365,7 @@ alter_table_add_value_partition(mvc *sql if (VALisnil(vnext)) { /* check for an eventual null value which cannot be */ msg = createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000) "ALTER TABLE: list value cannot be null"); + list_destroy2(values, sql->session->tr->store); goto finish; } @@ -375,6 +377,9 @@ alter_table_add_value_partition(mvc *sql if (list_append_sorted(values, nextv, &tpe, sql_values_list_element_validate_and_insert) != NULL) { msg = createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000) "ALTER TABLE: there are duplicated values in the list"); + list_destroy2(values, sql->session->tr->store); + _DELETE(nextv->value); + _DELETE(nextv); goto finish; } } diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c --- a/sql/common/sql_list.c +++ b/sql/common/sql_list.c @@ -188,8 +188,11 @@ list_append_with_validate(list *l, void if (l->cnt) { for (m = l->h; m; m = m->next) { err = cmp(m->data, data); - if(err) + if(err) { + n->data = NULL; + node_destroy(l, NULL, n); return err; + } } l->t->next = n; } else { @@ -225,8 +228,11 @@ list_append_sorted(list *l, void *data, } else { for (m = l->h; m; m = m->next) { err = cmp(m->data, data, extra, &comp); - if(err) + if(err) { + n->data = NULL; + node_destroy(l, NULL, n); return err; + } if(comp < 0) break; first = 0; diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -1570,7 +1570,7 @@ dup_sql_part(sql_allocator *sa, sql_tabl p->part.range.minlength = op->part.range.minlength; p->part.range.maxlength = op->part.range.maxlength; } else if (isListPartitionTable(mt)) { - p->part.values = list_new(sa, (fdestroy) NULL); + p->part.values = list_new(sa, (fdestroy) &part_value_destroy); for (node *n = op->part.values->h ; n ; n = n->next) { sql_part_value *prev = (sql_part_value*) n->data, *nextv = SA_ZNEW(sa, sql_part_value); nextv->value = SA_NEW_ARRAY(sa, char, prev->length); @@ -4563,6 +4563,8 @@ sql_trans_add_range_partition(sql_trans vmin = vmax = (ValRecord) {.vtype = TYPE_void,}; mt = new_table(tr, mt); + if (!mt->members.set) + cs_new(&mt->members, tr->sa, (fdestroy) &part_destroy); if (min) { ok = VALinit(&vmin, localtype, min); if (ok && localtype != TYPE_str) @@ -4613,6 +4615,10 @@ sql_trans_add_range_partition(sql_trans } /* add range partition values */ + if (update) { + _DELETE(p->part.range.minvalue); + _DELETE(p->part.range.maxvalue); + } p->part.range.minvalue = SA_NEW_ARRAY(tr->sa, char, smin); p->part.range.maxvalue = SA_NEW_ARRAY(tr->sa, char, smax); memcpy(p->part.range.minvalue, min, smin); @@ -4623,6 +4629,8 @@ sql_trans_add_range_partition(sql_trans if (!update) { *err = cs_add_with_validate(&mt->members, p, 0, sql_range_part_validate_and_insert); + if (*err) + part_destroy(store, p); } else { *err = cs_transverse_with_validate(&mt->members, p, sql_range_part_validate_and_insert); } @@ -4663,7 +4671,7 @@ finish: return res; } - int +int sql_trans_add_value_partition(sql_trans *tr, sql_table *mt, sql_table *pt, sql_subtype tpe, list* vals, bit with_nills, int update, sql_part **err) { @@ -4678,6 +4686,8 @@ sql_trans_add_value_partition(sql_trans sqlid *v; mt = new_table(tr, mt); + if (!mt->members.set) + cs_new(&mt->members, tr->sa, (fdestroy) &part_destroy); if (!update) { p = SA_ZNEW(tr->sa, sql_part); base_init(tr->sa, &p->base, next_oid(store), TR_NEW, pt->base.name); @@ -4707,7 +4717,10 @@ sql_trans_add_value_partition(sql_trans if (with_nills) { /* store the null value first */ ValRecord vnnil; if (VALinit(&vnnil, TYPE_str, ATOMnilptr(TYPE_str)) == NULL) { + if (!update) + part_destroy(store, p); _DELETE(v); + list_destroy2(vals, store); return -1; } store->table_api.table_insert(tr, values, &pt->base.id, v, VALget(&vnnil)); @@ -4720,15 +4733,21 @@ sql_trans_add_value_partition(sql_trans ptr ok; if (ATOMlen(localtype, next->value) > STORAGE_MAX_VALUE_LENGTH) { + if (!update) + part_destroy(store, p); _DELETE(v); + list_destroy2(vals, store); return -i - 1; } ok = VALinit(&vvalue, localtype, next->value); if (ok && localtype != TYPE_str) ok = VALconvert(TYPE_str, &vvalue); if (!ok) { + if (!update) + part_destroy(store, p); _DELETE(v); VALclear(&vvalue); + list_destroy2(vals, store); return -i - 1; } store->table_api.table_insert(tr, values, &pt->base.id, v, VALget(&vvalue)); @@ -4737,10 +4756,14 @@ sql_trans_add_value_partition(sql_trans } _DELETE(v); + if (p->part.values) + list_destroy2(p->part.values, store); p->part.values = vals; if (!update) { *err = cs_add_with_validate(&mt->members, p, 0, sql_values_part_validate_and_insert); + if (*err) + part_destroy(store, p); } else { *err = cs_transverse_with_validate(&mt->members, p, sql_values_part_validate_and_insert); } @@ -4759,7 +4782,7 @@ sql_trans_add_value_partition(sql_trans return 0; } - sql_table* +sql_table* sql_trans_rename_table(sql_trans *tr, sql_schema *s, sqlid id, const char *new_name) { sqlstore *store = tr->store; @@ -4787,7 +4810,7 @@ sql_trans_rename_table(sql_trans *tr, sq return t; } - sql_table* +sql_table* sql_trans_set_table_schema(sql_trans *tr, sqlid id, sql_schema *os, sql_schema *ns) { sqlstore *store = tr->store; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list