Changeset: 92180697aff2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=92180697aff2
Modified Files:
        sql/server/rel_select.c
Branch: subquery
Log Message:

make sure we return a proper expression on exists within case/cast


diffs (61 lines):

diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2343,15 +2343,17 @@ rel_logical_value_exp(sql_query *query, 
                symbol *lo = sc->data.sym;
                sql_rel *orel = *rel, *sq = NULL;
                list *pexps = NULL;
-               int needproj = 0, exists=(sc->token == SQL_EXISTS);
-
+               int needproj = 0, exists=(sc->token == SQL_EXISTS), is_value = 
is_sql_sel(f);
                sql_exp *le;
 
+               if (ek.type == type_value)
+                       is_value = 1;
+
                /* no input, assume single value */
                if ((!orel || (is_project(orel->op) && !is_processed(orel) && 
!orel->l && list_empty(orel->exps))) && !query_has_outer(query))
                        orel = *rel = rel_project_exp(sql->sa, 
exp_atom_bool(sql->sa, 1));
                ek.card = card_set;
-               if (is_sql_sel(f) && orel && is_project(orel->op) && 
!is_processed(orel)) {
+               if (is_value && orel && is_project(orel->op) && 
!is_processed(orel)) {
                        needproj = 1;
                        pexps = orel->exps;
                        *rel = orel->l;
@@ -2379,14 +2381,14 @@ rel_logical_value_exp(sql_query *query, 
 
                        //le = rel_lastexp(sql, sq);
                        le = _rel_lastexp(sql, sq);
-                       if (is_sql_sel(f)) { /* aggr (not) exist */
+                       if (is_value) { /* aggr (not) exist */
                                sq = rel_groupby(sql, sq, NULL);
                                ea = sql_bind_aggr(sql->sa, 
sql->session->schema, exists?"exist":"not_exist", exp_subtype(le));
                                le = exp_aggr1(sql->sa, le, ea, 0, 0, 
CARD_ATOM, 0);
                                le = rel_groupby_add_aggr(sql, sq, le);
                                le = exp_ref(sql->sa, le);
                        } 
-                       *rel = rel_crossproduct(sql->sa, *rel, sq, 
is_sql_sel(f)?op_left:exists?op_semi:op_anti); 
+                       *rel = rel_crossproduct(sql->sa, *rel, sq, 
is_value?op_left:exists?op_semi:op_anti); 
                        set_dependent(*rel);
                        if (*rel && needproj) {
                                *rel = rel_project(sql->sa, *rel, pexps);
@@ -2423,15 +2425,16 @@ rel_logical_value_exp(sql_query *query, 
                                sq = rel_project(sql->sa, sq, 
rel_projections(sql, sq, NULL, 1, 1));
                        if (!exp_is_atom(le))
                                le = _rel_lastexp(sql, sq);
-                       if (is_sql_sel(f)) { /* aggr (not) exist */
+                       if (is_value) { /* aggr (not) exist */
                                sq = rel_groupby(sql, sq, NULL);
                                ea = sql_bind_aggr(sql->sa, 
sql->session->schema, exists?"exist":"not_exist", exp_subtype(le));
                                le = exp_aggr1(sql->sa, le, ea, 0, 0, 
CARD_ATOM, 0);
                                le = rel_groupby_add_aggr(sql, sq, le);
                                le = exp_ref(sql->sa, le);
                        }
-                       *rel = rel_crossproduct(sql->sa, *rel, sq, 
is_sql_sel(f)?op_left:exists?op_semi:op_anti); 
-                       set_dependent(*rel);
+                       *rel = rel_crossproduct(sql->sa, *rel, sq, 
is_value?op_left:exists?op_semi:op_anti); 
+                       if (rel_has_freevar(sq))
+                               set_dependent(*rel);
                        if (*rel && needproj) {
                                *rel = rel_project(sql->sa, *rel, pexps);
                                reset_processed(*rel);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to