Changeset: a5fabb4507d0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5fabb4507d0
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/common/sql_list.c
        sql/include/sql_catalog.h
        sql/server/rel_distribute.c
        sql/server/rel_optimizer.c
        sql/server/rel_propagate.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_partition.c
        sql/storage/sql_catalog.c
        sql/storage/store.c
Branch: mmt
Log Message:

Keep the parts of merge/replica tables with in the schema.
(on merge/replica level we keep a list).
Each partition now has a counter, counting the number of times the table is 
member of
a hierarchy.


diffs (truncated from 1453 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -389,12 +389,14 @@ create_table_or_view(mvc *sql, char* sna
                        mvc_copy_key(sql, nt, k);
                }
        }
-       if (t->members.set) {
-               for (n = t->members.set->h; n; n = n->next) {
+       /*
+       if (t->members) {
+               for (n = t->members->h; n; n = n->next) {
                        sql_part *pt = n->data;
                        mvc_copy_part(sql, nt, pt);
                }
        }
+       */
        if (t->triggers.set) {
                for (n = t->triggers.set->h; n; n = n->next) {
                        sql_trigger *tr = n->data;
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
@@ -157,7 +157,7 @@ validate_alter_table_add_table(mvc *sql,
        const char *errtable = TABLE_TYPE_DESCRIPTION(rmt->type, 
rmt->properties);
        if (!update && (!isMergeTable(rmt) && !isReplicaTable(rmt)))
                throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: cannot add table 
'%s.%s' to %s '%s.%s'", psname, ptname, errtable, msname, mtname);
-       node *n = cs_find_id(&rmt->members, rpt->base.id);
+       node *n = list_find_base_id(rmt->members, rpt->base.id);
        if (isView(rpt))
                throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: can't add a view 
into a %s", errtable);
        if (isDeclaredTable(rpt))
@@ -415,7 +415,7 @@ alter_table_del_table(mvc *sql, char *ms
        const char *errtable = TABLE_TYPE_DESCRIPTION(mt->type, mt->properties);
        if (!isMergeTable(mt) && !isReplicaTable(mt))
                throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: cannot drop table '%s.%s' to %s '%s.%s'", psname, ptname, errtable, 
msname, mtname);
-       if (!(n = cs_find_id(&mt->members, pt->base.id)))
+       if (!(n = list_find_base_id(mt->members, pt->base.id)))
                throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER 
TABLE: table '%s.%s' isn't part of %s '%s.%s'", ps->base.name, ptname, 
errtable, ms->base.name, mtname);
 
        sql_trans_del_table(sql->session->tr, mt, pt, drop_action);
@@ -1710,7 +1710,7 @@ SQLrename_table(Client cntxt, MalBlkPtr 
                        throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER 
TABLE: not possible to change schema of a declared table");
                if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, 
NULL))
                        throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER 
TABLE: unable to set schema of table '%s' (there are database objects which 
depend on it)", otable_name);
-               if (!list_empty(t->members.set))
+               if (!list_empty(t->members))
                        throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER 
TABLE: unable to set schema of table '%s' while it has children", otable_name);
                if (!list_empty(t->triggers.set))
                        throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER 
TABLE: unable to set schema of table '%s' while it has triggers", otable_name);
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
@@ -309,6 +309,7 @@ list_remove_node(list *l, node *n)
        if (p != n)
                while (p && p->next != n)
                        p = p->next;
+       assert(p==n||(p && p->next == n));
        if (p == n) {
                l->h = n->next;
                p = NULL;
@@ -323,7 +324,7 @@ list_remove_node(list *l, node *n)
        MT_lock_unset(&l->ht_lock);
        node_destroy(l, n);
        l->cnt--;
-       assert(l->cnt >= 0);
+       assert(l->cnt > 0 || l->h == NULL);
        return p;
 }
 
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
@@ -267,6 +267,7 @@ typedef struct sql_schema {
        changeset types;
        changeset funcs;
        changeset seqs;
+       changeset parts;/* merge/replica tables can only contain parts from the 
same schema */
        list *keys;             /* Names for keys, idxs and triggers are */
        list *idxs;             /* global, but these objects are only */
        list *triggers;         /* useful within a table */
@@ -614,9 +615,10 @@ typedef struct sql_part_value {
 
 typedef struct sql_part {
        sql_base base;
-       struct sql_table *t; /* cached value of the merge table */
-       sql_subtype tpe;     /* the column/expression type */
-       bit with_nills;      /* 0 no nills, 1 holds nills, NULL holds all 
values -> range FROM MINVALUE TO MAXVALUE WITH NULL */
+       struct sql_table *t;      /* the merge table */
+       struct sql_table *member; /* the member of the merge table */
+       sql_subtype tpe;                  /* the column/expression type */
+       bit with_nills;                   /* 0 no nills, 1 holds nills, NULL 
holds all values -> range FROM MINVALUE TO MAXVALUE WITH NULL */
        union {
                list *values;         /* partition by values/list */
                struct sql_range {    /* partition by range */
@@ -651,7 +653,7 @@ typedef struct sql_table {
        changeset idxs;
        changeset keys;
        changeset triggers;
-       changeset members;
+       list *members;
        int drop_action;        /* only needed for alter drop table */
 
        int cleared;            /* cleared in the current transaction */
@@ -659,7 +661,7 @@ typedef struct sql_table {
        struct sql_schema *s;
        struct sql_table *po;   /* the outer transactions table */
 
-       bit partition;  /* if this table is part of some hierachy of tables 
(could be multiple) */
+       char partition;         /* number of times this table is part of some 
hierachy of tables */
        union {
                struct sql_column *pcol; /* If it is partitioned on a column */
                struct sql_expression *pexp; /* If it is partitioned by an 
expression */
@@ -770,6 +772,6 @@ typedef struct {
 } sql_emit_col;
 
 extern int nested_mergetable(sql_trans *tr, sql_table *t, const char *sname, 
const char *tname);
-extern sql_table *find_merge_table(sql_trans *tr, sql_table *pt, sql_table 
*mt);
+extern sql_part *partition_find_part(sql_trans *tr, sql_table *pt, sql_part 
*pp);
 
 #endif /* SQL_CATALOG_H */
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -195,7 +195,7 @@ replica(mvc *sql, sql_rel *rel, char *ur
 
                        if (uri) {
                                /* replace by the replica which matches the uri 
*/
-                               for (n = t->members.set->h; n; n = n->next) {
+                               for (n = t->members->h; n; n = n->next) {
                                        sql_part *p = n->data;
                                        sql_table *pt = find_sql_table_id(t->s, 
p->base.id);
 
@@ -205,10 +205,10 @@ replica(mvc *sql, sql_rel *rel, char *ur
                                        }
                                }
                        } else { /* no match, find one without remote or use 
first */
-                               if (t->members.set) {
+                               if (t->members) {
                                        int fnd = 0;
                                        sql_part *p;
-                                       for (n = t->members.set->h; n; n = 
n->next) {
+                                       for (n = t->members->h; n; n = n->next) 
{
                                                sql_part *p = n->data;
                                                sql_table *pt = 
find_sql_table_id(t->s, p->base.id);
 
@@ -219,7 +219,7 @@ replica(mvc *sql, sql_rel *rel, char *ur
                                                }
                                        }
                                        if (!fnd) {
-                                               p = t->members.set->h->data;
+                                               p = t->members->h->data;
                                                rel = rewrite_replica(sql, rel, 
t, p, 1);
                                        }
                                } else {
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -67,7 +67,7 @@ name_find_column( sql_rel *rel, const ch
                        if (strcmp(c->base.name, name) == 0) {
                                *bt = rel;
                                if (pnr < 0 || (mt &&
-                                       list_position(mt->members.set, c->t) == 
pnr))
+                                       list_position(mt->members, c->t) == 
pnr))
                                        return c;
                        }
                }
@@ -77,7 +77,7 @@ name_find_column( sql_rel *rel, const ch
                        if (strcmp(i->base.name, name+1 /* skip % */) == 0) {
                                *bt = rel;
                                if (pnr < 0 || (mt &&
-                                       list_position(mt->members.set, i->t) == 
pnr)) {
+                                       list_position(mt->members, i->t) == 
pnr)) {
                                        sql_kc *c = i->columns->h->data;
                                        return c->c;
                                }
@@ -4938,7 +4938,7 @@ rel_part_nr( sql_rel *rel, sql_exp *e )
                return -1;
        sql_table *pp = c->t;
        sql_table *mt = bt->r;
-       return list_position(mt->members.set, pp);
+       return list_position(mt->members, pp);
 }
 
 static int
@@ -4961,7 +4961,7 @@ rel_uses_part_nr( sql_rel *rel, sql_exp 
        if (c && bt && bt->r) {
                sql_table *pp = c->t;
                sql_table *mt = bt->r;
-               if (list_position(mt->members.set, pp) == pnr)
+               if (list_position(mt->members, pp) == pnr)
                        return 1;
        }
        /* for projects we may need to do a rename! */
@@ -8884,7 +8884,7 @@ rel_merge_table_rewrite(visitor *v, sql_
                                char *tname = t->base.name;
                                list *cols = NULL, *ranges = NULL;
 
-                               if (list_empty(t->members.set))
+                               if (list_empty(t->members))
                                        return rel;
                                if (sel) {
                                        cols = sa_list(v->sql->sa);
@@ -8939,10 +8939,10 @@ rel_merge_table_rewrite(visitor *v, sql_
                                        }
                                }
                                v->changes++;
-                               if (t->members.set) {
+                               if (t->members) {
                                        list *tables = sa_list(v->sql->sa);
 
-                                       for (node *nt = t->members.set->h; nt; 
nt = nt->next) {
+                                       for (node *nt = t->members->h; nt; nt = 
nt->next) {
                                                sql_part *pd = nt->data;
                                                sql_table *pt = 
find_sql_table_id(t->s, pd->base.id);
                                                sql_rel *prel = 
rel_basetable(v->sql, pt, tname), *bt = NULL;
@@ -9231,7 +9231,7 @@ rel_merge_table_rewrite(visitor *v, sql_
                                                tables = ntables;
                                        }
                                }
-                               if (nrel && list_length(t->members.set) == 1) {
+                               if (nrel && list_length(t->members) == 1) {
                                        nrel = rel_project(v->sql->sa, nrel, 
rel->exps);
                                } else if (nrel) {
                                        rel_set_exps(nrel, rel->exps);
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -74,7 +74,7 @@ rel_generate_anti_insert_expression(mvc 
        sql_exp* res = NULL;
 
        if ((*anti_rel)->op != op_project && (*anti_rel)->op != op_basetable && 
(*anti_rel)->op != op_table) {
-               sql_rel *inserts; //In a nested partition case the operation is 
a op_select, then a projection must be created
+               sql_rel *inserts; /* In a nested partition case the operation 
is a op_select, then a projection must be created */
                list *l = new_exp_list(sql->sa);
                *anti_rel = rel_project(sql->sa, *anti_rel, l);
 
@@ -211,7 +211,7 @@ create_range_partition_anti_rel(sql_quer
        (void) rel_groupby_add_aggr(sql, anti_rel, aggr);
        exp_label(sql->sa, aggr, ++sql->label);
 
-       //generate the exception
+       /* generate the exception */
        aggr = exp_ref(sql, aggr);
        generate_alter_table_error_message(buf, mt);
        exception = exp_exception(sql->sa, aggr, buf);
@@ -253,7 +253,7 @@ create_list_partition_anti_rel(sql_query
        (void) rel_groupby_add_aggr(sql, anti_rel, aggr);
        exp_label(sql->sa, aggr, ++sql->label);
 
-       //generate the exception
+       /* generate the exception */
        aggr = exp_ref(sql, aggr);
        generate_alter_table_error_message(buf, mt);
        exception = exp_exception(sql->sa, aggr, buf);
@@ -265,14 +265,14 @@ static sql_rel *
 propagate_validation_to_upper_tables(sql_query* query, sql_table *mt, 
sql_table *pt, sql_rel *rel)
 {
        mvc *sql = query->sql;
-       sql_table *it;
+       sql_part *it = NULL;
 
-       for (sql_table *prev = mt ; prev ; prev = it) {
-               if (!isPartition(prev) || 
(it=find_merge_table(sql->session->tr, prev, NULL)) == NULL)
+       for (sql_table *prev = mt ; prev; prev = it?it->t:NULL) {
+               if (!isPartition(prev) || 
(it=partition_find_part(sql->session->tr, prev, NULL)) == NULL)
                        break;
-               sql_part *spt = find_sql_part_id(it, prev->base.id);
+               sql_part *spt = it;
                if (spt) {
-                       if (isRangePartitionTable(it)) {
+                       if (isRangePartitionTable(it->t)) {
                                int tpe = spt->tpe.type->localtype;
                                int (*atomcmp)(const void *, const void *) = 
ATOMcompare(tpe);
                                const void *nil = ATOMnilptr(tpe);
@@ -287,19 +287,19 @@ propagate_validation_to_upper_tables(sql
                                        found_all = is_bit_nil(spt->with_nills);
                                }
                                if (!found_all || !spt->with_nills)
-                                       rel = rel_list(sql->sa, rel, 
create_range_partition_anti_rel(query, it, pt, spt->with_nills, e1, e2, false));
-                       } else if (isListPartitionTable(it)) {
+                                       rel = rel_list(sql->sa, rel, 
create_range_partition_anti_rel(query, it->t, pt, spt->with_nills, e1, e2, 
false));
+                       } else if (isListPartitionTable(it->t)) {
                                list *exps = new_exp_list(sql->sa);
                                for (node *n = spt->part.values->h ; n ; n = 
n->next) {
                                        sql_part_value *next = 
(sql_part_value*) n->data;
                                        sql_exp *e1 = exp_atom(sql->sa, 
atom_general_ptr(sql->sa, &spt->tpe, next->value));
                                        list_append(exps, e1);
                                }
-                               rel = rel_list(sql->sa, rel, 
create_list_partition_anti_rel(query, it, pt, spt->with_nills, exps));
+                               rel = rel_list(sql->sa, rel, 
create_list_partition_anti_rel(query, it->t, pt, spt->with_nills, exps));
                        } else {
                                assert(0);
                        }
-               } else { //the sql_part should exist
+               } else { /* the sql_part should exist */
                        assert(0);
                }
        }
@@ -336,7 +336,7 @@ rel_alter_table_add_partition_range(sql_
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to