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

Reply via email to