Changeset: 97e23efd60b2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=97e23efd60b2
Modified Files:
        sql/server/rel_distribute.c
        sql/server/rel_optimizer.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
Branch: merge-partitions
Log Message:

When distributing a delete statement across partitions, change column 
expressions labels

This clarifies the relational plan generated.


diffs (250 lines):

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
@@ -141,7 +141,7 @@ replica(mvc *sql, sql_rel *rel, char *ur
 
        if (rel_is_ref(rel)) {
                if (has_remote_or_replica(rel)) {
-                       sql_rel *nrel = rel_copy(sql->sa, rel);
+                       sql_rel *nrel = rel_copy(sql->sa, rel, 0);
 
                        if (nrel && rel->p)
                                nrel->p = prop_copy(sql->sa, rel->p);
@@ -272,7 +272,7 @@ distribute(mvc *sql, sql_rel *rel)
 
        if (rel_is_ref(rel)) {
                if (has_remote_or_replica(rel)) {
-                       sql_rel *nrel = rel_copy(sql->sa, rel);
+                       sql_rel *nrel = rel_copy(sql->sa, rel, 0);
 
                        if (nrel && rel->p)
                                nrel->p = prop_copy(sql->sa, rel->p);
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
@@ -8015,16 +8015,97 @@ rel_rename_part(mvc *sql, sql_rel *p, ch
        return p;
 }
 
+static sql_rel* rel_change_base_table(mvc* sql, sql_rel* rel, sql_table* oldt, 
sql_table* newt);
+
+static sql_exp*
+exp_change_column_table(mvc *sql, sql_exp *e, sql_table* oldt, sql_table* newt)
+{
+       if (!e)
+               return NULL;
+       switch(e->type) {
+               case e_psm: {
+                       if (e->flag & PSM_RETURN) {
+                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+                       } else if (e->flag & PSM_WHILE) {
+                               e->l = exp_change_column_table(sql, e->l, oldt, 
newt);
+                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+                       } else if (e->flag & PSM_IF) {
+                               e->l = exp_change_column_table(sql, e->l, oldt, 
newt);
+                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+                               if (e->f)
+                                       for(node *n = ((list*)e->f)->h ; n ; n 
= n->next)
+                                               n->data = 
exp_change_column_table(sql, (sql_exp*) n->data, oldt, newt);
+                       } else if (e->flag & PSM_REL) {
+                               rel_change_base_table(sql, e->l, oldt, newt);
+                       } else if (e->flag & PSM_EXCEPTION) {
+                               e->l = exp_change_column_table(sql, e->l, oldt, 
newt);
+                       }
+               } break;
+               case e_convert: {
+                       e->l = exp_change_column_table(sql, e->l, oldt, newt);
+               } break;
+               case e_atom:
+                       break;
+               case e_func: {
+                       for(node *n = ((list*)e->l)->h ; n ; n = n->next)
+                               n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+                       if (e->r)
+                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+               }       break;
+               case e_aggr: {
+                       if (e->l)
+                               for(node *n = ((list*)e->l)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+               }       break;
+               case e_column: {
+                       if(!strcmp(e->l, oldt->base.name))
+                               e->l = sa_strdup(sql->sa, newt->base.name);
+                       if(!strcmp(e->rname, oldt->base.name))
+                               e->rname = sa_strdup(sql->sa, newt->base.name);
+               } break;
+               case e_cmp: {
+                       if (e->flag == cmp_in || e->flag == cmp_notin) {
+                               e->l = exp_change_column_table(sql, e->l, oldt, 
newt);
+                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+                       } else if (get_cmp(e) == cmp_or || get_cmp(e) == 
cmp_filter) {
+                               for(node *n = ((list*)e->l)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+                               for(node *n = ((list*)e->r)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+                       } else {
+                               if(e->l)
+                                       e->l = exp_change_column_table(sql, 
e->l, oldt, newt);
+                               if(e->r)
+                                       e->r = exp_change_column_table(sql, 
e->r, oldt, newt);
+                               if(e->f)
+                                       e->f = exp_change_column_table(sql, 
e->f, oldt, newt);
+                       }
+               } break;
+       }
+       return e;
+}
+
 static sql_rel*
-rel_change_base_table(sql_rel* rel, sql_table* oldt, sql_table* newt)
+rel_change_base_table(mvc* sql, sql_rel* rel, sql_table* oldt, sql_table* newt)
 {
        if(!rel)
                return NULL;
 
+       if(rel->exps)
+               for(node *n = rel->exps->h ; n ; n = n->next)
+                       n->data = exp_change_column_table(sql, (sql_exp*) 
n->data, oldt, newt);
+
        switch(rel->op) {
                case op_basetable:
                        if(rel->l == oldt)
                                rel->l = newt;
+                       if(rel->r)
+                               rel->r = rel_change_base_table(sql, rel->r, 
oldt, newt);
                        break;
                case op_table:
                case op_topn:
@@ -8048,9 +8129,9 @@ rel_change_base_table(sql_rel* rel, sql_
                case op_anti:
                case op_apply:
                        if(rel->l)
-                               rel->l = rel_change_base_table(rel->l, oldt, 
newt);
+                               rel->l = rel_change_base_table(sql, rel->l, 
oldt, newt);
                        if(rel->r)
-                               rel->r = rel_change_base_table(rel->r, oldt, 
newt);
+                               rel->r = rel_change_base_table(sql, rel->r, 
oldt, newt);
        }
        return rel;
 }
@@ -8132,7 +8213,7 @@ rel_merge_table_rewrite(int *changes, mv
 {
        sql_rel *sel = NULL;
 
-       if(is_delete(rel->op) || is_truncate(rel->op) || is_insert(rel->op)) {
+       if(is_modify(rel->op)) {
                sql_rel *left = rel->l;
                if(left->op == op_basetable) {
                        sql_table *t = left->l;
@@ -8148,8 +8229,8 @@ rel_merge_table_rewrite(int *changes, mv
                                                sql_rel *s1, *dup = NULL;
 
                                                if(rel->r) {
-                                                       dup = rel_copy(sql->sa, 
rel->r);
-                                                       dup = 
rel_change_base_table(dup, t, sub);
+                                                       dup = rel_copy(sql->sa, 
rel->r, 1);
+                                                       dup = 
rel_change_base_table(sql, dup, t, sub);
                                                }
                                                if(is_delete(rel->op))
                                                        s1 = 
rel_delete(sql->sa, rel_basetable(sql, sub, sub->base.name), dup);
@@ -8281,6 +8362,32 @@ rel_merge_table_rewrite(int *changes, mv
                                                         
isRangePartitionTable(t) ? "range" : "list");
                                        exception = exp_exception(sql->sa, 
aggr, buf);
                                        sel = rel_ddl_distribute(sql->sa, sel, 
anti_dup, list_append(new_exp_list(sql->sa), exception));
+                               } else if(is_update(rel->op)) {
+                                       /*int colr = t->pcol->colnr;
+
+                                       for (node *n = t->members.set->h; n; n 
= n->next) {
+                                               sql_part *pt = (sql_part *) 
n->data;
+                                               sql_table *sub = 
find_sql_table(t->s, pt->base.name);
+                                               sql_rel *s1, *dup = NULL;
+
+                                               if(rel->r) {
+                                                       dup = rel_copy(sql->sa, 
rel->r, 1);
+                                                       dup = 
rel_change_base_table(sql, dup, t, sub);
+                                               }
+                                               rel_update(sql, 
rel_basetable(sql, sub, sub->base.name), rel, sql_exp **updates, list_dup(dup, 
NULL));
+
+
+                                               s1 = 
rel_truncate_duplicate(sql->sa, rel_basetable(sql, sub, sub->base.name), rel);
+                                               if (just_one == 0) {
+                                                       sel = rel_list(sql->sa, 
sel, s1);
+                                               } else {
+                                                       sel = s1;
+                                                       just_one = 0;
+                                               }
+                                               (*changes)++;
+                                       }
+                                       sel = rel_ddl_distribute(sql->sa, sel, 
NULL, NULL);*/
+
                                }
                        } else if(t->p && (isRangePartitionTable(t->p) || 
isListPartitionTable(t->p))
                                          && !find_prop(left->p, PROP_USED) && 
is_insert(rel->op)) {
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -109,7 +109,7 @@ rel_create( sql_allocator *sa )
 }
 
 sql_rel *
-rel_copy( sql_allocator *sa, sql_rel *i )
+rel_copy( sql_allocator *sa, sql_rel *i, int deep )
 {
        sql_rel *rel = rel_create(sa);
        if(!rel)
@@ -129,9 +129,17 @@ rel_copy( sql_allocator *sa, sql_rel *i 
                rel->r = i->r;
                break;
        case op_groupby:
-               rel->l = rel_copy(sa, i->l);
-               if (i->r)
-                       rel->r = (i->r)?list_dup(i->r, (fdup)NULL):NULL;
+               rel->l = rel_copy(sa, i->l, deep);
+               if (i->r) {
+                       if (!deep) {
+                               rel->r = list_dup(i->r, (fdup) NULL);
+                       } else {
+                               list* l = (list*)i->r;
+                               rel->r = list_new(l->sa, l->destroy);
+                               for(node *n = l->h ; n ; n = n->next)
+                                       list_append(rel->r, rel_copy(sa, 
(sql_rel *)n->data, deep));
+                       }
+               }
                break;
        case op_join:
        case op_left:
@@ -144,13 +152,13 @@ rel_copy( sql_allocator *sa, sql_rel *i 
        case op_select:
        default:
                if (i->l)
-                       rel->l = rel_copy(sa, i->l);
+                       rel->l = rel_copy(sa, i->l, deep);
                if (i->r)
-                       rel->r = rel_copy(sa, i->r);
+                       rel->r = rel_copy(sa, i->r, deep);
                break;
        }
        rel->op = i->op;
-       rel->exps = (i->exps)?list_dup(i->exps, (fdup)NULL):NULL;
+       rel->exps = (!i->exps)?NULL:deep?exps_copy(sa, 
i->exps):list_dup(i->exps, (fdup)NULL);
        return rel;
 }
 
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -33,7 +33,7 @@ extern sql_rel *rel_distinct(sql_rel *l)
 extern sql_rel *rel_dup(sql_rel *r);
 extern void rel_destroy(sql_rel *rel);
 extern sql_rel *rel_create(sql_allocator *sa);
-extern sql_rel *rel_copy(sql_allocator *sa, sql_rel *r);
+extern sql_rel *rel_copy(sql_allocator *sa, sql_rel *r, int deep);
 extern sql_rel *rel_select_copy(sql_allocator *sa, sql_rel *l, list *exps);
 
 extern sql_exp *rel_bind_column( mvc *sql, sql_rel *rel, const char *cname, 
int f );
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to