1 | #include "catch.hpp" |
2 | #include "dbgen.hpp" |
3 | #include "test_helpers.hpp" |
4 | |
5 | #include <chrono> |
6 | #include <iostream> |
7 | #include "duckdb/common/string_util.hpp" |
8 | |
9 | using namespace duckdb; |
10 | using namespace std; |
11 | |
12 | TEST_CASE("Test TPC-H SF0.01 with relations" , "[tpch][.]" ) { |
13 | unique_ptr<QueryResult> result; |
14 | DuckDB db(nullptr); |
15 | Connection con(db); |
16 | double sf = 0.01; |
17 | |
18 | tpch::dbgen(sf, db); |
19 | |
20 | auto lineitem = con.Table("lineitem" ); |
21 | auto part = con.Table("part" ); |
22 | auto supplier = con.Table("supplier" ); |
23 | auto partsupp = con.Table("partsupp" ); |
24 | auto nation = con.Table("nation" ); |
25 | auto region = con.Table("region" ); |
26 | auto orders = con.Table("orders" ); |
27 | auto customer = con.Table("customer" ); |
28 | // Q01 |
29 | result = |
30 | lineitem->Filter("l_shipdate <= DATE '1998-09-02'" ) |
31 | ->Aggregate( |
32 | {"l_returnflag" , "l_linestatus" , "sum(l_quantity) AS sum_qty" , "sum(l_extendedprice) AS sum_base_price" , |
33 | "sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price" , |
34 | "sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge" , "avg(l_quantity) AS avg_qty" , |
35 | "avg(l_extendedprice) AS avg_price" , "avg(l_discount) AS avg_disc" , "count(*) AS count_order" }) |
36 | ->Order("l_returnflag, l_linestatus" ) |
37 | ->Execute(); |
38 | COMPARE_CSV(result, tpch::get_answer(sf, 1), true); |
39 | |
40 | // Q02 |
41 | auto partsupp_region = partsupp->Join(supplier, "s_suppkey=ps_suppkey" ) |
42 | ->Join(nation, "s_nationkey=n_nationkey" ) |
43 | ->Join(region, "n_regionkey=r_regionkey" ); |
44 | partsupp_region->CreateView("partsupp_region" ); |
45 | auto part_join = partsupp_region->Join(part, "p_partkey=ps_partkey" ); |
46 | result = |
47 | part_join |
48 | ->Filter({"p_size=15" , "p_type LIKE '%BRASS'" , "r_name='EUROPE'" , |
49 | "ps_supplycost = ( SELECT min(ps_supplycost) FROM partsupp_region WHERE p_partkey = ps_partkey " |
50 | "AND r_name = 'EUROPE')" }) |
51 | ->Project({"s_acctbal" , "s_name" , "n_name" , "p_partkey" , "p_mfgr" , "s_address" , "s_phone" , "s_comment" }) |
52 | ->Order({"s_acctbal DESC" , "n_name" , "s_name" , "p_partkey" }) |
53 | ->Limit(100) |
54 | ->Execute(); |
55 | COMPARE_CSV(result, tpch::get_answer(sf, 2), true); |
56 | |
57 | // Q03 |
58 | auto cust_join = customer->Join(orders, "c_custkey=o_custkey" )->Join(lineitem, "l_orderkey=o_orderkey" ); |
59 | result = |
60 | cust_join |
61 | ->Filter({"c_mktsegment = 'BUILDING'" , "o_orderdate < DATE '1995-03-15'" , "l_shipdate > DATE '1995-03-15'" }) |
62 | ->Aggregate( |
63 | {"l_orderkey" , "sum(l_extendedprice * (1 - l_discount)) AS revenue" , "o_orderdate" , "o_shippriority" }) |
64 | ->Order("revenue DESC, o_orderdate" ) |
65 | ->Limit(10) |
66 | ->Execute(); |
67 | COMPARE_CSV(result, tpch::get_answer(sf, 3), true); |
68 | |
69 | // Q06 |
70 | result = lineitem |
71 | ->Filter({"l_shipdate >= cast('1994-01-01' AS date)" , "l_shipdate < cast('1995-01-01' AS date)" , |
72 | "l_discount BETWEEN 0.05 AND 0.07" , "l_quantity < 24;" }) |
73 | ->Aggregate("sum(l_extendedprice * l_discount) AS revenue" ) |
74 | ->Execute(); |
75 | COMPARE_CSV(result, tpch::get_answer(sf, 6), true); |
76 | |
77 | // Q12 |
78 | result = |
79 | lineitem->Join(orders, "l_orderkey=o_orderkey" ) |
80 | ->Filter({"l_shipmode IN ('MAIL', 'SHIP')" , "l_commitdate < l_receiptdate" , "l_shipdate < l_commitdate" , |
81 | "l_receiptdate >= cast('1994-01-01' AS date)" , "l_receiptdate < cast('1995-01-01' AS date)" }) |
82 | ->Aggregate({"l_shipmode" , |
83 | "sum(CASE WHEN o_orderpriority = '1-URGENT' OR o_orderpriority = '2-HIGH' THEN 1 ELSE 0 END) " |
84 | "AS high_line_count" , |
85 | "sum(CASE WHEN o_orderpriority <> '1-URGENT' AND o_orderpriority <> '2-HIGH' THEN 1 ELSE 0 " |
86 | "END) AS low_line_count" }) |
87 | ->Order("l_shipmode" ) |
88 | ->Execute(); |
89 | COMPARE_CSV(result, tpch::get_answer(sf, 12), true); |
90 | } |
91 | |