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