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

Reply via email to