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