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