==== ---- 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 ====