blob: 9c8ccaa8ca3332850740af2b4ece33ce409b182d [file] [log] [blame]
create schema qf;
-- Create and load common test tables.
CREATE TABLE qf.lineitem (
l_orderkey bigint NOT NULL,
l_partkey integer NOT NULL,
l_suppkey integer NOT NULL,
l_linenumber integer NOT NULL,
l_quantity numeric(15,2) NOT NULL,
l_extendedprice numeric(15,2) NOT NULL,
l_discount numeric(15,2) NOT NULL,
l_tax numeric(15,2) NOT NULL,
l_returnflag character(1) NOT NULL,
l_linestatus character(1) NOT NULL,
l_shipdate date NOT NULL,
l_commitdate date NOT NULL,
l_receiptdate date NOT NULL,
l_shipinstruct character(25) NOT NULL,
l_shipmode character(10) NOT NULL,
l_comment character varying(44) NOT NULL
)
DISTRIBUTED BY (l_orderkey);
\copy qf.lineitem ( L_ORDERKEY, L_PARTKEY, L_SUPPKEY,L_LINENUMBER,L_QUANTITY, L_EXTENDEDPRICE,L_DISCOUNT,L_TAX,L_RETURNFLAG,L_LINESTATUS,L_SHIPDATE,L_COMMITDATE,L_RECEIPTDATE,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT) from 'data/lineitem_small.csv' with delimiter '|';
ANALYZE qf.lineitem;
CREATE TABLE qf.orders (
o_orderkey bigint NOT NULL,
o_custkey integer NOT NULL,
o_orderstatus character(1) NOT NULL,
o_totalprice numeric(15,2) NOT NULL,
o_orderdate date NOT NULL,
o_orderpriority character(15) NOT NULL,
o_clerk character(15) NOT NULL,
o_shippriority integer NOT NULL,
o_comment character varying(79) NOT NULL
)
DISTRIBUTED BY (o_orderkey);
\copy qf.orders ( O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_TOTALPRICE,O_ORDERDATE,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT) from 'data/order_small.csv' with delimiter '|';
ANALYZE qf.orders;
CREATE TABLE qf.supplier (
s_suppkey integer NOT NULL,
s_name character(25) NOT NULL,
s_address character varying(40) NOT NULL,
s_nationkey integer NOT NULL,
s_phone character(15) NOT NULL,
s_acctbal numeric(15,2) NOT NULL,
s_comment character varying(101) NOT NULL
)
DISTRIBUTED BY (s_suppkey);
\copy qf.supplier (S_SUPPKEY,S_NAME,S_ADDRESS,S_NATIONKEY,S_PHONE,S_ACCTBAL,S_COMMENT) from 'data/supplier.csv' with delimiter '|';
ANALYZE qf.supplier;
create table skewed_lineitem as
select 1 AS l_skewkey, *
from qf.lineitem
distributed by (l_skewkey);
insert into skewed_lineitem
values(
2,
generate_series(1, 3), 42, 15, 23,
0, 4000, 0.1, 0.3,
NULL, NULL,
'2001-01-01', '2012-12-01', NULL,
'foobarfoobarbaz', '0937',
'supercalifragilisticexpialidocious');
--
-- The actual tests.
--
-- It used to fail because query cancel is sent and QE goes out of
-- transaction block, though QD sends 2PC request.
begin;
drop table if exists qf.foo;
create table qf.foo as select i a, i b from generate_series(1, 100)i;
select case when gp_segment_id = 0 then pg_sleep(3) end from qf.foo limit 1;
commit;
-- with order by. CTE can prevent LIMIT from being pushed down.
begin;
drop table if exists qf.bar2;
create table qf.bar2 as select i a, i b from generate_series(1, 100)i;
with t2 as(
select * from skewed_lineitem
order by l_orderkey
)
select * from t2 order by 1,2,3,4,5 limit 1;
commit;
-- with window function.
begin;
drop table if exists qf.bar3;
create table qf.bar3(a int, b text, c numeric) with (appendonly=true);
insert into qf.bar3 select a, repeat('x', 10) b, b from qf.bar2;
with t3 as(
select
l_skewkey,
count(*) over (partition by l_skewkey order by l_quantity, l_orderkey)
from skewed_lineitem
)
select * from t3 order by 1,2 limit 2;
commit;
-- combination.
begin;
drop table if exists qf.bar4;
create table qf.bar4(a int, b int, c text) with (appendonly=true, orientation=column);
insert into qf.bar4 select a, b, 'foo' from qf.bar2;
with t4a as(
select
l_skewkey,
count(*) over (partition by l_skewkey order by l_quantity, l_orderkey)
from skewed_lineitem
), t4b as (
select * from skewed_lineitem
order by l_orderkey
)
select a.l_skewkey, b.l_skewkey from t4a a
inner join t4b b on a.l_skewkey = b.l_skewkey
order by 1, 2
limit 3;
commit;
-- median.
begin;
drop table if exists qf.bar5;
create table qf.bar5(a int, b int);
insert into qf.bar5 select i, i % 10 from generate_series(1, 10)i;
with t5a as(
select
l_skewkey,
median(l_quantity) med
from skewed_lineitem
group by l_skewkey
), t5b as (
select * from skewed_lineitem
order by l_orderkey
)
select a.l_skewkey, a.med from t5a a
inner join t5b b on a.l_skewkey = b.l_skewkey order by a.l_skewkey, a.med
limit 1;
commit;
--Combination median and windows
begin;
with t3 as(
select
l_skewkey,
count(*) over (partition by l_skewkey order by l_quantity, l_orderkey)
from skewed_lineitem
),
t4 as ( select
l_skewkey,
median(l_quantity) med
from skewed_lineitem
group by l_skewkey
)
select a.l_skewkey from t3 a left outer join t4 b on a. l_skewkey = b. l_skewkey order by a.l_skewkey limit 1;
commit;
--csq
begin;
select l_returnflag from skewed_lineitem t1 where l_skewkey in (select l_skewkey from skewed_lineitem t2 where t1.l_shipinstruct = t2.l_shipinstruct) order by l_returnflag limit 3;
commit;
--
-- Exercise query-finish flag in sort.
--
with t6a as(
select
l_skewkey,
count(*) over (partition by l_skewkey order by l_quantity, l_orderkey)
from skewed_lineitem
), t6b as (
select * from skewed_lineitem
order by l_orderkey
), t6c as (
select l_skewkey, median(l_quantity) med
from skewed_lineitem
group by l_skewkey
)
select a.l_skewkey, b.l_orderkey,
c.med
from t6a a inner join t6b b on a.l_skewkey = b.l_skewkey
inner join t6c c on b.l_skewkey = c.l_skewkey
order by 1, 2, 3
limit 2;
--
-- Exercise query-finish vs motion/interconnect
--
with t7a as(
select
l_skewkey,
l_orderkey
from skewed_lineitem
), t7b as (
select * from skewed_lineitem
)
select count(*) from(
select b.l_skewkey, b.l_orderkey
from t7a a inner join t7b b on a.l_orderkey = b.l_orderkey
limit 2
)s;
select l1.l_partkey, l1.l_suppkey, l1.l_comment
from skewed_lineitem l1
inner join qf.orders o1
on l1.l_orderkey = o1.o_orderkey
where l1.l_suppkey = (
select s_suppkey
from skewed_lineitem l2
inner join qf.supplier on l2.l_suppkey = s_suppkey
where s_nationkey = 11 and l2.l_returnflag = 'A'
limit 1
)
limit 0;
select l1.l_partkey, l1.l_suppkey, l1.l_comment
from skewed_lineitem l1
inner join qf.orders o1
on l1.l_orderkey = o1.o_orderkey
where l1.l_suppkey in (
select s_suppkey
from skewed_lineitem l2
inner join qf.supplier on l2.l_suppkey = s_suppkey
where s_nationkey = 11 and l2.l_returnflag = 'A'
limit 2
)
limit 0;
select l1.l_partkey, l1.l_suppkey, l1.l_comment
from skewed_lineitem l1
inner join qf.orders o1
on l1.l_orderkey = o1.o_orderkey
where exists (
select *
from qf.supplier
where l1.l_suppkey = s_suppkey
and s_nationkey = 11 and l1.l_returnflag = 'A'
)
limit 0;
-- cause hashjoin to spill
set statement_mem = '1MB';
select l1.l_partkey IS NOT NULL as part_is_not_null
from skewed_lineitem l1
inner join qf.supplier s1 on l1.l_suppkey = s1.s_suppkey
limit 2;
reset statement_mem;