288 lines
7.4 KiB
SQL
288 lines
7.4 KiB
SQL
# name: test/optimizer/zonemaps.test
|
|
# description: Test if zonemaps are correctly used
|
|
# group: [optimizer]
|
|
|
|
statement ok
|
|
PRAGMA explain_output = PHYSICAL_ONLY;
|
|
|
|
statement ok
|
|
create temporary table t as select range a, length(range::varchar) b, mod(range,10000) c, 5 d, 10000 e from range(100000);
|
|
|
|
# 1) In-clause based on in-clause range/boundary zonemap check
|
|
query II
|
|
explain select count(*) from t where b in (1,2,3) ;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*
|
|
|
|
query II
|
|
explain select count(*) from t where b <=3 and b>=0;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*
|
|
|
|
mode skip
|
|
# FIXME
|
|
|
|
# 2) In-clause based on in-clause range/boundary zonemap check
|
|
|
|
query II
|
|
explain select count(*) from t where b in (1, 3) ;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*b<=3.*
|
|
|
|
query II
|
|
explain select count(*) from t where b = 1 or b = 3 ;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*b<=3.*
|
|
|
|
# 3) Transitive Filters
|
|
query II
|
|
explain select count(*) from t where b < 5 and d = 5;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*
|
|
|
|
query II
|
|
explain select count(*) from t where d = 5 and b < d;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*
|
|
|
|
# 4) Check zonemap before joins
|
|
statement ok
|
|
create temporary table t1 as select range a, length(range) nationkey from range(100000);
|
|
|
|
statement ok
|
|
create table t2 as select range nationkey, concat('Nation_',range) n_name from range(25);
|
|
|
|
query II
|
|
explain select count(*) from t1 join t2 using (nationkey)
|
|
where t2.n_name = 'Nation_1' and t1.nationkey =1;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*Filters:.*
|
|
|
|
query II
|
|
explain select count(*) from t1 join t2 using (nationkey)
|
|
where t2.n_name = 'Nation_1' and t2.nationkey =1;
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*Filters:.*
|
|
|
|
query II
|
|
explain select count(*) from t1 join t2 using (nationkey) where t2.n_name = 'Nation_1';
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*n_name=Nation_1.*
|
|
|
|
query II
|
|
explain select count(*) from t1 join t2 using (nationkey) where t2.nationkey =2 or n_name= 'Nation_2';
|
|
----
|
|
physical_plan <!REGEX>:.*Filters:.*
|
|
|
|
query II
|
|
explain select count(*) from t1 join t2 using (nationkey) where t2.n_name in ( 'Nation_1', 'Nation_2');
|
|
----
|
|
physical_plan <REGEX>:.*Filters:.*
|
|
|
|
|
|
|
|
# 5) More General Tests
|
|
statement ok
|
|
CREATE TABLE test(a tinyint, b smallint, c integer, d bigint, e double, f real, g varchar);
|
|
|
|
statement ok
|
|
INSERT INTO test values (1,1,1,1,1,1,'1')
|
|
|
|
statement ok
|
|
INSERT INTO test values (10,10,10,10,10,10,'10')
|
|
|
|
# 5.1) Flipping filters
|
|
query II
|
|
explain select count(*) from test where (2 < a and 7 > a) or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=2.*a<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (2 < a and a < 7) or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=2.*a<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (a >=2 and 7 > a) or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=2.*a<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (4=a) or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=4.*a<=6.*
|
|
|
|
# 5.2) Different Data Types
|
|
|
|
query II
|
|
explain select count(*) from test where (a >=2 and a < 7) or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=2.*a<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where a >2 and a < 7 or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=2.*a<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where a >2 and a <= 7 or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=2.*a<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where a >=2 and a <= 7 or (a >5 and a < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a>=2.*a<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (b >=2 and b < 7) or (b >5 and b < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*b>=2.*b<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where b >2 and b < 7 or (b >5 and b < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*b>=2.*b<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where b >2 and b <= 7 or (b >5 and b < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*b>=2.*b<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where b >=2 and b <= 7 or (b >5 and b < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*b>=2.*b<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (c >=2 and c < 7) or (c >5 and c < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*c>=2.*c<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where c >2 and c < 7 or (c >5 and c < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*c>=2.*c<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where c >2 and c <= 7 or (c >5 and c < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*c>=2.*c<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where c >=2 and c <= 7 or (c >5 and c < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*c>=2.*c<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (d >=2 and d < 7) or (d >5 and d < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*d>=2.*d<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where d >2 and d < 7 or (d >5 and d < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*d>=2.*d<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where d >2 and d <= 7 or (d >5 and d < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*d>=2.*d<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where d >=2 and d <= 7 or (d >5 and d < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*d>=2.*d<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (e >=2 and e < 7) or (e >5 and e < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*e>=2.*e<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where e >2 and e < 7 or (e >5 and e < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*e>=2.*e<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where e >2 and e <= 7 or (e >5 and e < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*e>=2.*e<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where e >=2 and e <= 7 or (e >5 and e < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*e>=2.*e<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (f >=2 and f < 7) or (f >5 and f < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*f>=2.*f<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where f >2 and f < 7 or (f >5 and f < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*f>=2.*f<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where f >2 and f <= 7 or (f >5 and f < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*f>=2.*f<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where f >=2 and f <= 7 or (f >5 and f < 6)
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*f>=2.*f<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where (g >='2' and g < '7') or (g >'5' and g < '6')
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*g>=2.*g<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where g >'2' and g < '7' or (g >'5' and g < '6')
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*g>=2.*g<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where g >'2' and g <= '7' or (g >'5' and g < '6')
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*g>=2.*g<=7.*
|
|
|
|
query II
|
|
explain select count(*) from test where g >='2' and g <= '7' or (g >'5' and g < '6')
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*g>=2.*g<=7.*
|
|
|
|
# 5.3) Casting
|
|
statement ok
|
|
CREATE TABLE test_date(a date);
|
|
|
|
statement ok
|
|
insert into test_date values ('1995-12-01')
|
|
|
|
statement ok
|
|
insert into test_date values ('1995-12-10')
|
|
|
|
query II
|
|
explain select count(*) from test_date where a = '1995-12-01'
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a=1995-12-01.*
|
|
|
|
query II
|
|
explain select count(*) from test_date where a in ( '1995-12-01', '1995-12-02')
|
|
----
|
|
physical_plan <REGEX>:.* Filters: .*a<=1995-12-02.*
|
|
|
|
# 5.4) Test with Nulls
|
|
statement ok
|
|
CREATE TABLE t0(c0 boolean);
|
|
|
|
statement ok
|
|
INSERT INTO t0 VALUES (false), (NULL);
|
|
|
|
query T
|
|
SELECT t0.c0 FROM t0 WHERE t0.c0 IN (false, NULL);
|
|
----
|
|
0
|