Changeset: a5fabb4507d0 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a5fabb4507d0 Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_cat.c sql/common/sql_list.c sql/include/sql_catalog.h sql/server/rel_distribute.c sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_partition.c sql/storage/sql_catalog.c sql/storage/store.c Branch: mmt Log Message:
Keep the parts of merge/replica tables with in the schema. (on merge/replica level we keep a list). Each partition now has a counter, counting the number of times the table is member of a hierarchy. diffs (truncated from 1453 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 @@ -389,12 +389,14 @@ create_table_or_view(mvc *sql, char* sna mvc_copy_key(sql, nt, k); } } - if (t->members.set) { - for (n = t->members.set->h; n; n = n->next) { + /* + 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 = cs_find_id(&rmt->members, rpt->base.id); + node *n = list_find_base_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 = cs_find_id(&mt->members, pt->base.id))) + if (!(n = list_find_base_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); @@ -1710,7 +1710,7 @@ SQLrename_table(Client cntxt, MalBlkPtr throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: not possible to change schema of a declared table"); if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, NULL)) throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' (there are database objects which depend on it)", otable_name); - if (!list_empty(t->members.set)) + if (!list_empty(t->members)) throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' while it has children", otable_name); if (!list_empty(t->triggers.set)) throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' while it has triggers", otable_name); diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c --- a/sql/common/sql_list.c +++ b/sql/common/sql_list.c @@ -309,6 +309,7 @@ list_remove_node(list *l, node *n) if (p != n) while (p && p->next != n) p = p->next; + assert(p==n||(p && p->next == n)); if (p == n) { l->h = n->next; p = NULL; @@ -323,7 +324,7 @@ list_remove_node(list *l, node *n) MT_lock_unset(&l->ht_lock); node_destroy(l, n); l->cnt--; - assert(l->cnt >= 0); + assert(l->cnt > 0 || l->h == NULL); return p; } 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 @@ -267,6 +267,7 @@ typedef struct sql_schema { changeset types; changeset funcs; changeset seqs; + changeset parts;/* merge/replica tables can only contain parts from the same schema */ list *keys; /* Names for keys, idxs and triggers are */ list *idxs; /* global, but these objects are only */ list *triggers; /* useful within a table */ @@ -614,9 +615,10 @@ typedef struct sql_part_value { typedef struct sql_part { sql_base base; - struct sql_table *t; /* cached value of the merge table */ - sql_subtype tpe; /* the column/expression type */ - bit with_nills; /* 0 no nills, 1 holds nills, NULL holds all values -> range FROM MINVALUE TO MAXVALUE WITH NULL */ + struct sql_table *t; /* the merge table */ + struct sql_table *member; /* the member of the merge table */ + sql_subtype tpe; /* the column/expression type */ + bit with_nills; /* 0 no nills, 1 holds nills, NULL holds all values -> range FROM MINVALUE TO MAXVALUE WITH NULL */ union { list *values; /* partition by values/list */ struct sql_range { /* partition by range */ @@ -651,7 +653,7 @@ typedef struct sql_table { changeset idxs; changeset keys; changeset triggers; - changeset members; + list *members; int drop_action; /* only needed for alter drop table */ int cleared; /* cleared in the current transaction */ @@ -659,7 +661,7 @@ typedef struct sql_table { struct sql_schema *s; struct sql_table *po; /* the outer transactions table */ - bit partition; /* if this table is part of some hierachy of tables (could be multiple) */ + char partition; /* number of times this table is part of some hierachy of tables */ union { struct sql_column *pcol; /* If it is partitioned on a column */ struct sql_expression *pexp; /* If it is partitioned by an expression */ @@ -770,6 +772,6 @@ typedef struct { } sql_emit_col; extern int nested_mergetable(sql_trans *tr, sql_table *t, const char *sname, const char *tname); -extern sql_table *find_merge_table(sql_trans *tr, sql_table *pt, sql_table *mt); +extern sql_part *partition_find_part(sql_trans *tr, sql_table *pt, sql_part *pp); #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 @@ -195,7 +195,7 @@ replica(mvc *sql, sql_rel *rel, char *ur if (uri) { /* replace by the replica which matches the uri */ - for (n = t->members.set->h; n; n = n->next) { + 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); @@ -205,10 +205,10 @@ replica(mvc *sql, sql_rel *rel, char *ur } } } else { /* no match, find one without remote or use first */ - if (t->members.set) { + if (t->members) { int fnd = 0; sql_part *p; - for (n = t->members.set->h; n; n = n->next) { + 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); @@ -219,7 +219,7 @@ replica(mvc *sql, sql_rel *rel, char *ur } } if (!fnd) { - p = t->members.set->h->data; + p = t->members->h->data; rel = rewrite_replica(sql, rel, t, p, 1); } } else { 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 @@ -67,7 +67,7 @@ name_find_column( sql_rel *rel, const ch if (strcmp(c->base.name, name) == 0) { *bt = rel; if (pnr < 0 || (mt && - list_position(mt->members.set, c->t) == pnr)) + list_position(mt->members, c->t) == pnr)) return c; } } @@ -77,7 +77,7 @@ name_find_column( sql_rel *rel, const ch if (strcmp(i->base.name, name+1 /* skip % */) == 0) { *bt = rel; if (pnr < 0 || (mt && - list_position(mt->members.set, i->t) == pnr)) { + list_position(mt->members, i->t) == pnr)) { sql_kc *c = i->columns->h->data; return c->c; } @@ -4938,7 +4938,7 @@ rel_part_nr( sql_rel *rel, sql_exp *e ) return -1; sql_table *pp = c->t; sql_table *mt = bt->r; - return list_position(mt->members.set, pp); + return list_position(mt->members, pp); } static int @@ -4961,7 +4961,7 @@ rel_uses_part_nr( sql_rel *rel, sql_exp if (c && bt && bt->r) { sql_table *pp = c->t; sql_table *mt = bt->r; - if (list_position(mt->members.set, pp) == pnr) + if (list_position(mt->members, pp) == pnr) return 1; } /* for projects we may need to do a rename! */ @@ -8884,7 +8884,7 @@ rel_merge_table_rewrite(visitor *v, sql_ char *tname = t->base.name; list *cols = NULL, *ranges = NULL; - if (list_empty(t->members.set)) + if (list_empty(t->members)) return rel; if (sel) { cols = sa_list(v->sql->sa); @@ -8939,10 +8939,10 @@ rel_merge_table_rewrite(visitor *v, sql_ } } v->changes++; - if (t->members.set) { + if (t->members) { list *tables = sa_list(v->sql->sa); - for (node *nt = t->members.set->h; nt; nt = nt->next) { + for (node *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_rel *prel = rel_basetable(v->sql, pt, tname), *bt = NULL; @@ -9231,7 +9231,7 @@ rel_merge_table_rewrite(visitor *v, sql_ tables = ntables; } } - if (nrel && list_length(t->members.set) == 1) { + if (nrel && list_length(t->members) == 1) { nrel = rel_project(v->sql->sa, nrel, rel->exps); } else if (nrel) { rel_set_exps(nrel, rel->exps); 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 @@ -74,7 +74,7 @@ rel_generate_anti_insert_expression(mvc sql_exp* res = NULL; if ((*anti_rel)->op != op_project && (*anti_rel)->op != op_basetable && (*anti_rel)->op != op_table) { - sql_rel *inserts; //In a nested partition case the operation is a op_select, then a projection must be created + sql_rel *inserts; /* In a nested partition case the operation is a op_select, then a projection must be created */ list *l = new_exp_list(sql->sa); *anti_rel = rel_project(sql->sa, *anti_rel, l); @@ -211,7 +211,7 @@ create_range_partition_anti_rel(sql_quer (void) rel_groupby_add_aggr(sql, anti_rel, aggr); exp_label(sql->sa, aggr, ++sql->label); - //generate the exception + /* generate the exception */ aggr = exp_ref(sql, aggr); generate_alter_table_error_message(buf, mt); exception = exp_exception(sql->sa, aggr, buf); @@ -253,7 +253,7 @@ create_list_partition_anti_rel(sql_query (void) rel_groupby_add_aggr(sql, anti_rel, aggr); exp_label(sql->sa, aggr, ++sql->label); - //generate the exception + /* generate the exception */ aggr = exp_ref(sql, aggr); generate_alter_table_error_message(buf, mt); exception = exp_exception(sql->sa, aggr, buf); @@ -265,14 +265,14 @@ static sql_rel * propagate_validation_to_upper_tables(sql_query* query, sql_table *mt, sql_table *pt, sql_rel *rel) { mvc *sql = query->sql; - sql_table *it; + sql_part *it = NULL; - for (sql_table *prev = mt ; prev ; prev = it) { - if (!isPartition(prev) || (it=find_merge_table(sql->session->tr, prev, NULL)) == NULL) + for (sql_table *prev = mt ; prev; prev = it?it->t:NULL) { + if (!isPartition(prev) || (it=partition_find_part(sql->session->tr, prev, NULL)) == NULL) break; - sql_part *spt = find_sql_part_id(it, prev->base.id); + sql_part *spt = it; if (spt) { - if (isRangePartitionTable(it)) { + if (isRangePartitionTable(it->t)) { int tpe = spt->tpe.type->localtype; int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe); const void *nil = ATOMnilptr(tpe); @@ -287,19 +287,19 @@ propagate_validation_to_upper_tables(sql found_all = is_bit_nil(spt->with_nills); } if (!found_all || !spt->with_nills) - rel = rel_list(sql->sa, rel, create_range_partition_anti_rel(query, it, pt, spt->with_nills, e1, e2, false)); - } else if (isListPartitionTable(it)) { + rel = rel_list(sql->sa, rel, create_range_partition_anti_rel(query, it->t, pt, spt->with_nills, e1, e2, false)); + } else if (isListPartitionTable(it->t)) { list *exps = new_exp_list(sql->sa); for (node *n = spt->part.values->h ; n ; n = n->next) { sql_part_value *next = (sql_part_value*) n->data; sql_exp *e1 = exp_atom(sql->sa, atom_general_ptr(sql->sa, &spt->tpe, next->value)); list_append(exps, e1); } - rel = rel_list(sql->sa, rel, create_list_partition_anti_rel(query, it, pt, spt->with_nills, exps)); + rel = rel_list(sql->sa, rel, create_list_partition_anti_rel(query, it->t, pt, spt->with_nills, exps)); } else { assert(0); } - } else { //the sql_part should exist + } else { /* the sql_part should exist */ assert(0); } } @@ -336,7 +336,7 @@ rel_alter_table_add_partition_range(sql_ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list