Changeset: fd7a445210e8 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fd7a445210e8 Modified Files: monetdb5/modules/mal/remote.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_schema.c sql/server/rel_select.c sql/storage/store.c Branch: default Log Message:
Merge with Jul2017 branch. diffs (truncated from 752 to 300 lines): diff --git a/monetdb5/modules/mal/remote.c b/monetdb5/modules/mal/remote.c --- a/monetdb5/modules/mal/remote.c +++ b/monetdb5/modules/mal/remote.c @@ -758,7 +758,7 @@ str RMTput(Client cntxt, MalBlkPtr mb, M l = ATOMformat(type, value, &val); } tpe = getTypeIdentifier(type); - l += strlen(tpe) + strlen(ident) + 10; + l += (int) (strlen(tpe) + strlen(ident) + 10); if (l > BUFSIZ) nbuf = GDKmalloc(l); if (type <= TYPE_str) 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); } @@ -551,41 +551,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 * @@ -637,7 +616,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) { @@ -686,6 +665,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; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list