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

Reply via email to