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

Reply via email to