~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to conf/dbt3/dbt3-joins.yy

DBT-3 joins grammar with currencies and realistic HAVING clauses

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#
 
2
# This grammar attempts to create realistic queries against the DBT-3 data set. The following rules apply:
 
3
 
4
# * standard DBT-3 prefixes are used for stuff ,e.g. ps = partsupp , r = region , etc.
 
5
#
 
6
# * each join is one of several plausible join chains allowed by the dataset
 
7
#
 
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
 
9
#
 
10
# * More AND is used as opposed to OR to keep with the spirit of the original queries from the benchmark
 
11
#
 
12
# * MariaDB's table elimination will remove unnecessary tables that have been joined but for which no WHERE conditions apply
 
13
#
 
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
 
16
#
 
17
# * In order to have realistic HAVING, for the HAVING queries we only use fields that hold currency ammounts
 
18
#
 
19
 
1
20
query:
2
 
        # supplier -> partsupp -> lineitem -> orders -> customer /* -> nation -> region */
3
 
        select_s_ps_l_o_c |
4
 
        select_p_ps_s_n_r ;
5
 
 
6
 
select_s_ps_l_o_c:
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;
 
22
 
 
23
# region -> nation -> supplier -> partsupp -> lineitem -> orders -> customer
 
24
 
 
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 ;
 
30
 
 
31
# part -> partsupp -> supplier -> nation -> region
11
32
 
12
33
select_p_ps_s_n_r:
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 ;
 
38
 
 
39
# part -> partsupp -> lineitem -> orders -> customer -> region -> nation -> supplier
 
40
 
 
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 ;
 
46
 
 
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
 
49
 
 
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 ;
 
53
 
 
54
asc_desc:
 
55
        | | | | | | ASC | DESC ;
17
56
 
18
57
order_by_1:
19
 
        | ORDER BY 1 ;
 
58
        | | ORDER BY 1 ;                                        # 30% of queries have ORDER BY on a single column
20
59
 
21
60
order_by_1_2:
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
23
62
 
24
 
join_s_ps_l_o_c:
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 ;
 
63
join_r_n_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 ) ;
26
65
 
27
66
join_p_ps_s_n_r:
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 ;
29
 
 
 
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 ) ;
 
68
 
 
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 ) ;
 
71
 
 
72
join_p_ps_s_l_o_c:
 
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 ) ;
 
74
        
30
75
join_type:
31
76
        JOIN | LEFT JOIN | RIGHT JOIN ;
32
77
 
36
81
        ps_partkey = l_partkey | ps_suppkey = l_suppkey ;
37
82
 
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 ;
41
85
 
42
86
lineitem_date_field:
43
87
        l_shipDATE | l_commitDATE | l_receiptDATE ;
44
88
 
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 ;
47
91
 
48
 
field_s_ps_l_o_c:
49
 
        field_s | field_ps | field_l | field_o | field_c ;
 
92
field_r_n_s_ps_l_o_c:
 
93
        field_r | field_n | field_s | field_ps | field_l | field_o | field_c ;
50
94
 
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 ;
54
98
field_p_ps_s_n_r:
55
99
        field_p | field_ps | field_s | field_n | field_r;
56
100
 
 
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 ;
 
103
 
 
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 ;
 
106
 
 
107
field_p_ps_s_l_o_c:
 
108
        field_p | field_ps | field_s | field_l | field_o | field_c |;
 
109
 
 
110
currency_field_p_ps_s_l_o_c:
 
111
        p_retailprice | ps_supplycost | l_extendedprice | o_totalprice | s_acctbal | c_acctbal ;
 
112
 
57
113
field_p:
58
114
        p_partkey;
59
115
 
60
116
field_s:
61
117
        s_suppkey | s_nationkey ;
 
118
 
62
119
field_ps:
63
120
        ps_partkey | ps_suppkey ;
 
121
 
64
122
field_l:
65
123
        l_orderkey | l_partkey | l_suppkey | l_linenumber | l_shipDATE | l_commitDATE | l_receiptDATE ;
66
124
 
67
125
field_o:
68
126
        o_orderkey | o_custkey ;
 
127
 
69
128
field_c:
70
129
        c_custkey | c_nationkey ;
71
130
 
81
140
distinct:
82
141
        | | | DISTINCT ;
83
142
 
84
 
where_s_ps_l_o_c:
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 ;
 
145
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 ;
86
147
 
87
148
where_p_ps_s_n_r:
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 ;
89
 
 
90
 
cond_s_ps_l_o_c:
91
 
        cond_s | cond_ps | cond_l | cond_o | cond_c | cond_l_o | cond_l_o | cond_s_c | cond_ps_l ;
92
 
 
93
150
cond_p_ps_s_n_r:
94
151
        cond_p | cond_ps | cond_s | cond_n | cond_r ;
95
152
 
 
153
 
 
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 ;
 
158
 
 
159
where_p_ps_s_l_o_c:
 
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 ;
 
