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