Changeset: 9fb0e1247cfe for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/9fb0e1247cfe Modified Files: sql/server/rel_select.c sql/test/SQLancer/Tests/sqlancer22.test Branch: default Log Message:
Don't be restrictive on relation matching cases diffs (65 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 @@ -2485,9 +2485,11 @@ rel_logical_value_exp(sql_query *query, *rel = query_pop_outer(query); if (!sq) return NULL; - if (ek.card <= card_set && is_project(sq->op) && list_length(sq->exps) > 1) + if (ek.type == type_value && ek.card <= card_set && is_project(sq->op) && list_length(sq->exps) > 1) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery must return only one column"); - if (ek.card < card_set && sq->card >= CARD_AGGR && (is_sql_sel(f) | is_sql_having(f) | is_sql_farg(f) | + if (ek.type == type_relation && is_project(sq->op) && list_length(sq->exps) != ek.type) + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery has too %s columns", list_length(sq->exps) < ek.type ? "few" : "many"); + if (ek.type == type_value && ek.card < card_set && sq->card >= CARD_AGGR && (is_sql_sel(f) | is_sql_having(f) | is_sql_farg(f) | ( is_sql_where(f) && rel && (!*rel || is_basetable((*rel)->op) || is_simple_project((*rel)->op) || is_joinop((*rel)->op))))) sq = rel_zero_or_one(sql, sq, ek); return exp_rel(sql, sq); @@ -2767,6 +2769,7 @@ rel_logical_exp(sql_query *query, sql_re rel = query_pop_outer(query); if (!sq) return NULL; + assert(ek.type == type_value); /* I don't expect IN tuple matching calls to land here */ if (ek.card <= card_set && is_project(sq->op) && list_length(sq->exps) > 1) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery must return only one column"); if (!rel) @@ -5182,7 +5185,9 @@ rel_value_exp2(sql_query *query, sql_rel return NULL; if (ek.type == type_value && ek.card <= card_set && is_project(r->op) && list_length(r->exps) > 1) return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery must return only one column"); - if (list_length(r->exps) == 1 && !is_sql_psm(f)) /* for now don't rename multi attribute results */ + if (ek.type == type_relation && is_project(r->op) && list_length(r->exps) != ek.type) + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: subquery has too %s columns", list_length(r->exps) < ek.type ? "few" : "many"); + if (ek.type == type_value && list_length(r->exps) == 1 && !is_sql_psm(f)) /* for now don't rename multi attribute results */ r = rel_zero_or_one(sql, r, ek); return exp_rel(sql, r); } diff --git a/sql/test/SQLancer/Tests/sqlancer22.test b/sql/test/SQLancer/Tests/sqlancer22.test --- a/sql/test/SQLancer/Tests/sqlancer22.test +++ b/sql/test/SQLancer/Tests/sqlancer22.test @@ -603,5 +603,25 @@ query I nosort SELECT (SELECT 1 FROM (VALUES (1),(2),(3)) z(z) FULL OUTER JOIN (VALUES (2, 3), (4, t0.c0)) AS x(x,y) ON z.z) FROM t0 ---- +query I nosort +select 1 where (2,3) in (select x,y from (values (2, 3), (4, 5)) x(x,y)) +---- +1 + +query I nosort +select 1 where (2,3) in (select 2,3 union all select 3,4) +---- +1 + +query I nosort +select 1 where (2,3) in (with x(x,y) as (select 2,3) select x,y from x) +---- +1 + +query I nosort +select 1 where (2,3) in ((values (2, 3), (4, 5))) +---- +1 + statement ok ROLLBACK _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org