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