Changeset: 5d3eb77f3912 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5d3eb77f3912
Modified Files:
        sql/include/sql_catalog.h
        sql/storage/store.c
        sql/test/merge-partitions/Tests/mergepart03.sql
Branch: merge-partitions
Log Message:

Don't mess up with failed transactions. Undo the changes properly to avoid 
leaks.


diffs (164 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
@@ -106,6 +106,7 @@
 #define PARTITION_BY_COLUMN 1
 #define PARTITION_BY_EXPRESSION 2
 
+#define PARTITION_NONE  0
 #define PARTITION_RANGE 1
 #define PARTITION_LIST  2
 
@@ -513,6 +514,7 @@ typedef struct sql_part {
        sql_base base;
        struct sql_table *t; /* cached value */
        int tpe;             /* the column type */
+       int part_type;       /* by range, list/values or none */
        union {
                bat values;           /* partition by values/list */
                struct sql_range {    /* partition by range */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -139,16 +139,18 @@ column_destroy(sql_column *c)
                store_funcs.destroy_col(NULL, c);
 }
 
-/*static void
+static void
 member_destroy(sql_part *pt)
 {
-       if(isRangePartitionTable(pt->t)) {
-               GDKfree(pt->part.range.minvalue);
-               GDKfree(pt->part.range.maxvalue);
-       } else if(isListPartitionTable(pt->t)) {
+       if(pt->part_type == PARTITION_RANGE) {
+               if(pt->part.range.minvalue)
+                       GDKfree(pt->part.range.minvalue);
+               if(pt->part.range.maxvalue)
+                       GDKfree(pt->part.range.maxvalue);
+       } else if(pt->part_type == PARTITION_LIST && pt->part.values) {
                BBPrelease(pt->part.values);
        }
-}*/
+}
 
 void
 table_destroy(sql_table *t)
@@ -574,6 +576,7 @@ load_range_partition(sql_trans *tr, sql_
        size_t min_length = 0, max_length = 0;
 
        pt->tpe = tpe;
+       pt->part_type = PARTITION_RANGE;
        rs = table_funcs.rids_select(tr, find_sql_column(ranges, "id"), 
&pt->base.id, &pt->base.id, NULL);
        if((rid = table_funcs.rids_next(rs)) != oid_nil) {
                void *v = table_funcs.column_find_value(tr, 
find_sql_column(ranges, "minimum"), rid);
@@ -619,6 +622,7 @@ load_value_partition(sql_trans *tr, sql_
        }
 
        pt->tpe = tpe;
+       pt->part_type = PARTITION_LIST;
        for(rid = table_funcs.rids_next(rs); !is_oid_nil(rid); rid = 
table_funcs.rids_next(rs)) {
                gdk_return ret = GDK_SUCCEED;
                ptr pnext = NULL;
@@ -726,7 +730,7 @@ load_table(sql_trans *tr, sql_schema *s,
        cs_new(&t->idxs, tr->sa, (fdestroy) &idx_destroy);
        cs_new(&t->keys, tr->sa, (fdestroy) &key_destroy);
        cs_new(&t->triggers, tr->sa, (fdestroy) &trigger_destroy);
-       cs_new(&t->members, tr->sa, (fdestroy) NULL);
+       cs_new(&t->members, tr->sa, (fdestroy) &member_destroy);
 
        if (isTable(t)) {
                if (store_funcs.create_del(tr, t) != LOG_OK) {
@@ -1420,7 +1424,7 @@ create_sql_table_with_id(sql_allocator *
        cs_new(&t->idxs, sa, (fdestroy) &idx_destroy);
        cs_new(&t->keys, sa, (fdestroy) &key_destroy);
        cs_new(&t->triggers, sa, (fdestroy) &trigger_destroy);
-       cs_new(&t->members, sa, (fdestroy) NULL);
+       cs_new(&t->members, sa, (fdestroy) &member_destroy);
        t->pkey = NULL;
        t->sz = COLSIZE;
        t->cleared = 0;
@@ -1466,6 +1470,7 @@ dup_sql_part(sql_allocator *sa, sql_tabl
        base_init(sa, &pt->base, opt->base.id, opt->base.flag, opt->base.name);
        pt->tpe = opt->tpe;
        pt->t = mt;
+       pt->part_type = opt->tpe;
 
        if(isRangePartitionTable(ot)) {
                sql_part *err = cs_add_sorted(&mt->members, pt, TR_NEW, 
sql_range_part_validate_and_insert);
@@ -2440,6 +2445,7 @@ part_dup(sql_trans *tr, int flag, sql_pa
 
        base_init(sa, &pt->base, opt->base.id, tr_flag(&opt->base, flag), 
opt->base.name);
        pt->tpe = opt->tpe;
+       pt->part_type = opt->tpe;
        if (isNew(opt) && flag == TR_NEW && tr->parent == gtrans) 
                opt->base.flag = TR_OLD;
 
@@ -2597,7 +2603,7 @@ table_dup(sql_trans *tr, int flag, sql_t
        cs_new(&t->keys, sa, (fdestroy) &key_destroy);
        cs_new(&t->idxs, sa, (fdestroy) &idx_destroy);
        cs_new(&t->triggers, sa, (fdestroy) &trigger_destroy);
-       cs_new(&t->members, sa, (fdestroy) NULL);
+       cs_new(&t->members, sa, (fdestroy) &member_destroy);
 
        t->pkey = NULL;
 
@@ -4641,6 +4647,7 @@ sql_trans_add_range_partition(sql_trans 
        pt->p = mt;
        p->t = pt;
        p->tpe = tpe;
+       p->part_type = PARTITION_RANGE;
 
        /* add range partition values */
        p->part.range.minvalue = min;
@@ -4694,6 +4701,7 @@ sql_trans_add_value_partition(sql_trans 
        pt->p = mt;
        p->t = pt;
        p->tpe = tpe;
+       p->part_type = PARTITION_LIST;
 
        rid = table_funcs.column_find_row(tr, find_sql_column(partitions, 
"table_id"), &mt->base.id, NULL);
        assert(!is_oid_nil(rid));
@@ -4750,7 +4758,9 @@ sql_trans_del_table(sql_trans *tr, sql_t
                        rid = table_funcs.column_find_row(tr, 
find_sql_column(ranges, "id"), &pt->base.id, NULL);
                        table_funcs.table_delete(tr, ranges, rid);
                        GDKfree(ppt->part.range.minvalue);
+                       ppt->part.range.minvalue = NULL;
                        GDKfree(ppt->part.range.maxvalue);
+                       ppt->part.range.maxvalue = NULL;
                } else if(isListPartitionTable(mt)) {
                        sql_table *values = find_sql_table(syss, 
"_value_partitions");
                        rids *rs = table_funcs.rids_select(tr, 
find_sql_column(values, "id"), &pt->base.id, &pt->base.id, NULL);
@@ -4759,6 +4769,7 @@ sql_trans_del_table(sql_trans *tr, sql_t
                        }
                        table_funcs.rids_destroy(rs);
                        BBPrelease(ppt->part.values);
+                       ppt->part.values = 0;
                }
        }
 
diff --git a/sql/test/merge-partitions/Tests/mergepart03.sql 
b/sql/test/merge-partitions/Tests/mergepart03.sql
--- a/sql/test/merge-partitions/Tests/mergepart03.sql
+++ b/sql/test/merge-partitions/Tests/mergepart03.sql
@@ -3,16 +3,17 @@ CREATE TABLE subtable1 (a int, b varchar
 CREATE TABLE subtable2 (a int, b varchar(32));
 
 START TRANSACTION;
-ALTER TABLE listparts ADD TABLE subtable1 AS PARTITION BETWEEN -4 AND 12;
+ALTER TABLE listparts ADD TABLE subtable1 AS PARTITION BETWEEN '-4' AND '12';
 SELECT COUNT(*) from range_partitions;
 ROLLBACK;
 
 SELECT COUNT(*) from range_partitions;
-ALTER TABLE listparts ADD TABLE subtable2 AS PARTITION BETWEEN -4 AND 12;
+ALTER TABLE listparts ADD TABLE subtable2 AS PARTITION BETWEEN '-4' AND '12';
 SELECT COUNT(*) from range_partitions;
 
 ALTER TABLE listparts DROP TABLE subtable2;
+SELECT COUNT(*) from range_partitions;
+
 DROP TABLE listparts;
 DROP TABLE subtable1;
 DROP TABLE subtable2;
-SELECT COUNT(*) from range_partitions;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to