Changeset: a90bf0528439 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a90bf0528439
Modified Files:
        sql/server/rel_select.c
        sql/server/rel_unnest.c
        sql/test/subquery/Tests/subquery5.stable.err
        sql/test/subquery/Tests/subquery5.stable.out
Branch: Jun2020
Log Message:

handle sub queries with constants better
handle error cases where the outer query is used both as aggregated and non 
aggregated better


diffs (114 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
@@ -3341,7 +3341,7 @@ static sql_exp *
        exps = sa_list(sql->sa);
        if (args && args->data.sym) {
                int i, all_aggr = query_has_outer(query);
-               bool found_nested_aggr = false, arguments_correlated = true;
+               bool found_nested_aggr = false, arguments_correlated = true, 
all_const = true;
                list *ungrouped_cols = NULL;
 
                all_freevar = 1;
@@ -3379,11 +3379,14 @@ static sql_exp *
 
                        all_aggr &= (exp_card(e) <= CARD_AGGR && 
!exp_is_atom(e) && is_aggr(e->type) && !is_func(e->type) && (!groupby || 
!is_groupby(groupby->op) || !groupby->r || !exps_find_exp(groupby->r, e)));
                        exp_only_freevar(query, e, &arguments_correlated, 
&found_one_freevar, &found_nested_aggr, &ungrouped_cols);
-                       all_freevar &= arguments_correlated && 
found_one_freevar; /* no uncorrelated variables must be found, plus at least 
one correlated variable to push this aggregate to an outer query */
+                       all_freevar &= (arguments_correlated && 
found_one_freevar) || (is_atom(e->type)?all_freevar:0); /* no uncorrelated 
variables must be found, plus at least one correlated variable to push this 
aggregate to an outer query */
+                       all_const &= is_atom(e->type);
                        list_append(exps, e);
                }
                if (all_aggr || ((arguments_correlated || all_freevar) && 
found_nested_aggr))
                        return sql_error(sql, 05, SQLSTATE(42000) "SELECT: 
aggregate function calls cannot be nested");
+               if (all_const)
+                       all_freevar = 0;
                if (!all_freevar) {
                        if (is_sql_groupby(f)) {
                                char *uaname = GDKmalloc(strlen(aname) + 1);
@@ -3425,19 +3428,23 @@ static sql_exp *
                                        sql_rel *outer;
                                        sql_exp *e = (sql_exp*) n->data;
 
-                                       if ((outer = query_fetch_outer(query, 
is_freevar(e)-1)) && outer->grouped) {
-                                               bool err = false, was_processed 
= false;
-
-                                               if (is_processed(outer)) {
-                                                       was_processed = true;
-                                                       reset_processed(outer);
+                                       if ((outer = query_fetch_outer(query, 
is_freevar(e)-1))) {
+                                               if (outer->grouped) {
+                                                       bool err = false, 
was_processed = false;
+
+                                                       if 
(is_processed(outer)) {
+                                                               was_processed = 
true;
+                                                               
reset_processed(outer);
+                                                       }
+                                                       if 
(!is_groupby_col(outer, e))
+                                                               err = true;
+                                                       if (was_processed)
+                                                               
set_processed(outer);
+                                                       if (err)
+                                                               return 
sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: subquery uses ungrouped 
column \"%s.%s\" from outer query", exp_relname(e), exp_name(e));
+                                               } else {
+                                                       set_outer(outer);
                                                }
-                                               if (!is_groupby_col(outer, e))
-                                                       err = true;
-                                               if (was_processed)
-                                                       set_processed(outer);
-                                               if (err)
-                                                       return sql_error(sql, 
ERR_GROUPBY, SQLSTATE(42000) "SELECT: subquery uses ungrouped column \"%s.%s\" 
from outer query", exp_relname(e), exp_name(e));
                                        }
                                }
                        }
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
@@ -2075,10 +2075,8 @@ rewrite_anyequal(mvc *sql, sql_rel *rel,
                                if (rsq) {
                                        if (on_right) {
                                                sql_rel *join = rel->l; /* the 
introduced join */
-                                               join->r = 
rel_crossproduct(sql->sa, join->r, rsq, op_left);
-                                               set_dependent(join);
-                                               if (le->type != e_column)
-                                                       le = exp_ref(sql, le);
+                                               join->r = 
rel_crossproduct(sql->sa, join->r, rsq, op_join);
+                                               le = exp_ref(sql, le);
                                        } else
                                                (void)rewrite_inner(sql, rel, 
rsq, !is_tuple?op_join:is_anyequal(sf)?op_semi:op_anti);
                                }
diff --git a/sql/test/subquery/Tests/subquery5.stable.err 
b/sql/test/subquery/Tests/subquery5.stable.err
--- a/sql/test/subquery/Tests/subquery5.stable.err
+++ b/sql/test/subquery/Tests/subquery5.stable.err
@@ -150,6 +150,14 @@ MAPI  = (monetdb) /var/tmp/mtest-974789/
 QUERY = SELECT (SELECT 1 UNION SELECT 2) IN (SELECT 1) FROM integers i1;
 ERROR = !Cardinality violation, scalar value expected
 CODE  = 21000
+MAPI  = (monetdb) /var/tmp/mtest-1308344/.s.monetdb.32497
+QUERY = SELECT (SELECT MAX(i1.i + i2.i) FROM integers i2) IN (SELECT 
MIN(i1.i)) FROM integers i1;
+ERROR = !SELECT: subquery uses ungrouped column from outer query
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-1308344/.s.monetdb.32497
+QUERY = SELECT (SELECT COVAR_SAMP(i1.i, i2.i) FROM integers i2) IN (SELECT 
MIN(i1.i)) FROM integers i1;
+ERROR = !SELECT: subquery uses ungrouped column from outer query
+CODE  = 42000
 
 # 08:41:39 >  
 # 08:41:39 >  "Done."
diff --git a/sql/test/subquery/Tests/subquery5.stable.out 
b/sql/test/subquery/Tests/subquery5.stable.out
--- a/sql/test/subquery/Tests/subquery5.stable.out
+++ b/sql/test/subquery/Tests/subquery5.stable.out
@@ -231,6 +231,12 @@ stdout of test 'subquery5` in directory 
 % boolean # type
 % 5 # length
 [ NULL ]
+#SELECT (SELECT COVAR_POP(i1.i, 1)) IN (SELECT SUM(i1.i)) FROM integers i1;
+% .%20 # table_name
+% %20 # name
+% boolean # type
+% 5 # length
+[ false        ]
 #DROP FUNCTION evilfunction(INT);
 #DROP TABLE tbl_ProductSales;
 #DROP TABLE another_T;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to