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