Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ object TypeCoercion {

val commonTypes = lhs.zip(rhs).flatMap { case (l, r) =>
findCommonTypeForBinaryComparison(l.dataType, r.dataType, conf)
.orElse(findTightestCommonType(l.dataType, r.dataType))
.orElse(findWiderTypeWithoutStringPromotionForTwo(l.dataType, r.dataType))
}

// The number of columns/expressions must match between LHS and RHS of an
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ CREATE TEMPORARY VIEW t3 AS SELECT * FROM VALUES
AS t3(t3a, t3b, t3c);

CREATE TEMPORARY VIEW t4 AS SELECT * FROM VALUES
(CAST(1 AS DOUBLE), CAST(2 AS STRING), CAST(3 AS STRING))
(CAST('2017-12-11' AS DATE), CAST(2 AS STRING), CAST('2017-12-11' AS DATE))
AS t1(t4a, t4b, t4c);

CREATE TEMPORARY VIEW t5 AS SELECT * FROM VALUES
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,3 +328,159 @@ SELECT cast('2017-12-12 09:30:00' as date) in (cast('2017-12-12 09:30:00' as dat
SELECT cast('2017-12-12 09:30:00' as date) in (cast('2017-12-12 09:30:00' as date), cast(1 as boolean)) FROM t;
SELECT cast('2017-12-12 09:30:00' as date) in (cast('2017-12-12 09:30:00' as date), cast('2017-12-11 09:30:00.0' as timestamp)) FROM t;
SELECT cast('2017-12-12 09:30:00' as date) in (cast('2017-12-12 09:30:00' as date), cast('2017-12-11 09:30:00' as date)) FROM t;

SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as tinyint) FROM t);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need to test all the combinations? We need most of such logics should be tested in findWiderTypeWithoutStringPromotionForTwo and we could have just few end to end tests.

SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as tinyint)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as smallint)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as int)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as bigint)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as float)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as double)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as decimal(10, 0))) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as string)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast('1' as binary)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast(1 as boolean)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00.0' as timestamp)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);

SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as tinyint) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as smallint) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as int) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as bigint) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as float) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as double) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as decimal(10, 0)) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as string) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast('1' as binary) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast(1 as boolean) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast('2017-12-11 09:30:00.0' as timestamp) FROM t);
SELECT * FROM t WHERE (cast('2017-12-11 09:30:00' as date)) IN (SELECT cast('2017-12-11 09:30:00' as date) FROM t);
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ struct<>

-- !query 3
CREATE TEMPORARY VIEW t4 AS SELECT * FROM VALUES
(CAST(1 AS DOUBLE), CAST(2 AS STRING), CAST(3 AS STRING))
(CAST('2017-12-11' AS DATE), CAST(2 AS STRING), CAST('2017-12-11' AS DATE))
AS t1(t4a, t4b, t4c)
-- !query 3 schema
struct<>
Expand Down Expand Up @@ -139,8 +139,8 @@ cannot resolve '(named_struct('t4a', t4.`t4a`, 't4b', t4.`t4b`, 't4c', t4.`t4c`)
The data type of one or more elements in the left hand side of an IN subquery
is not compatible with the data type of the output of the subquery
Mismatched columns:
[(t4.`t4a`:double, t5.`t5a`:decimal(18,0)), (t4.`t4c`:string, t5.`t5c`:bigint)]
[(t4.`t4a`:date, t5.`t5a`:decimal(18,0)), (t4.`t4c`:date, t5.`t5c`:bigint)]
Left side:
[double, string, string].
[date, string, date].
Right side:
[decimal(18,0), string, bigint].;
Loading