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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list