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 -- [email protected]
To unsubscribe send an email to [email protected]