Changeset: 88a2c5aeff07 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=88a2c5aeff07 Modified Files: sql/server/rel_unnest.c Branch: Oct2020 Log Message:
Identity function is needed when splitting 'or' expressions with subqueries diffs (42 lines): diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -1982,26 +1982,27 @@ rewrite_or_exp(visitor *v, sql_rel *rel) { if ((is_select(rel->op) || is_join(rel->op) || is_semi(rel->op)) && !list_empty(rel->exps)) { for(node *n=rel->exps->h; n; n=n->next) { - sql_exp *e = n->data; + sql_exp *e = n->data, *id; if (is_compare(e->type) && e->flag == cmp_or) { /* check for exp_is_rel */ if (exps_have_rel_exp(e->l) || exps_have_rel_exp(e->r)) { /* rewrite into setop */ + list_remove_node(rel->exps, n); /* remove or expression */ + if (is_select(rel->op) && list_empty(rel->exps)) { /* remove empty select if that's the case */ + sql_rel *l = rel->l; + rel->l = NULL; + rel_destroy(rel); + rel = l; + } + rel = rel_add_identity(v->sql, rel, &id); /* identity function needed */ + (void) id; + assert(id); + sql_rel *l = rel; sql_rel *r = rel_dup(rel); list *exps = rel_projections(v->sql, rel, NULL, 1, 1); - list_remove_node(rel->exps, n); /* remove or expression */ - if (is_select(rel->op) && list_empty(rel->exps)) { - sql_rel *ll = rel->l; - rel->l = NULL; - rel_destroy(rel); - rel = ll; - l = rel; - r = rel_dup(rel); - } - l = rel_select(v->sql->sa, l, NULL); l->exps = e->l; if (!(l = rewrite_or_exp(v, l))) _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list