tpch01.test 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. # 2013-09-05
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # a legal notice, here is a blessing:
  5. #
  6. # May you do good and not evil.
  7. # May you find forgiveness for yourself and forgive others.
  8. # May you share freely, never taking more than you give.
  9. #
  10. #***********************************************************************
  11. #
  12. # TPC-H test queries.
  13. #
  14. set testdir [file dirname $argv0]
  15. source $testdir/tester.tcl
  16. set testprefix tpch01
  17. do_execsql_test tpch01-1.0 {
  18. CREATE TABLE NATION ( N_NATIONKEY INTEGER NOT NULL,
  19. N_NAME CHAR(25) NOT NULL,
  20. N_REGIONKEY INTEGER NOT NULL,
  21. N_COMMENT VARCHAR(152));
  22. CREATE TABLE REGION ( R_REGIONKEY INTEGER NOT NULL,
  23. R_NAME CHAR(25) NOT NULL,
  24. R_COMMENT VARCHAR(152));
  25. CREATE TABLE PART ( P_PARTKEY INTEGER NOT NULL,
  26. P_NAME VARCHAR(55) NOT NULL,
  27. P_MFGR CHAR(25) NOT NULL,
  28. P_BRAND CHAR(10) NOT NULL,
  29. P_TYPE VARCHAR(25) NOT NULL,
  30. P_SIZE INTEGER NOT NULL,
  31. P_CONTAINER CHAR(10) NOT NULL,
  32. P_RETAILPRICE DECIMAL(15,2) NOT NULL,
  33. P_COMMENT VARCHAR(23) NOT NULL );
  34. CREATE TABLE SUPPLIER ( S_SUPPKEY INTEGER NOT NULL,
  35. S_NAME CHAR(25) NOT NULL,
  36. S_ADDRESS VARCHAR(40) NOT NULL,
  37. S_NATIONKEY INTEGER NOT NULL,
  38. S_PHONE CHAR(15) NOT NULL,
  39. S_ACCTBAL DECIMAL(15,2) NOT NULL,
  40. S_COMMENT VARCHAR(101) NOT NULL);
  41. CREATE TABLE PARTSUPP ( PS_PARTKEY INTEGER NOT NULL,
  42. PS_SUPPKEY INTEGER NOT NULL,
  43. PS_AVAILQTY INTEGER NOT NULL,
  44. PS_SUPPLYCOST DECIMAL(15,2) NOT NULL,
  45. PS_COMMENT VARCHAR(199) NOT NULL );
  46. CREATE TABLE CUSTOMER ( C_CUSTKEY INTEGER NOT NULL,
  47. C_NAME VARCHAR(25) NOT NULL,
  48. C_ADDRESS VARCHAR(40) NOT NULL,
  49. C_NATIONKEY INTEGER NOT NULL,
  50. C_PHONE CHAR(15) NOT NULL,
  51. C_ACCTBAL DECIMAL(15,2) NOT NULL,
  52. C_MKTSEGMENT CHAR(10) NOT NULL,
  53. C_COMMENT VARCHAR(117) NOT NULL);
  54. CREATE TABLE ORDERS ( O_ORDERKEY INTEGER NOT NULL,
  55. O_CUSTKEY INTEGER NOT NULL,
  56. O_ORDERSTATUS CHAR(1) NOT NULL,
  57. O_TOTALPRICE DECIMAL(15,2) NOT NULL,
  58. O_ORDERDATE DATE NOT NULL,
  59. O_ORDERPRIORITY CHAR(15) NOT NULL,
  60. O_CLERK CHAR(15) NOT NULL,
  61. O_SHIPPRIORITY INTEGER NOT NULL,
  62. O_COMMENT VARCHAR(79) NOT NULL);
  63. CREATE TABLE LINEITEM ( L_ORDERKEY INTEGER NOT NULL,
  64. L_PARTKEY INTEGER NOT NULL,
  65. L_SUPPKEY INTEGER NOT NULL,
  66. L_LINENUMBER INTEGER NOT NULL,
  67. L_QUANTITY DECIMAL(15,2) NOT NULL,
  68. L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
  69. L_DISCOUNT DECIMAL(15,2) NOT NULL,
  70. L_TAX DECIMAL(15,2) NOT NULL,
  71. L_RETURNFLAG CHAR(1) NOT NULL,
  72. L_LINESTATUS CHAR(1) NOT NULL,
  73. L_SHIPDATE DATE NOT NULL,
  74. L_COMMITDATE DATE NOT NULL,
  75. L_RECEIPTDATE DATE NOT NULL,
  76. L_SHIPINSTRUCT CHAR(25) NOT NULL,
  77. L_SHIPMODE CHAR(10) NOT NULL,
  78. L_COMMENT VARCHAR(44) NOT NULL);
  79. CREATE INDEX npki on nation(N_NATIONKEY);
  80. CREATE INDEX rpki on region(R_REGIONKEY);
  81. CREATE INDEX ppki on part(P_PARTKEY);
  82. CREATE INDEX spki on supplier(S_SUPPKEY);
  83. CREATE INDEX pspki on partsupp(PS_PARTKEY, PS_SUPPKEY);
  84. CREATE INDEX cpki on customer(C_CUSTKEY);
  85. CREATE INDEX opki on orders(O_ORDERKEY);
  86. CREATE INDEX lpki on lineitem(L_ORDERKEY, L_LINENUMBER);
  87. CREATE INDEX nrki on nation(n_regionkey);
  88. CREATE INDEX snki on supplier(s_nationkey);
  89. CREATE INDEX cnki on customer(c_nationkey);
  90. CREATE INDEX ocki on orders(O_CUSTKEY);
  91. CREATE INDEX odi on orders(O_ORDERDATE);
  92. CREATE INDEX lpki2 on lineitem(L_PARTKEY);
  93. CREATE INDEX lski on lineitem(L_SUPPKEY);
  94. CREATE INDEX lsdi on lineitem(L_SHIPDATE);
  95. CREATE INDEX lcdi on lineitem(L_COMMITDATE);
  96. CREATE INDEX lrdi on lineitem(L_RECEIPTDATE);
  97. CREATE INDEX bootleg_nni on nation(N_NAME);
  98. CREATE INDEX bootleg_psi on part(p_size);
  99. CREATE INDEX bootleg_pti on part(p_type);
  100. ANALYZE sqlite_master;
  101. INSERT INTO sqlite_stat1 VALUES('LINEITEM','lrdi','600572 236');
  102. INSERT INTO sqlite_stat1 VALUES('LINEITEM','lcdi','600572 244');
  103. INSERT INTO sqlite_stat1 VALUES('LINEITEM','lsdi','600572 238');
  104. INSERT INTO sqlite_stat1 VALUES('LINEITEM','lski','600572 601');
  105. INSERT INTO sqlite_stat1 VALUES('LINEITEM','lpki2','600572 31');
  106. INSERT INTO sqlite_stat1 VALUES('LINEITEM','lpki','600572 5 1');
  107. INSERT INTO sqlite_stat1 VALUES('ORDERS','odi','150000 63');
  108. INSERT INTO sqlite_stat1 VALUES('ORDERS','ocki','150000 15');
  109. INSERT INTO sqlite_stat1 VALUES('ORDERS','opki','150000 1');
  110. INSERT INTO sqlite_stat1 VALUES('CUSTOMER','cnki','15000 600');
  111. INSERT INTO sqlite_stat1 VALUES('CUSTOMER','cpki','15000 1');
  112. INSERT INTO sqlite_stat1 VALUES('PARTSUPP','pspki','80000 4 1');
  113. INSERT INTO sqlite_stat1 VALUES('SUPPLIER','snki','1000 40');
  114. INSERT INTO sqlite_stat1 VALUES('SUPPLIER','spki','1000 1');
  115. INSERT INTO sqlite_stat1 VALUES('PART','bootleg_pti','20000 134');
  116. INSERT INTO sqlite_stat1 VALUES('PART','bootleg_psi','20000 400');
  117. INSERT INTO sqlite_stat1 VALUES('PART','ppki','20000 1');
  118. INSERT INTO sqlite_stat1 VALUES('REGION','rpki','5 1');
  119. INSERT INTO sqlite_stat1 VALUES('NATION','bootleg_nni','25 1');
  120. INSERT INTO sqlite_stat1 VALUES('NATION','nrki','25 5');
  121. INSERT INTO sqlite_stat1 VALUES('NATION','npki','25 1');
  122. ANALYZE sqlite_master;
  123. } {}
  124. do_test tpch01-1.1 {
  125. unset -nocomplain ::eqpres
  126. set ::eqpres [db eval {EXPLAIN QUERY PLAN
  127. select
  128. o_year,
  129. sum(case
  130. when nation = 'EGYPT' then volume
  131. else 0
  132. end) / sum(volume) as mkt_share
  133. from
  134. (
  135. select
  136. strftime('%Y', o_orderdate) as o_year,
  137. l_extendedprice * (1 - l_discount) as volume,
  138. n2.n_name as nation
  139. from
  140. part,
  141. supplier,
  142. lineitem,
  143. orders,
  144. customer,
  145. nation n1,
  146. nation n2,
  147. region
  148. where
  149. p_partkey = l_partkey
  150. and s_suppkey = l_suppkey
  151. and l_orderkey = o_orderkey
  152. and o_custkey = c_custkey
  153. and c_nationkey = n1.n_nationkey
  154. and n1.n_regionkey = r_regionkey
  155. and r_name = 'MIDDLE EAST'
  156. and s_nationkey = n2.n_nationkey
  157. and o_orderdate between '1995-01-01' and '1996-12-31'
  158. and p_type = 'LARGE PLATED STEEL'
  159. ) as all_nations
  160. group by
  161. o_year
  162. order by
  163. o_year;}]
  164. set ::eqpres
  165. } {/0 0 0 {SEARCH TABLE part USING INDEX bootleg_pti .P_TYPE=..} 0 1 2 {SEARCH TABLE lineitem USING INDEX lpki2 .L_PARTKEY=..}.*/}
  166. do_test tpch01-1.1b {
  167. set ::eqpres
  168. } {/.* customer .* nation AS n1 .* nation AS n2 .*/}
  169. do_eqp_test tpch01-1.2 {
  170. select
  171. c_custkey, c_name, sum(l_extendedprice * (1 - l_discount)) as revenue,
  172. c_acctbal, n_name, c_address, c_phone, c_comment
  173. from
  174. customer, orders, lineitem, nation
  175. where
  176. c_custkey = o_custkey and l_orderkey = o_orderkey
  177. and o_orderdate >= '1994-08-01' and o_orderdate < date('1994-08-01', '+3 month')
  178. and l_returnflag = 'R' and c_nationkey = n_nationkey
  179. group by
  180. c_custkey, c_name, c_acctbal, c_phone, n_name, c_address, c_comment
  181. order by
  182. revenue desc;
  183. } {0 0 1 {SEARCH TABLE orders USING INDEX odi (O_ORDERDATE>? AND O_ORDERDATE<?)} 0 1 0 {SEARCH TABLE customer USING INDEX cpki (C_CUSTKEY=?)} 0 2 3 {SEARCH TABLE nation USING INDEX npki (N_NATIONKEY=?)} 0 3 2 {SEARCH TABLE lineitem USING INDEX lpki (L_ORDERKEY=?)} 0 0 0 {USE TEMP B-TREE FOR GROUP BY} 0 0 0 {USE TEMP B-TREE FOR ORDER BY}}