Changeset: 939d23814122 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=939d23814122
Modified Files:
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/include/sql_catalog.h
        sql/server/rel_distribute.c
        sql/server/rel_optimizer.c
        sql/server/rel_propagate.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_partition.c
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jun2020-mmt
Log Message:

Use a distinct object id for sql_part structure, so it removes ambiguity on 
tables part of multiple merge table hierarchies


diffs (truncated from 561 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
@@ -421,14 +421,6 @@ create_table_or_view(mvc *sql, char* sna
                        mvc_copy_key(sql, nt, k);
                }
        }
-       /*
-       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 = list_find_base_id(rmt->members, rpt->base.id);
+       node *n = members_find_child_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 = list_find_base_id(mt->members, pt->base.id)))
+       if (!(n = members_find_child_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);
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
@@ -729,8 +729,6 @@ extern sql_idx *sql_trans_find_idx(sql_t
 
 extern sql_column *find_sql_column(sql_table *t, const char *cname);
 
-extern sql_part *find_sql_part_id(sql_table *t, sqlid id);
-
 extern sql_table *find_sql_table(sql_schema *s, const char *tname);
 extern sql_table *find_sql_table_id(sql_schema *s, sqlid id);
 extern node *find_sql_table_node(sql_schema *s, sqlid id);
@@ -768,5 +766,6 @@ typedef struct {
 
 extern int nested_mergetable(sql_trans *tr, sql_table *t, const char *sname, 
const char *tname);
 extern sql_part *partition_find_part(sql_trans *tr, sql_table *pt, sql_part 
*pp);
+extern node *members_find_child_id(list *l, sqlid id);
 
 #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
@@ -81,7 +81,7 @@ static sql_rel *
 rewrite_replica( mvc *sql, sql_rel *rel, sql_table *t, sql_part *pd, int 
remote_prop)
 {
        node *n, *m;
-       sql_table *p = find_sql_table_id(t->s, pd->base.id);
+       sql_table *p = find_sql_table_id(t->s, pd->member->base.id);
        sql_rel *r = rel_basetable(sql, p, t->base.name);
 
        for (n = rel->exps->h, m = r->exps->h; n && m; n = n->next, m = 
m->next) {
@@ -197,7 +197,7 @@ replica(mvc *sql, sql_rel *rel, char *ur
                                /* replace by the replica which matches the uri 
*/
                                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);
