~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to conf/partition_pruning.yy

merge from internal tree

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
query:
 
2
  { @nonaggregates = () ; $tables = 0 ; $fields = 0 ; "" } query_type ;
 
3
 
 
4
 
 
5
query_type:
 
6
  select | select | select | select | select |
 
7
  select | select | select | select | select |
 
8
  select | select | select | select | select |
 
9
  update | update | update | delete | delete ;
 
10
 
 
11
distict:  DISTINCT | | | | | | | | | ;
 
12
 
 
13
select_option: SQL_SMALL_RESULT | | | | | | | | | | | | | | | | | | | | ;
 
14
 
 
15
explain_extended:
 
16
    | | | | | | | | | explain_extended2 ;
 
17
 
 
18
explain_extended2: | | | | EXPLAIN | EXPLAIN EXTENDED ;
 
19
 
 
20
 
 
21
select:
 
22
  simple_select | mixed_select ;
 
23
 
 
24
simple_select:
 
25
  explain_extended SELECT simple_select_list
 
26
  FROM join_list
 
27
  WHERE where_list 
 
28
  optional_group_by
 
29
  having_clause
 
30
  order_by_clause ;
 
31
 
 
32
 
 
33
mixed_select:
 
34
  explain_extended SELECT select_list
 
35
  FROM join_list
 
36
  WHERE where_list
 
37
  group_by_clause
 
38
  having_clause
 
39
  order_by_clause ;
 
40
 
 
41
update:
 
42
  int_update | char_update ;
 
43
 
 
44
int_update:
 
45
 int_update_query ; int_select_count ;
 
46
 
 
47
int_update_query:
 
48
  UPDATE _table[invariant] SET `int_signed` = _digit[invariant] WHERE special_where_list ; 
 
49
 
 
50
int_select_count:
 
51
  SELECT COUNT(*) FROM _table[invariant] WHERE `int_signed` = _digit[invariant];
 
52
 
 
53
char_update:
 
54
  char_update_query ; char_select_count ;
 
55
 
 
56
char_update_query:
 
57
  UPDATE _table[invariant] SET `varchar_5` = _char[invariant] WHERE special_where_list;
 
58
 
 
59
char_select_count:
 
60
  SELECT COUNT(*) FROM _table[invariant] WHERE `varchar_5` = _char[invariant];
 
61
 
 
62
 
 
63
delete:
 
64
  int_delete ;
 
65
 
 
66
int_delete:
 
67
  int_delete_query ; int_select_count ;
 
68
 
 
69
int_delete_query:
 
70
  DELETE FROM _table[invariant] WHERE `int_signed` = _digit[invariant] and_or special_where_list ;
 
71
 
 
72
special_where_list:
 
73
  ( special_where_item ) | ( special_where_item ) |
 
74
  ( special_where_list and_or special_where_item ) ;
 
75
 
 
76
special_where_item:
 
77
  _table[invariant] . partitioned_int_field arithmetic_operator _digit |
 
78
  _table[invariant] . partitioned_int_field not BETWEEN _digit[invariant] AND ( _digit[invariant] + _digit ) |
 
79
  _table[invariant] . partitioned_int_field not IN ( number_list ) |
 
80
  _table[invariant] . partitioned_char_field arithmetic_operator _char |
 
81
  _table[invariant] . partitioned_char_field not IN (char_list ) ;
 
82
 
 
83
#######################################################
 
84
# query clause rules
 
85
#######################################################
 
86
 
 
87
select_list:
 
88
   new_select_item | new_select_item | new_select_item |
 
89
   new_select_item, select_list | new_select_item, select_list ;
 
90
 
 
91
simple_select_list:
 
92
   nonaggregate_select_item | nonaggregate_select_item | nonaggregate_select_item |
 
93
   nonaggregate_select_item | nonaggregate_select_item, simple_select_list | nonaggregate_select_item, simple_select_list ;
 
94
 
 
95
join_list:
 
96
   new_table_item join_type new_table_item ON ( join_condition ) |
 
97
   new_table_item | new_table_item | new_table_item | new_table_item ;
 
98
 
 
99
join_type:
 
100
   INNER JOIN | left_right outer JOIN | STRAIGHT_JOIN ;
 
101
 
 
102
join_condition:
 
103
   current_table_item . int_indexed = previous_table_item . int_indexed |
 
104
   current_table_item . char_indexed = previous_table_item . char_indexed ; 
 
105
 
 
106
 
 
107
#########################################################
 
108
# We use partition pruning friendly clauses here
 
109
#########################################################
 
110
 
 
111
where_list:
 
112
  ( where_item ) | ( where_item ) |
 
113
  ( where_list and_or where_item ) ;
 
114
 
 
115
where_item:
 
116
  table1 . partitioned_int_field arithmetic_operator existing_table_item . int_field |
 
117
  table1 . partitioned_int_field arithmetic_operator _digit |
 