161
 
 
162
cond_p_ps_s_l_o_c:
 
163
        cond_p | cond_ps | cond_s | cond_l | cond_o | cond_c ;
 
164
 
 
165
currency_having:
 
166
        currency_having_item |
 
167
        currency_having_item and_or currency_having_item ;
 
168
 
 
169
currency_having_item:
 
170
        currency_having_field currency_clause ;
 
171
 
 
172
currency_having_field:
 
173
        currency1 | currency2 ;
 
174
 
96
175
and_or:
97
176
        AND | AND | AND | AND | OR ;
98
177
 
101
180
#
102
181
 
103
182
cond_l_o:
104
 
        l_extendedprice comp_op o_totalprice |
105
 
        lineitem_date_field comp_op o_orderdate ;
 
183
        l_extendedprice comp_op o_totalprice | lineitem_date_field comp_op o_orderdate ;
106
184
 
107
185
cond_ps_l:
108
 
        ps_availqty comp_op l_quantity |
109
 
        ps_supplycost comp_op l_extendedprice ;
 
186
        ps_availqty comp_op l_quantity | ps_supplycost comp_op l_extendedprice ;
110
187
 
111
188
cond_s_c:
112
189
        c_nationkey comp_op s_nationkey ;
117
194
 
118
195
cond_p:
119
196
        p_partkey partkey_clause |
 
197
        p_retailprice currency_clause |
120
198
        p_comment comment_clause ;
121
199
 
122
200
cond_s:
123
201
        s_suppkey suppkey_clause |
 
202
        s_nationkey nationkey_clause |
 
203
        s_acctbal currency_clause |
124
204
        s_comment comment_clause ;
125
 
#       s_nationkey nationkey_clause ;
126
205
 
127
206
cond_ps:
128
207
        ps_partkey partkey_clause |
129
208
        ps_suppkey suppkey_clause |
 
209
        ps_supplycost currency_clause |
130
210
        ps_comment comment_clause ;
131
211
 
132
212
cond_l:
138
218
        l_orderkey orderkey_clause |
139
219
        l_quantity quantity_clause |
140
220
        l_commitDATE commitdate_clause |
 
221
        l_extendedprice currency_clause |
141
222
        l_comment comment_clause ;
142
223
 
143
224
cond_o:
144
225
        o_orderkey orderkey_clause |
145
226
        o_custkey custkey_clause |
 
227
        o_totalprice currency_clause |
146
228
        o_comment comment_clause ;
147
229
 
148
230
cond_c:
149
231
        c_custkey custkey_clause |
 
232
        c_acctbal currency_clause |
150
233
        c_comment comment_clause ;
151
234
 
152
235
cond_n:
161
244
# Per-column WHERE conditions
162
245
#
163
246
 
164
 
 
165
247
comp_op:
166
248
        = | = | = | = | != | > | >= | < | <= | <> ;
167
249
 
322
404
custkey_range:
323
405
        _digit | _tinyint_unsigned ;
324
406
 
325
 
# COMMENT
326
 
 
327
 
comment_clause:
328
 
        IS NOT NULL | IS NOT NULL | IS NOT NULL |
329
 
        comp_op _varchar(1) |
330
 
        comment_not LIKE CONCAT( comment_count , '%' ) |
331
 
        BETWEEN _varchar(1) AND _varchar(1) ;
332
 
 
333
 
 
334
 
comment_not:
335
 
        NOT | NOT | NOT | ;
336
 
 
337
 
comment_count:
338
 
        _varchar(1) | _varchar(1) |  _varchar(1) | _varchar(1) | _varchar(2) ;
339
 
 
340
407
# NATIONKEY 
341
408
 
342
409
nationkey_clause:
371
438
regionkey_range:
372
439
        1 | 2 | 3 | 4 ;
373
440
 
374
 
 
375
 
 
376
 
 
377
 
 
 
441
# COMMENT
 
442
 
 
443
comment_clause:
 
444
        IS NOT NULL | IS NOT NULL | IS NOT NULL |
 
445
        comp_op _varchar(1) |
 
446
        comment_not LIKE CONCAT( comment_count , '%' ) |
 
447
        BETWEEN _varchar(1) AND _varchar(1) ;
 
448
 
 
449
comment_not:
 
450
        NOT | NOT | NOT | ;
 
451
 
 
452
comment_count:
 
453
        _varchar(1) | _varchar(1) |  _varchar(1) | _varchar(1) | _varchar(2) ;
 
454
 
 
455
# CURRENCIES
 
456
 
 
457
currency_clause:
 
458
        comp_op currency_item |
 
459
        BETWEEN currency_item AND currency_item + currency_range ;
 
460
 
 
461
currency_item:
 
462
        _digit | _tinyint_unsigned | _tinyint_unsigned | _tinyint_unsigned | _mediumint_unsigned ;
 
463
 
 
464
currency_range:
 
465
        _tinyint_unsigned ;