xref: /sqlite-3.40.0/test/tpch01.test (revision 8210233c)
189a75397Sdrh# 2013-09-05
289a75397Sdrh#
389a75397Sdrh# The author disclaims copyright to this source code.  In place of
489a75397Sdrh# a legal notice, here is a blessing:
589a75397Sdrh#
689a75397Sdrh#    May you do good and not evil.
789a75397Sdrh#    May you find forgiveness for yourself and forgive others.
889a75397Sdrh#    May you share freely, never taking more than you give.
989a75397Sdrh#
1089a75397Sdrh#***********************************************************************
1189a75397Sdrh#
1289a75397Sdrh# TPC-H test queries.
1389a75397Sdrh#
1489a75397Sdrh
1589a75397Sdrhset testdir [file dirname $argv0]
1689a75397Sdrhsource $testdir/tester.tcl
1789a75397Sdrhset testprefix tpch01
1889a75397Sdrh
1989a75397Sdrhdo_execsql_test tpch01-1.0 {
2089a75397Sdrh  CREATE TABLE NATION  ( N_NATIONKEY  INTEGER NOT NULL,
2189a75397Sdrh                              N_NAME       CHAR(25) NOT NULL,
2289a75397Sdrh                              N_REGIONKEY  INTEGER NOT NULL,
2389a75397Sdrh                              N_COMMENT    VARCHAR(152));
2489a75397Sdrh  CREATE TABLE REGION  ( R_REGIONKEY  INTEGER NOT NULL,
2589a75397Sdrh                              R_NAME       CHAR(25) NOT NULL,
2689a75397Sdrh                              R_COMMENT    VARCHAR(152));
2789a75397Sdrh  CREATE TABLE PART  ( P_PARTKEY     INTEGER NOT NULL,
2889a75397Sdrh                            P_NAME        VARCHAR(55) NOT NULL,
2989a75397Sdrh                            P_MFGR        CHAR(25) NOT NULL,
3089a75397Sdrh                            P_BRAND       CHAR(10) NOT NULL,
3189a75397Sdrh                            P_TYPE        VARCHAR(25) NOT NULL,
3289a75397Sdrh                            P_SIZE        INTEGER NOT NULL,
3389a75397Sdrh                            P_CONTAINER   CHAR(10) NOT NULL,
3489a75397Sdrh                            P_RETAILPRICE DECIMAL(15,2) NOT NULL,
3589a75397Sdrh                            P_COMMENT     VARCHAR(23) NOT NULL );
3689a75397Sdrh  CREATE TABLE SUPPLIER ( S_SUPPKEY     INTEGER NOT NULL,
3789a75397Sdrh                               S_NAME        CHAR(25) NOT NULL,
3889a75397Sdrh                               S_ADDRESS     VARCHAR(40) NOT NULL,
3989a75397Sdrh                               S_NATIONKEY   INTEGER NOT NULL,
4089a75397Sdrh                               S_PHONE       CHAR(15) NOT NULL,
4189a75397Sdrh                               S_ACCTBAL     DECIMAL(15,2) NOT NULL,
4289a75397Sdrh                               S_COMMENT     VARCHAR(101) NOT NULL);
4389a75397Sdrh  CREATE TABLE PARTSUPP ( PS_PARTKEY     INTEGER NOT NULL,
4489a75397Sdrh                               PS_SUPPKEY     INTEGER NOT NULL,
4589a75397Sdrh                               PS_AVAILQTY    INTEGER NOT NULL,
4689a75397Sdrh                               PS_SUPPLYCOST  DECIMAL(15,2)  NOT NULL,
4789a75397Sdrh                               PS_COMMENT     VARCHAR(199) NOT NULL );
4889a75397Sdrh  CREATE TABLE CUSTOMER ( C_CUSTKEY     INTEGER NOT NULL,
4989a75397Sdrh                               C_NAME        VARCHAR(25) NOT NULL,
5089a75397Sdrh                               C_ADDRESS     VARCHAR(40) NOT NULL,
5189a75397Sdrh                               C_NATIONKEY   INTEGER NOT NULL,
5289a75397Sdrh                               C_PHONE       CHAR(15) NOT NULL,
5389a75397Sdrh                               C_ACCTBAL     DECIMAL(15,2)   NOT NULL,
5489a75397Sdrh                               C_MKTSEGMENT  CHAR(10) NOT NULL,
5589a75397Sdrh                               C_COMMENT     VARCHAR(117) NOT NULL);
5689a75397Sdrh  CREATE TABLE ORDERS  ( O_ORDERKEY       INTEGER NOT NULL,
5789a75397Sdrh                             O_CUSTKEY        INTEGER NOT NULL,
5889a75397Sdrh                             O_ORDERSTATUS    CHAR(1) NOT NULL,
5989a75397Sdrh                             O_TOTALPRICE     DECIMAL(15,2) NOT NULL,
6089a75397Sdrh                             O_ORDERDATE      DATE NOT NULL,
6189a75397Sdrh                             O_ORDERPRIORITY  CHAR(15) NOT NULL,
6289a75397Sdrh                             O_CLERK          CHAR(15) NOT NULL,
6389a75397Sdrh                             O_SHIPPRIORITY   INTEGER NOT NULL,
6489a75397Sdrh                             O_COMMENT        VARCHAR(79) NOT NULL);
6589a75397Sdrh  CREATE TABLE LINEITEM ( L_ORDERKEY    INTEGER NOT NULL,
6689a75397Sdrh                               L_PARTKEY     INTEGER NOT NULL,
6789a75397Sdrh                               L_SUPPKEY     INTEGER NOT NULL,
6889a75397Sdrh                               L_LINENUMBER  INTEGER NOT NULL,
6989a75397Sdrh                               L_QUANTITY    DECIMAL(15,2) NOT NULL,
7089a75397Sdrh                               L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL,
7189a75397Sdrh                               L_DISCOUNT    DECIMAL(15,2) NOT NULL,
7289a75397Sdrh                               L_TAX         DECIMAL(15,2) NOT NULL,
7389a75397Sdrh                               L_RETURNFLAG  CHAR(1) NOT NULL,
7489a75397Sdrh                               L_LINESTATUS  CHAR(1) NOT NULL,
7589a75397Sdrh                               L_SHIPDATE    DATE NOT NULL,
7689a75397Sdrh                               L_COMMITDATE  DATE NOT NULL,
7789a75397Sdrh                               L_RECEIPTDATE DATE NOT NULL,
7889a75397Sdrh                               L_SHIPINSTRUCT CHAR(25) NOT NULL,
7989a75397Sdrh                               L_SHIPMODE     CHAR(10) NOT NULL,
8089a75397Sdrh                               L_COMMENT      VARCHAR(44) NOT NULL);
8189a75397Sdrh  CREATE INDEX npki on nation(N_NATIONKEY);
8289a75397Sdrh  CREATE INDEX rpki on region(R_REGIONKEY);
8389a75397Sdrh  CREATE INDEX ppki on part(P_PARTKEY);
8489a75397Sdrh  CREATE INDEX spki on supplier(S_SUPPKEY);
8589a75397Sdrh  CREATE INDEX pspki on partsupp(PS_PARTKEY, PS_SUPPKEY);
8689a75397Sdrh  CREATE INDEX cpki on customer(C_CUSTKEY);
8789a75397Sdrh  CREATE INDEX opki on orders(O_ORDERKEY);
8889a75397Sdrh  CREATE INDEX lpki on lineitem(L_ORDERKEY, L_LINENUMBER);
8989a75397Sdrh  CREATE INDEX nrki on nation(n_regionkey);
9089a75397Sdrh  CREATE INDEX snki on supplier(s_nationkey);
9189a75397Sdrh  CREATE INDEX cnki on customer(c_nationkey);
9289a75397Sdrh  CREATE INDEX ocki on orders(O_CUSTKEY);
9389a75397Sdrh  CREATE INDEX odi on orders(O_ORDERDATE);
9489a75397Sdrh  CREATE INDEX lpki2 on lineitem(L_PARTKEY);
9589a75397Sdrh  CREATE INDEX lski on lineitem(L_SUPPKEY);
9689a75397Sdrh  CREATE INDEX lsdi on lineitem(L_SHIPDATE);
9789a75397Sdrh  CREATE INDEX lcdi on lineitem(L_COMMITDATE);
9889a75397Sdrh  CREATE INDEX lrdi on lineitem(L_RECEIPTDATE);
9989a75397Sdrh  CREATE INDEX bootleg_nni on nation(N_NAME);
10089a75397Sdrh  CREATE INDEX bootleg_psi on part(p_size);
10189a75397Sdrh  CREATE INDEX bootleg_pti on part(p_type);
10289a75397Sdrh  ANALYZE sqlite_master;
10389a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('LINEITEM','lrdi','600572 236');
10489a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('LINEITEM','lcdi','600572 244');
10589a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('LINEITEM','lsdi','600572 238');
10689a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('LINEITEM','lski','600572 601');
10789a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('LINEITEM','lpki2','600572 31');
10889a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('LINEITEM','lpki','600572 5 1');
10989a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('ORDERS','odi','150000 63');
11089a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('ORDERS','ocki','150000 15');
11189a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('ORDERS','opki','150000 1');
11289a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('CUSTOMER','cnki','15000 600');
11389a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('CUSTOMER','cpki','15000 1');
11489a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('PARTSUPP','pspki','80000 4 1');
11589a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('SUPPLIER','snki','1000 40');
11689a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('SUPPLIER','spki','1000 1');
11789a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('PART','bootleg_pti','20000 134');
11889a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('PART','bootleg_psi','20000 400');
11989a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('PART','ppki','20000 1');
12089a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('REGION','rpki','5 1');
12189a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('NATION','bootleg_nni','25 1');
12289a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('NATION','nrki','25 5');
12389a75397Sdrh  INSERT INTO sqlite_stat1 VALUES('NATION','npki','25 1');
12489a75397Sdrh  ANALYZE sqlite_master;
12589a75397Sdrh} {}
12689a75397Sdrh
12789a75397Sdrhdo_test tpch01-1.1 {
12889a75397Sdrh  unset -nocomplain ::eqpres
12989a75397Sdrh  set ::eqpres [db eval {EXPLAIN QUERY PLAN
13089a75397Sdrh       select
13189a75397Sdrh               o_year,
13289a75397Sdrh               sum(case
13389a75397Sdrh                       when nation = 'EGYPT' then volume
13489a75397Sdrh                       else 0
13589a75397Sdrh               end) / sum(volume) as mkt_share
13689a75397Sdrh       from
13789a75397Sdrh               (
13889a75397Sdrh                       select
13989a75397Sdrh                               strftime('%Y', o_orderdate) as o_year,
14089a75397Sdrh                               l_extendedprice * (1 - l_discount) as volume,
14189a75397Sdrh                               n2.n_name as nation
14289a75397Sdrh                       from
14389a75397Sdrh                               part,
14489a75397Sdrh                               supplier,
14589a75397Sdrh                               lineitem,
14689a75397Sdrh                               orders,
14789a75397Sdrh                               customer,
14889a75397Sdrh                               nation n1,
14989a75397Sdrh                               nation n2,
15089a75397Sdrh                               region
15189a75397Sdrh                       where
15289a75397Sdrh                               p_partkey = l_partkey
15389a75397Sdrh                               and s_suppkey = l_suppkey
15489a75397Sdrh                               and l_orderkey = o_orderkey
15589a75397Sdrh                               and o_custkey = c_custkey
15689a75397Sdrh                               and c_nationkey = n1.n_nationkey
15789a75397Sdrh                               and n1.n_regionkey = r_regionkey
15889a75397Sdrh                               and r_name = 'MIDDLE EAST'
15989a75397Sdrh                               and s_nationkey = n2.n_nationkey
16089a75397Sdrh                               and o_orderdate between  '1995-01-01' and '1996-12-31'
16189a75397Sdrh                               and p_type = 'LARGE PLATED STEEL'
16289a75397Sdrh               ) as all_nations
16389a75397Sdrh       group by
16489a75397Sdrh               o_year
16589a75397Sdrh       order by
16689a75397Sdrh               o_year;}]
16789a75397Sdrh  set ::eqpres
168*8210233cSdrh} {/*SEARCH part USING INDEX bootleg_pti *SEARCH lineitem USING INDEX lpki2*/}
16989a75397Sdrhdo_test tpch01-1.1b {
17089a75397Sdrh  set ::eqpres
171*8210233cSdrh} {/.* customer .* n1 .*/}
1726b7ff748Sdrhdo_test tpch01-1.1c {
1736b7ff748Sdrh  set ::eqpres
174*8210233cSdrh} {/.* supplier .* n2 .*/}
17589a75397Sdrh
17689a75397Sdrhdo_eqp_test tpch01-1.2 {
17789a75397Sdrhselect
17889a75397Sdrh    c_custkey,    c_name,    sum(l_extendedprice * (1 - l_discount)) as revenue,
17989a75397Sdrh    c_acctbal,    n_name,    c_address,    c_phone,    c_comment
18089a75397Sdrhfrom
18189a75397Sdrh    customer,    orders,    lineitem,    nation
18289a75397Sdrhwhere
18389a75397Sdrh    c_custkey = o_custkey    and l_orderkey = o_orderkey
18489a75397Sdrh    and o_orderdate >=  '1994-08-01'    and o_orderdate < date('1994-08-01', '+3 month')
18589a75397Sdrh    and l_returnflag = 'R'    and c_nationkey = n_nationkey
18689a75397Sdrhgroup by
18789a75397Sdrh    c_custkey,    c_name,    c_acctbal,    c_phone,    n_name, c_address,    c_comment
18889a75397Sdrhorder by
18989a75397Sdrh    revenue desc;
190b3f0276bSdrh} {
191b3f0276bSdrh  QUERY PLAN
192*8210233cSdrh  |--SEARCH orders USING INDEX odi (O_ORDERDATE>? AND O_ORDERDATE<?)
193*8210233cSdrh  |--SEARCH customer USING INDEX cpki (C_CUSTKEY=?)
194*8210233cSdrh  |--SEARCH nation USING INDEX npki (N_NATIONKEY=?)
195*8210233cSdrh  |--SEARCH lineitem USING INDEX lpki (L_ORDERKEY=?)
196b3f0276bSdrh  |--USE TEMP B-TREE FOR GROUP BY
197b3f0276bSdrh  `--USE TEMP B-TREE FOR ORDER BY
198b3f0276bSdrh}
1996b7ff748Sdrh
2006b7ff748Sdrhfinish_test
201