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