Changeset: 5076e08f587c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5076e08f587c
Modified Files:
sql/backends/monet5/sql_cat.c
sql/include/sql_catalog.h
sql/rel.txt
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/storage/store.c
Branch: merge-partitions
Log Message:
A table can be part of a single partitioned merge table at the time
diffs (186 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
@@ -189,13 +189,18 @@ alter_table_add_range_partition(mvc *sql
ssize_t (*atomtostr)(str *, size_t *, const void *);
int accesses[3] = {RDONLY, RD_INS, RD_UPD_VAL};
- if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_range_partition", msname, mtname, psname, ptname, &mt,
&pt)))
+ if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_range_partition", msname, mtname, psname, ptname, &mt,
&pt))) {
return msg;
- if(mt->type != tt_range_partition) {
+ } else if(mt->type != tt_range_partition) {
msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
"ALTER
TABLE: cannot add range partition into a %s table",
(mt->type == tt_merge_table)?"merge":"list partition");
goto finish;
+ } else if(pt->p) {
+ msg =
createException(SQL,"sql.alter_table_add_range_partition",SQLSTATE(42000)
+ "ALTER
TABLE: table %s.%s is already part of another range partition table",
+ psname,
ptname);
+ goto finish;
}
col = mt->pcol;
@@ -354,13 +359,18 @@ alter_table_add_value_partition(mvc *sql
list *values = list_new(sql->sa, (fdestroy) NULL);
int accesses[3] = {RDONLY, RD_INS, RD_UPD_VAL};
- if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_value_partition", msname, mtname, psname, ptname, &mt,
&pt)))
+ if((msg = validate_alter_table_add_table(sql,
"sql.alter_table_add_value_partition", msname, mtname, psname, ptname, &mt,
&pt))) {
return msg;
- if(mt->type != tt_list_partition) {
+ } else if(mt->type != tt_list_partition) {
msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
"ALTER
TABLE: cannot add value partition into a %s table",
(mt->type == tt_merge_table)?"merge":"range partition");
goto finish;
+ } else if(pt->p) {
+ msg =
createException(SQL,"sql.alter_table_add_value_partition",SQLSTATE(42000)
+ "ALTER
TABLE: table %s.%s is already part of another list partition table",
+ psname,
ptname);
+ goto finish;
}
col = mt->pcol;
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
@@ -560,7 +560,6 @@ typedef struct sql_table {
struct sql_table *p; /* The table is part of this merge table */
struct sql_column *pcol; /* If it is partitioned on a column */
- struct sql_part *pt; /* This table belongs to this part */
} sql_table;
typedef struct res_col {
@@ -620,6 +619,8 @@ extern sql_idx *find_sql_idx(sql_table *
extern sql_column *find_sql_column(sql_table *t, const char *cname);
+extern sql_part *find_sql_part(sql_table *t, const char *tname);
+
extern sql_table *find_sql_table(sql_schema *s, const char *tname);
extern sql_table *find_sql_table_id(sql_schema *s, int id);
extern node *find_sql_table_node(sql_schema *s, int id);
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -160,3 +160,5 @@ e_psm
->r loop_exp_list
psm_return ->l return_exp
psm_rel ->l relation
+ psm_exception ->l column_exp
+ ->r cmp_exp
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1977,3 +1977,47 @@ exp_flatten(mvc *sql, sql_exp *e)
return NULL;
}
+sql_exp *
+create_table_part_atom_exp(mvc *sql, sht tpe, ptr value)
+{
+ switch (tpe) {
+ case TYPE_bit: {
+ bit bval = *((bit*) value);
+ return exp_atom_bool(sql->sa, bval ? 1 : 0);
+ }
+ case TYPE_bte: {
+ bte bbval = *((bte *) value);
+ return exp_atom_bte(sql->sa, bbval);
+ }
+ case TYPE_sht: {
+ sht sval = *((sht*) value);
+ return exp_atom_sht(sql->sa, sval);
+ }
+ case TYPE_int: {
+ int ival = *((int*) value);
+ return exp_atom_int(sql->sa, ival);
+ }
+ case TYPE_lng: {
+ lng lval = *((lng*) value);
+ return exp_atom_lng(sql->sa, lval);
+ }
+ case TYPE_flt: {
+ flt fval = *((flt*) value);
+ return exp_atom_flt(sql->sa, fval);
+ }
+ case TYPE_dbl: {
+ dbl dval = *((dbl*) value);
+ return exp_atom_dbl(sql->sa, dval);
+ }
+ case TYPE_str:
+ return exp_atom_clob(sql->sa, sa_strdup(sql->sa,
value));
+#ifdef HAVE_HGE
+ case TYPE_hge: {
+ hge hval = *((hge*) value);
+ return exp_atom_hge(sql->sa, hval);
+ }
+#endif
+ default:
+ assert(0);
+ }
+}
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -149,5 +149,6 @@ extern char *compare_func( comp_type t,
extern int is_identity( sql_exp *e, sql_rel *r);
extern atom *exp_flatten(mvc *sql, sql_exp *e);
+extern sql_exp *create_table_part_atom_exp(mvc *sql, sht tpe, ptr value);
#endif /* _REL_EXP_H_ */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1013,7 +1013,6 @@ set_members(changeset *ts)
sql_table *pt = find_sql_table(t->s,
p->base.name);
pt->p = t;
- pt->pt = p;
}
}
}
@@ -1530,7 +1529,6 @@ dup_sql_table(sql_allocator *sa, sql_tab
nt->access = t->access;
nt->query = (t->query) ? sa_strdup(sa, t->query) : NULL;
nt->p = t->p;
- nt->pt = t->pt;
for (n = t->columns.set->h; n; n = n->next)
dup_sql_column(sa, nt, n->data);
@@ -4643,7 +4641,6 @@ sql_trans_add_table(sql_trans *tr, sql_t
/* merge table depends on part table */
sql_trans_create_dependency(tr, pt->base.id, mt->base.id,
TABLE_DEPENDENCY);
pt->p = mt;
- pt->pt = p;
p->t = pt;
base_init(tr->sa, &p->base, pt->base.id, TR_NEW, pt->base.name);
cs_add(&mt->members, p, TR_NEW);
@@ -4688,7 +4685,6 @@ sql_trans_add_range_partition(sql_trans
base_init(tr->sa, &p->base, pt->base.id, TR_NEW, pt->base.name);
pt->p = mt;
- pt->pt = p;
p->t = pt;
p->tpe = tpe;
p->part_type = PARTITION_RANGE;
@@ -4744,7 +4740,6 @@ sql_trans_add_value_partition(sql_trans
base_init(tr->sa, &p->base, pt->base.id, TR_NEW, pt->base.name);
pt->p = mt;
- pt->pt = p;
p->t = pt;
p->tpe = tpe;
p->part_type = PARTITION_LIST;
@@ -4829,7 +4824,6 @@ sql_trans_del_table(sql_trans *tr, sql_t
sql_trans_drop_dependency(tr, pt->base.id, mt->base.id,
TABLE_DEPENDENCY);
cs_del(&mt->members, n, pt->base.flag);
pt->p = NULL;
- pt->pt = NULL;
table_funcs.table_delete(tr, sysobj, obj_oid);
mt->s->base.wtime = mt->base.wtime = tr->wtime = tr->wstime;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list