mirror of
https://github.com/apache/impala.git
synced 2026-01-01 18:00:30 -05:00
Previously, CodegenAnyVal used an LLVM function for floating point comparison that considered 'nan' = 'nan' to be true. This is inconsistent with the way we handle 'nan' in the non-codegen path, where we consider 'nan' = 'nan' to be false, leading to inconsisent results. This patch fixes CodegenAnyVal to use an LLVM function for floating point comparison that considers 'nan' = 'nan' to be false. Testing: - Added e2e tests for the two scenarios affected by this: CASE and joins. Change-Id: I1bb8e5074b3c939927dedc46bc9db63ca24486a1 Reviewed-on: http://gerrit.cloudera.org:8080/8790 Reviewed-by: Tim Armstrong <tarmstrong@cloudera.com> Reviewed-by: Michael Ho <kwho@cloudera.com> Tested-by: Impala Public Jenkins
798 lines
20 KiB
Plaintext
798 lines
20 KiB
Plaintext
====
|
|
---- QUERY
|
|
# Test join on timestamp, hashing was not working properly
|
|
select a.timestamp_col from alltypessmall a inner join alltypessmall b on
|
|
(a.timestamp_col = b.timestamp_col)
|
|
where a.year=2009 and a.month=1 and b.year=2009 and b.month=1
|
|
---- RESULTS
|
|
2009-01-01 00:00:00
|
|
2009-01-01 00:01:00
|
|
2009-01-01 00:02:00.100000000
|
|
2009-01-01 00:03:00.300000000
|
|
2009-01-01 00:04:00.600000000
|
|
2009-01-01 00:05:00.100000000
|
|
2009-01-01 00:06:00.150000000
|
|
2009-01-01 00:07:00.210000000
|
|
2009-01-01 00:08:00.280000000
|
|
2009-01-01 00:09:00.360000000
|
|
2009-01-02 00:10:00.450000000
|
|
2009-01-02 00:11:00.450000000
|
|
2009-01-02 00:12:00.460000000
|
|
2009-01-02 00:13:00.480000000
|
|
2009-01-02 00:14:00.510000000
|
|
2009-01-02 00:15:00.550000000
|
|
2009-01-02 00:16:00.600000000
|
|
2009-01-02 00:17:00.660000000
|
|
2009-01-02 00:18:00.730000000
|
|
2009-01-02 00:19:00.810000000
|
|
2009-01-03 00:20:00.900000000
|
|
2009-01-03 00:21:00.900000000
|
|
2009-01-03 00:22:00.910000000
|
|
2009-01-03 00:23:00.930000000
|
|
2009-01-03 00:24:00.960000000
|
|
---- TYPES
|
|
timestamp
|
|
====
|
|
---- QUERY
|
|
# Joins with multiple exprs
|
|
select j.*, d.* from JoinTbl j inner join DimTbl d on
|
|
(j.test_name = d.name AND j.test_zip = d.zip)
|
|
---- RESULTS
|
|
1001,'Name1',94611,5000,1001,'Name1',94611
|
|
1002,'Name2',94611,5000,1002,'Name2',94611
|
|
---- TYPES
|
|
bigint, string, int, int, bigint, string, int
|
|
====
|
|
---- QUERY
|
|
select j.*, d.* from JoinTbl j inner join DimTbl d on
|
|
(j.test_zip = d.zip AND j.test_name = d.name)
|
|
---- RESULTS
|
|
1001,'Name1',94611,5000,1001,'Name1',94611
|
|
1002,'Name2',94611,5000,1002,'Name2',94611
|
|
---- TYPES
|
|
bigint, string, int, int, bigint, string, int
|
|
====
|
|
---- QUERY
|
|
# join between three tables, extra join predicates, extra scan predicates, nulls in joins cols
|
|
# (alltypesagg.tinyint_col contains nulls instead of 0s)
|
|
select a.smallint_col, b.id, a.tinyint_col, c.id, a.int_col, b.float_col, c.string_col
|
|
from alltypesagg a
|
|
join alltypessmall b on (a.smallint_col = b.id)
|
|
join alltypessmall c on (a.tinyint_col = c.id)
|
|
where a.month=1
|
|
and a.day=1
|
|
and a.int_col > 899
|
|
and b.float_col > 4.5
|
|
and c.string_col < '7'
|
|
and a.int_col + b.float_col + cast(c.string_col as float) < 1000
|
|
---- RESULTS
|
|
15,15,5,5,915,5.5,'5'
|
|
16,16,6,6,916,6.599999904632568,'6'
|
|
31,31,1,1,931,6.599999904632568,'1'
|
|
32,32,2,2,932,7.699999809265137,'2'
|
|
33,33,3,3,933,8.800000190734863,'3'
|
|
34,34,4,4,934,9.899999618530273,'4'
|
|
41,41,1,1,941,6.599999904632568,'1'
|
|
42,42,2,2,942,7.699999809265137,'2'
|
|
43,43,3,3,943,8.800000190734863,'3'
|
|
44,44,4,4,944,9.899999618530273,'4'
|
|
5,5,5,5,905,5.5,'5'
|
|
55,55,5,5,955,5.5,'5'
|
|
56,56,6,6,956,6.599999904632568,'6'
|
|
6,6,6,6,906,6.599999904632568,'6'
|
|
65,65,5,5,965,5.5,'5'
|
|
66,66,6,6,966,6.599999904632568,'6'
|
|
81,81,1,1,981,6.599999904632568,'1'
|
|
82,82,2,2,982,7.699999809265137,'2'
|
|
83,83,3,3,983,8.800000190734863,'3'
|
|
84,84,4,4,984,9.899999618530273,'4'
|
|
91,91,1,1,991,6.599999904632568,'1'
|
|
---- TYPES
|
|
smallint, int, tinyint, int, int, float, string
|
|
====
|
|
---- QUERY
|
|
# reversing the order produces the same results
|
|
select a.smallint_col, b.id, a.tinyint_col, c.id, a.int_col, b.float_col, c.string_col
|
|
from alltypessmall b
|
|
join alltypesagg a on (a.smallint_col = b.id)
|
|
join alltypessmall c on (a.tinyint_col = c.id)
|
|
where a.month=1
|
|
and a.day=1
|
|
and a.int_col > 899
|
|
and b.float_col > 4.5
|
|
and c.string_col < '7'
|
|
and a.int_col + b.float_col + cast(c.string_col as float) < 1000
|
|
---- RESULTS
|
|
15,15,5,5,915,5.5,'5'
|
|
16,16,6,6,916,6.599999904632568,'6'
|
|
31,31,1,1,931,6.599999904632568,'1'
|
|
32,32,2,2,932,7.699999809265137,'2'
|
|
33,33,3,3,933,8.800000190734863,'3'
|
|
34,34,4,4,934,9.899999618530273,'4'
|
|
41,41,1,1,941,6.599999904632568,'1'
|
|
42,42,2,2,942,7.699999809265137,'2'
|
|
43,43,3,3,943,8.800000190734863,'3'
|
|
44,44,4,4,944,9.899999618530273,'4'
|
|
5,5,5,5,905,5.5,'5'
|
|
55,55,5,5,955,5.5,'5'
|
|
56,56,6,6,956,6.599999904632568,'6'
|
|
6,6,6,6,906,6.599999904632568,'6'
|
|
65,65,5,5,965,5.5,'5'
|
|
66,66,6,6,966,6.599999904632568,'6'
|
|
81,81,1,1,981,6.599999904632568,'1'
|
|
82,82,2,2,982,7.699999809265137,'2'
|
|
83,83,3,3,983,8.800000190734863,'3'
|
|
84,84,4,4,984,9.899999618530273,'4'
|
|
91,91,1,1,991,6.599999904632568,'1'
|
|
---- TYPES
|
|
smallint, int, tinyint, int, int, float, string
|
|
====
|
|
---- QUERY
|
|
# joins on empty tables
|
|
select * from emptytable t1 join emptytable t2 on (t1.field=t2.field)
|
|
---- RESULTS
|
|
---- TYPES
|
|
string, int, string, int
|
|
====
|
|
---- QUERY
|
|
select * from emptytable t1 join greptiny t2 on (t1.field=t2.field)
|
|
---- RESULTS
|
|
---- TYPES
|
|
string, int, string
|
|
====
|
|
---- QUERY
|
|
select * from greptiny t1 join emptytable t2 on (t1.field=t2.field)
|
|
---- RESULTS
|
|
---- TYPES
|
|
string, string, int
|
|
====
|
|
---- QUERY
|
|
# cross join
|
|
select t1.id, t2.id from alltypestiny t1 cross join alltypestiny t2
|
|
where (t1.id < 3 and t2.id < 3)
|
|
order by t1.id, t2.id limit 100
|
|
---- RESULTS
|
|
0,0
|
|
0,1
|
|
0,2
|
|
1,0
|
|
1,1
|
|
1,2
|
|
2,0
|
|
2,1
|
|
2,2
|
|
---- TYPES
|
|
int, int
|
|
====
|
|
---- QUERY
|
|
# cross join with an empty table
|
|
select t1.id, e.field from alltypestiny t1 cross join emptytable e
|
|
---- RESULTS
|
|
---- TYPES
|
|
int, string
|
|
====
|
|
---- QUERY
|
|
# check a larger cross join produces the expected number of rows
|
|
select count(*) from functional.AllTypesSmall t1 cross join functional.AllTypesSmall t2
|
|
---- RESULTS
|
|
10000
|
|
---- TYPES
|
|
bigint
|
|
====
|
|
---- QUERY
|
|
# cross join with nulls and constant table
|
|
select id, tinyint_col, t1.c from functional.alltypesagg
|
|
cross join (values(NULL c, 1, 2)) as t1
|
|
order by tinyint_col nulls first, id, t1.c
|
|
limit 6
|
|
---- RESULTS
|
|
0,NULL,NULL
|
|
0,NULL,NULL
|
|
10,NULL,NULL
|
|
10,NULL,NULL
|
|
20,NULL,NULL
|
|
20,NULL,NULL
|
|
---- TYPES
|
|
int, tinyint, null
|
|
====
|
|
---- QUERY
|
|
# check cross joins within a subquery
|
|
select t1.id as t1_id, t2_id, t3_id from alltypestiny t1
|
|
cross join (select t2.id as t2_id, t3.id as t3_id from alltypestiny t2
|
|
cross join alltypestiny t3) t4
|
|
where t1.id < 2 and t2_id < 2 and t3_id < 2
|
|
order by t1.id, t2_id, t3_id
|
|
limit 10
|
|
---- RESULTS
|
|
0,0,0
|
|
0,0,1
|
|
0,1,0
|
|
0,1,1
|
|
1,0,0
|
|
1,0,1
|
|
1,1,0
|
|
1,1,1
|
|
---- TYPES
|
|
int, int, int
|
|
====
|
|
---- QUERY
|
|
# cross join between two tables, extra where predicates, extra scan predicates, nulls in
|
|
# joins cols (alltypesagg.tinyint_col contains nulls instead of 0s)
|
|
select a.tinyint_col, b.id, a.string_col
|
|
from alltypesagg a cross join alltypessmall b
|
|
where a.tinyint_col = b.id
|
|
and a.month=1
|
|
and a.day=1
|
|
and a.tinyint_col + b.tinyint_col < 5
|
|
and a.string_col > '88'
|
|
and b.bool_col = false
|
|
---- RESULTS
|
|
1,1,'91'
|
|
1,1,'881'
|
|
1,1,'891'
|
|
1,1,'901'
|
|
1,1,'911'
|
|
1,1,'921'
|
|
1,1,'931'
|
|
1,1,'941'
|
|
1,1,'951'
|
|
1,1,'961'
|
|
1,1,'971'
|
|
1,1,'981'
|
|
1,1,'991'
|
|
---- TYPES
|
|
tinyint, int, string
|
|
====
|
|
---- QUERY
|
|
# join with three tables and then a cross join, extra where predicates, extra scan
|
|
# predicates, nulls in joins cols (alltypesagg.tinyint_col contains nulls instead of
|
|
# 0s)
|
|
select a.smallint_col, b.id, a.tinyint_col, c.id, a.int_col, b.float_col, c.string_col, d.id
|
|
from alltypesagg a
|
|
join alltypessmall b on (a.smallint_col = b.id)
|
|
join alltypessmall c on (a.tinyint_col = c.id)
|
|
cross join alltypestiny d
|
|
where a.month=1
|
|
and a.day=1
|
|
and a.int_col > 899
|
|
and b.float_col > 4.5
|
|
and c.string_col < '4'
|
|
and a.int_col + b.float_col + cast(c.string_col as float) < 1000
|
|
and d.id < 2
|
|
order by a.id, b.id, c.id, d.id
|
|
limit 100
|
|
---- RESULTS
|
|
31,31,1,1,931,6.599999904632568,'1',0
|
|
31,31,1,1,931,6.599999904632568,'1',1
|
|
32,32,2,2,932,7.699999809265137,'2',0
|
|
32,32,2,2,932,7.699999809265137,'2',1
|
|
33,33,3,3,933,8.800000190734863,'3',0
|
|
33,33,3,3,933,8.800000190734863,'3',1
|
|
41,41,1,1,941,6.599999904632568,'1',0
|
|
41,41,1,1,941,6.599999904632568,'1',1
|
|
42,42,2,2,942,7.699999809265137,'2',0
|
|
42,42,2,2,942,7.699999809265137,'2',1
|
|
43,43,3,3,943,8.800000190734863,'3',0
|
|
43,43,3,3,943,8.800000190734863,'3',1
|
|
81,81,1,1,981,6.599999904632568,'1',0
|
|
81,81,1,1,981,6.599999904632568,'1',1
|
|
82,82,2,2,982,7.699999809265137,'2',0
|
|
82,82,2,2,982,7.699999809265137,'2',1
|
|
83,83,3,3,983,8.800000190734863,'3',0
|
|
83,83,3,3,983,8.800000190734863,'3',1
|
|
91,91,1,1,991,6.599999904632568,'1',0
|
|
91,91,1,1,991,6.599999904632568,'1',1
|
|
---- TYPES
|
|
SMALLINT, INT, TINYINT, INT, INT, FLOAT, STRING, INT
|
|
====
|
|
---- QUERY
|
|
# FULL OUTER JOIN between two inline views followed by a GROUP BY (IMPALA-964)
|
|
select a.x FROM (VALUES(1 x, 1 y)) a FULL OUTER JOIN (VALUES(1 x, 1 y)) b
|
|
ON (a.x = b.y) GROUP BY a.x
|
|
---- RESULTS
|
|
1
|
|
---- TYPES
|
|
TINYINT
|
|
====
|
|
---- QUERY
|
|
select 1 FROM (VALUES(1 x, 1 y)) a RIGHT OUTER JOIN (VALUES(1 x, 1 y)) b
|
|
ON (a.x = b.y) GROUP BY a.x
|
|
---- RESULTS
|
|
1
|
|
---- TYPES
|
|
TINYINT
|
|
====
|
|
---- QUERY
|
|
# Test joins with union inputs. One input is a union.
|
|
select a.id, b.id, a.string_col, b.string_col
|
|
from
|
|
(select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 1
|
|
union all
|
|
select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 2
|
|
union all
|
|
select 0, '1234') a
|
|
inner join
|
|
functional.alltypestiny b
|
|
on a.id = b.id
|
|
where b.id < 5
|
|
---- RESULTS
|
|
0,0,'0','0'
|
|
0,0,'1234','0'
|
|
1,1,'1','1'
|
|
2,2,'2','0'
|
|
3,3,'3','1'
|
|
4,4,'4','0'
|
|
---- TYPES
|
|
INT, INT, STRING, STRING
|
|
====
|
|
---- QUERY
|
|
# Test joins with union inputs. One input is a union.
|
|
select a.id, b.id, a.string_col, b.string_col
|
|
from
|
|
functional.alltypestiny b
|
|
left outer join
|
|
(select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 1
|
|
union all
|
|
select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 2
|
|
union all
|
|
select 0, '1234') a
|
|
on a.id = b.id
|
|
where b.id < 5
|
|
---- RESULTS
|
|
0,0,'0','0'
|
|
0,0,'1234','0'
|
|
1,1,'1','1'
|
|
2,2,'2','0'
|
|
3,3,'3','1'
|
|
4,4,'4','0'
|
|
---- TYPES
|
|
INT, INT, STRING, STRING
|
|
====
|
|
---- QUERY
|
|
# Test joins with union inputs. Both inputs are a union.
|
|
select a.id, b.id, a.string_col, b.string_col
|
|
from
|
|
(select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 1
|
|
union all
|
|
select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 2
|
|
union all
|
|
select 0, '1234') a
|
|
full outer join
|
|
(select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 1
|
|
union all
|
|
select id, string_col from functional.alltypessmall
|
|
where year = 2009 and month = 2
|
|
union all
|
|
select 0, '5678') b
|
|
on a.id = b.id
|
|
where b.id < 5
|
|
---- RESULTS
|
|
0,0,'0','0'
|
|
0,0,'0','5678'
|
|
0,0,'1234','0'
|
|
0,0,'1234','5678'
|
|
1,1,'1','1'
|
|
2,2,'2','2'
|
|
3,3,'3','3'
|
|
4,4,'4','4'
|
|
---- TYPES
|
|
INT, INT, STRING, STRING
|
|
====
|
|
---- QUERY
|
|
# Regression test for IMPALA-1123. Tests that hash exchanges feeding the same
|
|
# hash-partitioned fragment use type-identical partition exprs.
|
|
select straight_join count(*) from
|
|
(select tinyint_col from functional.alltypessmall
|
|
union distinct
|
|
select tinyint_col from functional.alltypessmall) a
|
|
inner join [shuffle]
|
|
(select smallint_col from functional.alltypessmall
|
|
union distinct
|
|
select smallint_col from functional.alltypessmall) b
|
|
on a.tinyint_col = b.smallint_col
|
|
---- RESULTS
|
|
10
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Regression test for IMPALA-1123. The plan below has one big hash-partitioned
|
|
# fragment with two joins and a merge agg since their partition exprs are all
|
|
# compatible. The single fragment is fed by multiple hash-partitioning senders,
|
|
# and we need to ensure that the partition exprs used by the senders are cast
|
|
# to identical types because the same value will have different hashes for
|
|
# different types. Minimal explain plan:
|
|
#
|
|
# 15:AGGREGATE [MERGE FINALIZE]
|
|
# 14:EXCHANGE [UNPARTITIONED]
|
|
# 08:AGGREGATE
|
|
# 07:HASH JOIN [INNER JOIN, PARTITIONED]
|
|
# |--13:AGGREGATE [MERGE FINALIZE]
|
|
# | 12:EXCHANGE [HASH(tinyint_col)]
|
|
# | 05:AGGREGATE
|
|
# | 04:SCAN HDFS [functional.alltypessmall]
|
|
# 06:HASH JOIN [INNER JOIN, PARTITIONED]
|
|
# |--03:HASH JOIN [INNER JOIN, PARTITIONED]
|
|
# | |--10:EXCHANGE [HASH(t2.smallint_col)]
|
|
# | | 02:SCAN HDFS [functional.alltypessmall t2]
|
|
# | 09:EXCHANGE [HASH(t1.tinyint_col)]
|
|
# | 01:SCAN HDFS [functional.alltypessmall t1]
|
|
# 11:EXCHANGE [HASH(a.int_col)]
|
|
# 00:SCAN HDFS [functional.alltypessmall a]
|
|
#
|
|
select straight_join count(*) from
|
|
functional.alltypessmall a
|
|
inner join [shuffle]
|
|
(select straight_join t2.* from
|
|
functional.alltypessmall t1
|
|
inner join [shuffle]
|
|
functional.alltypessmall t2
|
|
on t1.tinyint_col = t2.smallint_col) b
|
|
on a.int_col = b.smallint_col
|
|
inner join [shuffle]
|
|
(select distinct tinyint_col
|
|
from functional.alltypessmall) c
|
|
on a.int_col = c.tinyint_col
|
|
---- RESULTS
|
|
11200
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Same query as above with broadcast joins. Results should be identical.
|
|
select straight_join count(*) from
|
|
functional.alltypessmall a
|
|
inner join [broadcast]
|
|
(select straight_join t2.* from
|
|
functional.alltypessmall t1
|
|
inner join [broadcast]
|
|
functional.alltypessmall t2
|
|
on t1.tinyint_col = t2.smallint_col) b
|
|
on a.int_col = b.smallint_col
|
|
inner join [broadcast]
|
|
(select distinct tinyint_col
|
|
from functional.alltypessmall) c
|
|
on a.int_col = c.tinyint_col
|
|
---- RESULTS
|
|
11200
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Regression test for IMPALA-1329
|
|
select COUNT(t1.string_col) AS int_col_1 FROM alltypestiny t1
|
|
LEFT JOIN alltypestiny t2 ON t2.date_string_col = t1.string_col
|
|
LEFT JOIN alltypesagg t3 ON t3.id = t2.tinyint_col
|
|
---- RESULTS
|
|
8
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Regression test for IMPALA-1332
|
|
select a.int_col from alltypesagg a
|
|
RIGHT OUTER JOIN alltypesagg b
|
|
using(int_col)
|
|
where a.int_col is NULL limit 1
|
|
---- RESULTS
|
|
NULL
|
|
---- TYPES
|
|
INT
|
|
====
|
|
---- QUERY
|
|
# Left outer join with non-equi join predicates
|
|
select straight_join count(*) from
|
|
alltypestiny a left outer join alltypes b on a.id < b.id
|
|
where a.id < 5
|
|
---- RESULTS
|
|
36485
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Left semi join with non-equi join predicates
|
|
select straight_join count(*) from
|
|
alltypesagg a left semi join alltypestiny b on a.id >= b.id or a.int_col != b.int_col
|
|
where a.tinyint_col < 10
|
|
---- RESULTS
|
|
9000
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Left anti join with non-equi join predicates
|
|
select straight_join count(*) from
|
|
alltypesagg a left anti join alltypestiny b on a.id < b.id and a.int_col > b.int_col
|
|
---- RESULTS
|
|
10994
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Inner and left outer joins with non-equi join predicates
|
|
select straight_join count(*) from
|
|
alltypesagg a inner join alltypes b on a.id < b.id
|
|
left outer join alltypestiny c
|
|
on a.int_col != c.int_col or a.tinyint_col > c.tinyint_col
|
|
where a.smallint_col < 2
|
|
---- RESULTS
|
|
2038096
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Inner, left-semi and left-anti joins with non-equi join predicates
|
|
select straight_join count(*) from
|
|
alltypestiny a left semi join alltypesagg b on a.id != b.id
|
|
left anti join alltypes c on a.int_col < c.int_col
|
|
inner join alltypestiny d on a.int_col = d.int_col
|
|
where a.tinyint_col < 10
|
|
---- RESULTS
|
|
0
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Joins with non-equi join predicates between inline views
|
|
select straight_join count(*) from
|
|
(select * from alltypestiny where id < 10) v1
|
|
inner join
|
|
(select * from alltypesagg a left semi join
|
|
alltypes b on a.id < b.id) v2
|
|
on v1.int_col != v2.tinyint_col
|
|
---- RESULTS
|
|
49632
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# IMPALA-2319: NLJ with limit
|
|
select straight_join t1.id, t2.bool_col
|
|
from functional.alltypes t1
|
|
cross join functional.alltypes t2 where t1.id = 0 limit 1;
|
|
---- RESULTS
|
|
0,true
|
|
---- TYPES
|
|
INT,BOOLEAN
|
|
====
|
|
---- QUERY
|
|
# IMPALA-2147: IS [NOT] DISTINCT FROM and "<=>"
|
|
select count(*) > 0
|
|
from alltypesagg as a, alltypesagg as b
|
|
where (a.tinyint_col IS DISTINCT FROM b.tinyint_col)
|
|
and a.tinyint_col is null
|
|
---- RESULTS
|
|
true
|
|
---- TYPES
|
|
BOOLEAN
|
|
====
|
|
---- QUERY
|
|
select count(*) > 0
|
|
from alltypesagg as a, alltypesagg as b
|
|
where (a.tinyint_col IS NOT DISTINCT FROM b.tinyint_col)
|
|
and a.tinyint_col is null
|
|
---- RESULTS
|
|
true
|
|
---- TYPES
|
|
BOOLEAN
|
|
====
|
|
---- QUERY
|
|
select count(*) > 0
|
|
from alltypesagg as a, alltypesagg as b
|
|
where (a.tinyint_col <=> b.tinyint_col)
|
|
and a.tinyint_col is null
|
|
---- RESULTS
|
|
true
|
|
---- TYPES
|
|
BOOLEAN
|
|
====
|
|
---- QUERY
|
|
# left joins with <=> are different from left joins with =
|
|
select P.d, Q.d, Q.b, Q.b is null
|
|
from nulltable P left join nulltable Q
|
|
on P.d = Q.d
|
|
---- RESULTS
|
|
NULL,NULL,'NULL',true
|
|
---- TYPES
|
|
INT,INT,STRING,BOOLEAN
|
|
====
|
|
---- QUERY
|
|
select P.d, Q.d, Q.b
|
|
from nulltable P left join nulltable Q
|
|
on P.d <=> Q.d
|
|
---- RESULTS
|
|
NULL,NULL,''
|
|
---- TYPES
|
|
INT,INT,STRING
|
|
====
|
|
---- QUERY
|
|
select count(*)
|
|
from nulltable P left anti join nulltable Q
|
|
on P.d = Q.d
|
|
---- RESULTS
|
|
1
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
select count(*)
|
|
from nulltable P left anti join nulltable Q
|
|
on P.d <=> Q.d
|
|
---- RESULTS
|
|
0
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Test that 'IS DISTINCT FROM' works in nested loop joins
|
|
select count(*) from nulltable t1, nulltable t2 where not(t1.d != t2.d)
|
|
---- RESULTS
|
|
0
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
select t1.d, t2.d from nulltable t1, nulltable t2 where not(t1.d IS DISTINCT FROM t2.d)
|
|
---- RESULTS
|
|
NULL,NULL
|
|
---- TYPES
|
|
INT,INT
|
|
====
|
|
---- QUERY
|
|
select count(*) from nulltable t1, nulltable t2
|
|
where t1.d != length(t2.a)
|
|
---- RESULTS
|
|
0
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
select t1.d, t2.a from nulltable t1, nulltable t2
|
|
where t1.d IS DISTINCT FROM length(t2.a)
|
|
---- RESULTS
|
|
NULL,'a'
|
|
---- TYPES
|
|
INT,STRING
|
|
====
|
|
---- QUERY
|
|
select t1.a, t1.b, t2.a, t2.b from
|
|
(values
|
|
(NULL a, NULL b), (NULL, 0), (NULL, 1),
|
|
(0, NULL), (0, 0), (0, 1),
|
|
(1, NULL), (1, 0), (1, 1)) as t1,
|
|
(values
|
|
(NULL a, NULL b), (NULL, 0), (NULL, 1),
|
|
(0, NULL), (0, 0), (0, 1),
|
|
(1, NULL), (1, 0), (1, 1)) as t2
|
|
where t1.a <=> t2.a
|
|
and t1.b <=> t2.b
|
|
order by t1.a, t1.b, t2.a, t2.b
|
|
---- RESULTS
|
|
0,0,0,0
|
|
0,1,0,1
|
|
0,NULL,0,NULL
|
|
1,0,1,0
|
|
1,1,1,1
|
|
1,NULL,1,NULL
|
|
NULL,0,NULL,0
|
|
NULL,1,NULL,1
|
|
NULL,NULL,NULL,NULL
|
|
---- TYPES
|
|
TINYINT,TINYINT,TINYINT,TINYINT
|
|
====
|
|
---- QUERY
|
|
select t1.a, t1.b, t2.a, t2.b from
|
|
(values
|
|
(NULL a, NULL b), (NULL, 0), (NULL, 1),
|
|
(0, NULL), (0, 0), (0, 1),
|
|
(1, NULL), (1, 0), (1, 1)) as t1,
|
|
(values
|
|
(NULL a, NULL b), (NULL, 0), (NULL, 1),
|
|
(0, NULL), (0, 0), (0, 1),
|
|
(1, NULL), (1, 0), (1, 1)) as t2
|
|
where t1.a <=> t2.a
|
|
and t1.b = t2.b
|
|
order by t1.a, t1.b, t2.a, t2.b
|
|
---- RESULTS
|
|
0,0,0,0
|
|
0,1,0,1
|
|
1,0,1,0
|
|
1,1,1,1
|
|
NULL,0,NULL,0
|
|
NULL,1,NULL,1
|
|
---- TYPES
|
|
TINYINT,TINYINT,TINYINT,TINYINT
|
|
====
|
|
---- QUERY
|
|
# Regression test for IMPALA-3645. Certain UDFs may do local allocations in Expr::Open().
|
|
# Make sure the DCHECK in PartitionedHashJoinNode::ProcessBuildInput() doesn't fire.
|
|
select count(*) from functional.alltypesagg t1 join functional.alltypesagg t2
|
|
on extract(minute from t1.timestamp_col) = extract(hour from t2.timestamp_col);
|
|
---- RESULTS
|
|
2042200
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Regression for IMPALA-3884. Exercise HashTableCtx::AssignNullValue() for
|
|
# 128-bit TimestampValue.
|
|
select count(*) from functional.alltypes t1 right outer join functional.decimal_tbl t2 on
|
|
t1.timestamp_col = cast(t2.d4 as TIMESTAMP);
|
|
---- RESULTS
|
|
5
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# IMPALA-5850: Tests that the sender partition exprs of a series of partitioned hash
|
|
# joins are cast to compatible types even when the containing fragment is RANDOM
|
|
# partitioned due a union. This test borrows ideas from existing tests for IMPALA-1123.
|
|
# The test has a union with three branches where each branch contains independent and
|
|
# incompatible hash-partitioning exchanges. Two of the union branches contain
|
|
# partitioned joins which require the sender partition exprs to be cast to produce
|
|
# correct results.
|
|
# Breakdown of result count:
|
|
# The first union branch is expected to produce 2 rows
|
|
# The second union branch is expected to produce 11200 rows (see IMPALA-1123 test)
|
|
# The third union branch is expected to produce 10 rows
|
|
select count(*) from (
|
|
select distinct tinyint_col, smallint_col, int_col
|
|
from functional.alltypestiny
|
|
union all
|
|
select /* +straight_join */ b.id, c.tinyint_col, null
|
|
from functional.alltypessmall a
|
|
inner join /* +shuffle */
|
|
(select /* +straight_join */ t2.id, t2.smallint_col
|
|
from functional.alltypessmall t1
|
|
inner join /* +shuffle */ functional.alltypessmall t2
|
|
on t1.tinyint_col = t2.smallint_col) b
|
|
on a.int_col = b.smallint_col
|
|
inner join /* +shuffle */
|
|
(select distinct tinyint_col
|
|
from functional.alltypessmall) c
|
|
on a.int_col = c.tinyint_col
|
|
union all
|
|
select /* +straight_join */ tinyint_col, bigint_col, null from
|
|
(select distinct tinyint_col, bigint_col div 10 as bigint_col
|
|
from functional.alltypessmall) a
|
|
inner join /* +shuffle */
|
|
(select distinct int_col, smallint_col
|
|
from functional.alltypessmall) b
|
|
on a.tinyint_col = b.int_col and a.bigint_col = b.smallint_col) v
|
|
---- RESULTS
|
|
11212
|
|
---- TYPES
|
|
BIGINT
|
|
====
|
|
---- QUERY
|
|
# Test that 'nan' != 'nan' when joining.
|
|
with x as (select cast('nan' as double) n)
|
|
select * from x a, x b where a.n = b.n
|
|
---- RESULTS
|
|
---- TYPES
|
|
DOUBLE,DOUBLE
|
|
====
|
|
---- QUERY
|
|
# Test that 'nan' != 'nan' when joining.
|
|
select a.id from functional.alltypestiny a, functional.alltypestiny b
|
|
where 1/a.double_col + -1/a.double_col = log10(-b.id)
|
|
---- RESULTS
|
|
---- TYPES
|
|
INT
|
|
====
|
|
---- QUERY
|
|
# Test that 'nan' != 'nan' when joining.
|
|
select a.id from functional.alltypestiny a, functional.alltypestiny b
|
|
where sqrt(-a.id) = b.float_col / b.double_col
|
|
---- RESULTS
|
|
---- TYPES
|
|
INT
|
|
====
|