├── .gitignore ├── benchmark ├── ssb │ ├── prepare.sql │ └── queries │ │ ├── 1.sql │ │ ├── 2.sql │ │ ├── 3.sql │ │ ├── 4.sql │ │ ├── 6.sql │ │ ├── 5.sql │ │ ├── 7.sql │ │ ├── 8.sql │ │ ├── 10.sql │ │ ├── 11.sql │ │ ├── 9.sql │ │ ├── 13.sql │ │ └── 12.sql ├── tpch │ ├── queries │ │ ├── 6.sql │ │ ├── 17.sql │ │ ├── 14.sql │ │ ├── 13.sql │ │ ├── 4.sql │ │ ├── 3.sql │ │ ├── 18.sql │ │ ├── 5.sql │ │ ├── 16.sql │ │ ├── 1.sql │ │ ├── 11.sql │ │ ├── 15.sql │ │ ├── 10.sql │ │ ├── 12.sql │ │ ├── 9.sql │ │ ├── 20.sql │ │ ├── 22.sql │ │ ├── 21.sql │ │ ├── 2.sql │ │ ├── 8.sql │ │ ├── 7.sql │ │ └── 19.sql │ └── prepare.sql ├── job │ ├── queries │ │ ├── 3b.sql │ │ ├── 2a.sql │ │ ├── 2b.sql │ │ ├── 2c.sql │ │ ├── 2d.sql │ │ ├── 32a.sql │ │ ├── 32b.sql │ │ ├── 4a.sql │ │ ├── 4b.sql │ │ ├── 4c.sql │ │ ├── 6a.sql │ │ ├── 6c.sql │ │ ├── 6e.sql │ │ ├── 8c.sql │ │ ├── 5b.sql │ │ ├── 17f.sql │ │ ├── 3a.sql │ │ ├── 17d.sql │ │ ├── 17e.sql │ │ ├── 8d.sql │ │ ├── 10c.sql │ │ ├── 17b.sql │ │ ├── 17c.sql │ │ ├── 1d.sql │ │ ├── 1b.sql │ │ ├── 10b.sql │ │ ├── 3c.sql │ │ ├── 17a.sql │ │ ├── 1c.sql │ │ ├── 1a.sql │ │ ├── 10a.sql │ │ ├── 6f.sql │ │ ├── 16b.sql │ │ ├── 5a.sql │ │ ├── 6b.sql │ │ ├── 6d.sql │ │ ├── 16c.sql │ │ ├── 8a.sql │ │ ├── 16a.sql │ │ ├── 16d.sql │ │ ├── 18a.sql │ │ ├── 5c.sql │ │ ├── 7b.sql │ │ ├── 13d.sql │ │ ├── 13a.sql │ │ ├── 9d.sql │ │ ├── 15d.sql │ │ ├── 11d.sql │ │ ├── 11a.sql │ │ ├── 8b.sql │ │ ├── 9c.sql │ │ ├── 7a.sql │ │ ├── 11b.sql │ │ ├── 12b.sql │ │ ├── 9b.sql │ │ ├── 12a.sql │ │ ├── 13b.sql │ │ ├── 13c.sql │ │ ├── 12c.sql │ │ ├── 15a.sql │ │ ├── 11c.sql │ │ ├── 15c.sql │ │ ├── 9a.sql │ │ ├── 18c.sql │ │ ├── 15b.sql │ │ ├── 18b.sql │ │ ├── 19d.sql │ │ ├── 7c.sql │ │ ├── 21b.sql │ │ ├── 19c.sql │ │ ├── 23a.sql │ │ ├── 19b.sql │ │ ├── 20a.sql │ │ ├── 14a.sql │ │ ├── 20b.sql │ │ ├── 14b.sql │ │ ├── 23b.sql │ │ ├── 20c.sql │ │ ├── 14c.sql │ │ ├── 23c.sql │ │ ├── 25a.sql │ │ ├── 19a.sql │ │ ├── 21a.sql │ │ ├── 21c.sql │ │ ├── 25b.sql │ │ ├── 26b.sql │ │ ├── 22a.sql │ │ ├── 22b.sql │ │ ├── 25c.sql │ │ ├── 33b.sql │ │ ├── 24a.sql │ │ ├── 26c.sql │ │ ├── 22d.sql │ │ ├── 27b.sql │ │ ├── 27a.sql │ │ ├── 33a.sql │ │ ├── 26a.sql │ │ ├── 22c.sql │ │ ├── 24b.sql │ │ ├── 31a.sql │ │ └── 33c.sql │ └── prepare.sql └── tpcds │ ├── queries │ ├── query_55.sql │ ├── query_96.sql │ ├── query_82.sql │ ├── query_37.sql │ ├── query_15.sql │ ├── query_22.sql │ ├── query_7.sql │ ├── query_26.sql │ ├── query_1.sql │ ├── query_86.sql │ ├── query_19.sql │ ├── query_45.sql │ ├── query_6.sql │ ├── query_27.sql │ ├── query_32.sql │ ├── query_92.sql │ ├── query_98.sql │ ├── query_12.sql │ ├── query_20.sql │ ├── query_36.sql │ ├── query_94.sql │ ├── query_65.sql │ ├── query_40.sql │ ├── query_38.sql │ ├── query_79.sql │ ├── query_87.sql │ ├── query_97.sql │ ├── query_90.sql │ ├── query_43.sql │ ├── query_16.sql │ ├── query_89.sql │ ├── query_21.sql │ ├── query_95.sql │ ├── query_53.sql │ ├── query_25.sql │ ├── query_72.sql │ ├── query_70.sql │ ├── query_99.sql │ ├── query_30.sql │ ├── query_67.sql │ ├── query_18.sql │ ├── query_63.sql │ ├── query_81.sql │ ├── query_29.sql │ ├── query_46.sql │ ├── query_34.sql │ ├── query_48.sql │ ├── query_68.sql │ ├── query_69.sql │ └── query_71.sql │ └── prepare.sql ├── .github └── workflows │ ├── workflow.yaml │ └── release.yaml ├── .goreleaser.yml ├── pkg ├── utils │ ├── utils_test.go │ └── utils.go ├── executor │ ├── compare.go │ ├── hint.go │ ├── result.go │ └── warning.go ├── loader │ └── loader.go ├── horoscope │ └── horoscope_test.go └── database │ ├── parser.go │ ├── database.go │ └── column.go ├── Makefile ├── cmd └── parse.go └── go.mod /.gitignore: -------------------------------------------------------------------------------- 1 | # build files 2 | bin 3 | 4 | # ide files 5 | .idea 6 | .vscode 7 | 8 | # dynamic workload 9 | workload/ 10 | horo.json 11 | -------------------------------------------------------------------------------- /benchmark/ssb/prepare.sql: -------------------------------------------------------------------------------- 1 | analyze table customer; 2 | analyze table date; 3 | analyze table lineorder; 4 | analyze table part; 5 | analyze table supplier; 6 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/1.sql: -------------------------------------------------------------------------------- 1 | -- Query 1.1 2 | 3 | select 4 | sum(lo_extendedprice*lo_discount) as revenue 5 | from 6 | lineorder, date 7 | where 8 | lo_orderdate = d_datekey and 9 | d_year = 1993 and 10 | lo_discount between 1 and 3 and 11 | lo_quantity < 25; 12 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/2.sql: -------------------------------------------------------------------------------- 1 | -- Query 1.2 2 | 3 | select 4 | sum(lo_extendedprice*lo_discount) as revenue 5 | from 6 | lineorder, date 7 | where 8 | lo_orderdate = d_datekey and 9 | d_yearmonthnum = 199401 and 10 | lo_discount between 4 and 6 and 11 | lo_quantity between 26 and 35; 12 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/3.sql: -------------------------------------------------------------------------------- 1 | -- Query 1.3 2 | 3 | select 4 | sum(lo_extendedprice*lo_discount) as revenue 5 | from 6 | lineorder, date 7 | where 8 | lo_orderdate = d_datekey and 9 | d_weeknuminyear = 6 and 10 | d_year = 1994 and 11 | lo_discount between 5 and 7 and 12 | lo_quantity between 26 and 35; 13 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/6.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | sum(l_extendedprice * l_discount) as revenue 6 | from 7 | lineitem 8 | where 9 | l_shipdate >= '1994-01-01' 10 | and l_shipdate < date_add('1994-01-01', interval '1' year) 11 | and l_discount between 0.06 - 0.01 and 0.06 + 0.01 12 | and l_quantity < 24; 13 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/4.sql: -------------------------------------------------------------------------------- 1 | -- Query 2.1 2 | 3 | select 4 | sum(lo_revenue), d_year, p_brand1 5 | from 6 | lineorder, date, part, supplier 7 | where 8 | lo_orderdate = d_datekey and 9 | lo_partkey = p_partkey and 10 | lo_suppkey = s_suppkey and 11 | p_category = 'MFGR#12' and 12 | s_region = 'AMERICA' 13 | group by d_year, p_brand1 14 | order by d_year, p_brand1; 15 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/6.sql: -------------------------------------------------------------------------------- 1 | -- Query 2.3 2 | 3 | select 4 | sum(lo_revenue), d_year, p_brand1 5 | from 6 | lineorder, date, part, supplier 7 | where 8 | lo_orderdate = d_datekey and 9 | lo_partkey = p_partkey and 10 | lo_suppkey = s_suppkey and 11 | p_brand1 = 'MFGR#2221' and 12 | s_region = 'EUROPE' 13 | group by d_year, p_brand1 14 | order by d_year, p_brand1; 15 | -------------------------------------------------------------------------------- /benchmark/job/queries/3b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS movie_title 2 | FROM keyword AS k, 3 | movie_info AS mi, 4 | movie_keyword AS mk, 5 | title AS t 6 | WHERE k.keyword LIKE '%sequel%' 7 | AND mi.info IN ('Bulgaria') 8 | AND t.production_year > 2010 9 | AND t.id = mi.movie_id 10 | AND t.id = mk.movie_id 11 | AND mk.movie_id = mi.movie_id 12 | AND k.id = mk.keyword_id; 13 | 14 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/5.sql: -------------------------------------------------------------------------------- 1 | -- Query 2.2 2 | 3 | select 4 | sum(lo_revenue), d_year, p_brand1 5 | from 6 | lineorder, date, part, supplier 7 | where 8 | lo_orderdate = d_datekey and 9 | lo_partkey = p_partkey and 10 | lo_suppkey = s_suppkey and 11 | p_brand1 between 'MFGR#2221' and 'MFGR#2228' and 12 | s_region = 'ASIA' 13 | group by d_year, p_brand1 14 | order by d_year, p_brand1; 15 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/17.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | sum(l_extendedprice) / 7.0 as avg_yearly 6 | from 7 | lineitem, 8 | part 9 | where 10 | p_partkey = l_partkey 11 | and p_brand = 'Brand#44' 12 | and p_container = 'WRAP PKG' 13 | and l_quantity < ( 14 | select 15 | 0.2 * avg(l_quantity) 16 | from 17 | lineitem 18 | where 19 | l_partkey = p_partkey 20 | ); 21 | -------------------------------------------------------------------------------- /benchmark/job/queries/2a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS movie_title 2 | FROM company_name AS cn, 3 | keyword AS k, 4 | movie_companies AS mc, 5 | movie_keyword AS mk, 6 | title AS t 7 | WHERE cn.country_code ='[de]' 8 | AND k.keyword ='character-name-in-title' 9 | AND cn.id = mc.company_id 10 | AND mc.movie_id = t.id 11 | AND t.id = mk.movie_id 12 | AND mk.keyword_id = k.id 13 | AND mc.movie_id = mk.movie_id; 14 | 15 | -------------------------------------------------------------------------------- /benchmark/job/queries/2b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS movie_title 2 | FROM company_name AS cn, 3 | keyword AS k, 4 | movie_companies AS mc, 5 | movie_keyword AS mk, 6 | title AS t 7 | WHERE cn.country_code ='[nl]' 8 | AND k.keyword ='character-name-in-title' 9 | AND cn.id = mc.company_id 10 | AND mc.movie_id = t.id 11 | AND t.id = mk.movie_id 12 | AND mk.keyword_id = k.id 13 | AND mc.movie_id = mk.movie_id; 14 | 15 | -------------------------------------------------------------------------------- /benchmark/job/queries/2c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS movie_title 2 | FROM company_name AS cn, 3 | keyword AS k, 4 | movie_companies AS mc, 5 | movie_keyword AS mk, 6 | title AS t 7 | WHERE cn.country_code ='[sm]' 8 | AND k.keyword ='character-name-in-title' 9 | AND cn.id = mc.company_id 10 | AND mc.movie_id = t.id 11 | AND t.id = mk.movie_id 12 | AND mk.keyword_id = k.id 13 | AND mc.movie_id = mk.movie_id; 14 | 15 | -------------------------------------------------------------------------------- /benchmark/job/queries/2d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS movie_title 2 | FROM company_name AS cn, 3 | keyword AS k, 4 | movie_companies AS mc, 5 | movie_keyword AS mk, 6 | title AS t 7 | WHERE cn.country_code ='[us]' 8 | AND k.keyword ='character-name-in-title' 9 | AND cn.id = mc.company_id 10 | AND mc.movie_id = t.id 11 | AND t.id = mk.movie_id 12 | AND mk.keyword_id = k.id 13 | AND mc.movie_id = mk.movie_id; 14 | 15 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/14.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | 100.00 * sum(case 6 | when p_type like 'PROMO%' 7 | then l_extendedprice * (1 - l_discount) 8 | else 0 9 | end) / sum(l_extendedprice * (1 - l_discount)) as promo_revenue 10 | from 11 | lineitem, 12 | part 13 | where 14 | l_partkey = p_partkey 15 | and l_shipdate >= '1996-12-01' 16 | and l_shipdate < date_add('1996-12-01', interval '1' month); 17 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/7.sql: -------------------------------------------------------------------------------- 1 | -- Query 3.1 2 | 3 | select 4 | c_nation, s_nation, d_year, sum(lo_revenue) as revenue 5 | from 6 | customer, lineorder, supplier, date 7 | where 8 | lo_custkey = c_custkey and 9 | lo_suppkey = s_suppkey and 10 | lo_orderdate = d_datekey and 11 | c_region = 'ASIA' and 12 | s_region = 'ASIA' and 13 | d_year >= 1992 and 14 | d_year <= 1997 15 | group by c_nation, s_nation, d_year 16 | order by d_year asc, revenue desc; 17 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/8.sql: -------------------------------------------------------------------------------- 1 | -- Query 3.2 2 | 3 | select 4 | c_city, s_city, d_year, sum(lo_revenue) as revenue 5 | from 6 | customer, lineorder, supplier, date 7 | where 8 | lo_custkey = c_custkey and 9 | lo_suppkey = s_suppkey and 10 | lo_orderdate = d_datekey and 11 | c_nation = 'UNITED STATES' and 12 | s_nation = 'UNITED STATES' and 13 | d_year >= 1992 and d_year <= 1997 14 | group by c_city, s_city, d_year 15 | order by d_year asc, revenue desc; 16 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/13.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | c_count, 6 | count(*) as custdist 7 | from 8 | ( 9 | select 10 | c_custkey, 11 | count(o_orderkey) as c_count 12 | from 13 | customer left outer join orders on 14 | c_custkey = o_custkey 15 | and o_comment not like '%pending%deposits%' 16 | group by 17 | c_custkey 18 | ) c_orders 19 | group by 20 | c_count 21 | order by 22 | custdist desc, 23 | c_count desc; 24 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/10.sql: -------------------------------------------------------------------------------- 1 | -- Query 3.4 2 | 3 | select 4 | c_city, s_city, d_year, sum(lo_revenue) as revenue 5 | from 6 | customer, lineorder, supplier, date 7 | where 8 | lo_custkey = c_custkey and 9 | lo_suppkey = s_suppkey and 10 | lo_orderdate = d_datekey and 11 | (c_city='UNITED KI1' or c_city='UNITED KI5') and 12 | (s_city='UNITED KI1' or s_city='UNITED KI5') and 13 | d_yearmonth = 'Dec1997' 14 | group by c_city, s_city, d_year 15 | order by d_year asc, revenue desc; 16 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/4.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | o_orderpriority, 6 | count(*) as order_count 7 | from 8 | orders 9 | where 10 | o_orderdate >= '1995-01-01' 11 | and o_orderdate < date_add('1995-01-01', interval '3' month) 12 | and exists ( 13 | select 14 | * 15 | from 16 | lineitem 17 | where 18 | l_orderkey = o_orderkey 19 | and l_commitdate < l_receiptdate 20 | ) 21 | group by 22 | o_orderpriority 23 | order by 24 | o_orderpriority; 25 | -------------------------------------------------------------------------------- /.github/workflows/workflow.yaml: -------------------------------------------------------------------------------- 1 | name: "workflow" 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | build: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/setup-go@v1 9 | with: 10 | go-version: 1.13.x 11 | - uses: actions/checkout@v2 12 | 13 | - name: "fmt" 14 | run: make fmt 15 | 16 | - name: "vet" 17 | run: make vet 18 | 19 | - name: "test" 20 | run: make test 21 | 22 | - name: "build" 23 | run: make build 24 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/11.sql: -------------------------------------------------------------------------------- 1 | -- Query 4.1 2 | 3 | select 4 | d_year, c_nation, sum(lo_revenue - lo_supplycost) as profit 5 | from 6 | date, customer, supplier, part, lineorder 7 | where 8 | lo_custkey = c_custkey and 9 | lo_suppkey = s_suppkey and 10 | lo_partkey = p_partkey and 11 | lo_orderdate = d_datekey and 12 | c_region = 'AMERICA' and 13 | s_region = 'AMERICA' and 14 | (p_mfgr = 'MFGR#1' or p_mfgr = 'MFGR#2') 15 | group by d_year, c_nation 16 | order by d_year, c_nation; 17 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_55.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query55.tpl 2 | select i_brand_id brand_id, i_brand brand, 3 | sum(ss_ext_sales_price) ext_price 4 | from date_dim, store_sales, item 5 | where d_date_sk = ss_sold_date_sk 6 | and ss_item_sk = i_item_sk 7 | and i_manager_id=36 8 | and d_moy=12 9 | and d_year=2001 10 | group by i_brand, i_brand_id 11 | order by ext_price desc, i_brand_id 12 | limit 100 ; 13 | 14 | -- end query 1 in stream 0 using template query55.tpl 15 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/9.sql: -------------------------------------------------------------------------------- 1 | -- Query 3.3 2 | 3 | select 4 | c_city, s_city, d_year, sum(lo_revenue) as revenue 5 | from 6 | customer, lineorder, supplier, date 7 | where 8 | lo_custkey = c_custkey and 9 | lo_suppkey = s_suppkey and 10 | lo_orderdate = d_datekey and 11 | (c_city='UNITED KI1' or c_city='UNITED KI5') and 12 | (s_city='UNITED KI1' or s_city='UNITED KI5') and 13 | d_year >= 1992 and 14 | d_year <= 1997 15 | group by c_city, s_city, d_year 16 | order by d_year asc, revenue desc; 17 | -------------------------------------------------------------------------------- /benchmark/job/queries/32a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(lt.link) AS link_type, 2 | MIN(t1.title) AS first_movie, 3 | MIN(t2.title) AS second_movie 4 | FROM keyword AS k, 5 | link_type AS lt, 6 | movie_keyword AS mk, 7 | movie_link AS ml, 8 | title AS t1, 9 | title AS t2 10 | WHERE k.keyword ='10,000-mile-club' 11 | AND mk.keyword_id = k.id 12 | AND t1.id = mk.movie_id 13 | AND ml.movie_id = t1.id 14 | AND ml.linked_movie_id = t2.id 15 | AND lt.id = ml.link_type_id 16 | AND mk.movie_id = t1.id; 17 | 18 | -------------------------------------------------------------------------------- /benchmark/job/queries/32b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(lt.link) AS link_type, 2 | MIN(t1.title) AS first_movie, 3 | MIN(t2.title) AS second_movie 4 | FROM keyword AS k, 5 | link_type AS lt, 6 | movie_keyword AS mk, 7 | movie_link AS ml, 8 | title AS t1, 9 | title AS t2 10 | WHERE k.keyword ='character-name-in-title' 11 | AND mk.keyword_id = k.id 12 | AND t1.id = mk.movie_id 13 | AND ml.movie_id = t1.id 14 | AND ml.linked_movie_id = t2.id 15 | AND lt.id = ml.link_type_id 16 | AND mk.movie_id = t1.id; 17 | 18 | -------------------------------------------------------------------------------- /benchmark/job/queries/4a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi_idx.info) AS rating, 2 | MIN(t.title) AS movie_title 3 | FROM info_type AS it, 4 | keyword AS k, 5 | movie_info_idx AS mi_idx, 6 | movie_keyword AS mk, 7 | title AS t 8 | WHERE it.info ='rating' 9 | AND k.keyword LIKE '%sequel%' 10 | AND mi_idx.info > '5.0' 11 | AND t.production_year > 2005 12 | AND t.id = mi_idx.movie_id 13 | AND t.id = mk.movie_id 14 | AND mk.movie_id = mi_idx.movie_id 15 | AND k.id = mk.keyword_id 16 | AND it.id = mi_idx.info_type_id; 17 | 18 | -------------------------------------------------------------------------------- /benchmark/job/queries/4b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi_idx.info) AS rating, 2 | MIN(t.title) AS movie_title 3 | FROM info_type AS it, 4 | keyword AS k, 5 | movie_info_idx AS mi_idx, 6 | movie_keyword AS mk, 7 | title AS t 8 | WHERE it.info ='rating' 9 | AND k.keyword LIKE '%sequel%' 10 | AND mi_idx.info > '9.0' 11 | AND t.production_year > 2010 12 | AND t.id = mi_idx.movie_id 13 | AND t.id = mk.movie_id 14 | AND mk.movie_id = mi_idx.movie_id 15 | AND k.id = mk.keyword_id 16 | AND it.id = mi_idx.info_type_id; 17 | 18 | -------------------------------------------------------------------------------- /benchmark/job/queries/4c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi_idx.info) AS rating, 2 | MIN(t.title) AS movie_title 3 | FROM info_type AS it, 4 | keyword AS k, 5 | movie_info_idx AS mi_idx, 6 | movie_keyword AS mk, 7 | title AS t 8 | WHERE it.info ='rating' 9 | AND k.keyword LIKE '%sequel%' 10 | AND mi_idx.info > '2.0' 11 | AND t.production_year > 1990 12 | AND t.id = mi_idx.movie_id 13 | AND t.id = mk.movie_id 14 | AND mk.movie_id = mi_idx.movie_id 15 | AND k.id = mk.keyword_id 16 | AND it.id = mi_idx.info_type_id; 17 | 18 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: "release" 2 | on: 3 | push: 4 | tags: 5 | - '*' 6 | 7 | jobs: 8 | release: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/setup-go@v1 12 | with: 13 | go-version: 1.13.x 14 | - uses: actions/checkout@v2 15 | 16 | - name: Run GoReleaser 17 | uses: goreleaser/goreleaser-action@v1 18 | with: 19 | version: latest 20 | args: release --rm-dist 21 | env: 22 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | -------------------------------------------------------------------------------- /benchmark/job/queries/6a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(k.keyword) AS movie_keyword, 2 | MIN(n.name) AS actor_name, 3 | MIN(t.title) AS marvel_movie 4 | FROM cast_info AS ci, 5 | keyword AS k, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword = 'marvel-cinematic-universe' 10 | AND n.name LIKE '%Downey%Robert%' 11 | AND t.production_year > 2010 12 | AND k.id = mk.keyword_id 13 | AND t.id = mk.movie_id 14 | AND t.id = ci.movie_id 15 | AND ci.movie_id = mk.movie_id 16 | AND n.id = ci.person_id; 17 | 18 | -------------------------------------------------------------------------------- /benchmark/job/queries/6c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(k.keyword) AS movie_keyword, 2 | MIN(n.name) AS actor_name, 3 | MIN(t.title) AS marvel_movie 4 | FROM cast_info AS ci, 5 | keyword AS k, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword = 'marvel-cinematic-universe' 10 | AND n.name LIKE '%Downey%Robert%' 11 | AND t.production_year > 2014 12 | AND k.id = mk.keyword_id 13 | AND t.id = mk.movie_id 14 | AND t.id = ci.movie_id 15 | AND ci.movie_id = mk.movie_id 16 | AND n.id = ci.person_id; 17 | 18 | -------------------------------------------------------------------------------- /benchmark/job/queries/6e.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(k.keyword) AS movie_keyword, 2 | MIN(n.name) AS actor_name, 3 | MIN(t.title) AS marvel_movie 4 | FROM cast_info AS ci, 5 | keyword AS k, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword = 'marvel-cinematic-universe' 10 | AND n.name LIKE '%Downey%Robert%' 11 | AND t.production_year > 2000 12 | AND k.id = mk.keyword_id 13 | AND t.id = mk.movie_id 14 | AND t.id = ci.movie_id 15 | AND ci.movie_id = mk.movie_id 16 | AND n.id = ci.person_id; 17 | 18 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/13.sql: -------------------------------------------------------------------------------- 1 | -- Query 4.3 2 | 3 | select 4 | d_year, s_city, p_brand1, sum(lo_revenue - lo_supplycost) as profit 5 | from 6 | date, customer, supplier, part, lineorder 7 | where 8 | lo_custkey = c_custkey and 9 | lo_suppkey = s_suppkey and 10 | lo_partkey = p_partkey and 11 | lo_orderdate = d_datekey and 12 | c_region = 'AMERICA' and 13 | s_nation = 'UNITED STATES' and 14 | (d_year = 1997 or d_year = 1998) and 15 | p_category = 'MFGR#14' 16 | group by d_year, s_city, p_brand1 17 | order by d_year, s_city, p_brand1; 18 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/3.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | l_orderkey, 6 | sum(l_extendedprice * (1 - l_discount)) as revenue, 7 | o_orderdate, 8 | o_shippriority 9 | from 10 | customer, 11 | orders, 12 | lineitem 13 | where 14 | c_mktsegment = 'AUTOMOBILE' 15 | and c_custkey = o_custkey 16 | and l_orderkey = o_orderkey 17 | and o_orderdate < '1995-03-13' 18 | and l_shipdate > '1995-03-13' 19 | group by 20 | l_orderkey, 21 | o_orderdate, 22 | o_shippriority 23 | order by 24 | revenue desc, 25 | o_orderdate 26 | limit 10; 27 | -------------------------------------------------------------------------------- /benchmark/ssb/queries/12.sql: -------------------------------------------------------------------------------- 1 | -- Query 4.2 2 | 3 | select 4 | d_year, s_nation, p_category, sum(lo_revenue - lo_supplycost) as profit 5 | from 6 | date, customer, supplier, part, lineorder 7 | where 8 | lo_custkey = c_custkey and 9 | lo_suppkey = s_suppkey and 10 | lo_partkey = p_partkey and 11 | lo_orderdate = d_datekey and 12 | c_region = 'AMERICA' and 13 | s_region = 'AMERICA' and 14 | (d_year = 1997 or d_year = 1998) and 15 | (p_mfgr = 'MFGR#1' or p_mfgr = 'MFGR#2') 16 | group by d_year, s_nation, p_category 17 | order by d_year, s_nation, p_category; 18 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_96.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query96.tpl 2 | select count(*) 3 | from store_sales 4 | ,household_demographics 5 | ,time_dim, store 6 | where ss_sold_time_sk = time_dim.t_time_sk 7 | and ss_hdemo_sk = household_demographics.hd_demo_sk 8 | and ss_store_sk = s_store_sk 9 | and time_dim.t_hour = 8 10 | and time_dim.t_minute >= 30 11 | and household_demographics.hd_dep_count = 5 12 | and store.s_store_name = 'ese' 13 | order by count(*) 14 | limit 100; 15 | 16 | -- end query 1 in stream 0 using template query96.tpl 17 | -------------------------------------------------------------------------------- /benchmark/job/queries/8c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(a1.name) AS writer_pseudo_name, 2 | MIN(t.title) AS movie_title 3 | FROM aka_name AS a1, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | movie_companies AS mc, 7 | name AS n1, 8 | role_type AS rt, 9 | title AS t 10 | WHERE cn.country_code ='[us]' 11 | AND rt.role ='writer' 12 | AND a1.person_id = n1.id 13 | AND n1.id = ci.person_id 14 | AND ci.movie_id = t.id 15 | AND t.id = mc.movie_id 16 | AND mc.company_id = cn.id 17 | AND ci.role_id = rt.id 18 | AND a1.person_id = ci.person_id 19 | AND ci.movie_id = mc.movie_id; 20 | 21 | -------------------------------------------------------------------------------- /benchmark/job/prepare.sql: -------------------------------------------------------------------------------- 1 | analyze table aka_name; 2 | analyze table aka_title; 3 | analyze table cast_info; 4 | analyze table char_name; 5 | analyze table comp_cast_type; 6 | analyze table company_name; 7 | analyze table company_type; 8 | analyze table complete_cast; 9 | analyze table info_type; 10 | analyze table keyword; 11 | analyze table kind_type; 12 | analyze table link_type; 13 | analyze table movie_companies; 14 | analyze table movie_info; 15 | analyze table movie_keyword; 16 | analyze table movie_link; 17 | analyze table name; 18 | analyze table person_info; 19 | analyze table role_type; 20 | analyze table title; 21 | -------------------------------------------------------------------------------- /benchmark/job/queries/5b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS american_vhs_movie 2 | FROM company_type AS ct, 3 | info_type AS it, 4 | movie_companies AS mc, 5 | movie_info AS mi, 6 | title AS t 7 | WHERE ct.kind = 'production companies' 8 | AND mc.note LIKE '%(VHS)%' 9 | AND mc.note LIKE '%(USA)%' 10 | AND mc.note LIKE '%(1994)%' 11 | AND mi.info IN ('USA', 12 | 'America') 13 | AND t.production_year > 2010 14 | AND t.id = mi.movie_id 15 | AND t.id = mc.movie_id 16 | AND mc.movie_id = mi.movie_id 17 | AND ct.id = mc.company_type_id 18 | AND it.id = mi.info_type_id; 19 | 20 | -------------------------------------------------------------------------------- /benchmark/job/queries/17f.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS member_in_charnamed_movie 2 | FROM cast_info AS ci, 3 | company_name AS cn, 4 | keyword AS k, 5 | movie_companies AS mc, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword ='character-name-in-title' 10 | AND n.name LIKE '%B%' 11 | AND n.id = ci.person_id 12 | AND ci.movie_id = t.id 13 | AND t.id = mk.movie_id 14 | AND mk.keyword_id = k.id 15 | AND t.id = mc.movie_id 16 | AND mc.company_id = cn.id 17 | AND ci.movie_id = mc.movie_id 18 | AND ci.movie_id = mk.movie_id 19 | AND mc.movie_id = mk.movie_id; 20 | 21 | -------------------------------------------------------------------------------- /benchmark/job/queries/3a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS movie_title 2 | FROM keyword AS k, 3 | movie_info AS mi, 4 | movie_keyword AS mk, 5 | title AS t 6 | WHERE k.keyword LIKE '%sequel%' 7 | AND mi.info IN ('Sweden', 8 | 'Norway', 9 | 'Germany', 10 | 'Denmark', 11 | 'Swedish', 12 | 'Denish', 13 | 'Norwegian', 14 | 'German') 15 | AND t.production_year > 2005 16 | AND t.id = mi.movie_id 17 | AND t.id = mk.movie_id 18 | AND mk.movie_id = mi.movie_id 19 | AND k.id = mk.keyword_id; 20 | 21 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | # This is an example goreleaser.yaml file with some sane defaults. 2 | # Make sure to check the documentation at http://goreleaser.com 3 | before: 4 | hooks: 5 | - go mod tidy 6 | builds: 7 | - binary: horo 8 | id: horo 9 | main: ./cmd/ 10 | env: 11 | - CGO_ENABLED=0 12 | - GO111MODULE=on 13 | goarch: 14 | - amd64 15 | goos: 16 | - linux 17 | - darwin 18 | archives: 19 | - replacements: 20 | darwin: Darwin 21 | linux: Linux 22 | windows: Windows 23 | 386: i386 24 | amd64: x86_64 25 | checksum: 26 | name_template: 'checksums.txt' 27 | -------------------------------------------------------------------------------- /benchmark/job/queries/17d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS member_in_charnamed_movie 2 | FROM cast_info AS ci, 3 | company_name AS cn, 4 | keyword AS k, 5 | movie_companies AS mc, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword ='character-name-in-title' 10 | AND n.name LIKE '%Bert%' 11 | AND n.id = ci.person_id 12 | AND ci.movie_id = t.id 13 | AND t.id = mk.movie_id 14 | AND mk.keyword_id = k.id 15 | AND t.id = mc.movie_id 16 | AND mc.company_id = cn.id 17 | AND ci.movie_id = mc.movie_id 18 | AND ci.movie_id = mk.movie_id 19 | AND mc.movie_id = mk.movie_id; 20 | 21 | -------------------------------------------------------------------------------- /benchmark/job/queries/17e.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS member_in_charnamed_movie 2 | FROM cast_info AS ci, 3 | company_name AS cn, 4 | keyword AS k, 5 | movie_companies AS mc, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE cn.country_code ='[us]' 10 | AND k.keyword ='character-name-in-title' 11 | AND n.id = ci.person_id 12 | AND ci.movie_id = t.id 13 | AND t.id = mk.movie_id 14 | AND mk.keyword_id = k.id 15 | AND t.id = mc.movie_id 16 | AND mc.company_id = cn.id 17 | AND ci.movie_id = mc.movie_id 18 | AND ci.movie_id = mk.movie_id 19 | AND mc.movie_id = mk.movie_id; 20 | 21 | -------------------------------------------------------------------------------- /benchmark/job/queries/8d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an1.name) AS costume_designer_pseudo, 2 | MIN(t.title) AS movie_with_costumes 3 | FROM aka_name AS an1, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | movie_companies AS mc, 7 | name AS n1, 8 | role_type AS rt, 9 | title AS t 10 | WHERE cn.country_code ='[us]' 11 | AND rt.role ='costume designer' 12 | AND an1.person_id = n1.id 13 | AND n1.id = ci.person_id 14 | AND ci.movie_id = t.id 15 | AND t.id = mc.movie_id 16 | AND mc.company_id = cn.id 17 | AND ci.role_id = rt.id 18 | AND an1.person_id = ci.person_id 19 | AND ci.movie_id = mc.movie_id; 20 | 21 | -------------------------------------------------------------------------------- /benchmark/job/queries/10c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS character, 2 | MIN(t.title) AS movie_with_american_producer 3 | FROM char_name AS chn, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | company_type AS ct, 7 | movie_companies AS mc, 8 | role_type AS rt, 9 | title AS t 10 | WHERE ci.note LIKE '%(producer)%' 11 | AND cn.country_code = '[us]' 12 | AND t.production_year > 1990 13 | AND t.id = mc.movie_id 14 | AND t.id = ci.movie_id 15 | AND ci.movie_id = mc.movie_id 16 | AND chn.id = ci.person_role_id 17 | AND rt.id = ci.role_id 18 | AND cn.id = mc.company_id 19 | AND ct.id = mc.company_type_id; 20 | -------------------------------------------------------------------------------- /benchmark/job/queries/17b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS member_in_charnamed_movie, 2 | MIN(n.name) AS a1 3 | FROM cast_info AS ci, 4 | company_name AS cn, 5 | keyword AS k, 6 | movie_companies AS mc, 7 | movie_keyword AS mk, 8 | name AS n, 9 | title AS t 10 | WHERE k.keyword ='character-name-in-title' 11 | AND n.name LIKE 'Z%' 12 | AND n.id = ci.person_id 13 | AND ci.movie_id = t.id 14 | AND t.id = mk.movie_id 15 | AND mk.keyword_id = k.id 16 | AND t.id = mc.movie_id 17 | AND mc.company_id = cn.id 18 | AND ci.movie_id = mc.movie_id 19 | AND ci.movie_id = mk.movie_id 20 | AND mc.movie_id = mk.movie_id; 21 | 22 | -------------------------------------------------------------------------------- /benchmark/job/queries/17c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS member_in_charnamed_movie, 2 | MIN(n.name) AS a1 3 | FROM cast_info AS ci, 4 | company_name AS cn, 5 | keyword AS k, 6 | movie_companies AS mc, 7 | movie_keyword AS mk, 8 | name AS n, 9 | title AS t 10 | WHERE k.keyword ='character-name-in-title' 11 | AND n.name LIKE 'X%' 12 | AND n.id = ci.person_id 13 | AND ci.movie_id = t.id 14 | AND t.id = mk.movie_id 15 | AND mk.keyword_id = k.id 16 | AND t.id = mc.movie_id 17 | AND mc.company_id = cn.id 18 | AND ci.movie_id = mc.movie_id 19 | AND ci.movie_id = mk.movie_id 20 | AND mc.movie_id = mk.movie_id; 21 | 22 | -------------------------------------------------------------------------------- /benchmark/job/queries/1d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mc.note) AS production_note, 2 | MIN(t.title) AS movie_title, 3 | MIN(t.production_year) AS movie_year 4 | FROM company_type AS ct, 5 | info_type AS it, 6 | movie_companies AS mc, 7 | movie_info_idx AS mi_idx, 8 | title AS t 9 | WHERE ct.kind = 'production companies' 10 | AND it.info = 'bottom 10 rank' 11 | AND mc.note NOT LIKE '%(as Metro-Goldwyn-Mayer Pictures)%' 12 | AND t.production_year >2000 13 | AND ct.id = mc.company_type_id 14 | AND t.id = mc.movie_id 15 | AND t.id = mi_idx.movie_id 16 | AND mc.movie_id = mi_idx.movie_id 17 | AND it.id = mi_idx.info_type_id; 18 | 19 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/18.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | c_name, 6 | c_custkey, 7 | o_orderkey, 8 | o_orderdate, 9 | o_totalprice, 10 | sum(l_quantity) 11 | from 12 | customer, 13 | orders, 14 | lineitem 15 | where 16 | o_orderkey in ( 17 | select 18 | l_orderkey 19 | from 20 | lineitem 21 | group by 22 | l_orderkey having 23 | sum(l_quantity) > 314 24 | ) 25 | and c_custkey = o_custkey 26 | and o_orderkey = l_orderkey 27 | group by 28 | c_name, 29 | c_custkey, 30 | o_orderkey, 31 | o_orderdate, 32 | o_totalprice 33 | order by 34 | o_totalprice desc, 35 | o_orderdate 36 | limit 100; 37 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/5.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | n_name, 6 | sum(l_extendedprice * (1 - l_discount)) as revenue 7 | from 8 | customer, 9 | orders, 10 | lineitem, 11 | supplier, 12 | nation, 13 | region 14 | where 15 | c_custkey = o_custkey 16 | and l_orderkey = o_orderkey 17 | and l_suppkey = s_suppkey 18 | and c_nationkey = s_nationkey 19 | and s_nationkey = n_nationkey 20 | and n_regionkey = r_regionkey 21 | and r_name = 'MIDDLE EAST' 22 | and o_orderdate >= '1994-01-01' 23 | and o_orderdate < date_add('1994-01-01', interval '1' year) 24 | group by 25 | n_name 26 | order by 27 | revenue desc; 28 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/16.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | p_brand, 6 | p_type, 7 | p_size, 8 | count(distinct ps_suppkey) as supplier_cnt 9 | from 10 | partsupp, 11 | part 12 | where 13 | p_partkey = ps_partkey 14 | and p_brand <> 'Brand#34' 15 | and p_type not like 'LARGE BRUSHED%' 16 | and p_size in (48, 19, 12, 4, 41, 7, 21, 39) 17 | and ps_suppkey not in ( 18 | select 19 | s_suppkey 20 | from 21 | supplier 22 | where 23 | s_comment like '%Customer%Complaints%' 24 | ) 25 | group by 26 | p_brand, 27 | p_type, 28 | p_size 29 | order by 30 | supplier_cnt desc, 31 | p_brand, 32 | p_type, 33 | p_size; 34 | -------------------------------------------------------------------------------- /benchmark/job/queries/1b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mc.note) AS production_note, 2 | MIN(t.title) AS movie_title, 3 | MIN(t.production_year) AS movie_year 4 | FROM company_type AS ct, 5 | info_type AS it, 6 | movie_companies AS mc, 7 | movie_info_idx AS mi_idx, 8 | title AS t 9 | WHERE ct.kind = 'production companies' 10 | AND it.info = 'bottom 10 rank' 11 | AND mc.note NOT LIKE '%(as Metro-Goldwyn-Mayer Pictures)%' 12 | AND t.production_year BETWEEN 2005 AND 2010 13 | AND ct.id = mc.company_type_id 14 | AND t.id = mc.movie_id 15 | AND t.id = mi_idx.movie_id 16 | AND mc.movie_id = mi_idx.movie_id 17 | AND it.id = mi_idx.info_type_id; 18 | 19 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/1.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | l_returnflag, 6 | l_linestatus, 7 | sum(l_quantity) as sum_qty, 8 | sum(l_extendedprice) as sum_base_price, 9 | sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, 10 | sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, 11 | avg(l_quantity) as avg_qty, 12 | avg(l_extendedprice) as avg_price, 13 | avg(l_discount) as avg_disc, 14 | count(*) as count_order 15 | from 16 | lineitem 17 | where 18 | l_shipdate <= date_sub('1998-12-01', interval 108 day) 19 | group by 20 | l_returnflag, 21 | l_linestatus 22 | order by 23 | l_returnflag, 24 | l_linestatus; 25 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/11.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | select 4 | ps_partkey, 5 | sum(ps_supplycost * ps_availqty) as value 6 | from 7 | partsupp, 8 | supplier, 9 | nation 10 | where 11 | ps_suppkey = s_suppkey 12 | and s_nationkey = n_nationkey 13 | and n_name = 'MOZAMBIQUE' 14 | group by 15 | ps_partkey having 16 | sum(ps_supplycost * ps_availqty) > ( 17 | select 18 | sum(ps_supplycost * ps_availqty) * 0.0001000000 19 | from 20 | partsupp, 21 | supplier, 22 | nation 23 | where 24 | ps_suppkey = s_suppkey 25 | and s_nationkey = n_nationkey 26 | and n_name = 'MOZAMBIQUE' 27 | ) 28 | order by 29 | value desc; 30 | -------------------------------------------------------------------------------- /benchmark/job/queries/10b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS character, 2 | MIN(t.title) AS russian_mov_with_actor_producer 3 | FROM char_name AS chn, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | company_type AS ct, 7 | movie_companies AS mc, 8 | role_type AS rt, 9 | title AS t 10 | WHERE ci.note LIKE '%(producer)%' 11 | AND cn.country_code = '[ru]' 12 | AND rt.role = 'actor' 13 | AND t.production_year > 2010 14 | AND t.id = mc.movie_id 15 | AND t.id = ci.movie_id 16 | AND ci.movie_id = mc.movie_id 17 | AND chn.id = ci.person_role_id 18 | AND rt.id = ci.role_id 19 | AND cn.id = mc.company_id 20 | AND ct.id = mc.company_type_id; 21 | 22 | -------------------------------------------------------------------------------- /benchmark/job/queries/3c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS movie_title 2 | FROM keyword AS k, 3 | movie_info AS mi, 4 | movie_keyword AS mk, 5 | title AS t 6 | WHERE k.keyword LIKE '%sequel%' 7 | AND mi.info IN ('Sweden', 8 | 'Norway', 9 | 'Germany', 10 | 'Denmark', 11 | 'Swedish', 12 | 'Denish', 13 | 'Norwegian', 14 | 'German', 15 | 'USA', 16 | 'American') 17 | AND t.production_year > 1990 18 | AND t.id = mi.movie_id 19 | AND t.id = mk.movie_id 20 | AND mk.movie_id = mi.movie_id 21 | AND k.id = mk.keyword_id; 22 | 23 | -------------------------------------------------------------------------------- /pkg/utils/utils_test.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/magiconair/properties/assert" 7 | "github.com/pingcap/parser/ast" 8 | _ "github.com/pingcap/tidb/types/parser_driver" 9 | "github.com/stretchr/testify/require" 10 | ) 11 | 12 | func TestNewNilValueExpr(t *testing.T) { 13 | stmt := &ast.SelectStmt{ 14 | SelectStmtOpts: &ast.SelectStmtOpts{ 15 | SQLCache: true, 16 | }, 17 | Fields: &ast.FieldList{ 18 | Fields: []*ast.SelectField{ 19 | { 20 | Expr: NewValueExpr([]byte(nil)), 21 | }, 22 | }, 23 | }, 24 | } 25 | 26 | query, err := BufferOut(stmt) 27 | require.Nil(t, err) 28 | assert.Equal(t, query, "SELECT NULL") 29 | } 30 | -------------------------------------------------------------------------------- /benchmark/job/queries/17a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS member_in_charnamed_american_movie, 2 | MIN(n.name) AS a1 3 | FROM cast_info AS ci, 4 | company_name AS cn, 5 | keyword AS k, 6 | movie_companies AS mc, 7 | movie_keyword AS mk, 8 | name AS n, 9 | title AS t 10 | WHERE cn.country_code ='[us]' 11 | AND k.keyword ='character-name-in-title' 12 | AND n.name LIKE 'B%' 13 | AND n.id = ci.person_id 14 | AND ci.movie_id = t.id 15 | AND t.id = mk.movie_id 16 | AND mk.keyword_id = k.id 17 | AND t.id = mc.movie_id 18 | AND mc.company_id = cn.id 19 | AND ci.movie_id = mc.movie_id 20 | AND ci.movie_id = mk.movie_id 21 | AND mc.movie_id = mk.movie_id; 22 | 23 | -------------------------------------------------------------------------------- /benchmark/job/queries/1c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mc.note) AS production_note, 2 | MIN(t.title) AS movie_title, 3 | MIN(t.production_year) AS movie_year 4 | FROM company_type AS ct, 5 | info_type AS it, 6 | movie_companies AS mc, 7 | movie_info_idx AS mi_idx, 8 | title AS t 9 | WHERE ct.kind = 'production companies' 10 | AND it.info = 'top 250 rank' 11 | AND mc.note NOT LIKE '%(as Metro-Goldwyn-Mayer Pictures)%' 12 | AND (mc.note LIKE '%(co-production)%') 13 | AND t.production_year >2010 14 | AND ct.id = mc.company_type_id 15 | AND t.id = mc.movie_id 16 | AND t.id = mi_idx.movie_id 17 | AND mc.movie_id = mi_idx.movie_id 18 | AND it.id = mi_idx.info_type_id; 19 | 20 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_82.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query82.tpl 2 | select i_item_id 3 | ,i_item_desc 4 | ,i_current_price 5 | from item, inventory, date_dim, store_sales 6 | where i_current_price between 30 and 30+30 7 | and inv_item_sk = i_item_sk 8 | and d_date_sk=inv_date_sk 9 | and d_date between cast('2002-05-30' as date) and (cast('2002-05-30' as date) + 60 days) 10 | and i_manufact_id in (437,129,727,663) 11 | and inv_quantity_on_hand between 100 and 500 12 | and ss_item_sk = i_item_sk 13 | group by i_item_id,i_item_desc,i_current_price 14 | order by i_item_id 15 | limit 100; 16 | 17 | -- end query 1 in stream 0 using template query82.tpl 18 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_37.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query37.tpl 2 | select i_item_id 3 | ,i_item_desc 4 | ,i_current_price 5 | from item, inventory, date_dim, catalog_sales 6 | where i_current_price between 22 and 22 + 30 7 | and inv_item_sk = i_item_sk 8 | and d_date_sk=inv_date_sk 9 | and d_date between cast('2001-06-02' as date) and (cast('2001-06-02' as date) + 60 days) 10 | and i_manufact_id in (678,964,918,849) 11 | and inv_quantity_on_hand between 100 and 500 12 | and cs_item_sk = i_item_sk 13 | group by i_item_id,i_item_desc,i_current_price 14 | order by i_item_id 15 | limit 100; 16 | 17 | -- end query 1 in stream 0 using template query37.tpl 18 | -------------------------------------------------------------------------------- /benchmark/job/queries/1a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mc.note) AS production_note, 2 | MIN(t.title) AS movie_title, 3 | MIN(t.production_year) AS movie_year 4 | FROM company_type AS ct, 5 | info_type AS it, 6 | movie_companies AS mc, 7 | movie_info_idx AS mi_idx, 8 | title AS t 9 | WHERE ct.kind = 'production companies' 10 | AND it.info = 'top 250 rank' 11 | AND mc.note NOT LIKE '%(as Metro-Goldwyn-Mayer Pictures)%' 12 | AND (mc.note LIKE '%(co-production)%' 13 | OR mc.note LIKE '%(presents)%') 14 | AND ct.id = mc.company_type_id 15 | AND t.id = mc.movie_id 16 | AND t.id = mi_idx.movie_id 17 | AND mc.movie_id = mi_idx.movie_id 18 | AND it.id = mi_idx.info_type_id; 19 | 20 | -------------------------------------------------------------------------------- /benchmark/job/queries/10a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS uncredited_voiced_character, 2 | MIN(t.title) AS russian_movie 3 | FROM char_name AS chn, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | company_type AS ct, 7 | movie_companies AS mc, 8 | role_type AS rt, 9 | title AS t 10 | WHERE ci.note LIKE '%(voice)%' 11 | AND ci.note LIKE '%(uncredited)%' 12 | AND cn.country_code = '[ru]' 13 | AND rt.role = 'actor' 14 | AND t.production_year > 2005 15 | AND t.id = mc.movie_id 16 | AND t.id = ci.movie_id 17 | AND ci.movie_id = mc.movie_id 18 | AND chn.id = ci.person_role_id 19 | AND rt.id = ci.role_id 20 | AND cn.id = mc.company_id 21 | AND ct.id = mc.company_type_id; 22 | 23 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/15.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | create view revenue0 (supplier_no, total_revenue) as 4 | select 5 | l_suppkey, 6 | sum(l_extendedprice * (1 - l_discount)) 7 | from 8 | lineitem 9 | where 10 | l_shipdate >= '1997-07-01' 11 | and l_shipdate < date_add('1997-07-01', interval '3' month) 12 | group by 13 | l_suppkey; 14 | 15 | 16 | select 17 | s_suppkey, 18 | s_name, 19 | s_address, 20 | s_phone, 21 | total_revenue 22 | from 23 | supplier, 24 | revenue0 25 | where 26 | s_suppkey = supplier_no 27 | and total_revenue = ( 28 | select 29 | max(total_revenue) 30 | from 31 | revenue0 32 | ) 33 | order by 34 | s_suppkey; 35 | 36 | drop view revenue0; 37 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | GOARCH := $(if $(GOARCH),$(GOARCH),amd64) 2 | GO=GO15VENDOREXPERIMENT="1" CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) GO111MODULE=on go 3 | GOTEST=GO15VENDOREXPERIMENT="1" CGO_ENABLED=1 GO111MODULE=on go test # go race detector requires cgo 4 | VERSION := $(if $(VERSION),$(VERSION),latest) 5 | PACKAGE_LIST := go list ./...| grep -vE "cmd" 6 | PACKAGES := $$($(PACKAGE_LIST)) 7 | 8 | GOBUILD=$(GO) build 9 | 10 | default: build 11 | 12 | build: 13 | $(GOBUILD) $(GOMOD) -o bin/horo cmd/*.go 14 | 15 | fmt: 16 | go fmt ./... 17 | 18 | test: 19 | go test ./... 20 | 21 | vet: 22 | $(GO) vet -all $(PACKAGES) 23 | 24 | tidy: 25 | @echo "go mod tidy" 26 | GO111MODULE=on go mod tidy 27 | @git diff --exit-code -- go.mod -------------------------------------------------------------------------------- /benchmark/tpch/queries/10.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | c_custkey, 6 | c_name, 7 | sum(l_extendedprice * (1 - l_discount)) as revenue, 8 | c_acctbal, 9 | n_name, 10 | c_address, 11 | c_phone, 12 | c_comment 13 | from 14 | customer, 15 | orders, 16 | lineitem, 17 | nation 18 | where 19 | c_custkey = o_custkey 20 | and l_orderkey = o_orderkey 21 | and o_orderdate >= '1993-08-01' 22 | and o_orderdate < date_add('1993-08-01', interval '3' month) 23 | and l_returnflag = 'R' 24 | and c_nationkey = n_nationkey 25 | group by 26 | c_custkey, 27 | c_name, 28 | c_acctbal, 29 | c_phone, 30 | n_name, 31 | c_address, 32 | c_comment 33 | order by 34 | revenue desc 35 | limit 20; 36 | -------------------------------------------------------------------------------- /pkg/executor/compare.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package executor 15 | 16 | import "fmt" 17 | 18 | type Comparable interface { 19 | fmt.Stringer 20 | Equal(other Comparable) bool 21 | } 22 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_15.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query15.tpl 2 | select ca_zip 3 | ,sum(cs_sales_price) 4 | from catalog_sales 5 | ,customer 6 | ,customer_address 7 | ,date_dim 8 | where cs_bill_customer_sk = c_customer_sk 9 | and c_current_addr_sk = ca_address_sk 10 | and ( substr(ca_zip,1,5) in ('85669', '86197','88274','83405','86475', 11 | '85392', '85460', '80348', '81792') 12 | or ca_state in ('CA','WA','GA') 13 | or cs_sales_price > 500) 14 | and cs_sold_date_sk = d_date_sk 15 | and d_qoy = 2 and d_year = 2000 16 | group by ca_zip 17 | order by ca_zip 18 | limit 100; 19 | 20 | -- end query 1 in stream 0 using template query15.tpl 21 | -------------------------------------------------------------------------------- /benchmark/job/queries/6f.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(k.keyword) AS movie_keyword, 2 | MIN(n.name) AS actor_name, 3 | MIN(t.title) AS hero_movie 4 | FROM cast_info AS ci, 5 | keyword AS k, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword IN ('superhero', 10 | 'sequel', 11 | 'second-part', 12 | 'marvel-comics', 13 | 'based-on-comic', 14 | 'tv-special', 15 | 'fight', 16 | 'violence') 17 | AND t.production_year > 2000 18 | AND k.id = mk.keyword_id 19 | AND t.id = mk.movie_id 20 | AND t.id = ci.movie_id 21 | AND ci.movie_id = mk.movie_id 22 | AND n.id = ci.person_id; 23 | 24 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_22.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query22.tpl 2 | select i_product_name 3 | ,i_brand 4 | ,i_class 5 | ,i_category 6 | ,avg(inv_quantity_on_hand) qoh 7 | from inventory 8 | ,date_dim 9 | ,item 10 | where inv_date_sk=d_date_sk 11 | and inv_item_sk=i_item_sk 12 | and d_month_seq between 1212 and 1212 + 11 13 | group by rollup(i_product_name 14 | ,i_brand 15 | ,i_class 16 | ,i_category) 17 | order by qoh, i_product_name, i_brand, i_class, i_category 18 | limit 100; 19 | 20 | -- end query 1 in stream 0 using template query22.tpl 21 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/12.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | l_shipmode, 6 | sum(case 7 | when o_orderpriority = '1-URGENT' 8 | or o_orderpriority = '2-HIGH' 9 | then 1 10 | else 0 11 | end) as high_line_count, 12 | sum(case 13 | when o_orderpriority <> '1-URGENT' 14 | and o_orderpriority <> '2-HIGH' 15 | then 1 16 | else 0 17 | end) as low_line_count 18 | from 19 | orders, 20 | lineitem 21 | where 22 | o_orderkey = l_orderkey 23 | and l_shipmode in ('RAIL', 'FOB') 24 | and l_commitdate < l_receiptdate 25 | and l_shipdate < l_commitdate 26 | and l_receiptdate >= '1997-01-01' 27 | and l_receiptdate < date_add('1997-01-01', interval '1' year) 28 | group by 29 | l_shipmode 30 | order by 31 | l_shipmode; 32 | -------------------------------------------------------------------------------- /benchmark/job/queries/16b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS cool_actor_pseudonym, 2 | MIN(t.title) AS series_named_after_char 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | keyword AS k, 7 | movie_companies AS mc, 8 | movie_keyword AS mk, 9 | name AS n, 10 | title AS t 11 | WHERE cn.country_code ='[us]' 12 | AND k.keyword ='character-name-in-title' 13 | AND an.person_id = n.id 14 | AND n.id = ci.person_id 15 | AND ci.movie_id = t.id 16 | AND t.id = mk.movie_id 17 | AND mk.keyword_id = k.id 18 | AND t.id = mc.movie_id 19 | AND mc.company_id = cn.id 20 | AND an.person_id = ci.person_id 21 | AND ci.movie_id = mc.movie_id 22 | AND ci.movie_id = mk.movie_id 23 | AND mc.movie_id = mk.movie_id; 24 | 25 | -------------------------------------------------------------------------------- /benchmark/tpcds/prepare.sql: -------------------------------------------------------------------------------- 1 | analyze table call_center; 2 | analyze table catalog_page; 3 | analyze table catalog_returns; 4 | analyze table catalog_sales; 5 | analyze table customer; 6 | analyze table customer_address; 7 | analyze table customer_demographics; 8 | analyze table date_dim; 9 | analyze table dbgen_version; 10 | analyze table household_demographics; 11 | analyze table income_band; 12 | analyze table inventory; 13 | analyze table item; 14 | analyze table promotion; 15 | analyze table reason; 16 | analyze table ship_mode; 17 | analyze table store; 18 | analyze table store_returns; 19 | analyze table store_sales; 20 | analyze table time_dim; 21 | analyze table warehouse; 22 | analyze table web_page; 23 | analyze table web_returns; 24 | analyze table web_sales; 25 | analyze table web_site; 26 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/9.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | nation, 6 | o_year, 7 | sum(amount) as sum_profit 8 | from 9 | ( 10 | select 11 | n_name as nation, 12 | extract(year from o_orderdate) as o_year, 13 | l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount 14 | from 15 | part, 16 | supplier, 17 | lineitem, 18 | partsupp, 19 | orders, 20 | nation 21 | where 22 | s_suppkey = l_suppkey 23 | and ps_suppkey = l_suppkey 24 | and ps_partkey = l_partkey 25 | and p_partkey = l_partkey 26 | and o_orderkey = l_orderkey 27 | and s_nationkey = n_nationkey 28 | and p_name like '%dim%' 29 | ) as profit 30 | group by 31 | nation, 32 | o_year 33 | order by 34 | nation, 35 | o_year desc; 36 | -------------------------------------------------------------------------------- /benchmark/job/queries/5a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS typical_european_movie 2 | FROM company_type AS ct, 3 | info_type AS it, 4 | movie_companies AS mc, 5 | movie_info AS mi, 6 | title AS t 7 | WHERE ct.kind = 'production companies' 8 | AND mc.note LIKE '%(theatrical)%' 9 | AND mc.note LIKE '%(France)%' 10 | AND mi.info IN ('Sweden', 11 | 'Norway', 12 | 'Germany', 13 | 'Denmark', 14 | 'Swedish', 15 | 'Denish', 16 | 'Norwegian', 17 | 'German') 18 | AND t.production_year > 2005 19 | AND t.id = mi.movie_id 20 | AND t.id = mc.movie_id 21 | AND mc.movie_id = mi.movie_id 22 | AND ct.id = mc.company_type_id 23 | AND it.id = mi.info_type_id; 24 | 25 | -------------------------------------------------------------------------------- /benchmark/job/queries/6b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(k.keyword) AS movie_keyword, 2 | MIN(n.name) AS actor_name, 3 | MIN(t.title) AS hero_movie 4 | FROM cast_info AS ci, 5 | keyword AS k, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword IN ('superhero', 10 | 'sequel', 11 | 'second-part', 12 | 'marvel-comics', 13 | 'based-on-comic', 14 | 'tv-special', 15 | 'fight', 16 | 'violence') 17 | AND n.name LIKE '%Downey%Robert%' 18 | AND t.production_year > 2014 19 | AND k.id = mk.keyword_id 20 | AND t.id = mk.movie_id 21 | AND t.id = ci.movie_id 22 | AND ci.movie_id = mk.movie_id 23 | AND n.id = ci.person_id; 24 | 25 | -------------------------------------------------------------------------------- /benchmark/job/queries/6d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(k.keyword) AS movie_keyword, 2 | MIN(n.name) AS actor_name, 3 | MIN(t.title) AS hero_movie 4 | FROM cast_info AS ci, 5 | keyword AS k, 6 | movie_keyword AS mk, 7 | name AS n, 8 | title AS t 9 | WHERE k.keyword IN ('superhero', 10 | 'sequel', 11 | 'second-part', 12 | 'marvel-comics', 13 | 'based-on-comic', 14 | 'tv-special', 15 | 'fight', 16 | 'violence') 17 | AND n.name LIKE '%Downey%Robert%' 18 | AND t.production_year > 2000 19 | AND k.id = mk.keyword_id 20 | AND t.id = mk.movie_id 21 | AND t.id = ci.movie_id 22 | AND ci.movie_id = mk.movie_id 23 | AND n.id = ci.person_id; 24 | 25 | -------------------------------------------------------------------------------- /benchmark/job/queries/16c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS cool_actor_pseudonym, 2 | MIN(t.title) AS series_named_after_char 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | keyword AS k, 7 | movie_companies AS mc, 8 | movie_keyword AS mk, 9 | name AS n, 10 | title AS t 11 | WHERE cn.country_code ='[us]' 12 | AND k.keyword ='character-name-in-title' 13 | AND t.episode_nr < 100 14 | AND an.person_id = n.id 15 | AND n.id = ci.person_id 16 | AND ci.movie_id = t.id 17 | AND t.id = mk.movie_id 18 | AND mk.keyword_id = k.id 19 | AND t.id = mc.movie_id 20 | AND mc.company_id = cn.id 21 | AND an.person_id = ci.person_id 22 | AND ci.movie_id = mc.movie_id 23 | AND ci.movie_id = mk.movie_id 24 | AND mc.movie_id = mk.movie_id; 25 | 26 | -------------------------------------------------------------------------------- /benchmark/job/queries/8a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an1.name) AS actress_pseudonym, 2 | MIN(t.title) AS japanese_movie_dubbed 3 | FROM aka_name AS an1, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | movie_companies AS mc, 7 | name AS n1, 8 | role_type AS rt, 9 | title AS t 10 | WHERE ci.note ='(voice: English version)' 11 | AND cn.country_code ='[jp]' 12 | AND mc.note LIKE '%(Japan)%' 13 | AND mc.note NOT LIKE '%(USA)%' 14 | AND n1.name LIKE '%Yo%' 15 | AND n1.name NOT LIKE '%Yu%' 16 | AND rt.role ='actress' 17 | AND an1.person_id = n1.id 18 | AND n1.id = ci.person_id 19 | AND ci.movie_id = t.id 20 | AND t.id = mc.movie_id 21 | AND mc.company_id = cn.id 22 | AND ci.role_id = rt.id 23 | AND an1.person_id = ci.person_id 24 | AND ci.movie_id = mc.movie_id; 25 | 26 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/20.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | s_name, 6 | s_address 7 | from 8 | supplier, 9 | nation 10 | where 11 | s_suppkey in ( 12 | select 13 | ps_suppkey 14 | from 15 | partsupp 16 | where 17 | ps_partkey in ( 18 | select 19 | p_partkey 20 | from 21 | part 22 | where 23 | p_name like 'green%' 24 | ) 25 | and ps_availqty > ( 26 | select 27 | 0.5 * sum(l_quantity) 28 | from 29 | lineitem 30 | where 31 | l_partkey = ps_partkey 32 | and l_suppkey = ps_suppkey 33 | and l_shipdate >= '1993-01-01' 34 | and l_shipdate < date_add('1993-01-01', interval '1' year) 35 | ) 36 | ) 37 | and s_nationkey = n_nationkey 38 | and n_name = 'ALGERIA' 39 | order by 40 | s_name; 41 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_7.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query7.tpl 2 | select i_item_id, 3 | avg(ss_quantity) agg1, 4 | avg(ss_list_price) agg2, 5 | avg(ss_coupon_amt) agg3, 6 | avg(ss_sales_price) agg4 7 | from store_sales, customer_demographics, date_dim, item, promotion 8 | where ss_sold_date_sk = d_date_sk and 9 | ss_item_sk = i_item_sk and 10 | ss_cdemo_sk = cd_demo_sk and 11 | ss_promo_sk = p_promo_sk and 12 | cd_gender = 'F' and 13 | cd_marital_status = 'W' and 14 | cd_education_status = 'Primary' and 15 | (p_channel_email = 'N' or p_channel_event = 'N') and 16 | d_year = 1998 17 | group by i_item_id 18 | order by i_item_id 19 | limit 100; 20 | 21 | -- end query 1 in stream 0 using template query7.tpl 22 | -------------------------------------------------------------------------------- /benchmark/job/queries/16a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS cool_actor_pseudonym, 2 | MIN(t.title) AS series_named_after_char 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | keyword AS k, 7 | movie_companies AS mc, 8 | movie_keyword AS mk, 9 | name AS n, 10 | title AS t 11 | WHERE cn.country_code ='[us]' 12 | AND k.keyword ='character-name-in-title' 13 | AND t.episode_nr >= 50 14 | AND t.episode_nr < 100 15 | AND an.person_id = n.id 16 | AND n.id = ci.person_id 17 | AND ci.movie_id = t.id 18 | AND t.id = mk.movie_id 19 | AND mk.keyword_id = k.id 20 | AND t.id = mc.movie_id 21 | AND mc.company_id = cn.id 22 | AND an.person_id = ci.person_id 23 | AND ci.movie_id = mc.movie_id 24 | AND ci.movie_id = mk.movie_id 25 | AND mc.movie_id = mk.movie_id; 26 | 27 | -------------------------------------------------------------------------------- /benchmark/job/queries/16d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS cool_actor_pseudonym, 2 | MIN(t.title) AS series_named_after_char 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | keyword AS k, 7 | movie_companies AS mc, 8 | movie_keyword AS mk, 9 | name AS n, 10 | title AS t 11 | WHERE cn.country_code ='[us]' 12 | AND k.keyword ='character-name-in-title' 13 | AND t.episode_nr >= 5 14 | AND t.episode_nr < 100 15 | AND an.person_id = n.id 16 | AND n.id = ci.person_id 17 | AND ci.movie_id = t.id 18 | AND t.id = mk.movie_id 19 | AND mk.keyword_id = k.id 20 | AND t.id = mc.movie_id 21 | AND mc.company_id = cn.id 22 | AND an.person_id = ci.person_id 23 | AND ci.movie_id = mc.movie_id 24 | AND ci.movie_id = mk.movie_id 25 | AND mc.movie_id = mk.movie_id; 26 | 27 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_26.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query26.tpl 2 | select i_item_id, 3 | avg(cs_quantity) agg1, 4 | avg(cs_list_price) agg2, 5 | avg(cs_coupon_amt) agg3, 6 | avg(cs_sales_price) agg4 7 | from catalog_sales, customer_demographics, date_dim, item, promotion 8 | where cs_sold_date_sk = d_date_sk and 9 | cs_item_sk = i_item_sk and 10 | cs_bill_cdemo_sk = cd_demo_sk and 11 | cs_promo_sk = p_promo_sk and 12 | cd_gender = 'F' and 13 | cd_marital_status = 'W' and 14 | cd_education_status = 'Primary' and 15 | (p_channel_email = 'N' or p_channel_event = 'N') and 16 | d_year = 1998 17 | group by i_item_id 18 | order by i_item_id 19 | limit 100; 20 | 21 | -- end query 1 in stream 0 using template query26.tpl 22 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_1.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query1.tpl 2 | with customer_total_return as 3 | (select sr_customer_sk as ctr_customer_sk 4 | ,sr_store_sk as ctr_store_sk 5 | ,sum(SR_FEE) as ctr_total_return 6 | from store_returns 7 | ,date_dim 8 | where sr_returned_date_sk = d_date_sk 9 | and d_year =2000 10 | group by sr_customer_sk 11 | ,sr_store_sk) 12 | select c_customer_id 13 | from customer_total_return ctr1 14 | ,store 15 | ,customer 16 | where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2 17 | from customer_total_return ctr2 18 | where ctr1.ctr_store_sk = ctr2.ctr_store_sk) 19 | and s_store_sk = ctr1.ctr_store_sk 20 | and s_state = 'SD' 21 | and ctr1.ctr_customer_sk = c_customer_sk 22 | order by c_customer_id 23 | limit 100; 24 | 25 | -- end query 1 in stream 0 using template query1.tpl 26 | -------------------------------------------------------------------------------- /benchmark/job/queries/18a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS movie_budget, 2 | MIN(mi_idx.info) AS movie_votes, 3 | MIN(t.title) AS movie_title 4 | FROM cast_info AS ci, 5 | info_type AS it1, 6 | info_type AS it2, 7 | movie_info AS mi, 8 | movie_info_idx AS mi_idx, 9 | name AS n, 10 | title AS t 11 | WHERE ci.note IN ('(producer)', 12 | '(executive producer)') 13 | AND it1.info = 'budget' 14 | AND it2.info = 'votes' 15 | AND n.gender = 'm' 16 | AND n.name LIKE '%Tim%' 17 | AND t.id = mi.movie_id 18 | AND t.id = mi_idx.movie_id 19 | AND t.id = ci.movie_id 20 | AND ci.movie_id = mi.movie_id 21 | AND ci.movie_id = mi_idx.movie_id 22 | AND mi.movie_id = mi_idx.movie_id 23 | AND n.id = ci.person_id 24 | AND it1.id = mi.info_type_id 25 | AND it2.id = mi_idx.info_type_id; 26 | 27 | -------------------------------------------------------------------------------- /benchmark/job/queries/5c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS american_movie 2 | FROM company_type AS ct, 3 | info_type AS it, 4 | movie_companies AS mc, 5 | movie_info AS mi, 6 | title AS t 7 | WHERE ct.kind = 'production companies' 8 | AND mc.note NOT LIKE '%(TV)%' 9 | AND mc.note LIKE '%(USA)%' 10 | AND mi.info IN ('Sweden', 11 | 'Norway', 12 | 'Germany', 13 | 'Denmark', 14 | 'Swedish', 15 | 'Denish', 16 | 'Norwegian', 17 | 'German', 18 | 'USA', 19 | 'American') 20 | AND t.production_year > 1990 21 | AND t.id = mi.movie_id 22 | AND t.id = mc.movie_id 23 | AND mc.movie_id = mi.movie_id 24 | AND ct.id = mc.company_type_id 25 | AND it.id = mi.info_type_id; 26 | 27 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/22.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | cntrycode, 6 | count(*) as numcust, 7 | sum(c_acctbal) as totacctbal 8 | from 9 | ( 10 | select 11 | substring(c_phone from 1 for 2) as cntrycode, 12 | c_acctbal 13 | from 14 | customer 15 | where 16 | substring(c_phone from 1 for 2) in 17 | ('20', '40', '22', '30', '39', '42', '21') 18 | and c_acctbal > ( 19 | select 20 | avg(c_acctbal) 21 | from 22 | customer 23 | where 24 | c_acctbal > 0.00 25 | and substring(c_phone from 1 for 2) in 26 | ('20', '40', '22', '30', '39', '42', '21') 27 | ) 28 | and not exists ( 29 | select 30 | * 31 | from 32 | orders 33 | where 34 | o_custkey = c_custkey 35 | ) 36 | ) as custsale 37 | group by 38 | cntrycode 39 | order by 40 | cntrycode; 41 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_86.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query86.tpl 2 | select 3 | sum(ws_net_paid) as total_sum 4 | ,i_category 5 | ,i_class 6 | ,grouping(i_category)+grouping(i_class) as lochierarchy 7 | ,rank() over ( 8 | partition by grouping(i_category)+grouping(i_class), 9 | case when grouping(i_class) = 0 then i_category end 10 | order by sum(ws_net_paid) desc) as rank_within_parent 11 | from 12 | web_sales 13 | ,date_dim d1 14 | ,item 15 | where 16 | d1.d_month_seq between 1212 and 1212+11 17 | and d1.d_date_sk = ws_sold_date_sk 18 | and i_item_sk = ws_item_sk 19 | group by rollup(i_category,i_class) 20 | order by 21 | lochierarchy desc, 22 | case when lochierarchy = 0 then i_category end, 23 | rank_within_parent 24 | limit 100; 25 | 26 | -- end query 1 in stream 0 using template query86.tpl 27 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_19.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query19.tpl 2 | select i_brand_id brand_id, i_brand brand, i_manufact_id, i_manufact, 3 | sum(ss_ext_sales_price) ext_price 4 | from date_dim, store_sales, item,customer,customer_address,store 5 | where d_date_sk = ss_sold_date_sk 6 | and ss_item_sk = i_item_sk 7 | and i_manager_id=7 8 | and d_moy=11 9 | and d_year=1999 10 | and ss_customer_sk = c_customer_sk 11 | and c_current_addr_sk = ca_address_sk 12 | and substr(ca_zip,1,5) <> substr(s_zip,1,5) 13 | and ss_store_sk = s_store_sk 14 | group by i_brand 15 | ,i_brand_id 16 | ,i_manufact_id 17 | ,i_manufact 18 | order by ext_price desc 19 | ,i_brand 20 | ,i_brand_id 21 | ,i_manufact_id 22 | ,i_manufact 23 | limit 100 ; 24 | 25 | -- end query 1 in stream 0 using template query19.tpl 26 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/21.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | s_name, 6 | count(*) as numwait 7 | from 8 | supplier, 9 | lineitem l1, 10 | orders, 11 | nation 12 | where 13 | s_suppkey = l1.l_suppkey 14 | and o_orderkey = l1.l_orderkey 15 | and o_orderstatus = 'F' 16 | and l1.l_receiptdate > l1.l_commitdate 17 | and exists ( 18 | select 19 | * 20 | from 21 | lineitem l2 22 | where 23 | l2.l_orderkey = l1.l_orderkey 24 | and l2.l_suppkey <> l1.l_suppkey 25 | ) 26 | and not exists ( 27 | select 28 | * 29 | from 30 | lineitem l3 31 | where 32 | l3.l_orderkey = l1.l_orderkey 33 | and l3.l_suppkey <> l1.l_suppkey 34 | and l3.l_receiptdate > l3.l_commitdate 35 | ) 36 | and s_nationkey = n_nationkey 37 | and n_name = 'EGYPT' 38 | group by 39 | s_name 40 | order by 41 | numwait desc, 42 | s_name 43 | limit 100; 44 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_45.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query45.tpl 2 | select ca_zip, ca_county, sum(ws_sales_price) 3 | from web_sales, customer, customer_address, date_dim, item 4 | where ws_bill_customer_sk = c_customer_sk 5 | and c_current_addr_sk = ca_address_sk 6 | and ws_item_sk = i_item_sk 7 | and ( substr(ca_zip,1,5) in ('85669', '86197','88274','83405','86475', '85392', '85460', '80348', '81792') 8 | or 9 | i_item_id in (select i_item_id 10 | from item 11 | where i_item_sk in (2, 3, 5, 7, 11, 13, 17, 19, 23, 29) 12 | ) 13 | ) 14 | and ws_sold_date_sk = d_date_sk 15 | and d_qoy = 2 and d_year = 2000 16 | group by ca_zip, ca_county 17 | order by ca_zip, ca_county 18 | limit 100; 19 | 20 | -- end query 1 in stream 0 using template query45.tpl 21 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_6.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query6.tpl 2 | select a.ca_state state, count(*) cnt 3 | from customer_address a 4 | ,customer c 5 | ,store_sales s 6 | ,date_dim d 7 | ,item i 8 | where a.ca_address_sk = c.c_current_addr_sk 9 | and c.c_customer_sk = s.ss_customer_sk 10 | and s.ss_sold_date_sk = d.d_date_sk 11 | and s.ss_item_sk = i.i_item_sk 12 | and d.d_month_seq = 13 | (select distinct (d_month_seq) 14 | from date_dim 15 | where d_year = 2000 16 | and d_moy = 2 ) 17 | and i.i_current_price > 1.2 * 18 | (select avg(j.i_current_price) 19 | from item j 20 | where j.i_category = i.i_category) 21 | group by a.ca_state 22 | having count(*) >= 10 23 | order by cnt, a.ca_state 24 | limit 100; 25 | 26 | -- end query 1 in stream 0 using template query6.tpl 27 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_27.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query27.tpl 2 | select i_item_id, 3 | s_state, grouping(s_state) g_state, 4 | avg(ss_quantity) agg1, 5 | avg(ss_list_price) agg2, 6 | avg(ss_coupon_amt) agg3, 7 | avg(ss_sales_price) agg4 8 | from store_sales, customer_demographics, date_dim, store, item 9 | where ss_sold_date_sk = d_date_sk and 10 | ss_item_sk = i_item_sk and 11 | ss_store_sk = s_store_sk and 12 | ss_cdemo_sk = cd_demo_sk and 13 | cd_gender = 'M' and 14 | cd_marital_status = 'M' and 15 | cd_education_status = '4 yr Degree' and 16 | d_year = 2002 and 17 | s_state in ('SD','TN', 'AL', 'TN', 'SD', 'SD') 18 | group by rollup (i_item_id, s_state) 19 | order by i_item_id 20 | ,s_state 21 | limit 100; 22 | 23 | -- end query 1 in stream 0 using template query27.tpl 24 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_32.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query32.tpl 2 | select sum(cs_ext_discount_amt) as "excess discount amount" 3 | from 4 | catalog_sales 5 | ,item 6 | ,date_dim 7 | where 8 | i_manufact_id = 269 9 | and i_item_sk = cs_item_sk 10 | and d_date between '1998-03-18' and 11 | (cast('1998-03-18' as date) + 90 days) 12 | and d_date_sk = cs_sold_date_sk 13 | and cs_ext_discount_amt 14 | > ( 15 | select 16 | 1.3 * avg(cs_ext_discount_amt) 17 | from 18 | catalog_sales 19 | ,date_dim 20 | where 21 | cs_item_sk = i_item_sk 22 | and d_date between '1998-03-18' and 23 | (cast('1998-03-18' as date) + 90 days) 24 | and d_date_sk = cs_sold_date_sk 25 | ) 26 | limit 100; 27 | 28 | -- end query 1 in stream 0 using template query32.tpl 29 | -------------------------------------------------------------------------------- /pkg/loader/loader.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package loader 15 | 16 | import "github.com/pingcap/parser/ast" 17 | 18 | type QueryLoader interface { 19 | Next() (queryID string, queryStmt ast.StmtNode) 20 | } 21 | 22 | // NoopLoader does nothing 23 | type NoopLoader struct{} 24 | 25 | func (n NoopLoader) Next() (queryID string, queryStmt ast.StmtNode) { 26 | return "", nil 27 | } 28 | -------------------------------------------------------------------------------- /benchmark/job/queries/7b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS of_person, 2 | MIN(t.title) AS biography_movie 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | info_type AS it, 6 | link_type AS lt, 7 | movie_link AS ml, 8 | name AS n, 9 | person_info AS pi, 10 | title AS t 11 | WHERE an.name LIKE '%a%' 12 | AND it.info ='mini biography' 13 | AND lt.link ='features' 14 | AND n.name_pcode_cf LIKE 'D%' 15 | AND n.gender='m' 16 | AND pi.note ='Volker Boehm' 17 | AND t.production_year BETWEEN 1980 AND 1984 18 | AND n.id = an.person_id 19 | AND n.id = pi.person_id 20 | AND ci.person_id = n.id 21 | AND t.id = ci.movie_id 22 | AND ml.linked_movie_id = t.id 23 | AND lt.id = ml.link_type_id 24 | AND it.id = pi.info_type_id 25 | AND pi.person_id = an.person_id 26 | AND pi.person_id = ci.person_id 27 | AND an.person_id = ci.person_id 28 | AND ci.movie_id = ml.linked_movie_id; 29 | 30 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/2.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | s_acctbal, 6 | s_name, 7 | n_name, 8 | p_partkey, 9 | p_mfgr, 10 | s_address, 11 | s_phone, 12 | s_comment 13 | from 14 | part, 15 | supplier, 16 | partsupp, 17 | nation, 18 | region 19 | where 20 | p_partkey = ps_partkey 21 | and s_suppkey = ps_suppkey 22 | and p_size = 30 23 | and p_type like '%STEEL' 24 | and s_nationkey = n_nationkey 25 | and n_regionkey = r_regionkey 26 | and r_name = 'ASIA' 27 | and ps_supplycost = ( 28 | select 29 | min(ps_supplycost) 30 | from 31 | partsupp, 32 | supplier, 33 | nation, 34 | region 35 | where 36 | p_partkey = ps_partkey 37 | and s_suppkey = ps_suppkey 38 | and s_nationkey = n_nationkey 39 | and n_regionkey = r_regionkey 40 | and r_name = 'ASIA' 41 | ) 42 | order by 43 | s_acctbal desc, 44 | n_name, 45 | s_name, 46 | p_partkey 47 | limit 100; 48 | -------------------------------------------------------------------------------- /benchmark/job/queries/13d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS producing_company, 2 | MIN(miidx.info) AS rating, 3 | MIN(t.title) AS movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it, 7 | info_type AS it2, 8 | kind_type AS kt, 9 | movie_companies AS mc, 10 | movie_info AS mi, 11 | movie_info_idx AS miidx, 12 | title AS t 13 | WHERE cn.country_code ='[us]' 14 | AND ct.kind ='production companies' 15 | AND it.info ='rating' 16 | AND it2.info ='release dates' 17 | AND kt.kind ='movie' 18 | AND mi.movie_id = t.id 19 | AND it2.id = mi.info_type_id 20 | AND kt.id = t.kind_id 21 | AND mc.movie_id = t.id 22 | AND cn.id = mc.company_id 23 | AND ct.id = mc.company_type_id 24 | AND miidx.movie_id = t.id 25 | AND it.id = miidx.info_type_id 26 | AND mi.movie_id = miidx.movie_id 27 | AND mi.movie_id = mc.movie_id 28 | AND miidx.movie_id = mc.movie_id; 29 | 30 | -------------------------------------------------------------------------------- /benchmark/job/queries/13a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS release_date, 2 | MIN(miidx.info) AS rating, 3 | MIN(t.title) AS german_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it, 7 | info_type AS it2, 8 | kind_type AS kt, 9 | movie_companies AS mc, 10 | movie_info AS mi, 11 | movie_info_idx AS miidx, 12 | title AS t 13 | WHERE cn.country_code ='[de]' 14 | AND ct.kind ='production companies' 15 | AND it.info ='rating' 16 | AND it2.info ='release dates' 17 | AND kt.kind ='movie' 18 | AND mi.movie_id = t.id 19 | AND it2.id = mi.info_type_id 20 | AND kt.id = t.kind_id 21 | AND mc.movie_id = t.id 22 | AND cn.id = mc.company_id 23 | AND ct.id = mc.company_type_id 24 | AND miidx.movie_id = t.id 25 | AND it.id = miidx.info_type_id 26 | AND mi.movie_id = miidx.movie_id 27 | AND mi.movie_id = mc.movie_id 28 | AND miidx.movie_id = mc.movie_id; 29 | 30 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_92.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query92.tpl 2 | select 3 | sum(ws_ext_discount_amt) as "Excess Discount Amount" 4 | from 5 | web_sales 6 | ,item 7 | ,date_dim 8 | where 9 | i_manufact_id = 269 10 | and i_item_sk = ws_item_sk 11 | and d_date between '1998-03-18' and 12 | (cast('1998-03-18' as date) + 90 days) 13 | and d_date_sk = ws_sold_date_sk 14 | and ws_ext_discount_amt 15 | > ( 16 | SELECT 17 | 1.3 * avg(ws_ext_discount_amt) 18 | FROM 19 | web_sales 20 | ,date_dim 21 | WHERE 22 | ws_item_sk = i_item_sk 23 | and d_date between '1998-03-18' and 24 | (cast('1998-03-18' as date) + 90 days) 25 | and d_date_sk = ws_sold_date_sk 26 | ) 27 | order by sum(ws_ext_discount_amt) 28 | limit 100; 29 | 30 | -- end query 1 in stream 0 using template query92.tpl 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/9d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS alternative_name, 2 | MIN(chn.name) AS voiced_char_name, 3 | MIN(n.name) AS voicing_actress, 4 | MIN(t.title) AS american_movie 5 | FROM aka_name AS an, 6 | char_name AS chn, 7 | cast_info AS ci, 8 | company_name AS cn, 9 | movie_companies AS mc, 10 | name AS n, 11 | role_type AS rt, 12 | title AS t 13 | WHERE ci.note IN ('(voice)', 14 | '(voice: Japanese version)', 15 | '(voice) (uncredited)', 16 | '(voice: English version)') 17 | AND cn.country_code ='[us]' 18 | AND n.gender ='f' 19 | AND rt.role ='actress' 20 | AND ci.movie_id = t.id 21 | AND t.id = mc.movie_id 22 | AND ci.movie_id = mc.movie_id 23 | AND mc.company_id = cn.id 24 | AND ci.role_id = rt.id 25 | AND n.id = ci.person_id 26 | AND chn.id = ci.person_role_id 27 | AND an.person_id = n.id 28 | AND an.person_id = ci.person_id; 29 | 30 | -------------------------------------------------------------------------------- /benchmark/job/queries/15d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(at.title) AS aka_title, 2 | MIN(t.title) AS internet_movie_title 3 | FROM aka_title AS at, 4 | company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | keyword AS k, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_keyword AS mk, 11 | title AS t 12 | WHERE cn.country_code = '[us]' 13 | AND it1.info = 'release dates' 14 | AND mi.note LIKE '%internet%' 15 | AND t.production_year > 1990 16 | AND t.id = at.movie_id 17 | AND t.id = mi.movie_id 18 | AND t.id = mk.movie_id 19 | AND t.id = mc.movie_id 20 | AND mk.movie_id = mi.movie_id 21 | AND mk.movie_id = mc.movie_id 22 | AND mk.movie_id = at.movie_id 23 | AND mi.movie_id = mc.movie_id 24 | AND mi.movie_id = at.movie_id 25 | AND mc.movie_id = at.movie_id 26 | AND k.id = mk.keyword_id 27 | AND it1.id = mi.info_type_id 28 | AND cn.id = mc.company_id 29 | AND ct.id = mc.company_type_id; 30 | 31 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/8.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | o_year, 6 | sum(case 7 | when nation = 'INDIA' then volume 8 | else 0 9 | end) / sum(volume) as mkt_share 10 | from 11 | ( 12 | select 13 | extract(year from o_orderdate) as o_year, 14 | l_extendedprice * (1 - l_discount) as volume, 15 | n2.n_name as nation 16 | from 17 | part, 18 | supplier, 19 | lineitem, 20 | orders, 21 | customer, 22 | nation n1, 23 | nation n2, 24 | region 25 | where 26 | p_partkey = l_partkey 27 | and s_suppkey = l_suppkey 28 | and l_orderkey = o_orderkey 29 | and o_custkey = c_custkey 30 | and c_nationkey = n1.n_nationkey 31 | and n1.n_regionkey = r_regionkey 32 | and r_name = 'ASIA' 33 | and s_nationkey = n2.n_nationkey 34 | and o_orderdate between '1995-01-01' and '1996-12-31' 35 | and p_type = 'SMALL PLATED COPPER' 36 | ) as all_nations 37 | group by 38 | o_year 39 | order by 40 | o_year; 41 | -------------------------------------------------------------------------------- /benchmark/job/queries/11d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS from_company, 2 | MIN(mc.note) AS production_note, 3 | MIN(t.title) AS movie_based_on_book 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | keyword AS k, 7 | link_type AS lt, 8 | movie_companies AS mc, 9 | movie_keyword AS mk, 10 | movie_link AS ml, 11 | title AS t 12 | WHERE cn.country_code !='[pl]' 13 | AND ct.kind != 'production companies' 14 | AND ct.kind IS NOT NULL 15 | AND k.keyword IN ('sequel', 16 | 'revenge', 17 | 'based-on-novel') 18 | AND mc.note IS NOT NULL 19 | AND t.production_year > 1950 20 | AND lt.id = ml.link_type_id 21 | AND ml.movie_id = t.id 22 | AND t.id = mk.movie_id 23 | AND mk.keyword_id = k.id 24 | AND t.id = mc.movie_id 25 | AND mc.company_type_id = ct.id 26 | AND mc.company_id = cn.id 27 | AND ml.movie_id = mk.movie_id 28 | AND ml.movie_id = mc.movie_id 29 | AND mk.movie_id = mc.movie_id; 30 | 31 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_98.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query98.tpl 2 | select i_item_id 3 | ,i_item_desc 4 | ,i_category 5 | ,i_class 6 | ,i_current_price 7 | ,sum(ss_ext_sales_price) as itemrevenue 8 | ,sum(ss_ext_sales_price)*100/sum(sum(ss_ext_sales_price)) over 9 | (partition by i_class) as revenueratio 10 | from 11 | store_sales 12 | ,item 13 | ,date_dim 14 | where 15 | ss_item_sk = i_item_sk 16 | and i_category in ('Jewelry', 'Sports', 'Books') 17 | and ss_sold_date_sk = d_date_sk 18 | and d_date between cast('2001-01-12' as date) 19 | and (cast('2001-01-12' as date) + 30 days) 20 | group by 21 | i_item_id 22 | ,i_item_desc 23 | ,i_category 24 | ,i_class 25 | ,i_current_price 26 | order by 27 | i_category 28 | ,i_class 29 | ,i_item_id 30 | ,i_item_desc 31 | ,revenueratio; 32 | 33 | -- end query 1 in stream 0 using template query98.tpl 34 | -------------------------------------------------------------------------------- /benchmark/job/queries/11a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS from_company, 2 | MIN(lt.link) AS movie_link_type, 3 | MIN(t.title) AS non_polish_sequel_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | keyword AS k, 7 | link_type AS lt, 8 | movie_companies AS mc, 9 | movie_keyword AS mk, 10 | movie_link AS ml, 11 | title AS t 12 | WHERE cn.country_code !='[pl]' 13 | AND (cn.name LIKE '%Film%' 14 | OR cn.name LIKE '%Warner%') 15 | AND ct.kind ='production companies' 16 | AND k.keyword ='sequel' 17 | AND lt.link LIKE '%follow%' 18 | AND mc.note IS NULL 19 | AND t.production_year BETWEEN 1950 AND 2000 20 | AND lt.id = ml.link_type_id 21 | AND ml.movie_id = t.id 22 | AND t.id = mk.movie_id 23 | AND mk.keyword_id = k.id 24 | AND t.id = mc.movie_id 25 | AND mc.company_type_id = ct.id 26 | AND mc.company_id = cn.id 27 | AND ml.movie_id = mk.movie_id 28 | AND ml.movie_id = mc.movie_id 29 | AND mk.movie_id = mc.movie_id; 30 | 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/8b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS acress_pseudonym, 2 | MIN(t.title) AS japanese_anime_movie 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | company_name AS cn, 6 | movie_companies AS mc, 7 | name AS n, 8 | role_type AS rt, 9 | title AS t 10 | WHERE ci.note ='(voice: English version)' 11 | AND cn.country_code ='[jp]' 12 | AND mc.note LIKE '%(Japan)%' 13 | AND mc.note NOT LIKE '%(USA)%' 14 | AND (mc.note LIKE '%(2006)%' 15 | OR mc.note LIKE '%(2007)%') 16 | AND n.name LIKE '%Yo%' 17 | AND n.name NOT LIKE '%Yu%' 18 | AND rt.role ='actress' 19 | AND t.production_year BETWEEN 2006 AND 2007 20 | AND (t.title LIKE 'One Piece%' 21 | OR t.title LIKE 'Dragon Ball Z%') 22 | AND an.person_id = n.id 23 | AND n.id = ci.person_id 24 | AND ci.movie_id = t.id 25 | AND t.id = mc.movie_id 26 | AND mc.company_id = cn.id 27 | AND ci.role_id = rt.id 28 | AND an.person_id = ci.person_id 29 | AND ci.movie_id = mc.movie_id; 30 | 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/9c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS alternative_name, 2 | MIN(chn.name) AS voiced_character_name, 3 | MIN(n.name) AS voicing_actress, 4 | MIN(t.title) AS american_movie 5 | FROM aka_name AS an, 6 | char_name AS chn, 7 | cast_info AS ci, 8 | company_name AS cn, 9 | movie_companies AS mc, 10 | name AS n, 11 | role_type AS rt, 12 | title AS t 13 | WHERE ci.note IN ('(voice)', 14 | '(voice: Japanese version)', 15 | '(voice) (uncredited)', 16 | '(voice: English version)') 17 | AND cn.country_code ='[us]' 18 | AND n.gender ='f' 19 | AND n.name LIKE '%An%' 20 | AND rt.role ='actress' 21 | AND ci.movie_id = t.id 22 | AND t.id = mc.movie_id 23 | AND ci.movie_id = mc.movie_id 24 | AND mc.company_id = cn.id 25 | AND ci.role_id = rt.id 26 | AND n.id = ci.person_id 27 | AND chn.id = ci.person_role_id 28 | AND an.person_id = n.id 29 | AND an.person_id = ci.person_id; 30 | 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/7a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS of_person, 2 | MIN(t.title) AS biography_movie 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | info_type AS it, 6 | link_type AS lt, 7 | movie_link AS ml, 8 | name AS n, 9 | person_info AS pi, 10 | title AS t 11 | WHERE an.name LIKE '%a%' 12 | AND it.info ='mini biography' 13 | AND lt.link ='features' 14 | AND n.name_pcode_cf BETWEEN 'A' AND 'F' 15 | AND (n.gender='m' 16 | OR (n.gender = 'f' 17 | AND n.name LIKE 'B%')) 18 | AND pi.note ='Volker Boehm' 19 | AND t.production_year BETWEEN 1980 AND 1995 20 | AND n.id = an.person_id 21 | AND n.id = pi.person_id 22 | AND ci.person_id = n.id 23 | AND t.id = ci.movie_id 24 | AND ml.linked_movie_id = t.id 25 | AND lt.id = ml.link_type_id 26 | AND it.id = pi.info_type_id 27 | AND pi.person_id = an.person_id 28 | AND pi.person_id = ci.person_id 29 | AND an.person_id = ci.person_id 30 | AND ci.movie_id = ml.linked_movie_id; 31 | 32 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_12.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query12.tpl 2 | select i_item_id 3 | ,i_item_desc 4 | ,i_category 5 | ,i_class 6 | ,i_current_price 7 | ,sum(ws_ext_sales_price) as itemrevenue 8 | ,sum(ws_ext_sales_price)*100/sum(sum(ws_ext_sales_price)) over 9 | (partition by i_class) as revenueratio 10 | from 11 | web_sales 12 | ,item 13 | ,date_dim 14 | where 15 | ws_item_sk = i_item_sk 16 | and i_category in ('Jewelry', 'Sports', 'Books') 17 | and ws_sold_date_sk = d_date_sk 18 | and d_date between cast('2001-01-12' as date) 19 | and (cast('2001-01-12' as date) + 30 days) 20 | group by 21 | i_item_id 22 | ,i_item_desc 23 | ,i_category 24 | ,i_class 25 | ,i_current_price 26 | order by 27 | i_category 28 | ,i_class 29 | ,i_item_id 30 | ,i_item_desc 31 | ,revenueratio 32 | limit 100; 33 | 34 | -- end query 1 in stream 0 using template query12.tpl 35 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_20.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query20.tpl 2 | select i_item_id 3 | ,i_item_desc 4 | ,i_category 5 | ,i_class 6 | ,i_current_price 7 | ,sum(cs_ext_sales_price) as itemrevenue 8 | ,sum(cs_ext_sales_price)*100/sum(sum(cs_ext_sales_price)) over 9 | (partition by i_class) as revenueratio 10 | from catalog_sales 11 | ,item 12 | ,date_dim 13 | where cs_item_sk = i_item_sk 14 | and i_category in ('Jewelry', 'Sports', 'Books') 15 | and cs_sold_date_sk = d_date_sk 16 | and d_date between cast('2001-01-12' as date) 17 | and (cast('2001-01-12' as date) + 30 days) 18 | group by i_item_id 19 | ,i_item_desc 20 | ,i_category 21 | ,i_class 22 | ,i_current_price 23 | order by i_category 24 | ,i_class 25 | ,i_item_id 26 | ,i_item_desc 27 | ,revenueratio 28 | limit 100; 29 | 30 | -- end query 1 in stream 0 using template query20.tpl 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/11b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS from_company, 2 | MIN(lt.link) AS movie_link_type, 3 | MIN(t.title) AS sequel_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | keyword AS k, 7 | link_type AS lt, 8 | movie_companies AS mc, 9 | movie_keyword AS mk, 10 | movie_link AS ml, 11 | title AS t 12 | WHERE cn.country_code !='[pl]' 13 | AND (cn.name LIKE '%Film%' 14 | OR cn.name LIKE '%Warner%') 15 | AND ct.kind ='production companies' 16 | AND k.keyword ='sequel' 17 | AND lt.link LIKE '%follows%' 18 | AND mc.note IS NULL 19 | AND t.production_year = 1998 20 | AND t.title LIKE '%Money%' 21 | AND lt.id = ml.link_type_id 22 | AND ml.movie_id = t.id 23 | AND t.id = mk.movie_id 24 | AND mk.keyword_id = k.id 25 | AND t.id = mc.movie_id 26 | AND mc.company_type_id = ct.id 27 | AND mc.company_id = cn.id 28 | AND ml.movie_id = mk.movie_id 29 | AND ml.movie_id = mc.movie_id 30 | AND mk.movie_id = mc.movie_id; 31 | 32 | -------------------------------------------------------------------------------- /benchmark/job/queries/12b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS budget, 2 | MIN(t.title) AS unsuccsessful_movie 3 | FROM company_name AS cn, 4 | company_type AS ct, 5 | info_type AS it1, 6 | info_type AS it2, 7 | movie_companies AS mc, 8 | movie_info AS mi, 9 | movie_info_idx AS mi_idx, 10 | title AS t 11 | WHERE cn.country_code ='[us]' 12 | AND ct.kind IS NOT NULL 13 | AND (ct.kind ='production companies' 14 | OR ct.kind = 'distributors') 15 | AND it1.info ='budget' 16 | AND it2.info ='bottom 10 rank' 17 | AND t.production_year >2000 18 | AND (t.title LIKE 'Birdemic%' 19 | OR t.title LIKE '%Movie%') 20 | AND t.id = mi.movie_id 21 | AND t.id = mi_idx.movie_id 22 | AND mi.info_type_id = it1.id 23 | AND mi_idx.info_type_id = it2.id 24 | AND t.id = mc.movie_id 25 | AND ct.id = mc.company_type_id 26 | AND cn.id = mc.company_id 27 | AND mc.movie_id = mi.movie_id 28 | AND mc.movie_id = mi_idx.movie_id 29 | AND mi.movie_id = mi_idx.movie_id; 30 | 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/9b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS alternative_name, 2 | MIN(chn.name) AS voiced_character, 3 | MIN(n.name) AS voicing_actress, 4 | MIN(t.title) AS american_movie 5 | FROM aka_name AS an, 6 | char_name AS chn, 7 | cast_info AS ci, 8 | company_name AS cn, 9 | movie_companies AS mc, 10 | name AS n, 11 | role_type AS rt, 12 | title AS t 13 | WHERE ci.note = '(voice)' 14 | AND cn.country_code ='[us]' 15 | AND mc.note LIKE '%(200%)%' 16 | AND (mc.note LIKE '%(USA)%' 17 | OR mc.note LIKE '%(worldwide)%') 18 | AND n.gender ='f' 19 | AND n.name LIKE '%Angel%' 20 | AND rt.role ='actress' 21 | AND t.production_year BETWEEN 2007 AND 2010 22 | AND ci.movie_id = t.id 23 | AND t.id = mc.movie_id 24 | AND ci.movie_id = mc.movie_id 25 | AND mc.company_id = cn.id 26 | AND ci.role_id = rt.id 27 | AND n.id = ci.person_id 28 | AND chn.id = ci.person_role_id 29 | AND an.person_id = n.id 30 | AND an.person_id = ci.person_id; 31 | 32 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/7.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | supp_nation, 6 | cust_nation, 7 | l_year, 8 | sum(volume) as revenue 9 | from 10 | ( 11 | select 12 | n1.n_name as supp_nation, 13 | n2.n_name as cust_nation, 14 | extract(year from l_shipdate) as l_year, 15 | l_extendedprice * (1 - l_discount) as volume 16 | from 17 | supplier, 18 | lineitem, 19 | orders, 20 | customer, 21 | nation n1, 22 | nation n2 23 | where 24 | s_suppkey = l_suppkey 25 | and o_orderkey = l_orderkey 26 | and c_custkey = o_custkey 27 | and s_nationkey = n1.n_nationkey 28 | and c_nationkey = n2.n_nationkey 29 | and ( 30 | (n1.n_name = 'JAPAN' and n2.n_name = 'INDIA') 31 | or (n1.n_name = 'INDIA' and n2.n_name = 'JAPAN') 32 | ) 33 | and l_shipdate between '1995-01-01' and '1996-12-31' 34 | ) as shipping 35 | group by 36 | supp_nation, 37 | cust_nation, 38 | l_year 39 | order by 40 | supp_nation, 41 | cust_nation, 42 | l_year; 43 | -------------------------------------------------------------------------------- /benchmark/job/queries/12a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS movie_company, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS drama_horror_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | info_type AS it2, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_info_idx AS mi_idx, 11 | title AS t 12 | WHERE cn.country_code = '[us]' 13 | AND ct.kind = 'production companies' 14 | AND it1.info = 'genres' 15 | AND it2.info = 'rating' 16 | AND mi.info IN ('Drama', 17 | 'Horror') 18 | AND mi_idx.info > '8.0' 19 | AND t.production_year BETWEEN 2005 AND 2008 20 | AND t.id = mi.movie_id 21 | AND t.id = mi_idx.movie_id 22 | AND mi.info_type_id = it1.id 23 | AND mi_idx.info_type_id = it2.id 24 | AND t.id = mc.movie_id 25 | AND ct.id = mc.company_type_id 26 | AND cn.id = mc.company_id 27 | AND mc.movie_id = mi.movie_id 28 | AND mc.movie_id = mi_idx.movie_id 29 | AND mi.movie_id = mi_idx.movie_id; 30 | 31 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_36.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query36.tpl 2 | select 3 | sum(ss_net_profit)/sum(ss_ext_sales_price) as gross_margin 4 | ,i_category 5 | ,i_class 6 | ,grouping(i_category)+grouping(i_class) as lochierarchy 7 | ,rank() over ( 8 | partition by grouping(i_category)+grouping(i_class), 9 | case when grouping(i_class) = 0 then i_category end 10 | order by sum(ss_net_profit)/sum(ss_ext_sales_price) asc) as rank_within_parent 11 | from 12 | store_sales 13 | ,date_dim d1 14 | ,item 15 | ,store 16 | where 17 | d1.d_year = 1999 18 | and d1.d_date_sk = ss_sold_date_sk 19 | and i_item_sk = ss_item_sk 20 | and s_store_sk = ss_store_sk 21 | and s_state in ('SD','TN','AL','SD', 22 | 'SD','SD','SD','SD') 23 | group by rollup(i_category,i_class) 24 | order by 25 | lochierarchy desc 26 | ,case when lochierarchy = 0 then i_category end 27 | ,rank_within_parent 28 | limit 100; 29 | 30 | -- end query 1 in stream 0 using template query36.tpl 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/13b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS producing_company, 2 | MIN(miidx.info) AS rating, 3 | MIN(t.title) AS movie_about_winning 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it, 7 | info_type AS it2, 8 | kind_type AS kt, 9 | movie_companies AS mc, 10 | movie_info AS mi, 11 | movie_info_idx AS miidx, 12 | title AS t 13 | WHERE cn.country_code ='[us]' 14 | AND ct.kind ='production companies' 15 | AND it.info ='rating' 16 | AND it2.info ='release dates' 17 | AND kt.kind ='movie' 18 | AND t.title != '' 19 | AND (t.title LIKE '%Champion%' 20 | OR t.title LIKE '%Loser%') 21 | AND mi.movie_id = t.id 22 | AND it2.id = mi.info_type_id 23 | AND kt.id = t.kind_id 24 | AND mc.movie_id = t.id 25 | AND cn.id = mc.company_id 26 | AND ct.id = mc.company_type_id 27 | AND miidx.movie_id = t.id 28 | AND it.id = miidx.info_type_id 29 | AND mi.movie_id = miidx.movie_id 30 | AND mi.movie_id = mc.movie_id 31 | AND miidx.movie_id = mc.movie_id; 32 | 33 | -------------------------------------------------------------------------------- /benchmark/job/queries/13c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS producing_company, 2 | MIN(miidx.info) AS rating, 3 | MIN(t.title) AS movie_about_winning 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it, 7 | info_type AS it2, 8 | kind_type AS kt, 9 | movie_companies AS mc, 10 | movie_info AS mi, 11 | movie_info_idx AS miidx, 12 | title AS t 13 | WHERE cn.country_code ='[us]' 14 | AND ct.kind ='production companies' 15 | AND it.info ='rating' 16 | AND it2.info ='release dates' 17 | AND kt.kind ='movie' 18 | AND t.title != '' 19 | AND (t.title LIKE 'Champion%' 20 | OR t.title LIKE 'Loser%') 21 | AND mi.movie_id = t.id 22 | AND it2.id = mi.info_type_id 23 | AND kt.id = t.kind_id 24 | AND mc.movie_id = t.id 25 | AND cn.id = mc.company_id 26 | AND ct.id = mc.company_type_id 27 | AND miidx.movie_id = t.id 28 | AND it.id = miidx.info_type_id 29 | AND mi.movie_id = miidx.movie_id 30 | AND mi.movie_id = mc.movie_id 31 | AND miidx.movie_id = mc.movie_id; 32 | 33 | -------------------------------------------------------------------------------- /benchmark/job/queries/12c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS movie_company, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS mainstream_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | info_type AS it2, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_info_idx AS mi_idx, 11 | title AS t 12 | WHERE cn.country_code = '[us]' 13 | AND ct.kind = 'production companies' 14 | AND it1.info = 'genres' 15 | AND it2.info = 'rating' 16 | AND mi.info IN ('Drama', 17 | 'Horror', 18 | 'Western', 19 | 'Family') 20 | AND mi_idx.info > '7.0' 21 | AND t.production_year BETWEEN 2000 AND 2010 22 | AND t.id = mi.movie_id 23 | AND t.id = mi_idx.movie_id 24 | AND mi.info_type_id = it1.id 25 | AND mi_idx.info_type_id = it2.id 26 | AND t.id = mc.movie_id 27 | AND ct.id = mc.company_type_id 28 | AND cn.id = mc.company_id 29 | AND mc.movie_id = mi.movie_id 30 | AND mc.movie_id = mi_idx.movie_id 31 | AND mi.movie_id = mi_idx.movie_id; 32 | 33 | -------------------------------------------------------------------------------- /benchmark/job/queries/15a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS release_date, 2 | MIN(t.title) AS internet_movie 3 | FROM aka_title AS at, 4 | company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | keyword AS k, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_keyword AS mk, 11 | title AS t 12 | WHERE cn.country_code = '[us]' 13 | AND it1.info = 'release dates' 14 | AND mc.note LIKE '%(200%)%' 15 | AND mc.note LIKE '%(worldwide)%' 16 | AND mi.note LIKE '%internet%' 17 | AND mi.info LIKE 'USA:% 200%' 18 | AND t.production_year > 2000 19 | AND t.id = at.movie_id 20 | AND t.id = mi.movie_id 21 | AND t.id = mk.movie_id 22 | AND t.id = mc.movie_id 23 | AND mk.movie_id = mi.movie_id 24 | AND mk.movie_id = mc.movie_id 25 | AND mk.movie_id = at.movie_id 26 | AND mi.movie_id = mc.movie_id 27 | AND mi.movie_id = at.movie_id 28 | AND mc.movie_id = at.movie_id 29 | AND k.id = mk.keyword_id 30 | AND it1.id = mi.info_type_id 31 | AND cn.id = mc.company_id 32 | AND ct.id = mc.company_type_id; 33 | 34 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_94.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query94.tpl 2 | select 3 | count(distinct ws_order_number) as "order count" 4 | ,sum(ws_ext_ship_cost) as "total shipping cost" 5 | ,sum(ws_net_profit) as "total net profit" 6 | from 7 | web_sales ws1 8 | ,date_dim 9 | ,customer_address 10 | ,web_site 11 | where 12 | d_date between '1999-5-01' and 13 | (cast('1999-5-01' as date) + 60 days) 14 | and ws1.ws_ship_date_sk = d_date_sk 15 | and ws1.ws_ship_addr_sk = ca_address_sk 16 | and ca_state = 'TX' 17 | and ws1.ws_web_site_sk = web_site_sk 18 | and web_company_name = 'pri' 19 | and exists (select * 20 | from web_sales ws2 21 | where ws1.ws_order_number = ws2.ws_order_number 22 | and ws1.ws_warehouse_sk <> ws2.ws_warehouse_sk) 23 | and not exists(select * 24 | from web_returns wr1 25 | where ws1.ws_order_number = wr1.wr_order_number) 26 | order by count(distinct ws_order_number) 27 | limit 100; 28 | 29 | -- end query 1 in stream 0 using template query94.tpl 30 | -------------------------------------------------------------------------------- /benchmark/job/queries/11c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS from_company, 2 | MIN(mc.note) AS production_note, 3 | MIN(t.title) AS movie_based_on_book 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | keyword AS k, 7 | link_type AS lt, 8 | movie_companies AS mc, 9 | movie_keyword AS mk, 10 | movie_link AS ml, 11 | title AS t 12 | WHERE cn.country_code !='[pl]' 13 | AND (cn.name LIKE '20th Century Fox%' 14 | OR cn.name LIKE 'Twentieth Century Fox%') 15 | AND ct.kind != 'production companies' 16 | AND ct.kind IS NOT NULL 17 | AND k.keyword IN ('sequel', 18 | 'revenge', 19 | 'based-on-novel') 20 | AND mc.note IS NOT NULL 21 | AND t.production_year > 1950 22 | AND lt.id = ml.link_type_id 23 | AND ml.movie_id = t.id 24 | AND t.id = mk.movie_id 25 | AND mk.keyword_id = k.id 26 | AND t.id = mc.movie_id 27 | AND mc.company_type_id = ct.id 28 | AND mc.company_id = cn.id 29 | AND ml.movie_id = mk.movie_id 30 | AND ml.movie_id = mc.movie_id 31 | AND mk.movie_id = mc.movie_id; 32 | 33 | -------------------------------------------------------------------------------- /benchmark/job/queries/15c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS release_date, 2 | MIN(t.title) AS modern_american_internet_movie 3 | FROM aka_title AS at, 4 | company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | keyword AS k, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_keyword AS mk, 11 | title AS t 12 | WHERE cn.country_code = '[us]' 13 | AND it1.info = 'release dates' 14 | AND mi.note LIKE '%internet%' 15 | AND mi.info IS NOT NULL 16 | AND (mi.info LIKE 'USA:% 199%' 17 | OR mi.info LIKE 'USA:% 200%') 18 | AND t.production_year > 1990 19 | AND t.id = at.movie_id 20 | AND t.id = mi.movie_id 21 | AND t.id = mk.movie_id 22 | AND t.id = mc.movie_id 23 | AND mk.movie_id = mi.movie_id 24 | AND mk.movie_id = mc.movie_id 25 | AND mk.movie_id = at.movie_id 26 | AND mi.movie_id = mc.movie_id 27 | AND mi.movie_id = at.movie_id 28 | AND mc.movie_id = at.movie_id 29 | AND k.id = mk.keyword_id 30 | AND it1.id = mi.info_type_id 31 | AND cn.id = mc.company_id 32 | AND ct.id = mc.company_type_id; 33 | 34 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_65.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query65.tpl 2 | select 3 | s_store_name, 4 | i_item_desc, 5 | sc.revenue, 6 | i_current_price, 7 | i_wholesale_cost, 8 | i_brand 9 | from store, item, 10 | (select ss_store_sk, avg(revenue) as ave 11 | from 12 | (select ss_store_sk, ss_item_sk, 13 | sum(ss_sales_price) as revenue 14 | from store_sales, date_dim 15 | where ss_sold_date_sk = d_date_sk and d_month_seq between 1212 and 1212+11 16 | group by ss_store_sk, ss_item_sk) sa 17 | group by ss_store_sk) sb, 18 | (select ss_store_sk, ss_item_sk, sum(ss_sales_price) as revenue 19 | from store_sales, date_dim 20 | where ss_sold_date_sk = d_date_sk and d_month_seq between 1212 and 1212+11 21 | group by ss_store_sk, ss_item_sk) sc 22 | where sb.ss_store_sk = sc.ss_store_sk and 23 | sc.revenue <= 0.1 * sb.ave and 24 | s_store_sk = sc.ss_store_sk and 25 | i_item_sk = sc.ss_item_sk 26 | order by s_store_name, i_item_desc 27 | limit 100; 28 | 29 | -- end query 1 in stream 0 using template query65.tpl 30 | -------------------------------------------------------------------------------- /benchmark/job/queries/9a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(an.name) AS alternative_name, 2 | MIN(chn.name) AS character_name, 3 | MIN(t.title) AS movie 4 | FROM aka_name AS an, 5 | char_name AS chn, 6 | cast_info AS ci, 7 | company_name AS cn, 8 | movie_companies AS mc, 9 | name AS n, 10 | role_type AS rt, 11 | title AS t 12 | WHERE ci.note IN ('(voice)', 13 | '(voice: Japanese version)', 14 | '(voice) (uncredited)', 15 | '(voice: English version)') 16 | AND cn.country_code ='[us]' 17 | AND mc.note IS NOT NULL 18 | AND (mc.note LIKE '%(USA)%' 19 | OR mc.note LIKE '%(worldwide)%') 20 | AND n.gender ='f' 21 | AND n.name LIKE '%Ang%' 22 | AND rt.role ='actress' 23 | AND t.production_year BETWEEN 2005 AND 2015 24 | AND ci.movie_id = t.id 25 | AND t.id = mc.movie_id 26 | AND ci.movie_id = mc.movie_id 27 | AND mc.company_id = cn.id 28 | AND ci.role_id = rt.id 29 | AND n.id = ci.person_id 30 | AND chn.id = ci.person_role_id 31 | AND an.person_id = n.id 32 | AND an.person_id = ci.person_id; 33 | 34 | -------------------------------------------------------------------------------- /benchmark/job/queries/18c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS movie_budget, 2 | MIN(mi_idx.info) AS movie_votes, 3 | MIN(t.title) AS movie_title 4 | FROM cast_info AS ci, 5 | info_type AS it1, 6 | info_type AS it2, 7 | movie_info AS mi, 8 | movie_info_idx AS mi_idx, 9 | name AS n, 10 | title AS t 11 | WHERE ci.note IN ('(writer)', 12 | '(head writer)', 13 | '(written by)', 14 | '(story)', 15 | '(story editor)') 16 | AND it1.info = 'genres' 17 | AND it2.info = 'votes' 18 | AND mi.info IN ('Horror', 19 | 'Action', 20 | 'Sci-Fi', 21 | 'Thriller', 22 | 'Crime', 23 | 'War') 24 | AND n.gender = 'm' 25 | AND t.id = mi.movie_id 26 | AND t.id = mi_idx.movie_id 27 | AND t.id = ci.movie_id 28 | AND ci.movie_id = mi.movie_id 29 | AND ci.movie_id = mi_idx.movie_id 30 | AND mi.movie_id = mi_idx.movie_id 31 | AND n.id = ci.person_id 32 | AND it1.id = mi.info_type_id 33 | AND it2.id = mi_idx.info_type_id; 34 | 35 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_40.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query40.tpl 2 | select 3 | w_state 4 | ,i_item_id 5 | ,sum(case when (cast(d_date as date) < cast ('1998-04-08' as date)) 6 | then cs_sales_price - coalesce(cr_refunded_cash,0) else 0 end) as sales_before 7 | ,sum(case when (cast(d_date as date) >= cast ('1998-04-08' as date)) 8 | then cs_sales_price - coalesce(cr_refunded_cash,0) else 0 end) as sales_after 9 | from 10 | catalog_sales left outer join catalog_returns on 11 | (cs_order_number = cr_order_number 12 | and cs_item_sk = cr_item_sk) 13 | ,warehouse 14 | ,item 15 | ,date_dim 16 | where 17 | i_current_price between 0.99 and 1.49 18 | and i_item_sk = cs_item_sk 19 | and cs_warehouse_sk = w_warehouse_sk 20 | and cs_sold_date_sk = d_date_sk 21 | and d_date between (cast ('1998-04-08' as date) - 30 days) 22 | and (cast ('1998-04-08' as date) + 30 days) 23 | group by 24 | w_state,i_item_id 25 | order by w_state,i_item_id 26 | limit 100; 27 | 28 | -- end query 1 in stream 0 using template query40.tpl 29 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_38.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query38.tpl 2 | select count(*) from ( 3 | select distinct c_last_name, c_first_name, d_date 4 | from store_sales, date_dim, customer 5 | where store_sales.ss_sold_date_sk = date_dim.d_date_sk 6 | and store_sales.ss_customer_sk = customer.c_customer_sk 7 | and d_month_seq between 1212 and 1212 + 11 8 | intersect 9 | select distinct c_last_name, c_first_name, d_date 10 | from catalog_sales, date_dim, customer 11 | where catalog_sales.cs_sold_date_sk = date_dim.d_date_sk 12 | and catalog_sales.cs_bill_customer_sk = customer.c_customer_sk 13 | and d_month_seq between 1212 and 1212 + 11 14 | intersect 15 | select distinct c_last_name, c_first_name, d_date 16 | from web_sales, date_dim, customer 17 | where web_sales.ws_sold_date_sk = date_dim.d_date_sk 18 | and web_sales.ws_bill_customer_sk = customer.c_customer_sk 19 | and d_month_seq between 1212 and 1212 + 11 20 | ) hot_cust 21 | limit 100; 22 | 23 | -- end query 1 in stream 0 using template query38.tpl 24 | -------------------------------------------------------------------------------- /benchmark/job/queries/15b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS release_date, 2 | MIN(t.title) AS youtube_movie 3 | FROM aka_title AS at, 4 | company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | keyword AS k, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_keyword AS mk, 11 | title AS t 12 | WHERE cn.country_code = '[us]' 13 | AND cn.name = 'YouTube' 14 | AND it1.info = 'release dates' 15 | AND mc.note LIKE '%(200%)%' 16 | AND mc.note LIKE '%(worldwide)%' 17 | AND mi.note LIKE '%internet%' 18 | AND mi.info LIKE 'USA:% 200%' 19 | AND t.production_year BETWEEN 2005 AND 2010 20 | AND t.id = at.movie_id 21 | AND t.id = mi.movie_id 22 | AND t.id = mk.movie_id 23 | AND t.id = mc.movie_id 24 | AND mk.movie_id = mi.movie_id 25 | AND mk.movie_id = mc.movie_id 26 | AND mk.movie_id = at.movie_id 27 | AND mi.movie_id = mc.movie_id 28 | AND mi.movie_id = at.movie_id 29 | AND mc.movie_id = at.movie_id 30 | AND k.id = mk.keyword_id 31 | AND it1.id = mi.info_type_id 32 | AND cn.id = mc.company_id 33 | AND ct.id = mc.company_type_id; 34 | 35 | -------------------------------------------------------------------------------- /benchmark/job/queries/18b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS movie_budget, 2 | MIN(mi_idx.info) AS movie_votes, 3 | MIN(t.title) AS movie_title 4 | FROM cast_info AS ci, 5 | info_type AS it1, 6 | info_type AS it2, 7 | movie_info AS mi, 8 | movie_info_idx AS mi_idx, 9 | name AS n, 10 | title AS t 11 | WHERE ci.note IN ('(writer)', 12 | '(head writer)', 13 | '(written by)', 14 | '(story)', 15 | '(story editor)') 16 | AND it1.info = 'genres' 17 | AND it2.info = 'rating' 18 | AND mi.info IN ('Horror', 19 | 'Thriller') 20 | AND mi.note IS NULL 21 | AND mi_idx.info > '8.0' 22 | AND n.gender IS NOT NULL 23 | AND n.gender = 'f' 24 | AND t.production_year BETWEEN 2008 AND 2014 25 | AND t.id = mi.movie_id 26 | AND t.id = mi_idx.movie_id 27 | AND t.id = ci.movie_id 28 | AND ci.movie_id = mi.movie_id 29 | AND ci.movie_id = mi_idx.movie_id 30 | AND mi.movie_id = mi_idx.movie_id 31 | AND n.id = ci.person_id 32 | AND it1.id = mi.info_type_id 33 | AND it2.id = mi_idx.info_type_id; 34 | 35 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_79.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query79.tpl 2 | select 3 | c_last_name,c_first_name,substr(s_city,1,30),ss_ticket_number,amt,profit 4 | from 5 | (select ss_ticket_number 6 | ,ss_customer_sk 7 | ,store.s_city 8 | ,sum(ss_coupon_amt) amt 9 | ,sum(ss_net_profit) profit 10 | from store_sales,date_dim,store,household_demographics 11 | where store_sales.ss_sold_date_sk = date_dim.d_date_sk 12 | and store_sales.ss_store_sk = store.s_store_sk 13 | and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk 14 | and (household_demographics.hd_dep_count = 8 or household_demographics.hd_vehicle_count > 0) 15 | and date_dim.d_dow = 1 16 | and date_dim.d_year in (1998,1998+1,1998+2) 17 | and store.s_number_employees between 200 and 295 18 | group by ss_ticket_number,ss_customer_sk,ss_addr_sk,store.s_city) ms,customer 19 | where ss_customer_sk = c_customer_sk 20 | order by c_last_name,c_first_name,substr(s_city,1,30), profit 21 | limit 100; 22 | 23 | -- end query 1 in stream 0 using template query79.tpl 24 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_87.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query87.tpl 2 | select count(*) 3 | from ((select distinct c_last_name, c_first_name, d_date 4 | from store_sales, date_dim, customer 5 | where store_sales.ss_sold_date_sk = date_dim.d_date_sk 6 | and store_sales.ss_customer_sk = customer.c_customer_sk 7 | and d_month_seq between 1212 and 1212+11) 8 | except 9 | (select distinct c_last_name, c_first_name, d_date 10 | from catalog_sales, date_dim, customer 11 | where catalog_sales.cs_sold_date_sk = date_dim.d_date_sk 12 | and catalog_sales.cs_bill_customer_sk = customer.c_customer_sk 13 | and d_month_seq between 1212 and 1212+11) 14 | except 15 | (select distinct c_last_name, c_first_name, d_date 16 | from web_sales, date_dim, customer 17 | where web_sales.ws_sold_date_sk = date_dim.d_date_sk 18 | and web_sales.ws_bill_customer_sk = customer.c_customer_sk 19 | and d_month_seq between 1212 and 1212+11) 20 | ) cool_cust 21 | ; 22 | 23 | -- end query 1 in stream 0 using template query87.tpl 24 | -------------------------------------------------------------------------------- /benchmark/job/queries/19d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS voicing_actress, 2 | MIN(t.title) AS jap_engl_voiced_movie 3 | FROM aka_name AS an, 4 | char_name AS chn, 5 | cast_info AS ci, 6 | company_name AS cn, 7 | info_type AS it, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | name AS n, 11 | role_type AS rt, 12 | title AS t 13 | WHERE ci.note IN ('(voice)', 14 | '(voice: Japanese version)', 15 | '(voice) (uncredited)', 16 | '(voice: English version)') 17 | AND cn.country_code ='[us]' 18 | AND it.info = 'release dates' 19 | AND n.gender ='f' 20 | AND rt.role ='actress' 21 | AND t.production_year > 2000 22 | AND t.id = mi.movie_id 23 | AND t.id = mc.movie_id 24 | AND t.id = ci.movie_id 25 | AND mc.movie_id = ci.movie_id 26 | AND mc.movie_id = mi.movie_id 27 | AND mi.movie_id = ci.movie_id 28 | AND cn.id = mc.company_id 29 | AND it.id = mi.info_type_id 30 | AND n.id = ci.person_id 31 | AND rt.id = ci.role_id 32 | AND n.id = an.person_id 33 | AND ci.person_id = an.person_id 34 | AND chn.id = ci.person_role_id; 35 | 36 | -------------------------------------------------------------------------------- /cmd/parse.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package main 15 | 16 | import ( 17 | "errors" 18 | "fmt" 19 | 20 | "github.com/pingcap/parser" 21 | "github.com/pingcap/parser/ast" 22 | ) 23 | 24 | func Parse(sql string) (stmt ast.StmtNode, err error) { 25 | stmts, warns, err := parser.New().Parse(sql, "", "") 26 | if err != nil { 27 | return 28 | } 29 | 30 | for _, warn := range warns { 31 | if warn != nil { 32 | err = warn 33 | return 34 | } 35 | } 36 | 37 | if len(stmts) != 1 { 38 | err = errors.New(fmt.Sprintf("Invalid statement: %s", sql)) 39 | return 40 | } 41 | stmt = stmts[0] 42 | return 43 | } 44 | -------------------------------------------------------------------------------- /benchmark/tpch/queries/19.sql: -------------------------------------------------------------------------------- 1 | -- using 1365545250 as a seed to the RNG 2 | 3 | 4 | select 5 | sum(l_extendedprice* (1 - l_discount)) as revenue 6 | from 7 | lineitem, 8 | part 9 | where 10 | ( 11 | p_partkey = l_partkey 12 | and p_brand = 'Brand#52' 13 | and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') 14 | and l_quantity >= 4 and l_quantity <= 4 + 10 15 | and p_size between 1 and 5 16 | and l_shipmode in ('AIR', 'AIR REG') 17 | and l_shipinstruct = 'DELIVER IN PERSON' 18 | ) 19 | or 20 | ( 21 | p_partkey = l_partkey 22 | and p_brand = 'Brand#11' 23 | and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') 24 | and l_quantity >= 18 and l_quantity <= 18 + 10 25 | and p_size between 1 and 10 26 | and l_shipmode in ('AIR', 'AIR REG') 27 | and l_shipinstruct = 'DELIVER IN PERSON' 28 | ) 29 | or 30 | ( 31 | p_partkey = l_partkey 32 | and p_brand = 'Brand#51' 33 | and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') 34 | and l_quantity >= 29 and l_quantity <= 29 + 10 35 | and p_size between 1 and 15 36 | and l_shipmode in ('AIR', 'AIR REG') 37 | and l_shipinstruct = 'DELIVER IN PERSON' 38 | ); 39 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_97.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query97.tpl 2 | with ssci as ( 3 | select ss_customer_sk customer_sk 4 | ,ss_item_sk item_sk 5 | from store_sales,date_dim 6 | where ss_sold_date_sk = d_date_sk 7 | and d_month_seq between 1212 and 1212 + 11 8 | group by ss_customer_sk 9 | ,ss_item_sk), 10 | csci as( 11 | select cs_bill_customer_sk customer_sk 12 | ,cs_item_sk item_sk 13 | from catalog_sales,date_dim 14 | where cs_sold_date_sk = d_date_sk 15 | and d_month_seq between 1212 and 1212 + 11 16 | group by cs_bill_customer_sk 17 | ,cs_item_sk) 18 | select sum(case when ssci.customer_sk is not null and csci.customer_sk is null then 1 else 0 end) store_only 19 | ,sum(case when ssci.customer_sk is null and csci.customer_sk is not null then 1 else 0 end) catalog_only 20 | ,sum(case when ssci.customer_sk is not null and csci.customer_sk is not null then 1 else 0 end) store_and_catalog 21 | from ssci full outer join csci on (ssci.customer_sk=csci.customer_sk 22 | and ssci.item_sk = csci.item_sk) 23 | limit 100; 24 | 25 | -- end query 1 in stream 0 using template query97.tpl 26 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_90.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query90.tpl 2 | select cast(amc as decimal(15,4))/cast(pmc as decimal(15,4)) am_pm_ratio 3 | from ( select count(*) amc 4 | from web_sales, household_demographics , time_dim, web_page 5 | where ws_sold_time_sk = time_dim.t_time_sk 6 | and ws_ship_hdemo_sk = household_demographics.hd_demo_sk 7 | and ws_web_page_sk = web_page.wp_web_page_sk 8 | and time_dim.t_hour between 6 and 6+1 9 | and household_demographics.hd_dep_count = 8 10 | and web_page.wp_char_count between 5000 and 5200) at, 11 | ( select count(*) pmc 12 | from web_sales, household_demographics , time_dim, web_page 13 | where ws_sold_time_sk = time_dim.t_time_sk 14 | and ws_ship_hdemo_sk = household_demographics.hd_demo_sk 15 | and ws_web_page_sk = web_page.wp_web_page_sk 16 | and time_dim.t_hour between 14 and 14+1 17 | and household_demographics.hd_dep_count = 8 18 | and web_page.wp_char_count between 5000 and 5200) pt 19 | order by am_pm_ratio 20 | limit 100; 21 | 22 | -- end query 1 in stream 0 using template query90.tpl 23 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_43.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query43.tpl 2 | select s_store_name, s_store_id, 3 | sum(case when (d_day_name='Sunday') then ss_sales_price else null end) sun_sales, 4 | sum(case when (d_day_name='Monday') then ss_sales_price else null end) mon_sales, 5 | sum(case when (d_day_name='Tuesday') then ss_sales_price else null end) tue_sales, 6 | sum(case when (d_day_name='Wednesday') then ss_sales_price else null end) wed_sales, 7 | sum(case when (d_day_name='Thursday') then ss_sales_price else null end) thu_sales, 8 | sum(case when (d_day_name='Friday') then ss_sales_price else null end) fri_sales, 9 | sum(case when (d_day_name='Saturday') then ss_sales_price else null end) sat_sales 10 | from date_dim, store_sales, store 11 | where d_date_sk = ss_sold_date_sk and 12 | s_store_sk = ss_store_sk and 13 | s_gmt_offset = -5 and 14 | d_year = 1998 15 | group by s_store_name, s_store_id 16 | order by s_store_name, s_store_id,sun_sales,mon_sales,tue_sales,wed_sales,thu_sales,fri_sales,sat_sales 17 | limit 100; 18 | 19 | -- end query 1 in stream 0 using template query43.tpl 20 | -------------------------------------------------------------------------------- /pkg/horoscope/horoscope_test.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package horoscope 15 | 16 | import ( 17 | "fmt" 18 | "testing" 19 | 20 | "github.com/pingcap/parser" 21 | "github.com/pingcap/parser/ast" 22 | _ "github.com/pingcap/tidb/types/parser_driver" 23 | "github.com/stretchr/testify/assert" 24 | ) 25 | 26 | func TestHoroscope_Plan(t *testing.T) { 27 | stmts, warns, err := parser.New().Parse("SELECT /*+ NTH_PLAN(1) */ * FROM t", "", "") 28 | assert.Nil(t, err) 29 | assert.Empty(t, warns) 30 | assert.Len(t, stmts, 1) 31 | selectStmt, ok := stmts[0].(*ast.SelectStmt) 32 | assert.True(t, ok) 33 | fmt.Printf("%#v", selectStmt.TableHints[0]) 34 | } 35 | -------------------------------------------------------------------------------- /benchmark/job/queries/7c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS cast_member_name, 2 | MIN(pi.info) AS cast_member_info 3 | FROM aka_name AS an, 4 | cast_info AS ci, 5 | info_type AS it, 6 | link_type AS lt, 7 | movie_link AS ml, 8 | name AS n, 9 | person_info AS pi, 10 | title AS t 11 | WHERE an.name IS NOT NULL 12 | AND (an.name LIKE '%a%' 13 | OR an.name LIKE 'A%') 14 | AND it.info ='mini biography' 15 | AND lt.link IN ('references', 16 | 'referenced in', 17 | 'features', 18 | 'featured in') 19 | AND n.name_pcode_cf BETWEEN 'A' AND 'F' 20 | AND (n.gender='m' 21 | OR (n.gender = 'f' 22 | AND n.name LIKE 'A%')) 23 | AND pi.note IS NOT NULL 24 | AND t.production_year BETWEEN 1980 AND 2010 25 | AND n.id = an.person_id 26 | AND n.id = pi.person_id 27 | AND ci.person_id = n.id 28 | AND t.id = ci.movie_id 29 | AND ml.linked_movie_id = t.id 30 | AND lt.id = ml.link_type_id 31 | AND it.id = pi.info_type_id 32 | AND pi.person_id = an.person_id 33 | AND pi.person_id = ci.person_id 34 | AND an.person_id = ci.person_id 35 | AND ci.movie_id = ml.linked_movie_id; 36 | 37 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/chaos-mesh/horoscope 2 | 3 | go 1.13 4 | 5 | require ( 6 | github.com/aclements/go-moremath v0.0.0-20190830160640-d16893ddf098 7 | github.com/go-openapi/strfmt v0.19.5 // indirect 8 | github.com/go-sql-driver/mysql v1.5.0 9 | github.com/golang-collections/go-datastructures v0.0.0-20150211160725-59788d5eb259 10 | github.com/golang/protobuf v1.4.2 // indirect 11 | github.com/jedib0t/go-pretty v4.3.0+incompatible 12 | github.com/magiconair/properties v1.8.0 13 | github.com/pingcap/parser v0.0.0-20200921041333-cd2542b7a8a2 14 | github.com/pingcap/tidb v1.1.0-beta.0.20200921050610-4ec101d7e329 15 | github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect 16 | github.com/sirupsen/logrus v1.6.0 17 | github.com/stretchr/testify v1.6.1 18 | github.com/urfave/cli/v2 v2.2.0 19 | golang.org/x/perf v0.0.0-20200318175901-9c9101da8316 20 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 21 | google.golang.org/protobuf v1.24.0 // indirect 22 | ) 23 | 24 | //replace github.com/pingcap/tidb => github.com/pingcap/tidb v0.0.0-20200317142013-5268094afe05 25 | replace github.com/pingcap/parser => github.com/Hexilee/parser v0.0.0-20200921032941-e3585adbb4a1 26 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_16.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query16.tpl 2 | select 3 | count(distinct cs_order_number) as "order count" 4 | ,sum(cs_ext_ship_cost) as "total shipping cost" 5 | ,sum(cs_net_profit) as "total net profit" 6 | from 7 | catalog_sales cs1 8 | ,date_dim 9 | ,customer_address 10 | ,call_center 11 | where 12 | d_date between '1999-5-01' and 13 | (cast('1999-5-01' as date) + 60 days) 14 | and cs1.cs_ship_date_sk = d_date_sk 15 | and cs1.cs_ship_addr_sk = ca_address_sk 16 | and ca_state = 'OH' 17 | and cs1.cs_call_center_sk = cc_call_center_sk 18 | and cc_county in ('Ziebach County','Williamson County','Walker County','Williamson County', 19 | 'Ziebach County' 20 | ) 21 | and exists (select * 22 | from catalog_sales cs2 23 | where cs1.cs_order_number = cs2.cs_order_number 24 | and cs1.cs_warehouse_sk <> cs2.cs_warehouse_sk) 25 | and not exists(select * 26 | from catalog_returns cr1 27 | where cs1.cs_order_number = cr1.cr_order_number) 28 | order by count(distinct cs_order_number) 29 | limit 100; 30 | 31 | -- end query 1 in stream 0 using template query16.tpl 32 | -------------------------------------------------------------------------------- /benchmark/job/queries/21b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS company_name, 2 | MIN(lt.link) AS link_type, 3 | MIN(t.title) AS german_follow_up 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | keyword AS k, 7 | link_type AS lt, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_keyword AS mk, 11 | movie_link AS ml, 12 | title AS t 13 | WHERE cn.country_code !='[pl]' 14 | AND (cn.name LIKE '%Film%' 15 | OR cn.name LIKE '%Warner%') 16 | AND ct.kind ='production companies' 17 | AND k.keyword ='sequel' 18 | AND lt.link LIKE '%follow%' 19 | AND mc.note IS NULL 20 | AND mi.info IN ('Germany', 21 | 'German') 22 | AND t.production_year BETWEEN 2000 AND 2010 23 | AND lt.id = ml.link_type_id 24 | AND ml.movie_id = t.id 25 | AND t.id = mk.movie_id 26 | AND mk.keyword_id = k.id 27 | AND t.id = mc.movie_id 28 | AND mc.company_type_id = ct.id 29 | AND mc.company_id = cn.id 30 | AND mi.movie_id = t.id 31 | AND ml.movie_id = mk.movie_id 32 | AND ml.movie_id = mc.movie_id 33 | AND mk.movie_id = mc.movie_id 34 | AND ml.movie_id = mi.movie_id 35 | AND mk.movie_id = mi.movie_id 36 | AND mc.movie_id = mi.movie_id; 37 | 38 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_89.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query89.tpl 2 | select * 3 | from( 4 | select i_category, i_class, i_brand, 5 | s_store_name, s_company_name, 6 | d_moy, 7 | sum(ss_sales_price) sum_sales, 8 | avg(sum(ss_sales_price)) over 9 | (partition by i_category, i_brand, s_store_name, s_company_name) 10 | avg_monthly_sales 11 | from item, store_sales, date_dim, store 12 | where ss_item_sk = i_item_sk and 13 | ss_sold_date_sk = d_date_sk and 14 | ss_store_sk = s_store_sk and 15 | d_year in (2000) and 16 | ((i_category in ('Home','Books','Electronics') and 17 | i_class in ('wallpaper','parenting','musical') 18 | ) 19 | or (i_category in ('Shoes','Jewelry','Men') and 20 | i_class in ('womens','birdal','pants') 21 | )) 22 | group by i_category, i_class, i_brand, 23 | s_store_name, s_company_name, d_moy) tmp1 24 | where case when (avg_monthly_sales <> 0) then (abs(sum_sales - avg_monthly_sales) / avg_monthly_sales) else null end > 0.1 25 | order by sum_sales - avg_monthly_sales, s_store_name 26 | limit 100; 27 | 28 | -- end query 1 in stream 0 using template query89.tpl 29 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_21.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query21.tpl 2 | select * 3 | from(select w_warehouse_name 4 | ,i_item_id 5 | ,sum(case when (cast(d_date as date) < cast ('1998-04-08' as date)) 6 | then inv_quantity_on_hand 7 | else 0 end) as inv_before 8 | ,sum(case when (cast(d_date as date) >= cast ('1998-04-08' as date)) 9 | then inv_quantity_on_hand 10 | else 0 end) as inv_after 11 | from inventory 12 | ,warehouse 13 | ,item 14 | ,date_dim 15 | where i_current_price between 0.99 and 1.49 16 | and i_item_sk = inv_item_sk 17 | and inv_warehouse_sk = w_warehouse_sk 18 | and inv_date_sk = d_date_sk 19 | and d_date between (cast ('1998-04-08' as date) - 30 days) 20 | and (cast ('1998-04-08' as date) + 30 days) 21 | group by w_warehouse_name, i_item_id) x 22 | where (case when inv_before > 0 23 | then inv_after / inv_before 24 | else null 25 | end) between 2.0/3.0 and 3.0/2.0 26 | order by w_warehouse_name 27 | ,i_item_id 28 | limit 100; 29 | 30 | -- end query 1 in stream 0 using template query21.tpl 31 | -------------------------------------------------------------------------------- /benchmark/job/queries/19c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS voicing_actress, 2 | MIN(t.title) AS jap_engl_voiced_movie 3 | FROM aka_name AS an, 4 | char_name AS chn, 5 | cast_info AS ci, 6 | company_name AS cn, 7 | info_type AS it, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | name AS n, 11 | role_type AS rt, 12 | title AS t 13 | WHERE ci.note IN ('(voice)', 14 | '(voice: Japanese version)', 15 | '(voice) (uncredited)', 16 | '(voice: English version)') 17 | AND cn.country_code ='[us]' 18 | AND it.info = 'release dates' 19 | AND mi.info IS NOT NULL 20 | AND (mi.info LIKE 'Japan:%200%' 21 | OR mi.info LIKE 'USA:%200%') 22 | AND n.gender ='f' 23 | AND n.name LIKE '%An%' 24 | AND rt.role ='actress' 25 | AND t.production_year > 2000 26 | AND t.id = mi.movie_id 27 | AND t.id = mc.movie_id 28 | AND t.id = ci.movie_id 29 | AND mc.movie_id = ci.movie_id 30 | AND mc.movie_id = mi.movie_id 31 | AND mi.movie_id = ci.movie_id 32 | AND cn.id = mc.company_id 33 | AND it.id = mi.info_type_id 34 | AND n.id = ci.person_id 35 | AND rt.id = ci.role_id 36 | AND n.id = an.person_id 37 | AND ci.person_id = an.person_id 38 | AND chn.id = ci.person_role_id; 39 | 40 | -------------------------------------------------------------------------------- /benchmark/job/queries/23a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(kt.kind) AS movie_kind, 2 | MIN(t.title) AS complete_us_internet_movie 3 | FROM complete_cast AS cc, 4 | comp_cast_type AS cct1, 5 | company_name AS cn, 6 | company_type AS ct, 7 | info_type AS it1, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_keyword AS mk, 13 | title AS t 14 | WHERE cct1.kind = 'complete+verified' 15 | AND cn.country_code = '[us]' 16 | AND it1.info = 'release dates' 17 | AND kt.kind IN ('movie') 18 | AND mi.note LIKE '%internet%' 19 | AND mi.info IS NOT NULL 20 | AND (mi.info LIKE 'USA:% 199%' 21 | OR mi.info LIKE 'USA:% 200%') 22 | AND t.production_year > 2000 23 | AND kt.id = t.kind_id 24 | AND t.id = mi.movie_id 25 | AND t.id = mk.movie_id 26 | AND t.id = mc.movie_id 27 | AND t.id = cc.movie_id 28 | AND mk.movie_id = mi.movie_id 29 | AND mk.movie_id = mc.movie_id 30 | AND mk.movie_id = cc.movie_id 31 | AND mi.movie_id = mc.movie_id 32 | AND mi.movie_id = cc.movie_id 33 | AND mc.movie_id = cc.movie_id 34 | AND k.id = mk.keyword_id 35 | AND it1.id = mi.info_type_id 36 | AND cn.id = mc.company_id 37 | AND ct.id = mc.company_type_id 38 | AND cct1.id = cc.status_id; 39 | 40 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_95.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query95.tpl 2 | with ws_wh as 3 | (select ws1.ws_order_number,ws1.ws_warehouse_sk wh1,ws2.ws_warehouse_sk wh2 4 | from web_sales ws1,web_sales ws2 5 | where ws1.ws_order_number = ws2.ws_order_number 6 | and ws1.ws_warehouse_sk <> ws2.ws_warehouse_sk) 7 | select 8 | count(distinct ws_order_number) as "order count" 9 | ,sum(ws_ext_ship_cost) as "total shipping cost" 10 | ,sum(ws_net_profit) as "total net profit" 11 | from 12 | web_sales ws1 13 | ,date_dim 14 | ,customer_address 15 | ,web_site 16 | where 17 | d_date between '1999-5-01' and 18 | (cast('1999-5-01' as date) + 60 days) 19 | and ws1.ws_ship_date_sk = d_date_sk 20 | and ws1.ws_ship_addr_sk = ca_address_sk 21 | and ca_state = 'TX' 22 | and ws1.ws_web_site_sk = web_site_sk 23 | and web_company_name = 'pri' 24 | and ws1.ws_order_number in (select ws_order_number 25 | from ws_wh) 26 | and ws1.ws_order_number in (select wr_order_number 27 | from web_returns,ws_wh 28 | where wr_order_number = ws_wh.ws_order_number) 29 | order by count(distinct ws_order_number) 30 | limit 100; 31 | 32 | -- end query 1 in stream 0 using template query95.tpl 33 | -------------------------------------------------------------------------------- /pkg/executor/hint.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package executor 15 | 16 | import ( 17 | "reflect" 18 | "strings" 19 | ) 20 | 21 | type Hints struct { 22 | segments map[string]bool 23 | raw string 24 | } 25 | 26 | func NewHints(raw string) Hints { 27 | hints := Hints{ 28 | segments: make(map[string]bool), 29 | raw: raw, 30 | } 31 | for _, hint := range strings.Split(raw, ",") { 32 | segment := strings.Trim(hint, " ") 33 | if !strings.Contains(segment, "nth_plan") { 34 | hints.segments[segment] = true 35 | } 36 | } 37 | return hints 38 | } 39 | 40 | func (h Hints) Equal(other Hints) bool { 41 | return reflect.DeepEqual(h.segments, other.segments) 42 | } 43 | 44 | func (h Hints) String() string { 45 | return h.raw 46 | } 47 | -------------------------------------------------------------------------------- /benchmark/job/queries/19b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS voicing_actress, 2 | MIN(t.title) AS kung_fu_panda 3 | FROM aka_name AS an, 4 | char_name AS chn, 5 | cast_info AS ci, 6 | company_name AS cn, 7 | info_type AS it, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | name AS n, 11 | role_type AS rt, 12 | title AS t 13 | WHERE ci.note = '(voice)' 14 | AND cn.country_code ='[us]' 15 | AND it.info = 'release dates' 16 | AND mc.note LIKE '%(200%)%' 17 | AND (mc.note LIKE '%(USA)%' 18 | OR mc.note LIKE '%(worldwide)%') 19 | AND mi.info IS NOT NULL 20 | AND (mi.info LIKE 'Japan:%2007%' 21 | OR mi.info LIKE 'USA:%2008%') 22 | AND n.gender ='f' 23 | AND n.name LIKE '%Angel%' 24 | AND rt.role ='actress' 25 | AND t.production_year BETWEEN 2007 AND 2008 26 | AND t.title LIKE '%Kung%Fu%Panda%' 27 | AND t.id = mi.movie_id 28 | AND t.id = mc.movie_id 29 | AND t.id = ci.movie_id 30 | AND mc.movie_id = ci.movie_id 31 | AND mc.movie_id = mi.movie_id 32 | AND mi.movie_id = ci.movie_id 33 | AND cn.id = mc.company_id 34 | AND it.id = mi.info_type_id 35 | AND n.id = ci.person_id 36 | AND rt.id = ci.role_id 37 | AND n.id = an.person_id 38 | AND ci.person_id = an.person_id 39 | AND chn.id = ci.person_role_id; 40 | 41 | -------------------------------------------------------------------------------- /benchmark/job/queries/20a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS complete_downey_ironman_movie 2 | FROM complete_cast AS cc, 3 | comp_cast_type AS cct1, 4 | comp_cast_type AS cct2, 5 | char_name AS chn, 6 | cast_info AS ci, 7 | keyword AS k, 8 | kind_type AS kt, 9 | movie_keyword AS mk, 10 | name AS n, 11 | title AS t 12 | WHERE cct1.kind = 'cast' 13 | AND cct2.kind LIKE '%complete%' 14 | AND chn.name NOT LIKE '%Sherlock%' 15 | AND (chn.name LIKE '%Tony%Stark%' 16 | OR chn.name LIKE '%Iron%Man%') 17 | AND k.keyword IN ('superhero', 18 | 'sequel', 19 | 'second-part', 20 | 'marvel-comics', 21 | 'based-on-comic', 22 | 'tv-special', 23 | 'fight', 24 | 'violence') 25 | AND kt.kind = 'movie' 26 | AND t.production_year > 1950 27 | AND kt.id = t.kind_id 28 | AND t.id = mk.movie_id 29 | AND t.id = ci.movie_id 30 | AND t.id = cc.movie_id 31 | AND mk.movie_id = ci.movie_id 32 | AND mk.movie_id = cc.movie_id 33 | AND ci.movie_id = cc.movie_id 34 | AND chn.id = ci.person_role_id 35 | AND n.id = ci.person_id 36 | AND k.id = mk.keyword_id 37 | AND cct1.id = cc.subject_id 38 | AND cct2.id = cc.status_id; 39 | 40 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_53.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query53.tpl 2 | select * from 3 | (select i_manufact_id, 4 | sum(ss_sales_price) sum_sales, 5 | avg(sum(ss_sales_price)) over (partition by i_manufact_id) avg_quarterly_sales 6 | from item, store_sales, date_dim, store 7 | where ss_item_sk = i_item_sk and 8 | ss_sold_date_sk = d_date_sk and 9 | ss_store_sk = s_store_sk and 10 | d_month_seq in (1212,1212+1,1212+2,1212+3,1212+4,1212+5,1212+6,1212+7,1212+8,1212+9,1212+10,1212+11) and 11 | ((i_category in ('Books','Children','Electronics') and 12 | i_class in ('personal','portable','reference','self-help') and 13 | i_brand in ('scholaramalgamalg #14','scholaramalgamalg #7', 14 | 'exportiunivamalg #9','scholaramalgamalg #9')) 15 | or(i_category in ('Women','Music','Men') and 16 | i_class in ('accessories','classical','fragrances','pants') and 17 | i_brand in ('amalgimporto #1','edu packscholar #1','exportiimporto #1', 18 | 'importoamalg #1'))) 19 | group by i_manufact_id, d_qoy ) tmp1 20 | where case when avg_quarterly_sales > 0 21 | then abs (sum_sales - avg_quarterly_sales)/ avg_quarterly_sales 22 | else null end > 0.1 23 | order by avg_quarterly_sales, 24 | sum_sales, 25 | i_manufact_id 26 | limit 100; 27 | 28 | -- end query 1 in stream 0 using template query53.tpl 29 | -------------------------------------------------------------------------------- /benchmark/job/queries/14a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi_idx.info) AS rating, 2 | MIN(t.title) AS northern_dark_movie 3 | FROM info_type AS it1, 4 | info_type AS it2, 5 | keyword AS k, 6 | kind_type AS kt, 7 | movie_info AS mi, 8 | movie_info_idx AS mi_idx, 9 | movie_keyword AS mk, 10 | title AS t 11 | WHERE it1.info = 'countries' 12 | AND it2.info = 'rating' 13 | AND k.keyword IN ('murder', 14 | 'murder-in-title', 15 | 'blood', 16 | 'violence') 17 | AND kt.kind = 'movie' 18 | AND mi.info IN ('Sweden', 19 | 'Norway', 20 | 'Germany', 21 | 'Denmark', 22 | 'Swedish', 23 | 'Denish', 24 | 'Norwegian', 25 | 'German', 26 | 'USA', 27 | 'American') 28 | AND mi_idx.info < '8.5' 29 | AND t.production_year > 2010 30 | AND kt.id = t.kind_id 31 | AND t.id = mi.movie_id 32 | AND t.id = mk.movie_id 33 | AND t.id = mi_idx.movie_id 34 | AND mk.movie_id = mi.movie_id 35 | AND mk.movie_id = mi_idx.movie_id 36 | AND mi.movie_id = mi_idx.movie_id 37 | AND k.id = mk.keyword_id 38 | AND it1.id = mi.info_type_id 39 | AND it2.id = mi_idx.info_type_id; 40 | 41 | -------------------------------------------------------------------------------- /pkg/executor/result.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package executor 15 | 16 | import ( 17 | "database/sql" 18 | "fmt" 19 | ) 20 | 21 | type Result struct { 22 | LastInsertId, RowsAffected int64 23 | } 24 | 25 | func NewResult(result sql.Result) (ret Result, err error) { 26 | ret.LastInsertId, err = result.LastInsertId() 27 | if err != nil { 28 | return 29 | } 30 | 31 | ret.RowsAffected, err = result.RowsAffected() 32 | return 33 | } 34 | 35 | func (r Result) Equal(other Comparable) bool { 36 | if otherResult, ok := other.(Result); ok { 37 | return r == otherResult 38 | } else { 39 | return false 40 | } 41 | } 42 | 43 | func (r Result) String() string { 44 | return fmt.Sprintf("OK. LastInsertId: %d, RowsAffected: %d", r.LastInsertId, r.RowsAffected) 45 | } 46 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_25.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query25.tpl 2 | select 3 | i_item_id 4 | ,i_item_desc 5 | ,s_store_id 6 | ,s_store_name 7 | ,sum(ss_net_profit) as store_sales_profit 8 | ,sum(sr_net_loss) as store_returns_loss 9 | ,sum(cs_net_profit) as catalog_sales_profit 10 | from 11 | store_sales 12 | ,store_returns 13 | ,catalog_sales 14 | ,date_dim d1 15 | ,date_dim d2 16 | ,date_dim d3 17 | ,store 18 | ,item 19 | where 20 | d1.d_moy = 4 21 | and d1.d_year = 2000 22 | and d1.d_date_sk = ss_sold_date_sk 23 | and i_item_sk = ss_item_sk 24 | and s_store_sk = ss_store_sk 25 | and ss_customer_sk = sr_customer_sk 26 | and ss_item_sk = sr_item_sk 27 | and ss_ticket_number = sr_ticket_number 28 | and sr_returned_date_sk = d2.d_date_sk 29 | and d2.d_moy between 4 and 10 30 | and d2.d_year = 2000 31 | and sr_customer_sk = cs_bill_customer_sk 32 | and sr_item_sk = cs_item_sk 33 | and cs_sold_date_sk = d3.d_date_sk 34 | and d3.d_moy between 4 and 10 35 | and d3.d_year = 2000 36 | group by 37 | i_item_id 38 | ,i_item_desc 39 | ,s_store_id 40 | ,s_store_name 41 | order by 42 | i_item_id 43 | ,i_item_desc 44 | ,s_store_id 45 | ,s_store_name 46 | limit 100; 47 | 48 | -- end query 1 in stream 0 using template query25.tpl 49 | -------------------------------------------------------------------------------- /benchmark/job/queries/20b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(t.title) AS complete_downey_ironman_movie 2 | FROM complete_cast AS cc, 3 | comp_cast_type AS cct1, 4 | comp_cast_type AS cct2, 5 | char_name AS chn, 6 | cast_info AS ci, 7 | keyword AS k, 8 | kind_type AS kt, 9 | movie_keyword AS mk, 10 | name AS n, 11 | title AS t 12 | WHERE cct1.kind = 'cast' 13 | AND cct2.kind LIKE '%complete%' 14 | AND chn.name NOT LIKE '%Sherlock%' 15 | AND (chn.name LIKE '%Tony%Stark%' 16 | OR chn.name LIKE '%Iron%Man%') 17 | AND k.keyword IN ('superhero', 18 | 'sequel', 19 | 'second-part', 20 | 'marvel-comics', 21 | 'based-on-comic', 22 | 'tv-special', 23 | 'fight', 24 | 'violence') 25 | AND kt.kind = 'movie' 26 | AND n.name LIKE '%Downey%Robert%' 27 | AND t.production_year > 2000 28 | AND kt.id = t.kind_id 29 | AND t.id = mk.movie_id 30 | AND t.id = ci.movie_id 31 | AND t.id = cc.movie_id 32 | AND mk.movie_id = ci.movie_id 33 | AND mk.movie_id = cc.movie_id 34 | AND ci.movie_id = cc.movie_id 35 | AND chn.id = ci.person_role_id 36 | AND n.id = ci.person_id 37 | AND k.id = mk.keyword_id 38 | AND cct1.id = cc.subject_id 39 | AND cct2.id = cc.status_id; 40 | 41 | -------------------------------------------------------------------------------- /benchmark/tpch/prepare.sql: -------------------------------------------------------------------------------- 1 | analyze table lineitem; 2 | analyze table orders; 3 | analyze table part; 4 | analyze table partsupp; 5 | analyze table supplier; 6 | analyze table customer; 7 | analyze table region; 8 | analyze table nation; 9 | explain select * from lineitem where l_shipdate <= '2018-01-01'; 10 | explain select * from orders where o_orderdate <= '2018-01-01'; 11 | explain select * from lineitem where l_returnflag = 'R'; 12 | explain select * from nation where n_name = 'A'; 13 | explain select * from lineitem where l_shipmode = 'A'; 14 | explain select * from lineitem where l_commitdate <= '2018-01-01'; 15 | explain select * from lineitem where l_receiptdate <= '2018-01-01'; 16 | explain select * from orders where o_orderpriority = 'A'; 17 | explain select * from part where p_type = 'A'; 18 | explain select * from part where p_brand = 'A'; 19 | explain select * from part where p_size = 1; 20 | explain select * from supplier where s_comment = 'A'; 21 | explain select * from part where p_container = 'A'; 22 | explain select * from lineitem where l_quantity = 1; 23 | explain select * from lineitem where l_shipinstruct = 'A'; 24 | explain select * from part where p_name = 'A'; 25 | explain select * from orders where o_orderstatus = 'A'; 26 | explain select * from region where r_name = 'A'; 27 | explain select * from lineitem where l_discount = 0.01; -------------------------------------------------------------------------------- /benchmark/job/queries/14b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi_idx.info) AS rating, 2 | MIN(t.title) AS western_dark_production 3 | FROM info_type AS it1, 4 | info_type AS it2, 5 | keyword AS k, 6 | kind_type AS kt, 7 | movie_info AS mi, 8 | movie_info_idx AS mi_idx, 9 | movie_keyword AS mk, 10 | title AS t 11 | WHERE it1.info = 'countries' 12 | AND it2.info = 'rating' 13 | AND k.keyword IN ('murder', 14 | 'murder-in-title') 15 | AND kt.kind = 'movie' 16 | AND mi.info IN ('Sweden', 17 | 'Norway', 18 | 'Germany', 19 | 'Denmark', 20 | 'Swedish', 21 | 'Denish', 22 | 'Norwegian', 23 | 'German', 24 | 'USA', 25 | 'American') 26 | AND mi_idx.info > '6.0' 27 | AND t.production_year > 2010 28 | AND (t.title LIKE '%murder%' 29 | OR t.title LIKE '%Murder%' 30 | OR t.title LIKE '%Mord%') 31 | AND kt.id = t.kind_id 32 | AND t.id = mi.movie_id 33 | AND t.id = mk.movie_id 34 | AND t.id = mi_idx.movie_id 35 | AND mk.movie_id = mi.movie_id 36 | AND mk.movie_id = mi_idx.movie_id 37 | AND mi.movie_id = mi_idx.movie_id 38 | AND k.id = mk.keyword_id 39 | AND it1.id = mi.info_type_id 40 | AND it2.id = mi_idx.info_type_id; 41 | 42 | -------------------------------------------------------------------------------- /pkg/database/parser.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package database 15 | 16 | import ( 17 | "fmt" 18 | 19 | "github.com/pingcap/parser" 20 | "github.com/pingcap/parser/ast" 21 | "github.com/pingcap/parser/types" 22 | ) 23 | 24 | type Parser struct { 25 | parser.Parser 26 | } 27 | 28 | func NewParser() *Parser { 29 | return &Parser{*parser.New()} 30 | } 31 | 32 | func (p *Parser) ParseFieldType(tp string) (fieldType *types.FieldType, err error) { 33 | ddl := fmt.Sprintf("CREATE TABLE t (c %s)", tp) 34 | stmt, err := p.ParseOneStmt(ddl, "", "") 35 | if err != nil { 36 | return 37 | } 38 | 39 | nodes, ok := stmt.(*ast.CreateTableStmt) 40 | 41 | if !ok || len(nodes.Cols) != 1 { 42 | err = fmt.Errorf("invalid field type: %s", tp) 43 | return 44 | } 45 | fieldType = nodes.Cols[0].Tp 46 | return 47 | } 48 | -------------------------------------------------------------------------------- /benchmark/job/queries/23b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(kt.kind) AS movie_kind, 2 | MIN(t.title) AS complete_nerdy_internet_movie 3 | FROM complete_cast AS cc, 4 | comp_cast_type AS cct1, 5 | company_name AS cn, 6 | company_type AS ct, 7 | info_type AS it1, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_keyword AS mk, 13 | title AS t 14 | WHERE cct1.kind = 'complete+verified' 15 | AND cn.country_code = '[us]' 16 | AND it1.info = 'release dates' 17 | AND k.keyword IN ('nerd', 18 | 'loner', 19 | 'alienation', 20 | 'dignity') 21 | AND kt.kind IN ('movie') 22 | AND mi.note LIKE '%internet%' 23 | AND mi.info LIKE 'USA:% 200%' 24 | AND t.production_year > 2000 25 | AND kt.id = t.kind_id 26 | AND t.id = mi.movie_id 27 | AND t.id = mk.movie_id 28 | AND t.id = mc.movie_id 29 | AND t.id = cc.movie_id 30 | AND mk.movie_id = mi.movie_id 31 | AND mk.movie_id = mc.movie_id 32 | AND mk.movie_id = cc.movie_id 33 | AND mi.movie_id = mc.movie_id 34 | AND mi.movie_id = cc.movie_id 35 | AND mc.movie_id = cc.movie_id 36 | AND k.id = mk.keyword_id 37 | AND it1.id = mi.info_type_id 38 | AND cn.id = mc.company_id 39 | AND ct.id = mc.company_type_id 40 | AND cct1.id = cc.status_id; 41 | 42 | -------------------------------------------------------------------------------- /pkg/utils/utils.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "math" 7 | "reflect" 8 | 9 | "github.com/pingcap/parser/ast" 10 | "github.com/pingcap/parser/format" 11 | ) 12 | 13 | func QError(est, act float64) float64 { 14 | if est <= 0 || act <= 0 { 15 | panic(fmt.Sprintf("est or act value cannot be less or equal to zero")) 16 | } 17 | z := est / act 18 | zp := act / est 19 | return math.Max(z, zp) 20 | } 21 | 22 | func BufferOut(node ast.Node) (string, error) { 23 | out := new(bytes.Buffer) 24 | err := node.Restore(format.NewRestoreCtx(format.RestoreStringDoubleQuotes, out)) 25 | if err != nil { 26 | return "", err 27 | } 28 | return out.String(), nil 29 | } 30 | 31 | func NewValueExpr(value interface{}) ast.ValueExpr { 32 | if IsNil(value) { 33 | return ast.NewValueExpr(nil, "", "") 34 | } 35 | return ast.NewValueExpr(value, "", "") 36 | } 37 | 38 | func IsNil(i interface{}) bool { 39 | if i == nil { 40 | return true 41 | } 42 | switch reflect.TypeOf(i).Kind() { 43 | case reflect.Ptr, reflect.Map, reflect.Array, reflect.Chan, reflect.Slice: 44 | return reflect.ValueOf(i).IsNil() 45 | } 46 | return false 47 | } 48 | 49 | func MaxInt(a, b int) int { 50 | if a > b { 51 | return a 52 | } 53 | return b 54 | } 55 | 56 | func MinInt(a, b int) int { 57 | if a < b { 58 | return a 59 | } 60 | return b 61 | } 62 | -------------------------------------------------------------------------------- /benchmark/job/queries/20c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS cast_member, 2 | MIN(t.title) AS complete_dynamic_hero_movie 3 | FROM complete_cast AS cc, 4 | comp_cast_type AS cct1, 5 | comp_cast_type AS cct2, 6 | char_name AS chn, 7 | cast_info AS ci, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_keyword AS mk, 11 | name AS n, 12 | title AS t 13 | WHERE cct1.kind = 'cast' 14 | AND cct2.kind LIKE '%complete%' 15 | AND chn.name IS NOT NULL 16 | AND (chn.name LIKE '%man%' 17 | OR chn.name LIKE '%Man%') 18 | AND k.keyword IN ('superhero', 19 | 'marvel-comics', 20 | 'based-on-comic', 21 | 'tv-special', 22 | 'fight', 23 | 'violence', 24 | 'magnet', 25 | 'web', 26 | 'claw', 27 | 'laser') 28 | AND kt.kind = 'movie' 29 | AND t.production_year > 2000 30 | AND kt.id = t.kind_id 31 | AND t.id = mk.movie_id 32 | AND t.id = ci.movie_id 33 | AND t.id = cc.movie_id 34 | AND mk.movie_id = ci.movie_id 35 | AND mk.movie_id = cc.movie_id 36 | AND ci.movie_id = cc.movie_id 37 | AND chn.id = ci.person_role_id 38 | AND n.id = ci.person_id 39 | AND k.id = mk.keyword_id 40 | AND cct1.id = cc.subject_id 41 | AND cct2.id = cc.status_id; 42 | 43 | -------------------------------------------------------------------------------- /benchmark/job/queries/14c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi_idx.info) AS rating, 2 | MIN(t.title) AS north_european_dark_production 3 | FROM info_type AS it1, 4 | info_type AS it2, 5 | keyword AS k, 6 | kind_type AS kt, 7 | movie_info AS mi, 8 | movie_info_idx AS mi_idx, 9 | movie_keyword AS mk, 10 | title AS t 11 | WHERE it1.info = 'countries' 12 | AND it2.info = 'rating' 13 | AND k.keyword IS NOT NULL 14 | AND k.keyword IN ('murder', 15 | 'murder-in-title', 16 | 'blood', 17 | 'violence') 18 | AND kt.kind IN ('movie', 19 | 'episode') 20 | AND mi.info IN ('Sweden', 21 | 'Norway', 22 | 'Germany', 23 | 'Denmark', 24 | 'Swedish', 25 | 'Danish', 26 | 'Norwegian', 27 | 'German', 28 | 'USA', 29 | 'American') 30 | AND mi_idx.info < '8.5' 31 | AND t.production_year > 2005 32 | AND kt.id = t.kind_id 33 | AND t.id = mi.movie_id 34 | AND t.id = mk.movie_id 35 | AND t.id = mi_idx.movie_id 36 | AND mk.movie_id = mi.movie_id 37 | AND mk.movie_id = mi_idx.movie_id 38 | AND mi.movie_id = mi_idx.movie_id 39 | AND k.id = mk.keyword_id 40 | AND it1.id = mi.info_type_id 41 | AND it2.id = mi_idx.info_type_id; 42 | 43 | -------------------------------------------------------------------------------- /benchmark/job/queries/23c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(kt.kind) AS movie_kind, 2 | MIN(t.title) AS complete_us_internet_movie 3 | FROM complete_cast AS cc, 4 | comp_cast_type AS cct1, 5 | company_name AS cn, 6 | company_type AS ct, 7 | info_type AS it1, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_keyword AS mk, 13 | title AS t 14 | WHERE cct1.kind = 'complete+verified' 15 | AND cn.country_code = '[us]' 16 | AND it1.info = 'release dates' 17 | AND kt.kind IN ('movie', 18 | 'tv movie', 19 | 'video movie', 20 | 'video game') 21 | AND mi.note LIKE '%internet%' 22 | AND mi.info IS NOT NULL 23 | AND (mi.info LIKE 'USA:% 199%' 24 | OR mi.info LIKE 'USA:% 200%') 25 | AND t.production_year > 1990 26 | AND kt.id = t.kind_id 27 | AND t.id = mi.movie_id 28 | AND t.id = mk.movie_id 29 | AND t.id = mc.movie_id 30 | AND t.id = cc.movie_id 31 | AND mk.movie_id = mi.movie_id 32 | AND mk.movie_id = mc.movie_id 33 | AND mk.movie_id = cc.movie_id 34 | AND mi.movie_id = mc.movie_id 35 | AND mi.movie_id = cc.movie_id 36 | AND mc.movie_id = cc.movie_id 37 | AND k.id = mk.keyword_id 38 | AND it1.id = mi.info_type_id 39 | AND cn.id = mc.company_id 40 | AND ct.id = mc.company_type_id 41 | AND cct1.id = cc.status_id; 42 | 43 | -------------------------------------------------------------------------------- /benchmark/job/queries/25a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS movie_budget, 2 | MIN(mi_idx.info) AS movie_votes, 3 | MIN(n.name) AS male_writer, 4 | MIN(t.title) AS violent_movie_title 5 | FROM cast_info AS ci, 6 | info_type AS it1, 7 | info_type AS it2, 8 | keyword AS k, 9 | movie_info AS mi, 10 | movie_info_idx AS mi_idx, 11 | movie_keyword AS mk, 12 | name AS n, 13 | title AS t 14 | WHERE ci.note IN ('(writer)', 15 | '(head writer)', 16 | '(written by)', 17 | '(story)', 18 | '(story editor)') 19 | AND it1.info = 'genres' 20 | AND it2.info = 'votes' 21 | AND k.keyword IN ('murder', 22 | 'blood', 23 | 'gore', 24 | 'death', 25 | 'female-nudity') 26 | AND mi.info = 'Horror' 27 | AND n.gender = 'm' 28 | AND t.id = mi.movie_id 29 | AND t.id = mi_idx.movie_id 30 | AND t.id = ci.movie_id 31 | AND t.id = mk.movie_id 32 | AND ci.movie_id = mi.movie_id 33 | AND ci.movie_id = mi_idx.movie_id 34 | AND ci.movie_id = mk.movie_id 35 | AND mi.movie_id = mi_idx.movie_id 36 | AND mi.movie_id = mk.movie_id 37 | AND mi_idx.movie_id = mk.movie_id 38 | AND n.id = ci.person_id 39 | AND it1.id = mi.info_type_id 40 | AND it2.id = mi_idx.info_type_id 41 | AND k.id = mk.keyword_id; 42 | 43 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_72.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query72.tpl 2 | select i_item_desc 3 | ,w_warehouse_name 4 | ,d1.d_week_seq 5 | ,sum(case when p_promo_sk is null then 1 else 0 end) no_promo 6 | ,sum(case when p_promo_sk is not null then 1 else 0 end) promo 7 | ,count(*) total_cnt 8 | from catalog_sales 9 | join inventory on (cs_item_sk = inv_item_sk) 10 | join warehouse on (w_warehouse_sk=inv_warehouse_sk) 11 | join item on (i_item_sk = cs_item_sk) 12 | join customer_demographics on (cs_bill_cdemo_sk = cd_demo_sk) 13 | join household_demographics on (cs_bill_hdemo_sk = hd_demo_sk) 14 | join date_dim d1 on (cs_sold_date_sk = d1.d_date_sk) 15 | join date_dim d2 on (inv_date_sk = d2.d_date_sk) 16 | join date_dim d3 on (cs_ship_date_sk = d3.d_date_sk) 17 | left outer join promotion on (cs_promo_sk=p_promo_sk) 18 | left outer join catalog_returns on (cr_item_sk = cs_item_sk and cr_order_number = cs_order_number) 19 | where d1.d_week_seq = d2.d_week_seq 20 | and inv_quantity_on_hand < cs_quantity 21 | and d3.d_date > d1.d_date + 5 22 | and hd_buy_potential = '1001-5000' 23 | and d1.d_year = 2001 24 | and cd_marital_status = 'M' 25 | group by i_item_desc,w_warehouse_name,d1.d_week_seq 26 | order by total_cnt desc, i_item_desc, w_warehouse_name, d_week_seq 27 | limit 100; 28 | 29 | -- end query 1 in stream 0 using template query72.tpl 30 | -------------------------------------------------------------------------------- /benchmark/job/queries/19a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(n.name) AS voicing_actress, 2 | MIN(t.title) AS voiced_movie 3 | FROM aka_name AS an, 4 | char_name AS chn, 5 | cast_info AS ci, 6 | company_name AS cn, 7 | info_type AS it, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | name AS n, 11 | role_type AS rt, 12 | title AS t 13 | WHERE ci.note IN ('(voice)', 14 | '(voice: Japanese version)', 15 | '(voice) (uncredited)', 16 | '(voice: English version)') 17 | AND cn.country_code ='[us]' 18 | AND it.info = 'release dates' 19 | AND mc.note IS NOT NULL 20 | AND (mc.note LIKE '%(USA)%' 21 | OR mc.note LIKE '%(worldwide)%') 22 | AND mi.info IS NOT NULL 23 | AND (mi.info LIKE 'Japan:%200%' 24 | OR mi.info LIKE 'USA:%200%') 25 | AND n.gender ='f' 26 | AND n.name LIKE '%Ang%' 27 | AND rt.role ='actress' 28 | AND t.production_year BETWEEN 2005 AND 2009 29 | AND t.id = mi.movie_id 30 | AND t.id = mc.movie_id 31 | AND t.id = ci.movie_id 32 | AND mc.movie_id = ci.movie_id 33 | AND mc.movie_id = mi.movie_id 34 | AND mi.movie_id = ci.movie_id 35 | AND cn.id = mc.company_id 36 | AND it.id = mi.info_type_id 37 | AND n.id = ci.person_id 38 | AND rt.id = ci.role_id 39 | AND n.id = an.person_id 40 | AND ci.person_id = an.person_id 41 | AND chn.id = ci.person_role_id; 42 | 43 | -------------------------------------------------------------------------------- /benchmark/job/queries/21a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS company_name, 2 | MIN(lt.link) AS link_type, 3 | MIN(t.title) AS western_follow_up 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | keyword AS k, 7 | link_type AS lt, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_keyword AS mk, 11 | movie_link AS ml, 12 | title AS t 13 | WHERE cn.country_code !='[pl]' 14 | AND (cn.name LIKE '%Film%' 15 | OR cn.name LIKE '%Warner%') 16 | AND ct.kind ='production companies' 17 | AND k.keyword ='sequel' 18 | AND lt.link LIKE '%follow%' 19 | AND mc.note IS NULL 20 | AND mi.info IN ('Sweden', 21 | 'Norway', 22 | 'Germany', 23 | 'Denmark', 24 | 'Swedish', 25 | 'Denish', 26 | 'Norwegian', 27 | 'German') 28 | AND t.production_year BETWEEN 1950 AND 2000 29 | AND lt.id = ml.link_type_id 30 | AND ml.movie_id = t.id 31 | AND t.id = mk.movie_id 32 | AND mk.keyword_id = k.id 33 | AND t.id = mc.movie_id 34 | AND mc.company_type_id = ct.id 35 | AND mc.company_id = cn.id 36 | AND mi.movie_id = t.id 37 | AND ml.movie_id = mk.movie_id 38 | AND ml.movie_id = mc.movie_id 39 | AND mk.movie_id = mc.movie_id 40 | AND ml.movie_id = mi.movie_id 41 | AND mk.movie_id = mi.movie_id 42 | AND mc.movie_id = mi.movie_id; 43 | 44 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_70.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query70.tpl 2 | select 3 | sum(ss_net_profit) as total_sum 4 | ,s_state 5 | ,s_county 6 | ,grouping(s_state)+grouping(s_county) as lochierarchy 7 | ,rank() over ( 8 | partition by grouping(s_state)+grouping(s_county), 9 | case when grouping(s_county) = 0 then s_state end 10 | order by sum(ss_net_profit) desc) as rank_within_parent 11 | from 12 | store_sales 13 | ,date_dim d1 14 | ,store 15 | where 16 | d1.d_month_seq between 1212 and 1212+11 17 | and d1.d_date_sk = ss_sold_date_sk 18 | and s_store_sk = ss_store_sk 19 | and s_state in 20 | ( select s_state 21 | from (select s_state as s_state, 22 | rank() over ( partition by s_state order by sum(ss_net_profit) desc) as ranking 23 | from store_sales, store, date_dim 24 | where d_month_seq between 1212 and 1212+11 25 | and d_date_sk = ss_sold_date_sk 26 | and s_store_sk = ss_store_sk 27 | group by s_state 28 | ) tmp1 29 | where ranking <= 5 30 | ) 31 | group by rollup(s_state,s_county) 32 | order by 33 | lochierarchy desc 34 | ,case when lochierarchy = 0 then s_state end 35 | ,rank_within_parent 36 | limit 100; 37 | 38 | -- end query 1 in stream 0 using template query70.tpl 39 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_99.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query99.tpl 2 | select 3 | substr(w_warehouse_name,1,20) 4 | ,sm_type 5 | ,cc_name 6 | ,sum(case when (cs_ship_date_sk - cs_sold_date_sk <= 30 ) then 1 else 0 end) as "30 days" 7 | ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 30) and 8 | (cs_ship_date_sk - cs_sold_date_sk <= 60) then 1 else 0 end ) as "31-60 days" 9 | ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 60) and 10 | (cs_ship_date_sk - cs_sold_date_sk <= 90) then 1 else 0 end) as "61-90 days" 11 | ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 90) and 12 | (cs_ship_date_sk - cs_sold_date_sk <= 120) then 1 else 0 end) as "91-120 days" 13 | ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 120) then 1 else 0 end) as ">120 days" 14 | from 15 | catalog_sales 16 | ,warehouse 17 | ,ship_mode 18 | ,call_center 19 | ,date_dim 20 | where 21 | d_month_seq between 1212 and 1212 + 11 22 | and cs_ship_date_sk = d_date_sk 23 | and cs_warehouse_sk = w_warehouse_sk 24 | and cs_ship_mode_sk = sm_ship_mode_sk 25 | and cs_call_center_sk = cc_call_center_sk 26 | group by 27 | substr(w_warehouse_name,1,20) 28 | ,sm_type 29 | ,cc_name 30 | order by substr(w_warehouse_name,1,20) 31 | ,sm_type 32 | ,cc_name 33 | limit 100; 34 | 35 | -- end query 1 in stream 0 using template query99.tpl 36 | -------------------------------------------------------------------------------- /benchmark/job/queries/21c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS company_name, 2 | MIN(lt.link) AS link_type, 3 | MIN(t.title) AS western_follow_up 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | keyword AS k, 7 | link_type AS lt, 8 | movie_companies AS mc, 9 | movie_info AS mi, 10 | movie_keyword AS mk, 11 | movie_link AS ml, 12 | title AS t 13 | WHERE cn.country_code !='[pl]' 14 | AND (cn.name LIKE '%Film%' 15 | OR cn.name LIKE '%Warner%') 16 | AND ct.kind ='production companies' 17 | AND k.keyword ='sequel' 18 | AND lt.link LIKE '%follow%' 19 | AND mc.note IS NULL 20 | AND mi.info IN ('Sweden', 21 | 'Norway', 22 | 'Germany', 23 | 'Denmark', 24 | 'Swedish', 25 | 'Denish', 26 | 'Norwegian', 27 | 'German', 28 | 'English') 29 | AND t.production_year BETWEEN 1950 AND 2010 30 | AND lt.id = ml.link_type_id 31 | AND ml.movie_id = t.id 32 | AND t.id = mk.movie_id 33 | AND mk.keyword_id = k.id 34 | AND t.id = mc.movie_id 35 | AND mc.company_type_id = ct.id 36 | AND mc.company_id = cn.id 37 | AND mi.movie_id = t.id 38 | AND ml.movie_id = mk.movie_id 39 | AND ml.movie_id = mc.movie_id 40 | AND mk.movie_id = mc.movie_id 41 | AND ml.movie_id = mi.movie_id 42 | AND mk.movie_id = mi.movie_id 43 | AND mc.movie_id = mi.movie_id; 44 | 45 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_30.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query30.tpl 2 | with customer_total_return as 3 | (select wr_returning_customer_sk as ctr_customer_sk 4 | ,ca_state as ctr_state, 5 | sum(wr_return_amt) as ctr_total_return 6 | from web_returns 7 | ,date_dim 8 | ,customer_address 9 | where wr_returned_date_sk = d_date_sk 10 | and d_year =2002 11 | and wr_returning_addr_sk = ca_address_sk 12 | group by wr_returning_customer_sk 13 | ,ca_state) 14 | select c_customer_id,c_salutation,c_first_name,c_last_name,c_preferred_cust_flag 15 | ,c_birth_day,c_birth_month,c_birth_year,c_birth_country,c_login,c_email_address 16 | ,c_last_review_date_sk,ctr_total_return 17 | from customer_total_return ctr1 18 | ,customer_address 19 | ,customer 20 | where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2 21 | from customer_total_return ctr2 22 | where ctr1.ctr_state = ctr2.ctr_state) 23 | and ca_address_sk = c_current_addr_sk 24 | and ca_state = 'IL' 25 | and ctr1.ctr_customer_sk = c_customer_sk 26 | order by c_customer_id,c_salutation,c_first_name,c_last_name,c_preferred_cust_flag 27 | ,c_birth_day,c_birth_month,c_birth_year,c_birth_country,c_login,c_email_address 28 | ,c_last_review_date_sk,ctr_total_return 29 | limit 100; 30 | 31 | -- end query 1 in stream 0 using template query30.tpl 32 | -------------------------------------------------------------------------------- /benchmark/job/queries/25b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS movie_budget, 2 | MIN(mi_idx.info) AS movie_votes, 3 | MIN(n.name) AS male_writer, 4 | MIN(t.title) AS violent_movie_title 5 | FROM cast_info AS ci, 6 | info_type AS it1, 7 | info_type AS it2, 8 | keyword AS k, 9 | movie_info AS mi, 10 | movie_info_idx AS mi_idx, 11 | movie_keyword AS mk, 12 | name AS n, 13 | title AS t 14 | WHERE ci.note IN ('(writer)', 15 | '(head writer)', 16 | '(written by)', 17 | '(story)', 18 | '(story editor)') 19 | AND it1.info = 'genres' 20 | AND it2.info = 'votes' 21 | AND k.keyword IN ('murder', 22 | 'blood', 23 | 'gore', 24 | 'death', 25 | 'female-nudity') 26 | AND mi.info = 'Horror' 27 | AND n.gender = 'm' 28 | AND t.production_year > 2010 29 | AND t.title LIKE 'Vampire%' 30 | AND t.id = mi.movie_id 31 | AND t.id = mi_idx.movie_id 32 | AND t.id = ci.movie_id 33 | AND t.id = mk.movie_id 34 | AND ci.movie_id = mi.movie_id 35 | AND ci.movie_id = mi_idx.movie_id 36 | AND ci.movie_id = mk.movie_id 37 | AND mi.movie_id = mi_idx.movie_id 38 | AND mi.movie_id = mk.movie_id 39 | AND mi_idx.movie_id = mk.movie_id 40 | AND n.id = ci.person_id 41 | AND it1.id = mi.info_type_id 42 | AND it2.id = mi_idx.info_type_id 43 | AND k.id = mk.keyword_id; 44 | 45 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_67.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query67.tpl 2 | select * 3 | from (select i_category 4 | ,i_class 5 | ,i_brand 6 | ,i_product_name 7 | ,d_year 8 | ,d_qoy 9 | ,d_moy 10 | ,s_store_id 11 | ,sumsales 12 | ,rank() over (partition by i_category order by sumsales desc) rk 13 | from (select i_category 14 | ,i_class 15 | ,i_brand 16 | ,i_product_name 17 | ,d_year 18 | ,d_qoy 19 | ,d_moy 20 | ,s_store_id 21 | ,sum(coalesce(ss_sales_price*ss_quantity,0)) sumsales 22 | from store_sales 23 | ,date_dim 24 | ,store 25 | ,item 26 | where ss_sold_date_sk=d_date_sk 27 | and ss_item_sk=i_item_sk 28 | and ss_store_sk = s_store_sk 29 | and d_month_seq between 1212 and 1212+11 30 | group by rollup(i_category, i_class, i_brand, i_product_name, d_year, d_qoy, d_moy,s_store_id))dw1) dw2 31 | where rk <= 100 32 | order by i_category 33 | ,i_class 34 | ,i_brand 35 | ,i_product_name 36 | ,d_year 37 | ,d_qoy 38 | ,d_moy 39 | ,s_store_id 40 | ,sumsales 41 | ,rk 42 | limit 100; 43 | 44 | -- end query 1 in stream 0 using template query67.tpl 45 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_18.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query18.tpl 2 | select i_item_id, 3 | ca_country, 4 | ca_state, 5 | ca_county, 6 | avg( cast(cs_quantity as decimal(12,2))) agg1, 7 | avg( cast(cs_list_price as decimal(12,2))) agg2, 8 | avg( cast(cs_coupon_amt as decimal(12,2))) agg3, 9 | avg( cast(cs_sales_price as decimal(12,2))) agg4, 10 | avg( cast(cs_net_profit as decimal(12,2))) agg5, 11 | avg( cast(c_birth_year as decimal(12,2))) agg6, 12 | avg( cast(cd1.cd_dep_count as decimal(12,2))) agg7 13 | from catalog_sales, customer_demographics cd1, 14 | customer_demographics cd2, customer, customer_address, date_dim, item 15 | where cs_sold_date_sk = d_date_sk and 16 | cs_item_sk = i_item_sk and 17 | cs_bill_cdemo_sk = cd1.cd_demo_sk and 18 | cs_bill_customer_sk = c_customer_sk and 19 | cd1.cd_gender = 'M' and 20 | cd1.cd_education_status = 'College' and 21 | c_current_cdemo_sk = cd2.cd_demo_sk and 22 | c_current_addr_sk = ca_address_sk and 23 | c_birth_month in (9,5,12,4,1,10) and 24 | d_year = 2001 and 25 | ca_state in ('ND','WI','AL' 26 | ,'NC','OK','MS','TN') 27 | group by rollup (i_item_id, ca_country, ca_state, ca_county) 28 | order by ca_country, 29 | ca_state, 30 | ca_county, 31 | i_item_id 32 | limit 100; 33 | 34 | -- end query 1 in stream 0 using template query18.tpl 35 | -------------------------------------------------------------------------------- /pkg/executor/warning.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package executor 15 | 16 | import ( 17 | "errors" 18 | "strconv" 19 | "strings" 20 | 21 | "github.com/go-sql-driver/mysql" 22 | "github.com/pingcap/tidb/errno" 23 | log "github.com/sirupsen/logrus" 24 | ) 25 | 26 | func Warning(row Row) (warning error, err error) { 27 | if len(row) != 3 { 28 | err = errors.New("warning table should have 3 columns") 29 | return 30 | } 31 | 32 | code, err := strconv.Atoi(string(row[1])) 33 | if err != nil { 34 | return 35 | } 36 | 37 | log.WithFields(log.Fields{ 38 | "code": code, 39 | "msg": string(row[2]), 40 | }).Debug("sql warning") 41 | 42 | warning = &mysql.MySQLError{Number: uint16(code), Message: string(row[2])} 43 | return 44 | } 45 | 46 | func PlanOutOfRange(err error) bool { 47 | mysqlErr, ok := err.(*mysql.MySQLError) 48 | return ok && mysqlErr.Number == errno.ErrUnknown && strings.Contains(strings.ToLower(mysqlErr.Message), "nth_plan") 49 | } 50 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_63.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query63.tpl 2 | select * 3 | from (select i_manager_id 4 | ,sum(ss_sales_price) sum_sales 5 | ,avg(sum(ss_sales_price)) over (partition by i_manager_id) avg_monthly_sales 6 | from item 7 | ,store_sales 8 | ,date_dim 9 | ,store 10 | where ss_item_sk = i_item_sk 11 | and ss_sold_date_sk = d_date_sk 12 | and ss_store_sk = s_store_sk 13 | and d_month_seq in (1212,1212+1,1212+2,1212+3,1212+4,1212+5,1212+6,1212+7,1212+8,1212+9,1212+10,1212+11) 14 | and (( i_category in ('Books','Children','Electronics') 15 | and i_class in ('personal','portable','reference','self-help') 16 | and i_brand in ('scholaramalgamalg #14','scholaramalgamalg #7', 17 | 'exportiunivamalg #9','scholaramalgamalg #9')) 18 | or( i_category in ('Women','Music','Men') 19 | and i_class in ('accessories','classical','fragrances','pants') 20 | and i_brand in ('amalgimporto #1','edu packscholar #1','exportiimporto #1', 21 | 'importoamalg #1'))) 22 | group by i_manager_id, d_moy) tmp1 23 | where case when avg_monthly_sales > 0 then abs (sum_sales - avg_monthly_sales) / avg_monthly_sales else null end > 0.1 24 | order by i_manager_id 25 | ,avg_monthly_sales 26 | ,sum_sales 27 | limit 100; 28 | 29 | -- end query 1 in stream 0 using template query63.tpl 30 | -------------------------------------------------------------------------------- /pkg/database/database.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package database 15 | 16 | import ( 17 | "errors" 18 | "fmt" 19 | 20 | "github.com/chaos-mesh/horoscope/pkg/executor" 21 | ) 22 | 23 | // Database defines database database 24 | type Database struct { 25 | Name string 26 | BaseTables map[string]*Table 27 | } 28 | 29 | func LoadDatabase(rawName, tables executor.Rows) (db *Database, err error) { 30 | if rawName.ColumnNums() != 1 || rawName.RowCount() != 1 { 31 | err = errors.New(fmt.Sprintf("Invalid database\n%s", rawName.String())) 32 | return 33 | } 34 | if tables.ColumnNums() != 2 { 35 | err = errors.New(fmt.Sprintf("Invalid tables\n%s", tables.String())) 36 | return 37 | } 38 | dbName := string(rawName.Data[0][0]) 39 | db = &Database{ 40 | Name: dbName, 41 | BaseTables: make(map[string]*Table), 42 | } 43 | for _, row := range tables.Data { 44 | db.BaseTables[string(row[0])] = PrepareTable(dbName, string(row[0])) 45 | } 46 | return 47 | } 48 | -------------------------------------------------------------------------------- /benchmark/job/queries/26b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS character_name, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS complete_hero_movie 4 | FROM complete_cast AS cc, 5 | comp_cast_type AS cct1, 6 | comp_cast_type AS cct2, 7 | char_name AS chn, 8 | cast_info AS ci, 9 | info_type AS it2, 10 | keyword AS k, 11 | kind_type AS kt, 12 | movie_info_idx AS mi_idx, 13 | movie_keyword AS mk, 14 | name AS n, 15 | title AS t 16 | WHERE cct1.kind = 'cast' 17 | AND cct2.kind LIKE '%complete%' 18 | AND chn.name IS NOT NULL 19 | AND (chn.name LIKE '%man%' 20 | OR chn.name LIKE '%Man%') 21 | AND it2.info = 'rating' 22 | AND k.keyword IN ('superhero', 23 | 'marvel-comics', 24 | 'based-on-comic', 25 | 'fight') 26 | AND kt.kind = 'movie' 27 | AND mi_idx.info > '8.0' 28 | AND t.production_year > 2005 29 | AND kt.id = t.kind_id 30 | AND t.id = mk.movie_id 31 | AND t.id = ci.movie_id 32 | AND t.id = cc.movie_id 33 | AND t.id = mi_idx.movie_id 34 | AND mk.movie_id = ci.movie_id 35 | AND mk.movie_id = cc.movie_id 36 | AND mk.movie_id = mi_idx.movie_id 37 | AND ci.movie_id = cc.movie_id 38 | AND ci.movie_id = mi_idx.movie_id 39 | AND cc.movie_id = mi_idx.movie_id 40 | AND chn.id = ci.person_role_id 41 | AND n.id = ci.person_id 42 | AND k.id = mk.keyword_id 43 | AND cct1.id = cc.subject_id 44 | AND cct2.id = cc.status_id 45 | AND it2.id = mi_idx.info_type_id; 46 | 47 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_81.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query81.tpl 2 | with customer_total_return as 3 | (select cr_returning_customer_sk as ctr_customer_sk 4 | ,ca_state as ctr_state, 5 | sum(cr_return_amt_inc_tax) as ctr_total_return 6 | from catalog_returns 7 | ,date_dim 8 | ,customer_address 9 | where cr_returned_date_sk = d_date_sk 10 | and d_year =1998 11 | and cr_returning_addr_sk = ca_address_sk 12 | group by cr_returning_customer_sk 13 | ,ca_state ) 14 | select c_customer_id,c_salutation,c_first_name,c_last_name,ca_street_number,ca_street_name 15 | ,ca_street_type,ca_suite_number,ca_city,ca_county,ca_state,ca_zip,ca_country,ca_gmt_offset 16 | ,ca_location_type,ctr_total_return 17 | from customer_total_return ctr1 18 | ,customer_address 19 | ,customer 20 | where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2 21 | from customer_total_return ctr2 22 | where ctr1.ctr_state = ctr2.ctr_state) 23 | and ca_address_sk = c_current_addr_sk 24 | and ca_state = 'IL' 25 | and ctr1.ctr_customer_sk = c_customer_sk 26 | order by c_customer_id,c_salutation,c_first_name,c_last_name,ca_street_number,ca_street_name 27 | ,ca_street_type,ca_suite_number,ca_city,ca_county,ca_state,ca_zip,ca_country,ca_gmt_offset 28 | ,ca_location_type,ctr_total_return 29 | limit 100; 30 | 31 | -- end query 1 in stream 0 using template query81.tpl 32 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_29.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query29.tpl 2 | select 3 | i_item_id 4 | ,i_item_desc 5 | ,s_store_id 6 | ,s_store_name 7 | ,sum(ss_quantity) as store_sales_quantity 8 | ,sum(sr_return_quantity) as store_returns_quantity 9 | ,sum(cs_quantity) as catalog_sales_quantity 10 | from 11 | store_sales 12 | ,store_returns 13 | ,catalog_sales 14 | ,date_dim d1 15 | ,date_dim d2 16 | ,date_dim d3 17 | ,store 18 | ,item 19 | where 20 | d1.d_moy = 4 21 | and d1.d_year = 1999 22 | and d1.d_date_sk = ss_sold_date_sk 23 | and i_item_sk = ss_item_sk 24 | and s_store_sk = ss_store_sk 25 | and ss_customer_sk = sr_customer_sk 26 | and ss_item_sk = sr_item_sk 27 | and ss_ticket_number = sr_ticket_number 28 | and sr_returned_date_sk = d2.d_date_sk 29 | and d2.d_moy between 4 and 4 + 3 30 | and d2.d_year = 1999 31 | and sr_customer_sk = cs_bill_customer_sk 32 | and sr_item_sk = cs_item_sk 33 | and cs_sold_date_sk = d3.d_date_sk 34 | and d3.d_year in (1999,1999+1,1999+2) 35 | group by 36 | i_item_id 37 | ,i_item_desc 38 | ,s_store_id 39 | ,s_store_name 40 | order by 41 | i_item_id 42 | ,i_item_desc 43 | ,s_store_id 44 | ,s_store_name 45 | limit 100; 46 | 47 | -- end query 1 in stream 0 using template query29.tpl 48 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_46.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query46.tpl 2 | select c_last_name 3 | ,c_first_name 4 | ,ca_city 5 | ,bought_city 6 | ,ss_ticket_number 7 | ,amt,profit 8 | from 9 | (select ss_ticket_number 10 | ,ss_customer_sk 11 | ,ca_city bought_city 12 | ,sum(ss_coupon_amt) amt 13 | ,sum(ss_net_profit) profit 14 | from store_sales,date_dim,store,household_demographics,customer_address 15 | where store_sales.ss_sold_date_sk = date_dim.d_date_sk 16 | and store_sales.ss_store_sk = store.s_store_sk 17 | and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk 18 | and store_sales.ss_addr_sk = customer_address.ca_address_sk 19 | and (household_demographics.hd_dep_count = 7 or 20 | household_demographics.hd_vehicle_count= 2) 21 | and date_dim.d_dow in (6,0) 22 | and date_dim.d_year in (2000,2000+1,2000+2) 23 | and store.s_city in ('Fairview','Oak Grove','Midway','Riverside','Mount Pleasant') 24 | group by ss_ticket_number,ss_customer_sk,ss_addr_sk,ca_city) dn,customer,customer_address current_addr 25 | where ss_customer_sk = c_customer_sk 26 | and customer.c_current_addr_sk = current_addr.ca_address_sk 27 | and current_addr.ca_city <> bought_city 28 | order by c_last_name 29 | ,c_first_name 30 | ,ca_city 31 | ,bought_city 32 | ,ss_ticket_number 33 | limit 100; 34 | 35 | -- end query 1 in stream 0 using template query46.tpl 36 | -------------------------------------------------------------------------------- /benchmark/job/queries/22a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS movie_company, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS western_violent_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | info_type AS it2, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_info_idx AS mi_idx, 13 | movie_keyword AS mk, 14 | title AS t 15 | WHERE cn.country_code != '[us]' 16 | AND it1.info = 'countries' 17 | AND it2.info = 'rating' 18 | AND k.keyword IN ('murder', 19 | 'murder-in-title', 20 | 'blood', 21 | 'violence') 22 | AND kt.kind IN ('movie', 23 | 'episode') 24 | AND mc.note NOT LIKE '%(USA)%' 25 | AND mc.note LIKE '%(200%)%' 26 | AND mi.info IN ('Germany', 27 | 'German', 28 | 'USA', 29 | 'American') 30 | AND mi_idx.info < '7.0' 31 | AND t.production_year > 2008 32 | AND kt.id = t.kind_id 33 | AND t.id = mi.movie_id 34 | AND t.id = mk.movie_id 35 | AND t.id = mi_idx.movie_id 36 | AND t.id = mc.movie_id 37 | AND mk.movie_id = mi.movie_id 38 | AND mk.movie_id = mi_idx.movie_id 39 | AND mk.movie_id = mc.movie_id 40 | AND mi.movie_id = mi_idx.movie_id 41 | AND mi.movie_id = mc.movie_id 42 | AND mc.movie_id = mi_idx.movie_id 43 | AND k.id = mk.keyword_id 44 | AND it1.id = mi.info_type_id 45 | AND it2.id = mi_idx.info_type_id 46 | AND ct.id = mc.company_type_id 47 | AND cn.id = mc.company_id; 48 | 49 | -------------------------------------------------------------------------------- /benchmark/job/queries/22b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS movie_company, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS western_violent_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | info_type AS it2, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_info_idx AS mi_idx, 13 | movie_keyword AS mk, 14 | title AS t 15 | WHERE cn.country_code != '[us]' 16 | AND it1.info = 'countries' 17 | AND it2.info = 'rating' 18 | AND k.keyword IN ('murder', 19 | 'murder-in-title', 20 | 'blood', 21 | 'violence') 22 | AND kt.kind IN ('movie', 23 | 'episode') 24 | AND mc.note NOT LIKE '%(USA)%' 25 | AND mc.note LIKE '%(200%)%' 26 | AND mi.info IN ('Germany', 27 | 'German', 28 | 'USA', 29 | 'American') 30 | AND mi_idx.info < '7.0' 31 | AND t.production_year > 2009 32 | AND kt.id = t.kind_id 33 | AND t.id = mi.movie_id 34 | AND t.id = mk.movie_id 35 | AND t.id = mi_idx.movie_id 36 | AND t.id = mc.movie_id 37 | AND mk.movie_id = mi.movie_id 38 | AND mk.movie_id = mi_idx.movie_id 39 | AND mk.movie_id = mc.movie_id 40 | AND mi.movie_id = mi_idx.movie_id 41 | AND mi.movie_id = mc.movie_id 42 | AND mc.movie_id = mi_idx.movie_id 43 | AND k.id = mk.keyword_id 44 | AND it1.id = mi.info_type_id 45 | AND it2.id = mi_idx.info_type_id 46 | AND ct.id = mc.company_type_id 47 | AND cn.id = mc.company_id; 48 | 49 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_34.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query34.tpl 2 | select c_last_name 3 | ,c_first_name 4 | ,c_salutation 5 | ,c_preferred_cust_flag 6 | ,ss_ticket_number 7 | ,cnt from 8 | (select ss_ticket_number 9 | ,ss_customer_sk 10 | ,count(*) cnt 11 | from store_sales,date_dim,store,household_demographics 12 | where store_sales.ss_sold_date_sk = date_dim.d_date_sk 13 | and store_sales.ss_store_sk = store.s_store_sk 14 | and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk 15 | and (date_dim.d_dom between 1 and 3 or date_dim.d_dom between 25 and 28) 16 | and (household_demographics.hd_buy_potential = '>10000' or 17 | household_demographics.hd_buy_potential = 'Unknown') 18 | and household_demographics.hd_vehicle_count > 0 19 | and (case when household_demographics.hd_vehicle_count > 0 20 | then household_demographics.hd_dep_count/ household_demographics.hd_vehicle_count 21 | else null 22 | end) > 1.2 23 | and date_dim.d_year in (1999,1999+1,1999+2) 24 | and store.s_county in ('Ziebach County','Williamson County','Walker County','Ziebach County', 25 | 'Ziebach County','Ziebach County','Ziebach County','Ziebach County') 26 | group by ss_ticket_number,ss_customer_sk) dn,customer 27 | where ss_customer_sk = c_customer_sk 28 | and cnt between 15 and 20 29 | order by c_last_name,c_first_name,c_salutation,c_preferred_cust_flag desc, ss_ticket_number; 30 | 31 | -- end query 1 in stream 0 using template query34.tpl 32 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_48.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query48.tpl 2 | select sum(ss_quantity) 3 | from store_sales, store, customer_demographics, customer_address, date_dim 4 | where s_store_sk = ss_store_sk 5 | and ss_sold_date_sk = d_date_sk and d_year = 1998 6 | and 7 | ( 8 | ( 9 | cd_demo_sk = ss_cdemo_sk 10 | and 11 | cd_marital_status = 'M' 12 | and 13 | cd_education_status = '4 yr Degree' 14 | and 15 | ss_sales_price between 100.00 and 150.00 16 | ) 17 | or 18 | ( 19 | cd_demo_sk = ss_cdemo_sk 20 | and 21 | cd_marital_status = 'D' 22 | and 23 | cd_education_status = 'Primary' 24 | and 25 | ss_sales_price between 50.00 and 100.00 26 | ) 27 | or 28 | ( 29 | cd_demo_sk = ss_cdemo_sk 30 | and 31 | cd_marital_status = 'U' 32 | and 33 | cd_education_status = 'Advanced Degree' 34 | and 35 | ss_sales_price between 150.00 and 200.00 36 | ) 37 | ) 38 | and 39 | ( 40 | ( 41 | ss_addr_sk = ca_address_sk 42 | and 43 | ca_country = 'United States' 44 | and 45 | ca_state in ('KY', 'GA', 'NM') 46 | and ss_net_profit between 0 and 2000 47 | ) 48 | or 49 | (ss_addr_sk = ca_address_sk 50 | and 51 | ca_country = 'United States' 52 | and 53 | ca_state in ('MT', 'OR', 'IN') 54 | and ss_net_profit between 150 and 3000 55 | ) 56 | or 57 | (ss_addr_sk = ca_address_sk 58 | and 59 | ca_country = 'United States' 60 | and 61 | ca_state in ('WI', 'MO', 'WV') 62 | and ss_net_profit between 50 and 25000 63 | ) 64 | ) 65 | ; 66 | 67 | -- end query 1 in stream 0 using template query48.tpl 68 | -------------------------------------------------------------------------------- /benchmark/job/queries/25c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS movie_budget, 2 | MIN(mi_idx.info) AS movie_votes, 3 | MIN(n.name) AS male_writer, 4 | MIN(t.title) AS violent_movie_title 5 | FROM cast_info AS ci, 6 | info_type AS it1, 7 | info_type AS it2, 8 | keyword AS k, 9 | movie_info AS mi, 10 | movie_info_idx AS mi_idx, 11 | movie_keyword AS mk, 12 | name AS n, 13 | title AS t 14 | WHERE ci.note IN ('(writer)', 15 | '(head writer)', 16 | '(written by)', 17 | '(story)', 18 | '(story editor)') 19 | AND it1.info = 'genres' 20 | AND it2.info = 'votes' 21 | AND k.keyword IN ('murder', 22 | 'violence', 23 | 'blood', 24 | 'gore', 25 | 'death', 26 | 'female-nudity', 27 | 'hospital') 28 | AND mi.info IN ('Horror', 29 | 'Action', 30 | 'Sci-Fi', 31 | 'Thriller', 32 | 'Crime', 33 | 'War') 34 | AND n.gender = 'm' 35 | AND t.id = mi.movie_id 36 | AND t.id = mi_idx.movie_id 37 | AND t.id = ci.movie_id 38 | AND t.id = mk.movie_id 39 | AND ci.movie_id = mi.movie_id 40 | AND ci.movie_id = mi_idx.movie_id 41 | AND ci.movie_id = mk.movie_id 42 | AND mi.movie_id = mi_idx.movie_id 43 | AND mi.movie_id = mk.movie_id 44 | AND mi_idx.movie_id = mk.movie_id 45 | AND n.id = ci.person_id 46 | AND it1.id = mi.info_type_id 47 | AND it2.id = mi_idx.info_type_id 48 | AND k.id = mk.keyword_id; 49 | 50 | -------------------------------------------------------------------------------- /benchmark/job/queries/33b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn1.name) AS first_company, 2 | MIN(cn2.name) AS second_company, 3 | MIN(mi_idx1.info) AS first_rating, 4 | MIN(mi_idx2.info) AS second_rating, 5 | MIN(t1.title) AS first_movie, 6 | MIN(t2.title) AS second_movie 7 | FROM company_name AS cn1, 8 | company_name AS cn2, 9 | info_type AS it1, 10 | info_type AS it2, 11 | kind_type AS kt1, 12 | kind_type AS kt2, 13 | link_type AS lt, 14 | movie_companies AS mc1, 15 | movie_companies AS mc2, 16 | movie_info_idx AS mi_idx1, 17 | movie_info_idx AS mi_idx2, 18 | movie_link AS ml, 19 | title AS t1, 20 | title AS t2 21 | WHERE cn1.country_code = '[nl]' 22 | AND it1.info = 'rating' 23 | AND it2.info = 'rating' 24 | AND kt1.kind IN ('tv series') 25 | AND kt2.kind IN ('tv series') 26 | AND lt.link LIKE '%follow%' 27 | AND mi_idx2.info < '3.0' 28 | AND t2.production_year = 2007 29 | AND lt.id = ml.link_type_id 30 | AND t1.id = ml.movie_id 31 | AND t2.id = ml.linked_movie_id 32 | AND it1.id = mi_idx1.info_type_id 33 | AND t1.id = mi_idx1.movie_id 34 | AND kt1.id = t1.kind_id 35 | AND cn1.id = mc1.company_id 36 | AND t1.id = mc1.movie_id 37 | AND ml.movie_id = mi_idx1.movie_id 38 | AND ml.movie_id = mc1.movie_id 39 | AND mi_idx1.movie_id = mc1.movie_id 40 | AND it2.id = mi_idx2.info_type_id 41 | AND t2.id = mi_idx2.movie_id 42 | AND kt2.id = t2.kind_id 43 | AND cn2.id = mc2.company_id 44 | AND t2.id = mc2.movie_id 45 | AND ml.linked_movie_id = mi_idx2.movie_id 46 | AND ml.linked_movie_id = mc2.movie_id 47 | AND mi_idx2.movie_id = mc2.movie_id; 48 | 49 | -------------------------------------------------------------------------------- /benchmark/job/queries/24a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS voiced_char_name, 2 | MIN(n.name) AS voicing_actress_name, 3 | MIN(t.title) AS voiced_action_movie_jap_eng 4 | FROM aka_name AS an, 5 | char_name AS chn, 6 | cast_info AS ci, 7 | company_name AS cn, 8 | info_type AS it, 9 | keyword AS k, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_keyword AS mk, 13 | name AS n, 14 | role_type AS rt, 15 | title AS t 16 | WHERE ci.note IN ('(voice)', 17 | '(voice: Japanese version)', 18 | '(voice) (uncredited)', 19 | '(voice: English version)') 20 | AND cn.country_code ='[us]' 21 | AND it.info = 'release dates' 22 | AND k.keyword IN ('hero', 23 | 'martial-arts', 24 | 'hand-to-hand-combat') 25 | AND mi.info IS NOT NULL 26 | AND (mi.info LIKE 'Japan:%201%' 27 | OR mi.info LIKE 'USA:%201%') 28 | AND n.gender ='f' 29 | AND n.name LIKE '%An%' 30 | AND rt.role ='actress' 31 | AND t.production_year > 2010 32 | AND t.id = mi.movie_id 33 | AND t.id = mc.movie_id 34 | AND t.id = ci.movie_id 35 | AND t.id = mk.movie_id 36 | AND mc.movie_id = ci.movie_id 37 | AND mc.movie_id = mi.movie_id 38 | AND mc.movie_id = mk.movie_id 39 | AND mi.movie_id = ci.movie_id 40 | AND mi.movie_id = mk.movie_id 41 | AND ci.movie_id = mk.movie_id 42 | AND cn.id = mc.company_id 43 | AND it.id = mi.info_type_id 44 | AND n.id = ci.person_id 45 | AND rt.id = ci.role_id 46 | AND n.id = an.person_id 47 | AND ci.person_id = an.person_id 48 | AND chn.id = ci.person_role_id 49 | AND k.id = mk.keyword_id; 50 | 51 | -------------------------------------------------------------------------------- /benchmark/job/queries/26c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS character_name, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS complete_hero_movie 4 | FROM complete_cast AS cc, 5 | comp_cast_type AS cct1, 6 | comp_cast_type AS cct2, 7 | char_name AS chn, 8 | cast_info AS ci, 9 | info_type AS it2, 10 | keyword AS k, 11 | kind_type AS kt, 12 | movie_info_idx AS mi_idx, 13 | movie_keyword AS mk, 14 | name AS n, 15 | title AS t 16 | WHERE cct1.kind = 'cast' 17 | AND cct2.kind LIKE '%complete%' 18 | AND chn.name IS NOT NULL 19 | AND (chn.name LIKE '%man%' 20 | OR chn.name LIKE '%Man%') 21 | AND it2.info = 'rating' 22 | AND k.keyword IN ('superhero', 23 | 'marvel-comics', 24 | 'based-on-comic', 25 | 'tv-special', 26 | 'fight', 27 | 'violence', 28 | 'magnet', 29 | 'web', 30 | 'claw', 31 | 'laser') 32 | AND kt.kind = 'movie' 33 | AND t.production_year > 2000 34 | AND kt.id = t.kind_id 35 | AND t.id = mk.movie_id 36 | AND t.id = ci.movie_id 37 | AND t.id = cc.movie_id 38 | AND t.id = mi_idx.movie_id 39 | AND mk.movie_id = ci.movie_id 40 | AND mk.movie_id = cc.movie_id 41 | AND mk.movie_id = mi_idx.movie_id 42 | AND ci.movie_id = cc.movie_id 43 | AND ci.movie_id = mi_idx.movie_id 44 | AND cc.movie_id = mi_idx.movie_id 45 | AND chn.id = ci.person_role_id 46 | AND n.id = ci.person_id 47 | AND k.id = mk.keyword_id 48 | AND cct1.id = cc.subject_id 49 | AND cct2.id = cc.status_id 50 | AND it2.id = mi_idx.info_type_id; 51 | 52 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_68.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query68.tpl 2 | select c_last_name 3 | ,c_first_name 4 | ,ca_city 5 | ,bought_city 6 | ,ss_ticket_number 7 | ,extended_price 8 | ,extended_tax 9 | ,list_price 10 | from (select ss_ticket_number 11 | ,ss_customer_sk 12 | ,ca_city bought_city 13 | ,sum(ss_ext_sales_price) extended_price 14 | ,sum(ss_ext_list_price) list_price 15 | ,sum(ss_ext_tax) extended_tax 16 | from store_sales 17 | ,date_dim 18 | ,store 19 | ,household_demographics 20 | ,customer_address 21 | where store_sales.ss_sold_date_sk = date_dim.d_date_sk 22 | and store_sales.ss_store_sk = store.s_store_sk 23 | and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk 24 | and store_sales.ss_addr_sk = customer_address.ca_address_sk 25 | and date_dim.d_dom between 1 and 2 26 | and (household_demographics.hd_dep_count = 7 or 27 | household_demographics.hd_vehicle_count= 2) 28 | and date_dim.d_year in (2000,2000+1,2000+2) 29 | and store.s_city in ('Fairview','Oak Grove') 30 | group by ss_ticket_number 31 | ,ss_customer_sk 32 | ,ss_addr_sk,ca_city) dn 33 | ,customer 34 | ,customer_address current_addr 35 | where ss_customer_sk = c_customer_sk 36 | and customer.c_current_addr_sk = current_addr.ca_address_sk 37 | and current_addr.ca_city <> bought_city 38 | order by c_last_name 39 | ,ss_ticket_number 40 | limit 100; 41 | 42 | -- end query 1 in stream 0 using template query68.tpl 43 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_69.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query69.tpl 2 | select 3 | cd_gender, 4 | cd_marital_status, 5 | cd_education_status, 6 | count(*) cnt1, 7 | cd_purchase_estimate, 8 | count(*) cnt2, 9 | cd_credit_rating, 10 | count(*) cnt3 11 | from 12 | customer c,customer_address ca,customer_demographics 13 | where 14 | c.c_current_addr_sk = ca.ca_address_sk and 15 | ca_state in ('CO','IL','MN') and 16 | cd_demo_sk = c.c_current_cdemo_sk and 17 | exists (select * 18 | from store_sales,date_dim 19 | where c.c_customer_sk = ss_customer_sk and 20 | ss_sold_date_sk = d_date_sk and 21 | d_year = 1999 and 22 | d_moy between 1 and 1+2) and 23 | (not exists (select * 24 | from web_sales,date_dim 25 | where c.c_customer_sk = ws_bill_customer_sk and 26 | ws_sold_date_sk = d_date_sk and 27 | d_year = 1999 and 28 | d_moy between 1 and 1+2) and 29 | not exists (select * 30 | from catalog_sales,date_dim 31 | where c.c_customer_sk = cs_ship_customer_sk and 32 | cs_sold_date_sk = d_date_sk and 33 | d_year = 1999 and 34 | d_moy between 1 and 1+2)) 35 | group by cd_gender, 36 | cd_marital_status, 37 | cd_education_status, 38 | cd_purchase_estimate, 39 | cd_credit_rating 40 | order by cd_gender, 41 | cd_marital_status, 42 | cd_education_status, 43 | cd_purchase_estimate, 44 | cd_credit_rating 45 | limit 100; 46 | 47 | -- end query 1 in stream 0 using template query69.tpl 48 | -------------------------------------------------------------------------------- /benchmark/job/queries/22d.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS movie_company, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS western_violent_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | info_type AS it2, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_info_idx AS mi_idx, 13 | movie_keyword AS mk, 14 | title AS t 15 | WHERE cn.country_code != '[us]' 16 | AND it1.info = 'countries' 17 | AND it2.info = 'rating' 18 | AND k.keyword IN ('murder', 19 | 'murder-in-title', 20 | 'blood', 21 | 'violence') 22 | AND kt.kind IN ('movie', 23 | 'episode') 24 | AND mi.info IN ('Sweden', 25 | 'Norway', 26 | 'Germany', 27 | 'Denmark', 28 | 'Swedish', 29 | 'Danish', 30 | 'Norwegian', 31 | 'German', 32 | 'USA', 33 | 'American') 34 | AND mi_idx.info < '8.5' 35 | AND t.production_year > 2005 36 | AND kt.id = t.kind_id 37 | AND t.id = mi.movie_id 38 | AND t.id = mk.movie_id 39 | AND t.id = mi_idx.movie_id 40 | AND t.id = mc.movie_id 41 | AND mk.movie_id = mi.movie_id 42 | AND mk.movie_id = mi_idx.movie_id 43 | AND mk.movie_id = mc.movie_id 44 | AND mi.movie_id = mi_idx.movie_id 45 | AND mi.movie_id = mc.movie_id 46 | AND mc.movie_id = mi_idx.movie_id 47 | AND k.id = mk.keyword_id 48 | AND it1.id = mi.info_type_id 49 | AND it2.id = mi_idx.info_type_id 50 | AND ct.id = mc.company_type_id 51 | AND cn.id = mc.company_id; 52 | 53 | -------------------------------------------------------------------------------- /benchmark/job/queries/27b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS producing_company, 2 | MIN(lt.link) AS link_type, 3 | MIN(t.title) AS complete_western_sequel 4 | FROM complete_cast AS cc, 5 | comp_cast_type AS cct1, 6 | comp_cast_type AS cct2, 7 | company_name AS cn, 8 | company_type AS ct, 9 | keyword AS k, 10 | link_type AS lt, 11 | movie_companies AS mc, 12 | movie_info AS mi, 13 | movie_keyword AS mk, 14 | movie_link AS ml, 15 | title AS t 16 | WHERE cct1.kind IN ('cast', 17 | 'crew') 18 | AND cct2.kind = 'complete' 19 | AND cn.country_code !='[pl]' 20 | AND (cn.name LIKE '%Film%' 21 | OR cn.name LIKE '%Warner%') 22 | AND ct.kind ='production companies' 23 | AND k.keyword ='sequel' 24 | AND lt.link LIKE '%follow%' 25 | AND mc.note IS NULL 26 | AND mi.info IN ('Sweden', 27 | 'Germany', 28 | 'Swedish', 29 | 'German') 30 | AND t.production_year = 1998 31 | AND lt.id = ml.link_type_id 32 | AND ml.movie_id = t.id 33 | AND t.id = mk.movie_id 34 | AND mk.keyword_id = k.id 35 | AND t.id = mc.movie_id 36 | AND mc.company_type_id = ct.id 37 | AND mc.company_id = cn.id 38 | AND mi.movie_id = t.id 39 | AND t.id = cc.movie_id 40 | AND cct1.id = cc.subject_id 41 | AND cct2.id = cc.status_id 42 | AND ml.movie_id = mk.movie_id 43 | AND ml.movie_id = mc.movie_id 44 | AND mk.movie_id = mc.movie_id 45 | AND ml.movie_id = mi.movie_id 46 | AND mk.movie_id = mi.movie_id 47 | AND mc.movie_id = mi.movie_id 48 | AND ml.movie_id = cc.movie_id 49 | AND mk.movie_id = cc.movie_id 50 | AND mc.movie_id = cc.movie_id 51 | AND mi.movie_id = cc.movie_id; 52 | 53 | -------------------------------------------------------------------------------- /benchmark/job/queries/27a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS producing_company, 2 | MIN(lt.link) AS link_type, 3 | MIN(t.title) AS complete_western_sequel 4 | FROM complete_cast AS cc, 5 | comp_cast_type AS cct1, 6 | comp_cast_type AS cct2, 7 | company_name AS cn, 8 | company_type AS ct, 9 | keyword AS k, 10 | link_type AS lt, 11 | movie_companies AS mc, 12 | movie_info AS mi, 13 | movie_keyword AS mk, 14 | movie_link AS ml, 15 | title AS t 16 | WHERE cct1.kind IN ('cast', 17 | 'crew') 18 | AND cct2.kind = 'complete' 19 | AND cn.country_code !='[pl]' 20 | AND (cn.name LIKE '%Film%' 21 | OR cn.name LIKE '%Warner%') 22 | AND ct.kind ='production companies' 23 | AND k.keyword ='sequel' 24 | AND lt.link LIKE '%follow%' 25 | AND mc.note IS NULL 26 | AND mi.info IN ('Sweden', 27 | 'Germany', 28 | 'Swedish', 29 | 'German') 30 | AND t.production_year BETWEEN 1950 AND 2000 31 | AND lt.id = ml.link_type_id 32 | AND ml.movie_id = t.id 33 | AND t.id = mk.movie_id 34 | AND mk.keyword_id = k.id 35 | AND t.id = mc.movie_id 36 | AND mc.company_type_id = ct.id 37 | AND mc.company_id = cn.id 38 | AND mi.movie_id = t.id 39 | AND t.id = cc.movie_id 40 | AND cct1.id = cc.subject_id 41 | AND cct2.id = cc.status_id 42 | AND ml.movie_id = mk.movie_id 43 | AND ml.movie_id = mc.movie_id 44 | AND mk.movie_id = mc.movie_id 45 | AND ml.movie_id = mi.movie_id 46 | AND mk.movie_id = mi.movie_id 47 | AND mc.movie_id = mi.movie_id 48 | AND ml.movie_id = cc.movie_id 49 | AND mk.movie_id = cc.movie_id 50 | AND mc.movie_id = cc.movie_id 51 | AND mi.movie_id = cc.movie_id; 52 | 53 | -------------------------------------------------------------------------------- /benchmark/job/queries/33a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn1.name) AS first_company, 2 | MIN(cn2.name) AS second_company, 3 | MIN(mi_idx1.info) AS first_rating, 4 | MIN(mi_idx2.info) AS second_rating, 5 | MIN(t1.title) AS first_movie, 6 | MIN(t2.title) AS second_movie 7 | FROM company_name AS cn1, 8 | company_name AS cn2, 9 | info_type AS it1, 10 | info_type AS it2, 11 | kind_type AS kt1, 12 | kind_type AS kt2, 13 | link_type AS lt, 14 | movie_companies AS mc1, 15 | movie_companies AS mc2, 16 | movie_info_idx AS mi_idx1, 17 | movie_info_idx AS mi_idx2, 18 | movie_link AS ml, 19 | title AS t1, 20 | title AS t2 21 | WHERE cn1.country_code = '[us]' 22 | AND it1.info = 'rating' 23 | AND it2.info = 'rating' 24 | AND kt1.kind IN ('tv series') 25 | AND kt2.kind IN ('tv series') 26 | AND lt.link IN ('sequel', 27 | 'follows', 28 | 'followed by') 29 | AND mi_idx2.info < '3.0' 30 | AND t2.production_year BETWEEN 2005 AND 2008 31 | AND lt.id = ml.link_type_id 32 | AND t1.id = ml.movie_id 33 | AND t2.id = ml.linked_movie_id 34 | AND it1.id = mi_idx1.info_type_id 35 | AND t1.id = mi_idx1.movie_id 36 | AND kt1.id = t1.kind_id 37 | AND cn1.id = mc1.company_id 38 | AND t1.id = mc1.movie_id 39 | AND ml.movie_id = mi_idx1.movie_id 40 | AND ml.movie_id = mc1.movie_id 41 | AND mi_idx1.movie_id = mc1.movie_id 42 | AND it2.id = mi_idx2.info_type_id 43 | AND t2.id = mi_idx2.movie_id 44 | AND kt2.id = t2.kind_id 45 | AND cn2.id = mc2.company_id 46 | AND t2.id = mc2.movie_id 47 | AND ml.linked_movie_id = mi_idx2.movie_id 48 | AND ml.linked_movie_id = mc2.movie_id 49 | AND mi_idx2.movie_id = mc2.movie_id; 50 | 51 | -------------------------------------------------------------------------------- /benchmark/job/queries/26a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS character_name, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(n.name) AS playing_actor, 4 | MIN(t.title) AS complete_hero_movie 5 | FROM complete_cast AS cc, 6 | comp_cast_type AS cct1, 7 | comp_cast_type AS cct2, 8 | char_name AS chn, 9 | cast_info AS ci, 10 | info_type AS it2, 11 | keyword AS k, 12 | kind_type AS kt, 13 | movie_info_idx AS mi_idx, 14 | movie_keyword AS mk, 15 | name AS n, 16 | title AS t 17 | WHERE cct1.kind = 'cast' 18 | AND cct2.kind LIKE '%complete%' 19 | AND chn.name IS NOT NULL 20 | AND (chn.name LIKE '%man%' 21 | OR chn.name LIKE '%Man%') 22 | AND it2.info = 'rating' 23 | AND k.keyword IN ('superhero', 24 | 'marvel-comics', 25 | 'based-on-comic', 26 | 'tv-special', 27 | 'fight', 28 | 'violence', 29 | 'magnet', 30 | 'web', 31 | 'claw', 32 | 'laser') 33 | AND kt.kind = 'movie' 34 | AND mi_idx.info > '7.0' 35 | AND t.production_year > 2000 36 | AND kt.id = t.kind_id 37 | AND t.id = mk.movie_id 38 | AND t.id = ci.movie_id 39 | AND t.id = cc.movie_id 40 | AND t.id = mi_idx.movie_id 41 | AND mk.movie_id = ci.movie_id 42 | AND mk.movie_id = cc.movie_id 43 | AND mk.movie_id = mi_idx.movie_id 44 | AND ci.movie_id = cc.movie_id 45 | AND ci.movie_id = mi_idx.movie_id 46 | AND cc.movie_id = mi_idx.movie_id 47 | AND chn.id = ci.person_role_id 48 | AND n.id = ci.person_id 49 | AND k.id = mk.keyword_id 50 | AND cct1.id = cc.subject_id 51 | AND cct2.id = cc.status_id 52 | AND it2.id = mi_idx.info_type_id; 53 | 54 | -------------------------------------------------------------------------------- /benchmark/job/queries/22c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn.name) AS movie_company, 2 | MIN(mi_idx.info) AS rating, 3 | MIN(t.title) AS western_violent_movie 4 | FROM company_name AS cn, 5 | company_type AS ct, 6 | info_type AS it1, 7 | info_type AS it2, 8 | keyword AS k, 9 | kind_type AS kt, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_info_idx AS mi_idx, 13 | movie_keyword AS mk, 14 | title AS t 15 | WHERE cn.country_code != '[us]' 16 | AND it1.info = 'countries' 17 | AND it2.info = 'rating' 18 | AND k.keyword IN ('murder', 19 | 'murder-in-title', 20 | 'blood', 21 | 'violence') 22 | AND kt.kind IN ('movie', 23 | 'episode') 24 | AND mc.note NOT LIKE '%(USA)%' 25 | AND mc.note LIKE '%(200%)%' 26 | AND mi.info IN ('Sweden', 27 | 'Norway', 28 | 'Germany', 29 | 'Denmark', 30 | 'Swedish', 31 | 'Danish', 32 | 'Norwegian', 33 | 'German', 34 | 'USA', 35 | 'American') 36 | AND mi_idx.info < '8.5' 37 | AND t.production_year > 2005 38 | AND kt.id = t.kind_id 39 | AND t.id = mi.movie_id 40 | AND t.id = mk.movie_id 41 | AND t.id = mi_idx.movie_id 42 | AND t.id = mc.movie_id 43 | AND mk.movie_id = mi.movie_id 44 | AND mk.movie_id = mi_idx.movie_id 45 | AND mk.movie_id = mc.movie_id 46 | AND mi.movie_id = mi_idx.movie_id 47 | AND mi.movie_id = mc.movie_id 48 | AND mc.movie_id = mi_idx.movie_id 49 | AND k.id = mk.keyword_id 50 | AND it1.id = mi.info_type_id 51 | AND it2.id = mi_idx.info_type_id 52 | AND ct.id = mc.company_type_id 53 | AND cn.id = mc.company_id; 54 | 55 | -------------------------------------------------------------------------------- /benchmark/job/queries/24b.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(chn.name) AS voiced_char_name, 2 | MIN(n.name) AS voicing_actress_name, 3 | MIN(t.title) AS kung_fu_panda 4 | FROM aka_name AS an, 5 | char_name AS chn, 6 | cast_info AS ci, 7 | company_name AS cn, 8 | info_type AS it, 9 | keyword AS k, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_keyword AS mk, 13 | name AS n, 14 | role_type AS rt, 15 | title AS t 16 | WHERE ci.note IN ('(voice)', 17 | '(voice: Japanese version)', 18 | '(voice) (uncredited)', 19 | '(voice: English version)') 20 | AND cn.country_code ='[us]' 21 | AND cn.name = 'DreamWorks Animation' 22 | AND it.info = 'release dates' 23 | AND k.keyword IN ('hero', 24 | 'martial-arts', 25 | 'hand-to-hand-combat', 26 | 'computer-animated-movie') 27 | AND mi.info IS NOT NULL 28 | AND (mi.info LIKE 'Japan:%201%' 29 | OR mi.info LIKE 'USA:%201%') 30 | AND n.gender ='f' 31 | AND n.name LIKE '%An%' 32 | AND rt.role ='actress' 33 | AND t.production_year > 2010 34 | AND t.title LIKE 'Kung Fu Panda%' 35 | AND t.id = mi.movie_id 36 | AND t.id = mc.movie_id 37 | AND t.id = ci.movie_id 38 | AND t.id = mk.movie_id 39 | AND mc.movie_id = ci.movie_id 40 | AND mc.movie_id = mi.movie_id 41 | AND mc.movie_id = mk.movie_id 42 | AND mi.movie_id = ci.movie_id 43 | AND mi.movie_id = mk.movie_id 44 | AND ci.movie_id = mk.movie_id 45 | AND cn.id = mc.company_id 46 | AND it.id = mi.info_type_id 47 | AND n.id = ci.person_id 48 | AND rt.id = ci.role_id 49 | AND n.id = an.person_id 50 | AND ci.person_id = an.person_id 51 | AND chn.id = ci.person_role_id 52 | AND k.id = mk.keyword_id; 53 | 54 | -------------------------------------------------------------------------------- /benchmark/job/queries/31a.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(mi.info) AS movie_budget, 2 | MIN(mi_idx.info) AS movie_votes, 3 | MIN(n.name) AS writer, 4 | MIN(t.title) AS violent_liongate_movie 5 | FROM cast_info AS ci, 6 | company_name AS cn, 7 | info_type AS it1, 8 | info_type AS it2, 9 | keyword AS k, 10 | movie_companies AS mc, 11 | movie_info AS mi, 12 | movie_info_idx AS mi_idx, 13 | movie_keyword AS mk, 14 | name AS n, 15 | title AS t 16 | WHERE ci.note IN ('(writer)', 17 | '(head writer)', 18 | '(written by)', 19 | '(story)', 20 | '(story editor)') 21 | AND cn.name LIKE 'Lionsgate%' 22 | AND it1.info = 'genres' 23 | AND it2.info = 'votes' 24 | AND k.keyword IN ('murder', 25 | 'violence', 26 | 'blood', 27 | 'gore', 28 | 'death', 29 | 'female-nudity', 30 | 'hospital') 31 | AND mi.info IN ('Horror', 32 | 'Thriller') 33 | AND n.gender = 'm' 34 | AND t.id = mi.movie_id 35 | AND t.id = mi_idx.movie_id 36 | AND t.id = ci.movie_id 37 | AND t.id = mk.movie_id 38 | AND t.id = mc.movie_id 39 | AND ci.movie_id = mi.movie_id 40 | AND ci.movie_id = mi_idx.movie_id 41 | AND ci.movie_id = mk.movie_id 42 | AND ci.movie_id = mc.movie_id 43 | AND mi.movie_id = mi_idx.movie_id 44 | AND mi.movie_id = mk.movie_id 45 | AND mi.movie_id = mc.movie_id 46 | AND mi_idx.movie_id = mk.movie_id 47 | AND mi_idx.movie_id = mc.movie_id 48 | AND mk.movie_id = mc.movie_id 49 | AND n.id = ci.person_id 50 | AND it1.id = mi.info_type_id 51 | AND it2.id = mi_idx.info_type_id 52 | AND k.id = mk.keyword_id 53 | AND cn.id = mc.company_id; 54 | 55 | -------------------------------------------------------------------------------- /pkg/database/column.go: -------------------------------------------------------------------------------- 1 | // Copyright 2020 PingCAP, Inc. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | package database 15 | 16 | import ( 17 | "fmt" 18 | 19 | "github.com/pingcap/parser/ast" 20 | "github.com/pingcap/parser/model" 21 | "github.com/pingcap/parser/types" 22 | 23 | "github.com/chaos-mesh/horoscope/pkg/executor" 24 | ) 25 | 26 | // Column defines database column 27 | type Column struct { 28 | Table *Table 29 | Name model.CIStr 30 | Type *types.FieldType 31 | Null bool 32 | Key string 33 | } 34 | 35 | func (c *Column) String() string { 36 | return fmt.Sprintf("%s.%s", c.Table.Name, c.Name) 37 | } 38 | 39 | func (c *Column) FullType() string { 40 | return c.Type.String() 41 | } 42 | 43 | func (c *Column) ColumnName() *ast.ColumnName { 44 | return &ast.ColumnName{ 45 | Name: c.Name, 46 | Table: c.Table.Name, 47 | } 48 | } 49 | 50 | func LoadColumn(table *Table, row executor.Row) (column *Column, err error) { 51 | tp, err := NewParser().ParseFieldType(string(row[1])) 52 | if err != nil { 53 | return 54 | } 55 | 56 | column = &Column{ 57 | Table: table, 58 | Name: model.NewCIStr(string(row[0])), 59 | Type: tp, 60 | Null: ifNull(string(row[2])), 61 | Key: string(row[3]), 62 | } 63 | return 64 | } 65 | 66 | func ifNull(null string) bool { 67 | return null == "YES" 68 | } 69 | -------------------------------------------------------------------------------- /benchmark/job/queries/33c.sql: -------------------------------------------------------------------------------- 1 | SELECT MIN(cn1.name) AS first_company, 2 | MIN(cn2.name) AS second_company, 3 | MIN(mi_idx1.info) AS first_rating, 4 | MIN(mi_idx2.info) AS second_rating, 5 | MIN(t1.title) AS first_movie, 6 | MIN(t2.title) AS second_movie 7 | FROM company_name AS cn1, 8 | company_name AS cn2, 9 | info_type AS it1, 10 | info_type AS it2, 11 | kind_type AS kt1, 12 | kind_type AS kt2, 13 | link_type AS lt, 14 | movie_companies AS mc1, 15 | movie_companies AS mc2, 16 | movie_info_idx AS mi_idx1, 17 | movie_info_idx AS mi_idx2, 18 | movie_link AS ml, 19 | title AS t1, 20 | title AS t2 21 | WHERE cn1.country_code != '[us]' 22 | AND it1.info = 'rating' 23 | AND it2.info = 'rating' 24 | AND kt1.kind IN ('tv series', 25 | 'episode') 26 | AND kt2.kind IN ('tv series', 27 | 'episode') 28 | AND lt.link IN ('sequel', 29 | 'follows', 30 | 'followed by') 31 | AND mi_idx2.info < '3.5' 32 | AND t2.production_year BETWEEN 2000 AND 2010 33 | AND lt.id = ml.link_type_id 34 | AND t1.id = ml.movie_id 35 | AND t2.id = ml.linked_movie_id 36 | AND it1.id = mi_idx1.info_type_id 37 | AND t1.id = mi_idx1.movie_id 38 | AND kt1.id = t1.kind_id 39 | AND cn1.id = mc1.company_id 40 | AND t1.id = mc1.movie_id 41 | AND ml.movie_id = mi_idx1.movie_id 42 | AND ml.movie_id = mc1.movie_id 43 | AND mi_idx1.movie_id = mc1.movie_id 44 | AND it2.id = mi_idx2.info_type_id 45 | AND t2.id = mi_idx2.movie_id 46 | AND kt2.id = t2.kind_id 47 | AND cn2.id = mc2.company_id 48 | AND t2.id = mc2.movie_id 49 | AND ml.linked_movie_id = mi_idx2.movie_id 50 | AND ml.linked_movie_id = mc2.movie_id 51 | AND mi_idx2.movie_id = mc2.movie_id; 52 | 53 | -------------------------------------------------------------------------------- /benchmark/tpcds/queries/query_71.sql: -------------------------------------------------------------------------------- 1 | -- start query 1 in stream 0 using template query71.tpl 2 | select i_brand_id brand_id, i_brand brand,t_hour,t_minute, 3 | sum(ext_price) ext_price 4 | from item, (select ws_ext_sales_price as ext_price, 5 | ws_sold_date_sk as sold_date_sk, 6 | ws_item_sk as sold_item_sk, 7 | ws_sold_time_sk as time_sk 8 | from web_sales,date_dim 9 | where d_date_sk = ws_sold_date_sk 10 | and d_moy=12 11 | and d_year=2000 12 | union all 13 | select cs_ext_sales_price as ext_price, 14 | cs_sold_date_sk as sold_date_sk, 15 | cs_item_sk as sold_item_sk, 16 | cs_sold_time_sk as time_sk 17 | from catalog_sales,date_dim 18 | where d_date_sk = cs_sold_date_sk 19 | and d_moy=12 20 | and d_year=2000 21 | union all 22 | select ss_ext_sales_price as ext_price, 23 | ss_sold_date_sk as sold_date_sk, 24 | ss_item_sk as sold_item_sk, 25 | ss_sold_time_sk as time_sk 26 | from store_sales,date_dim 27 | where d_date_sk = ss_sold_date_sk 28 | and d_moy=12 29 | and d_year=2000 30 | ) tmp,time_dim 31 | where 32 | sold_item_sk = i_item_sk 33 | and i_manager_id=1 34 | and time_sk = t_time_sk 35 | and (t_meal_time = 'breakfast' or t_meal_time = 'dinner') 36 | group by i_brand, i_brand_id,t_hour,t_minute 37 | order by ext_price desc, i_brand_id 38 | ; 39 | 40 | -- end query 1 in stream 0 using template query71.tpl 41 | --------------------------------------------------------------------------------