2
# This grammar attempts to create realistic queries against the DBT-3 data set. The following rules apply:
4
# * standard DBT-3 prefixes are used for stuff ,e.g. ps = partsupp , r = region , etc.
6
# * each join is one of several plausible join chains allowed by the dataset
8
# * each WHERE condition is realistic for the column being queried and only uses table that are known to participate in the particular join chain
10
# * More AND is used as opposed to OR to keep with the spirit of the original queries from the benchmark
12
# * MariaDB's table elimination will remove unnecessary tables that have been joined but for which no WHERE conditions apply
14
# * The joinable fields are indexed in both tables and most WHERE conditions also involve indexes. To provide some non-indexed clauses
15
# * we include some WHERE conditions on the comment field that appears in each table
17
# * In order to have realistic HAVING, for the HAVING queries we only use fields that hold currency ammounts
2
# supplier -> partsupp -> lineitem -> orders -> customer /* -> nation -> region */
7
SELECT select_list_s_ps_l_o_c join_s_ps_l_o_c order_by_1_2 |
8
SELECT aggregate field_s_ps_l_o_c ) join_s_ps_l_o_c |
9
SELECT field_s_ps_l_o_c , aggregate field_s_ps_l_o_c ) join_s_ps_l_o_c GROUP BY 1 order_by_1 |
10
SELECT field_s_ps_l_o_c , field_s_ps_l_o_c , aggregate field_s_ps_l_o_c ) join_s_ps_l_o_c GROUP BY 1 , 2 order_by_1_2 ;
21
select_r_n_s_ps_l_o_c | select_p_ps_s_n_r | select_p_ps_l_o_c_r_n_s | currency_select_p_ps_s_l_o_c;
23
# region -> nation -> supplier -> partsupp -> lineitem -> orders -> customer
25
select_r_n_s_ps_l_o_c:
26
SELECT select_list_r_n_s_ps_l_o_c join_r_n_s_ps_l_o_c WHERE where_r_n_s_ps_l_o_c order_by_1_2 |
27
SELECT aggregate field_r_n_s_ps_l_o_c ) join_r_n_s_ps_l_o_c WHERE where_r_n_s_ps_l_o_c |
28
SELECT field_r_n_s_ps_l_o_c , aggregate field_r_n_s_ps_l_o_c ) join_r_n_s_ps_l_o_c WHERE where_r_n_s_ps_l_o_c GROUP BY 1 asc_desc order_by_1 |
29
SELECT field_r_n_s_ps_l_o_c , field_r_n_s_ps_l_o_c , aggregate field_r_n_s_ps_l_o_c ) join_r_n_s_ps_l_o_c WHERE where_r_n_s_ps_l_o_c GROUP BY 1 asc_desc , 2 asc_desc order_by_1_2 ;
31
# part -> partsupp -> supplier -> nation -> region
13
SELECT select_list_p_ps_s_n_r join_p_ps_s_n_r order_by_1_2 |
14
SELECT aggregate field_p_ps_s_n_r ) join_p_ps_s_n_r |
15
SELECT field_p_ps_s_n_r , aggregate field_p_ps_s_n_r ) join_p_ps_s_n_r GROUP BY 1 order_by_1 |
16
SELECT field_p_ps_s_n_r , field_p_ps_s_n_r , aggregate field_p_ps_s_n_r ) join_p_ps_s_n_r GROUP BY 1 , 2 order_by_1_2 ;
34
SELECT select_list_p_ps_s_n_r join_p_ps_s_n_r WHERE where_p_ps_s_n_r order_by_1_2 |
35
SELECT aggregate field_p_ps_s_n_r ) join_p_ps_s_n_r WHERE where_p_ps_s_n_r |
36
SELECT field_p_ps_s_n_r , aggregate field_p_ps_s_n_r ) join_p_ps_s_n_r WHERE where_p_ps_s_n_r GROUP BY 1 asc_desc order_by_1 |
37
SELECT field_p_ps_s_n_r , field_p_ps_s_n_r , aggregate field_p_ps_s_n_r ) join_p_ps_s_n_r WHERE where_p_ps_s_n_r GROUP BY 1 asc_desc , 2 asc_desc order_by_1_2 ;
39
# part -> partsupp -> lineitem -> orders -> customer -> region -> nation -> supplier
41
select_p_ps_l_o_c_r_n_s:
42
SELECT select_list_p_ps_l_o_c_r_n_s join_p_ps_l_o_c_r_n_s WHERE where_p_ps_l_o_c_r_n_s order_by_1_2 |
43
SELECT aggregate field_p_ps_l_o_c_r_n_s ) join_p_ps_l_o_c_r_n_s WHERE where_p_ps_l_o_c_r_n_s |
44
SELECT field_p_ps_l_o_c_r_n_s , aggregate field_p_ps_l_o_c_r_n_s ) join_p_ps_l_o_c_r_n_s WHERE where_p_ps_l_o_c_r_n_s GROUP BY 1 asc_desc order_by_1 |
45
SELECT field_p_ps_l_o_c_r_n_s , field_p_ps_l_o_c_r_n_s , aggregate field_p_ps_l_o_c_r_n_s ) join_p_ps_l_o_c_r_n_s WHERE where_p_ps_l_o_c_r_n_s GROUP BY 1 asc_desc , 2 asc_desc order_by_1_2 ;
47
# part -> partsupp -> lineitem -> orders -> customer with currency fields only
48
# This allows for a meaningful HAVING condition because the type and the spirit of values in the SELECT list will be known
50
currency_select_p_ps_s_l_o_c:
51
SELECT currency_field_p_ps_s_l_o_c AS currency1 , currency_field_p_ps_s_l_o_c AS currency2 join_p_ps_s_l_o_c WHERE where_p_ps_s_l_o_c HAVING currency_having order_by_1_2 |
52
SELECT field_p_ps_s_l_o_c, currency_field_p_ps_s_l_o_c AS currency1 , aggregate currency_field_p_ps_s_l_o_c ) AS currency2 join_p_ps_s_l_o_c WHERE where_p_ps_s_l_o_c GROUP BY 1 , 2 HAVING currency_having order_by_1_2 ;
55
| | | | | | ASC | DESC ;
58
| | ORDER BY 1 ; # 30% of queries have ORDER BY on a single column
22
| ORDER BY 1 | ORDER BY 2 | ORDER BY 1 , 2 ;
61
| | | | | | ORDER BY 1 | ORDER BY 2 | ORDER BY 1 , 2 ; # 30% of queries have ORDER BY on two columns
25
FROM supplier join_type partsupp ON ( s_suppkey = ps_suppkey ) join_type lineitem ON ( partsupp_lineitem_join_cond ) join_type orders ON ( l_orderkey = o_orderkey ) join_type customer ON ( o_custkey = c_custkey ) WHERE where_s_ps_l_o_c ;
64
FROM region join_type nation ON ( r_regionkey = n_regionkey ) join_type supplier ON ( s_nationkey = n_nationkey ) join_type partsupp ON ( s_suppkey = ps_suppkey ) join_type lineitem ON ( partsupp_lineitem_join_cond ) join_type orders ON ( l_orderkey = o_orderkey ) join_type customer ON ( o_custkey = c_custkey ) ;
28
FROM part join_type partsupp ON ( p_partkey = ps_partkey ) join_type supplier ON ( ps_suppkey = s_suppkey ) join_type nation ON ( s_nationkey = n_nationkey ) join_type region ON ( n_regionkey = r_regionkey ) WHERE where_p_ps_s_n_r ;
67
FROM part join_type partsupp ON ( p_partkey = ps_partkey ) join_type supplier ON ( ps_suppkey = s_suppkey ) join_type nation ON ( s_nationkey = n_nationkey ) join_type region ON ( n_regionkey = r_regionkey ) ;
69
join_p_ps_l_o_c_r_n_s:
70
FROM part join_type partsupp ON ( p_partkey = ps_partkey ) join_type lineitem ON ( partsupp_lineitem_join_cond ) join_type orders ON ( l_orderkey = o_orderkey ) join_type customer ON ( o_custkey = c_custkey ) join_type nation ON ( c_nationkey = n_nationkey ) join_type supplier ON ( s_nationkey = n_nationkey ) join_type region ON ( n_regionkey = r_regionkey ) ;
73
FROM part join_type partsupp ON ( p_partkey = ps_partkey ) join_type supplier ON (s_suppkey = ps_suppkey) join_type lineitem ON ( partsupp_lineitem_join_cond ) join_type orders ON ( l_orderkey = o_orderkey ) join_type customer ON ( o_custkey = c_custkey ) ;
31
76
JOIN | LEFT JOIN | RIGHT JOIN ;
36
81
ps_partkey = l_partkey | ps_suppkey = l_suppkey ;
38
83
lineitem_orders_join_cond:
39
l_orderkey = o_orderkey |
40
lineitem_date_field = o_orderdate ;
84
l_orderkey = o_orderkey | lineitem_date_field = o_orderdate ;
42
86
lineitem_date_field:
43
87
l_shipDATE | l_commitDATE | l_receiptDATE ;
45
select_list_s_ps_l_o_c:
46
field_s_ps_l_o_c , field_s_ps_l_o_c | field_s_ps_l_o_c , select_list_s_ps_l_o_c ;
89
select_list_r_n_s_ps_l_o_c:
90
field_r_n_s_ps_l_o_c , field_r_n_s_ps_l_o_c | field_r_n_s_ps_l_o_c , select_list_r_n_s_ps_l_o_c ;
49
field_s | field_ps | field_l | field_o | field_c ;
93
field_r | field_n | field_s | field_ps | field_l | field_o | field_c ;
51
95
select_list_p_ps_s_n_r:
52
96
field_p_ps_s_n_r , field_p_ps_s_n_r | field_p_ps_s_n_r , select_list_p_ps_s_n_r ;
55
99
field_p | field_ps | field_s | field_n | field_r;
101
select_list_p_ps_l_o_c_r_n_s:
102
field_p_ps_l_o_c_r_n_s , field_p_ps_l_o_c_r_n_s | field_p_ps_l_o_c_r_n_s , select_list_p_ps_l_o_c_r_n_s ;
104
field_p_ps_l_o_c_r_n_s:
105
field_p | field_ps | field_l | field_o | field_c | field_r | field_n | field_s ;
108
field_p | field_ps | field_s | field_l | field_o | field_c |;
110
currency_field_p_ps_s_l_o_c:
111
p_retailprice | ps_supplycost | l_extendedprice | o_totalprice | s_acctbal | c_acctbal ;
61
117
s_suppkey | s_nationkey ;
63
120
ps_partkey | ps_suppkey ;
65
123
l_orderkey | l_partkey | l_suppkey | l_linenumber | l_shipDATE | l_commitDATE | l_receiptDATE ;
68
126
o_orderkey | o_custkey ;
70
129
c_custkey | c_nationkey ;
85
cond_s_ps_l_o_c and_or cond_s_ps_l_o_c and_or cond_s_ps_l_o_c | where_s_ps_l_o_c and_or cond_s_ps_l_o_c ;
143
where_r_n_s_ps_l_o_c:
144
cond_r_n_s_ps_l_o_c and_or cond_r_n_s_ps_l_o_c and_or cond_r_n_s_ps_l_o_c | where_r_n_s_ps_l_o_c and_or cond_r_n_s_ps_l_o_c ;
146
cond_r | cond_n | cond_s | cond_ps | cond_l | cond_o | cond_c | cond_l_o | cond_l_o | cond_s_c | cond_ps_l ;
88
149
cond_p_ps_s_n_r and_or cond_p_ps_s_n_r and_or cond_p_ps_s_n_r | where_p_ps_s_n_r and_or cond_p_ps_s_n_r ;
91
cond_s | cond_ps | cond_l | cond_o | cond_c | cond_l_o | cond_l_o | cond_s_c | cond_ps_l ;
94
151
cond_p | cond_ps | cond_s | cond_n | cond_r ;
154
where_p_ps_l_o_c_r_n_s:
155
cond_p_ps_l_o_c_r_n_s and_or cond_p_ps_l_o_c_r_n_s and_or cond_p_ps_l_o_c_r_n_s | where_p_ps_l_o_c_r_n_s and_or cond_p_ps_l_o_c_r_n_s ;
156
cond_p_ps_l_o_c_r_n_s:
157
cond_p | cond_ps | cond_l | cond_o | cond_c | cond_r | cond_n | cond_s ;
160
cond_p_ps_s_l_o_c and_or cond_p_ps_s_l_o_c and_or cond_p_ps_s_l_o_c | where_p_ps_s_l_o_c and_or cond_p_ps_s_l_o_c ;
163
cond_p | cond_ps | cond_s | cond_l | cond_o | cond_c ;
166
currency_having_item |
167
currency_having_item and_or currency_having_item ;
169
currency_having_item:
170
currency_having_field currency_clause ;
172
currency_having_field:
173
currency1 | currency2 ;
97
176
AND | AND | AND | AND | OR ;