+                                       sql_table *pt = find_sql_table_id(t->s, 
p->member->base.id);
 
                                        if (isRemote(pt) && strcmp(uri, 
pt->query) == 0) {
                                                rel = rewrite_replica(sql, rel, 
t, p, 0);
@@ -210,7 +210,7 @@ replica(mvc *sql, sql_rel *rel, char *ur
                                        sql_part *p;
                                        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);
+                                               sql_table *pt = 
find_sql_table_id(t->s, p->member->base.id);
 
                                                if (!isRemote(pt)) {
                                                        fnd = 1;
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
@@ -9081,7 +9081,7 @@ rel_merge_table_rewrite(visitor *v, sql_
                                        memset(pos, 0, sizeof(int)*nr);
                                        for (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_table *pt = 
find_sql_table_id(t->s, pd->member->base.id);
                                                sql_rel *prel = 
rel_basetable(v->sql, pt, tname);
                                                node *n;
                                                int skip = 0, j;
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
@@ -604,7 +604,7 @@ rel_generate_subdeletes(mvc *sql, sql_re
 
        for (node *n = t->members->h; n; n = n->next) {
                sql_part *pt = (sql_part *) n->data;
-               sql_table *sub = find_sql_table_id(t->s, pt->base.id);
+               sql_table *sub = find_sql_table_id(t->s, pt->member->base.id);
                sql_rel *s1, *dup = NULL;
 
                if (!update_allowed(sql, sub, sub->base.name, 
is_delete(rel->op) ? "DELETE": "TRUNCATE",
@@ -638,7 +638,7 @@ rel_generate_subupdates(mvc *sql, sql_re
 
        for (node *n = t->members->h; n; n = n->next) {
                sql_part *pt = (sql_part *) n->data;
-               sql_table *sub = find_sql_table_id(t->s, pt->base.id);
+               sql_table *sub = find_sql_table_id(t->s, pt->member->base.id);
                sql_rel *s1, *dup = NULL;
                list *uexps = exps_copy(sql, rel->exps), *checked_updates = 
new_exp_list(sql->sa);
 
@@ -706,7 +706,7 @@ rel_generate_subinserts(sql_query *query
 
        for (node *n = t->members->h; n; n = n->next) {
                sql_part *pt = (sql_part *) n->data;
-               sql_table *sub = find_sql_table_id(t->s, pt->base.id);
+               sql_table *sub = find_sql_table_id(t->s, pt->member->base.id);
                sql_rel *s1 = NULL, *dup = NULL;
                sql_exp *le = NULL;
 
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -2129,12 +2129,6 @@ mvc_copy_trigger(mvc *m, sql_table *t, s
        return sql_trans_copy_trigger(m->session->tr, t, tr);
 }
 
-sql_part *
-mvc_copy_part(mvc *m, sql_table *t, sql_part *pt)
-{
-       return sql_trans_copy_part(m->session->tr, t, pt);
-}
-
 sql_rel *
 sql_processrelation(mvc *sql, sql_rel* rel, int value_based_opt)
 {
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -286,7 +286,6 @@ extern sql_column *mvc_copy_column(mvc *
 extern sql_key *mvc_copy_key(mvc *m, sql_table *t, sql_key *k);
 extern sql_idx *mvc_copy_idx(mvc *m, sql_table *t, sql_idx *i);
 extern sql_trigger *mvc_copy_trigger(mvc *m, sql_table *t, sql_trigger *tr);
-extern sql_part *mvc_copy_part(mvc *m, sql_table *t, sql_part *pt);
 
 extern sql_rel *sql_processrelation(mvc *m, sql_rel* rel, int value_based_opt);
 
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -330,9 +330,9 @@ initialize_sql_parts(mvc *sql, sql_table
 
                for (node *n = mt->members->h; n; n = n->next) {
                        sql_part *next = (sql_part*) n->data, *p = 
SA_ZNEW(tr->sa, sql_part);
-                       sql_table *pt = find_sql_table_id(mt->s, next->base.id);
+                       sql_table *pt = find_sql_table_id(mt->s, 
next->member->base.id);
 
-                       base_init(tr->sa, &p->base, pt->base.id, TR_NEW, 
pt->base.name);
+                       base_init(tr->sa, &p->base, next->base.id, TR_NEW, 
pt->base.name);
                        p->t = mt;
                        p->member = pt;
                        assert(isMergeTable(mt) || isReplicaTable(mt));
@@ -418,7 +418,7 @@ initialize_sql_parts(mvc *sql, sql_table
                }
                for (node *n = new->h; n; n = n->next) {
                        sql_part *next = (sql_part*) n->data;
-                       sql_table *pt = find_sql_table_id(mt->s, next->base.id);
+                       sql_table *pt = find_sql_table_id(mt->s, 
next->member->base.id);
                        sql_part *err = NULL;
 
                        cs_add(&mt->s->parts, next, TR_NEW);
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -209,14 +209,6 @@ find_sql_column(sql_table *t, const char
        return _cs_find_name(&t->columns, cname);
 }
 
-sql_part *
-find_sql_part_id(sql_table *t, sqlid id)
-{
-       node *n = list_find_base_id(t->members, id);
-
-       return n ? n->data : NULL;
-}
-
 sql_table *
 find_sql_table(sql_schema *s, const char *tname)
 {
@@ -557,12 +549,27 @@ partition_find_part(sql_trans *tr, sql_t
                        continue;
                }
 
-               if (p->base.id == pt->base.id)
+               if (p->member->base.id == pt->base.id)
                                return p;
        }
        return NULL;
 }
 
+node *
+members_find_child_id(list *l, sqlid id)
+{
+       if (l) {
+               node *n;
+               for (n = l->h; n; n = n->next) {
+                       sql_part *p = n->data;
+
+                       if (id == p->member->base.id)
+                               return n;
+               }
+       }
+       return NULL;
+}
+
 int
 nested_mergetable(sql_trans *tr, sql_table *mt, const char *sname, const char 
*tname)
 {
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -506,7 +506,6 @@ extern sql_column *sql_trans_copy_column
 extern sql_key *sql_trans_copy_key(sql_trans *tr, sql_table *t, sql_key *k);
 extern sql_idx *sql_trans_copy_idx(sql_trans *tr, sql_table *t, sql_idx *i);
 extern sql_trigger *sql_trans_copy_trigger(sql_trans *tr, sql_table *t, 
sql_trigger *tri);
-extern sql_part *sql_trans_copy_part(sql_trans *tr, sql_table *t, sql_part 
*pt);
 
 extern void sql_trans_drop_any_comment(sql_trans *tr, sqlid id);
 extern void sql_trans_drop_obj_priv(sql_trans *tr, sqlid obj_id);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -759,7 +759,7 @@ load_range_partition(sql_trans *tr, sql_
        sql_subtype *empty = sql_bind_localtype("void");
 
        pt->tpe = *empty;
-       rs = table_funcs.rids_select(tr, find_sql_column(ranges, "table_id"), 
&pt->base.id, &pt->base.id, NULL);
+       rs = table_funcs.rids_select(tr, find_sql_column(ranges, "table_id"), 
&pt->member->base.id, &pt->member->base.id, NULL);
        if ((rid = table_funcs.rids_next(rs)) != oid_nil) {
                void *v1, *v2, *v3;
                ValRecord vmin, vmax;
@@ -803,7 +803,7 @@ load_value_partition(sql_trans *tr, sql_
        sql_table *values = find_sql_table(syss, "value_partitions");
        list *vals = NULL;
        oid rid;
-       rids *rs = table_funcs.rids_select(tr, find_sql_column(values, 
"table_id"), &pt->base.id, &pt->base.id, NULL);
+       rids *rs = table_funcs.rids_select(tr, find_sql_column(values, 
"table_id"), &pt->member->base.id, &pt->member->base.id, NULL);
        int i = 0;
        sql_subtype *empty = sql_bind_localtype("void");
 
@@ -861,14 +861,16 @@ load_part(sql_trans *tr, sql_table *mt, 
        sql_part *pt = SA_ZNEW(tr->sa, sql_part);
        sql_schema *syss = find_sql_schema(tr, "sys");
        sql_table *objects = find_sql_table(syss, "objects");
-       sqlid id;
+       sqlid id, childid;
 
        assert(isMergeTable(mt) || isReplicaTable(mt));
-       v = table_funcs.column_find_value(tr, find_sql_column(objects, "nr"), 
rid);
+       v = table_funcs.column_find_value(tr, find_sql_column(objects, "id"), 
rid);
        id = *(sqlid*)v; _DELETE(v);
        v = table_funcs.column_find_value(tr, find_sql_column(objects, "name"), 
rid);
        base_init(tr->sa, &pt->base, id, 0, v); _DELETE(v);
-       sql_table *member = find_sql_table_id(mt->s, pt->base.id);
+       v = table_funcs.column_find_value(tr, find_sql_column(objects, "sub"), 
rid);
+       childid = *(sqlid*)v; _DELETE(v);
+       sql_table *member = find_sql_table_id(mt->s, childid);
        assert(member);
        pt->t = mt;
        pt->member = member;
@@ -1386,11 +1388,11 @@ load_schema(sql_trans *tr, sqlid id, oid
                        sql_table *t = n->data;
                        if (isMergeTable(t) || isReplicaTable(t)) {
                                sql_table *objects = find_sql_table(syss, 
"objects");
-                               sql_column *mt_id = find_sql_column(objects, 
"id");
                                sql_column *mt_nr = find_sql_column(objects, 
"nr");
-                               rids *rs = table_funcs.rids_select(tr, mt_id, 
&t->base.id, &t->base.id, NULL);
-
-                               rs = table_funcs.rids_orderby(tr, rs, mt_nr);
+                               sql_column *mt_sub = find_sql_column(objects, 
"sub");
+                               rids *rs = table_funcs.rids_select(tr, mt_nr, 
&t->base.id, &t->base.id, NULL);
+
+                               rs = table_funcs.rids_orderby(tr, rs, mt_sub);
                                for (rid = table_funcs.rids_next(rs); 
!is_oid_nil(rid); rid = table_funcs.rids_next(rs)) {
                                        sql_part *pt = load_part(tr, t, rid);
                                        if (isRangePartitionTable(t)) {
@@ -1758,6 +1760,7 @@ dup_sql_part(sql_allocator *sa, sql_tabl
        }
        list_append(mt->members, p);
        p->t = mt;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to