Changeset: ec563c09d093 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ec563c09d093
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/include/sql_catalog.h
        sql/server/rel_distribute.c
        sql/server/rel_optimizer.c
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/storage/store.c
Branch: Jul2017
Log Message:

use a changeset of 'part' information in stead of
directly tables. This to solve order dependence (ie
is merge or replica table created before or after
the partition/member). This solves bug 6328


diffs (truncated from 740 to 300 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
@@ -114,7 +114,7 @@ alter_table_add_table(mvc *sql, char *ms
                return sql_message("42S02!ALTER TABLE: cannot add table '%s.%s' 
to table '%s.%s'", psname, ptname, msname, mtname);
        if (mt && pt) {
                char *msg;
-               node *n = cs_find_id(&mt->tables, pt->base.id);
+               node *n = cs_find_id(&mt->members, pt->base.id);
 
                if (n)
                        return sql_message("42S02!ALTER TABLE: table '%s.%s' is 
already part of the MERGE TABLE '%s.%s'", psname, ptname, msname, mtname);
@@ -142,7 +142,7 @@ alter_table_del_table(mvc *sql, char *ms
        if (mt && pt) {
                node *n = NULL;
 
-               if (!pt || (n = cs_find_id(&mt->tables, pt->base.id)) == NULL)
+               if (!pt || (n = cs_find_id(&mt->members, pt->base.id)) == NULL)
                        return sql_message("42S02!ALTER TABLE: table '%s.%s' 
isn't part of the MERGE TABLE '%s.%s'", psname, ptname, msname, 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
@@ -489,6 +489,11 @@ typedef enum table_types {
 #define TABLE_READONLY 1
 #define TABLE_APPENDONLY       2
 
+typedef struct sql_part {
+       sql_base base;
+       struct sql_table *t; /* cached value */
+} sql_part;
+
 typedef struct sql_table {
        sql_base base;
        sht type;               /* table, view, etc */
@@ -504,7 +509,7 @@ typedef struct sql_table {
        changeset idxs;
        changeset keys;
        changeset triggers;
-       changeset tables;
+       changeset members;
        int drop_action;        /* only needed for alter drop table */
 
        int cleared;            /* cleared in the current transaction */
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
@@ -70,9 +70,10 @@ has_remote_or_replica( sql_rel *rel )
 }
 
 static sql_rel *
-rewrite_replica( mvc *sql, sql_rel *rel, sql_table *t, sql_table *p, int 
remote_prop)
+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(t->s, pd->base.name);
        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) {
@@ -120,19 +121,20 @@ replica(mvc *sql, sql_rel *rel, char *ur
 
                        if (uri) {
                                /* replace by the replica which matches the uri 
*/
-                               for (n = t->tables.set->h; n; n = n->next) {
-                                       sql_table *p = n->data;
+                               for (n = t->members.set->h; n; n = n->next) {
+                                       sql_part *p = n->data;
+                                       sql_table *pt = find_sql_table(t->s, 
p->base.name);
        
-                                       if (isRemote(p) && strcmp(uri, 
p->query) == 0) {
+                                       if (isRemote(pt) && strcmp(uri, 
pt->query) == 0) {
                                                rel = rewrite_replica(sql, rel, 
t, p, 0);
                                                break;
                                        }
                                }
                        } else { /* no match, use first */
-                               sql_table *p = NULL;
+                               sql_part *p = NULL;
 
-                               if (t->tables.set) {
-                                       p = t->tables.set->h->data;
+                               if (t->members.set) {
+                                       p = t->members.set->h->data;
                                        rel = rewrite_replica(sql, rel, t, p, 
1);
                                } else {
                                        rel = NULL;
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
@@ -80,7 +80,7 @@ name_find_column( sql_rel *rel, char *rn
                        if (strcmp(c->base.name, name) == 0) {
                                *bt = rel;
                                if (pnr < 0 || (c->t->p &&
-                                   list_position(c->t->p->tables.set, c->t) == 
pnr))
+                                   list_position(c->t->p->members.set, c->t) 
== pnr))
                                        return c;
                        }
                }
@@ -90,7 +90,7 @@ name_find_column( sql_rel *rel, char *rn
                        if (strcmp(i->base.name, name+1 /* skip % */) == 0) {
                                *bt = rel;
                                if (pnr < 0 || (i->t->p &&
-                                   list_position(i->t->p->tables.set, i->t) == 
pnr)) {
+                                   list_position(i->t->p->members.set, i->t) 
== pnr)) {
                                        sql_kc *c = i->columns->h->data;
                                        return c->c;
                                }
@@ -4319,7 +4319,7 @@ rel_part_nr( sql_rel *rel, sql_exp *e )
                return -1;
        pp = c->t;
        if (pp->p)
-               return list_position(pp->p->tables.set, pp);
+               return list_position(pp->p->members.set, pp);
        return -1;
 }
 
@@ -4341,7 +4341,7 @@ rel_uses_part_nr( sql_rel *rel, sql_exp 
                c = exp_find_column(rel, e->r, pnr); 
        if (c) {
                sql_table *pp = c->t;
-               if (pp->p && list_position(pp->p->tables.set, pp) == pnr)
+               if (pp->p && list_position(pp->p->members.set, pp) == pnr)
                        return 1;
        }
        /* for projects we may need to do a rename! */
@@ -7617,13 +7617,13 @@ rel_merge_table_rewrite(int *changes, mv
                        char *tname = t->base.name;
                        list *cols = NULL, *low = NULL, *high = NULL;
 
-                       if (list_empty(t->tables.set)) 
+                       if (list_empty(t->members.set)) 
                                return rel;
                        if (sel) {
                                node *n;
 
                                /* no need to reduce the tables list */
-                               if (list_length(t->tables.set) <= 1) 
+                               if (list_length(t->members.set) <= 1) 
                                        return sel;
 
                                cols = sa_list(sql->sa);
@@ -7678,7 +7678,7 @@ rel_merge_table_rewrite(int *changes, mv
                        }
                        assert(!rel_is_ref(rel));
                        (*changes)++;
-                       if (t->tables.set) {
+                       if (t->members.set) {
                                list *tables = sa_list(sql->sa);
                                node *nt;
                                int *pos = NULL, nr = list_length(rel->exps), 
first = 1;
@@ -7686,8 +7686,9 @@ rel_merge_table_rewrite(int *changes, mv
                                /* rename (mostly the idxs) */
                                pos = SA_NEW_ARRAY(sql->sa, int, nr);
                                memset(pos, 0, sizeof(int)*nr);
-                               for (nt = t->tables.set->h; nt; nt = nt->next) {
-                                       sql_table *pt = nt->data;
+                               for (nt = t->members.set->h; nt; nt = nt->next) 
{
+                                       sql_part *pd = nt->data;
+                                       sql_table *pt = find_sql_table(t->s, 
pd->base.name);
                                        sql_rel *prel = rel_basetable(sql, pt, 
tname);
                                        node *n, *m;
                                        int skip = 0, j;
@@ -7772,7 +7773,7 @@ rel_merge_table_rewrite(int *changes, mv
                                        tables = ntables;
                                }
                        }
-                       if (nrel && list_length(t->tables.set) == 1) {
+                       if (nrel && list_length(t->members.set) == 1) {
                                nrel = rel_project(sql->sa, nrel, rel->exps);
                        } else if (nrel)
                                nrel->exps = rel->exps;
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -664,7 +664,7 @@ table_element(mvc *sql, symbol *s, sql_s
 
        if (alter && 
                (isView(t) || 
-               ((isMergeTable(t) || isReplicaTable(t)) && (s->token != 
SQL_TABLE && s->token != SQL_DROP_TABLE && cs_size(&t->tables)>0)) || 
+               ((isMergeTable(t) || isReplicaTable(t)) && (s->token != 
SQL_TABLE && s->token != SQL_DROP_TABLE && cs_size(&t->members)>0)) || 
                (isTable(t) && (s->token == SQL_TABLE || s->token == 
SQL_DROP_TABLE)) ||
                (isPartition(t) && (s->token == SQL_DROP_COLUMN || s->token == 
SQL_COLUMN || s->token == SQL_CONSTRAINT)))){
                char *msg = "";
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -923,7 +923,7 @@ table_ref(mvc *sql, sql_rel *rel, symbol
                        }
                        return rel;
                }
-               if ((isMergeTable(t) || isReplicaTable(t)) && 
list_empty(t->tables.set))
+               if ((isMergeTable(t) || isReplicaTable(t)) && 
list_empty(t->members.set))
                        return sql_error(sql, 02, "MERGE or REPLICA TABLE 
should have at least one table associated");
 
                return rel_basetable(sql, t, tname);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -150,7 +150,7 @@ table_destroy(sql_table *t)
        cs_destroy(&t->idxs);
        cs_destroy(&t->triggers);
        cs_destroy(&t->columns);
-       cs_destroy(&t->tables);
+       cs_destroy(&t->members);
        if (isTable(t))
                store_funcs.destroy_del(NULL, t);
 }
@@ -555,41 +555,20 @@ load_column(sql_trans *tr, sql_table *t,
 }
 
 static void
-load_table_parts(sql_trans *tr, sql_table *t, oid rid)
-{
+load_part(sql_trans *tr, sql_table *t, oid rid)
+{
+       void *v;
+       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");
-       void *v = table_funcs.column_find_value(tr, find_sql_column(objects, 
"name"), rid);
-       sql_table *tp = find_sql_table(t->s, v);        _DELETE(v);
-
-       assert(tp);
-       cs_add(&t->tables, tp, TR_OLD);
-       tp->p = t;
-}
-
-static void
-load_tables_of_tables(sql_trans *tr, sql_schema *s)
-{
-       node *n;
-       sql_schema *syss = find_sql_schema(tr, "sys");
-       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");
-
-       if (s->tables.set)
-       for (n=s->tables.set->h; n; n = n->next) {
-               sql_table *t = n->data;
-               oid r = oid_nil;
-
-               if (isMergeTable(t) || isReplicaTable(t)) {
-                       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); 
-                       for(r = table_funcs.rids_next(rs); r != oid_nil; r = 
table_funcs.rids_next(rs)) 
-                               load_table_parts(tr, t, r);
-                       table_funcs.rids_destroy(rs);
-               }
-       }
+       sqlid id;
+
+       v = table_funcs.column_find_value(tr, find_sql_column(objects, "nr"), 
rid);
+       id = *(sqlid*)v; _DELETE(v);
+       v = table_funcs.column_find_value(tr, find_sql_column(objects, "name"), 
rid);
+       /* limitation, parts can only be within the same schema */
+       base_init(tr->sa, &pt->base, id, TR_OLD, v);    _DELETE(v);
+       cs_add(&t->members, pt, TR_OLD);
 }
 
 static sql_table *
@@ -641,7 +620,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->tables, tr->sa, (fdestroy) NULL);
+       cs_new(&t->members, tr->sa, (fdestroy) NULL);
 
        if (isTable(t)) {
                if (store_funcs.create_del(tr, t) != LOG_OK) {
@@ -690,6 +669,18 @@ load_table(sql_trans *tr, sql_schema *s,
                list_append(s->triggers, k);
        }
        table_funcs.rids_destroy(rs);
+
+       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); 
+               for(rid = table_funcs.rids_next(rs); rid != oid_nil; rid = 
table_funcs.rids_next(rs)) 
+                       load_part(tr, t, rid);
+               table_funcs.rids_destroy(rs);
+       }
        return t;
 }
 
@@ -858,6 +849,27 @@ load_seq(sql_trans *tr, sql_schema * s, 
        return seq;
 }
 
+static void
+set_members(changeset *ts)
+{
+       node *n, *m;
+
+       if (ts && ts->set)
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to