118
  table1 . partitioned_int_field not BETWEEN _digit[invariant] AND ( _digit[invariant] + _digit ) |
 
119
  table1 . partitioned_int_field not IN ( number_list ) |
 
120
  table1 . partitioned_char_field arithmetic_operator existing_table_item . char_field |
 
121
  table1 . partitioned_char_field arithmetic_operator _char |
 
122
  table1 . partitioned_char_field not IN (char_list ) ;
 
123
 
 
124
partitioned_int_field:
 
125
    `int_signed` ;
 
126
 
 
127
partitioned_char_field:
 
128
    `varchar_5` ;
 
129
 
 
130
int_field:
 
131
    `int_signed` | `int_signed_key` ;
 
132
 
 
133
char_field:
 
134
    `varchar_5` | `varchar_5_key` | `varchar_10` | `varchar_10_key` ;
 
135
 
 
136
date_field:
 
137
  `datetime` | `date_key` | `datetime_key` | `date` ; 
 
138
 
 
139
non_int_field:
 
140
  char_field | date_field ;
 
141
 
 
142
number_list:
 
143
        _digit | number_list, _digit ;
 
144
 
 
145
char_list: 
 
146
        _char | char_list, _char ;
 
147
 
 
148
#########################################################
 
149
# GROUP BY / HAVING / ORDER BY rules
 
150
#########################################################
 
151
group_by_clause:
 
152
        { scalar(@nonaggregates) > 0 ? " GROUP BY ".join (', ' , @nonaggregates ) : "" }  ;
 
153
 
 
154
optional_group_by:
 
155
        | | | | | | | | | group_by_clause ;
 
156
 
 
157
having_clause:
 
158
        | | | | | | | | | HAVING having_list;
 
159
 
 
160
having_list:
 
161
        having_item |
 
162
        having_item |
 
163
        (having_list and_or having_item)  ;
 
164
 
 
165
having_item:
 
166
        existing_select_item arithmetic_operator value |
 
167
        existing_select_item arithmetic_operator value |
 
168
        existing_select_item arithmetic_operator value |
 
169
        existing_select_item arithmetic_operator value |
 
170
        existing_select_item arithmetic_operator existing_select_item ;
 
171
 
 
172
order_by_clause:
 
173
 | | | | ORDER BY total_order_by desc limit ;
 
174
 
 
175
total_order_by:
 
176
        { join(', ', map { "field".$_ } (1..$fields) ) };
 
177
 
 
178
desc:
 
179
  ASC | | | | DESC ;
 
180
 
 
181
limit:
 
182
  | | | | | | | | | | LIMIT limit_size | LIMIT limit_size OFFSET _digit;
 
183
 
 
184
limit_size:
 
185
    1 | 2 | 10 | 100 | 1000;
 
186
 
 
187
#########################################################
 
188
# query component rules
 
189
#########################################################
 
190
 
 
191
new_select_item:
 
192
  nonaggregate_select_item  | aggregate_select_item ;
 
193
 
 
194
nonaggregate_select_item:
 
195
  table_one_two . _field AS { my $f = "field".++$fields ; push @nonaggregates , $f ; $f } ;
 
196
 
 
197
aggregate_select_item:
 
198
  aggregate table_one_two . non_int_field ) AS { "field".++$fields } |
 
199
  int_aggregate table_one_two . int_field ) AS { "field".++$fields } ;
 
200
 
 
201
 
 
202
new_table_item:
 
203
        _table AS { "table".++$tables };
 
204
 
 
205
table_one_two:
 
206
      table1 | table1 | table1 | table1 | table2 ;
 
207
 
 
208
current_table_item:
 
209
        { "table".$tables };
 
210
 
 
211
previous_table_item:
 
212
        { "table".($tables - 1) };
 
213
 
 
214
existing_table_item:
 
215
        { "table".$prng->int(1,$tables) };
 
216
 
 
217
left_right:
 
218
        LEFT | RIGHT ;
 
219
 
 
220
outer: 
 
221
        | | | OUTER ;
 
222
 
 
223
existing_select_item:
 
224
        { "field".$prng->int(1,$fields) };
 
225
 
 
226
int_indexed:
 
227
    `int_signed_key` ;
 
228
 
 
229
char_indexed:
 
230
    `varchar_5_key` | `varchar_10_key` ;
 
231
 
 
232
arithmetic_operator:
 
233
        = | > | < | != | <> | <= | >= ;
 
234
 
 
235
aggregate:
 
236
        COUNT( | MIN( | MAX( ;
 
237
 
 
238
int_aggregate:
 
239
        SUM( | aggregate ;
 
240
 
 
241
and_or:
 
242
        AND | AND | OR ;
 
243
 
 
244
not:
 
245
   | | | | NOT ;
 
246
 
 
247
 
 
248
value:
 
249
        _digit | _digit | _digit | _digit | _digit |
 
250
        _char | _char | _char | _char | _char ;