Changeset: 39292cf2559d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/39292cf2559d
Modified Files:
        sql/server/rel_select.c
Branch: Jan2022
Log Message:

Don't push down early expression with freevars (ie correlated columns). It 
gives issues while unnesting


diffs (39 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
@@ -1564,9 +1564,9 @@ rel_filter(mvc *sql, sql_rel *rel, list 
                        return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) 
"SELECT: cannot use non GROUP BY column in query results without an aggregate 
function");
                }
        }
-       if (!is_join(rel->op) && !is_select(rel->op))
+       if ((!is_join(rel->op) && !is_select(rel->op)) || 
exps_have_freevar(sql, l) || exps_have_freevar(sql, r))
                return rel_select(sql->sa, rel, e);
-       if (exps_card(r) <= CARD_ATOM && (exps_are_atoms(r) || 
exps_have_freevar(sql, r) || exps_have_freevar(sql, l))) {
+       if (exps_card(r) <= CARD_ATOM && exps_are_atoms(r)) {
                if (exps_card(l) == exps_card(r) || rel->processed)  /* bin 
compare op */
                        return rel_select(sql->sa, rel, e);
 
@@ -1598,11 +1598,10 @@ rel_filter_exp_(mvc *sql, sql_rel *rel, 
 static sql_rel *
 rel_select_push_exp_down(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, 
sql_exp *rs, sql_exp *rs2, int f)
 {
-       if (!is_join(rel->op) && !is_select(rel->op))
+       if ((!is_join(rel->op) && !is_select(rel->op)) || exp_has_freevar(sql, 
ls) || exp_has_freevar(sql, rs) || (rs2 && exp_has_freevar(sql, rs2)))
                return rel_select(sql->sa, rel, e);
-       if ((rs->card <= CARD_ATOM || (rs2 && ls->card <= CARD_ATOM)) &&
-               (exp_is_atom(rs) || (rs2 && exp_is_atom(ls)) || 
exp_has_freevar(sql, rs) || exp_has_freevar(sql, ls)) &&
-               (!rs2 || (rs2->card <= CARD_ATOM && (exp_is_atom(rs2) || 
exp_has_freevar(sql, rs2))))) {
+       if ((rs->card <= CARD_ATOM || (rs2 && ls->card <= CARD_ATOM)) && 
(exp_is_atom(rs) || (rs2 && exp_is_atom(ls))) &&
+               (!rs2 || (rs2->card <= CARD_ATOM && exp_is_atom(rs2)))) {
                if (ls->card == rs->card || (rs2 && (ls->card == rs2->card || 
rs->card == rs2->card)) || rel->processed) /* bin compare op */
                        return rel_select(sql->sa, rel, e);
 
@@ -2073,7 +2072,7 @@ rel_in_exp(sql_query *query, sql_rel *re
                int r_has_freevar = rlist ? exps_have_freevar(sql, e->r) : 
exp_has_freevar(sql, e->r);
 
                if (rcard <= CARD_ATOM && (r_is_atoms || r_has_freevar || 
exp_has_freevar(sql, ls))) {
-                       if ((exp_card(ls) == rcard) || rel->processed) /* bin 
compare op */
+                       if (exp_has_freevar(sql, ls) || r_has_freevar || 
(exp_card(ls) == rcard) || rel->processed) /* bin compare op */
                                return rel_select(sql->sa, rel, e);
 
                        return push_select_exp(sql, rel, e, ls, f);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to