====
---- QUERY
# testtbl is empty
select * from testtbl
---- TYPES
bigint, string, int
---- RESULTS
====
---- QUERY
# month ends at 12
select int_col from alltypessmall where month > 100
---- TYPES
int
---- RESULTS
====
---- QUERY
# Empty partitioned table test
select field from emptytable
---- TYPES
string
---- RESULTS
====
---- QUERY
# Constant conjunct.
select t1.id, t2.id
from alltypestiny t1
left outer join alltypes t2
on t1.id = t2.id
where false
---- TYPES
int, int
---- RESULTS
====
---- QUERY
# Constant conjunct in query block with an aggregation.
select count(int_col), avg(double_col), count(*)
from alltypes
where null
---- TYPES
bigint, double, bigint
---- RESULTS
0,NULL,0
====
---- QUERY
# Constant conjunct in inline view.
select e.id, f.id
from alltypessmall f
inner join
  (select t1.id
   from alltypestiny t1
   left outer join alltypes t2
   on t1.id = t2.id
   where 1 + 3 > 10) e
on e.id = f.id
---- TYPES
int, int
---- RESULTS
====
---- QUERY
# Limit 0
select t1.id, t2.id
from alltypestiny t1
left outer join alltypes t2
on t1.id = t2.id
limit 0
---- TYPES
int, int
---- RESULTS
====
---- QUERY
# Limit 0 in query block with an aggregation
select count(int_col), avg(double_col), count(*)
from alltypes
limit 0
---- TYPES
bigint, double, bigint
---- RESULTS
====
---- QUERY
# Limit 0 in inline view
select e.id, f.id
from alltypessmall f
inner join
  (select t1.id
   from alltypestiny t1
   left outer join alltypes t2
   on t1.id = t2.id
   limit 0) e
on e.id = f.id
---- TYPES
int, int
---- RESULTS
====
---- QUERY
# IMPALA-1234: Analytic with constant empty result set failed precondition check in FE
select MIN(int_col) OVER () FROM alltypes limit 0
---- RESULTS
---- TYPES
INT
====
---- QUERY
# IMPALA-1524: Materialize all tuples produced by an EmptySet node.
SELECT
COALESCE(580, MAX(t2.year), 150) AS int_col FROM (
  SELECT
  t1.bool_col,
  COALESCE(LAG(-826, 69) OVER (
    ORDER BY t1.bool_col DESC, COALESCE(t2.int_col, t2.smallint_col, t2.id)), 279, -764) AS int_col,
  COALESCE(t2.int_col, t2.smallint_col, t2.id) AS int_col_2
  FROM alltypestiny t1
  INNER JOIN alltypestiny t2
  ON ((t2.bigint_col) = (t1.id)) AND ((t2.timestamp_col) = (t1.timestamp_col))) t1
INNER JOIN alltypes t2 ON (t2.year) = (t1.int_col_2)
WHERE (-339.22) IN (-922.68, -254.84)
---- RESULTS
580
---- TYPES
INT
====
---- QUERY
# IMPALA-1960: Exprs in the aggregation that reference slots from an inline view when
# the select stmt has an empty select-project-join portion.
select sum(T.id), count(T.int_col)
from
  (select id, int_col, bigint_col from alltypestiny) T
where false
---- RESULTS
NULL,0
---- TYPES
BIGINT, BIGINT
====
---- QUERY
# IMPALA-2088: Test empty union operands with analytic functions.
select lead(-496, 81) over (order by t1.double_col desc, t1.id asc)
from alltypestiny t1 where 5 = 6
union
select 794.67
from alltypes t1 where 5 = 6
union all
select coalesce(10.4, int_col)
from alltypes where false
---- RESULTS
---- TYPES
DECIMAL
====
---- QUERY
# IMPALA-2406: condition filters out all rows from subquery during planning.
select *
from (select 10 as i, 2 as j, '2013' as s) as t
where t.i < 10;
---- RESULTS
---- TYPES
TINYINT,TINYINT,STRING
====
