sqliterate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +21 -0
- data/README.md +0 -0
- data/lib/sqliterate.rb +18 -0
- data/lib/sqliterate/grammar/command.treetop +13 -0
- data/lib/sqliterate/grammar/comment.treetop +15 -0
- data/lib/sqliterate/grammar/expression.treetop +239 -0
- data/lib/sqliterate/grammar/identifier.treetop +45 -0
- data/lib/sqliterate/grammar/keywords.treetop +255 -0
- data/lib/sqliterate/grammar/literals.treetop +40 -0
- data/lib/sqliterate/grammar/operator.treetop +65 -0
- data/lib/sqliterate/grammar/query.treetop +25 -0
- data/lib/sqliterate/grammar/space.treetop +17 -0
- data/lib/sqliterate/grammar/string.treetop +47 -0
- data/lib/sqliterate/node/control.rb +3 -0
- data/lib/sqliterate/node/control/expression.rb +192 -0
- data/lib/sqliterate/node/control/query.rb +39 -0
- data/lib/sqliterate/node/evaluate.rb +5 -0
- data/lib/sqliterate/node/evaluate/expression.rb +124 -0
- data/lib/sqliterate/node/evaluate/literals.rb +46 -0
- data/lib/sqliterate/node/evaluate/operator.rb +51 -0
- data/lib/sqliterate/node/evaluate/string.rb +42 -0
- data/lib/sqliterate/node/identify.rb +3 -0
- data/lib/sqliterate/node/identify/identifier.rb +40 -0
- data/lib/sqliterate/node/identify/keywords.rb +9 -0
- data/lib/sqliterate/version.rb +3 -0
- metadata +140 -0
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 Emmanuel Bastien
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
File without changes
|
data/lib/sqliterate.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'polyglot'
|
3
|
+
require 'treetop'
|
4
|
+
|
5
|
+
require 'sqliterate/node/identify'
|
6
|
+
require 'sqliterate/node/evaluate'
|
7
|
+
require 'sqliterate/node/control'
|
8
|
+
|
9
|
+
require 'sqliterate/grammar/comment'
|
10
|
+
require 'sqliterate/grammar/space'
|
11
|
+
require 'sqliterate/grammar/keywords'
|
12
|
+
require 'sqliterate/grammar/identifier'
|
13
|
+
require 'sqliterate/grammar/string'
|
14
|
+
require 'sqliterate/grammar/literals'
|
15
|
+
require 'sqliterate/grammar/operator'
|
16
|
+
require 'sqliterate/grammar/expression'
|
17
|
+
require 'sqliterate/grammar/query'
|
18
|
+
require 'sqliterate/grammar/command'
|
@@ -0,0 +1,239 @@
|
|
1
|
+
module SQLiterate
|
2
|
+
grammar Expression
|
3
|
+
include Space
|
4
|
+
include Identifier
|
5
|
+
include Keywords
|
6
|
+
include Literals
|
7
|
+
include Operator
|
8
|
+
|
9
|
+
rule scalar_expression
|
10
|
+
gen_expression
|
11
|
+
end
|
12
|
+
|
13
|
+
rule gen_expression
|
14
|
+
h:( gen_operator space )*
|
15
|
+
gen_value
|
16
|
+
r:( o:( space gen_operator )+ space gen_value )*
|
17
|
+
t:( space gen_operator )*
|
18
|
+
<Node::GenExpression>
|
19
|
+
end
|
20
|
+
|
21
|
+
rule gen_value
|
22
|
+
literal_value <Node::GenValue::Literal>
|
23
|
+
/
|
24
|
+
function_call <Node::GenValue::Function>
|
25
|
+
/
|
26
|
+
field_selection r:( space '['
|
27
|
+
space range_expression space
|
28
|
+
']' )+ <Node::GenValue::Subscript>
|
29
|
+
/
|
30
|
+
field_selection <Node::GenValue::Field>
|
31
|
+
end
|
32
|
+
|
33
|
+
rule function_call
|
34
|
+
type_cast
|
35
|
+
/
|
36
|
+
function_name space '('
|
37
|
+
space function_params space
|
38
|
+
')' <Node::FunctionCall>
|
39
|
+
end
|
40
|
+
|
41
|
+
rule type_cast
|
42
|
+
cast_kw space '('
|
43
|
+
space scalar_expression space as_kw space type_name space
|
44
|
+
')' <Node::TypeCast>
|
45
|
+
end
|
46
|
+
|
47
|
+
rule function_name
|
48
|
+
qualified_name / identifier
|
49
|
+
end
|
50
|
+
|
51
|
+
rule function_params
|
52
|
+
aggregate_expression
|
53
|
+
/
|
54
|
+
expressions_list
|
55
|
+
/
|
56
|
+
void_expression
|
57
|
+
end
|
58
|
+
|
59
|
+
rule void_expression
|
60
|
+
space <Node::VoidExpression>
|
61
|
+
end
|
62
|
+
|
63
|
+
rule aggregate_expression
|
64
|
+
all_columns <Node::AllColumns>
|
65
|
+
/
|
66
|
+
(aggregate_specifier space)? expressions_list space order_by_clause
|
67
|
+
<Node::AggregateExpression>
|
68
|
+
end
|
69
|
+
|
70
|
+
rule aggregate_specifier
|
71
|
+
all_kw / distinct_kw
|
72
|
+
end
|
73
|
+
|
74
|
+
rule ordering_specifier
|
75
|
+
( asc_kw / desc_kw )?
|
76
|
+
( required_space nulls_kw required_space ( first_kw / last_kw ) )?
|
77
|
+
end
|
78
|
+
|
79
|
+
rule order_by_clause
|
80
|
+
( order_by_kw space expressions_list space ordering_specifier / space )
|
81
|
+
<Node::OrderByClause>
|
82
|
+
end
|
83
|
+
|
84
|
+
rule expressions_list
|
85
|
+
gen_expression r:( space ',' space gen_expression)* <Node::ExpressionsList>
|
86
|
+
end
|
87
|
+
|
88
|
+
rule range_expression
|
89
|
+
b:scalar_expression space ':' space e:scalar_expression <Node::RangeExpression>
|
90
|
+
/
|
91
|
+
scalar_expression
|
92
|
+
end
|
93
|
+
|
94
|
+
rule field_selection
|
95
|
+
row_value space '.' space field_identifier <Node::FieldSelection>
|
96
|
+
/
|
97
|
+
row_value
|
98
|
+
end
|
99
|
+
|
100
|
+
rule field_identifier
|
101
|
+
all_fields / identifier
|
102
|
+
end
|
103
|
+
|
104
|
+
rule row_value
|
105
|
+
'(' query_expression ')' <Node::RowValue::Query>
|
106
|
+
/
|
107
|
+
'(' space gen_expression space ')' <Node::RowValue::Expression>
|
108
|
+
/
|
109
|
+
positional_param <Node::RowValue::Positional>
|
110
|
+
/
|
111
|
+
identifier <Node::RowValue::Identifier>
|
112
|
+
end
|
113
|
+
|
114
|
+
rule query_expression
|
115
|
+
query_value r:( space set_operation space query_value )*
|
116
|
+
<Node::QueryExpression>
|
117
|
+
end
|
118
|
+
|
119
|
+
rule set_operation
|
120
|
+
( union_kw / intersect_kw / except_kw ) ( required_space all_kw )?
|
121
|
+
end
|
122
|
+
|
123
|
+
rule query_value
|
124
|
+
'(' space query_expression space ')' <Node::QueryValue::Expression>
|
125
|
+
/
|
126
|
+
select_query <Node::QueryValue::Select>
|
127
|
+
end
|
128
|
+
|
129
|
+
rule select_query
|
130
|
+
select_kw required_space
|
131
|
+
distinct_clause space
|
132
|
+
select_list space
|
133
|
+
table_expression space
|
134
|
+
order_by_clause
|
135
|
+
<Node::SelectQuery>
|
136
|
+
end
|
137
|
+
|
138
|
+
rule distinct_clause
|
139
|
+
aggregate_specifier (
|
140
|
+
required_space on_kw required_space '(' space expressions_list space ')'
|
141
|
+
)?
|
142
|
+
/
|
143
|
+
space
|
144
|
+
end
|
145
|
+
|
146
|
+
rule select_list
|
147
|
+
all_columns / named_expressions_list
|
148
|
+
end
|
149
|
+
|
150
|
+
rule named_expressions_list
|
151
|
+
named_expression r:( space ',' space named_expression)*
|
152
|
+
<Node::NamedExpressionsList>
|
153
|
+
end
|
154
|
+
|
155
|
+
rule named_expression
|
156
|
+
gen_expression ( space (as_kw space)? column_name )? <Node::NamedExpression>
|
157
|
+
end
|
158
|
+
|
159
|
+
rule table_reference
|
160
|
+
(table_spec space (as_kw space)? table_name space column_list?
|
161
|
+
/
|
162
|
+
qualified_name) <Node::TableReference>
|
163
|
+
end
|
164
|
+
|
165
|
+
rule all_columns
|
166
|
+
'*' <Node::AllColumns>
|
167
|
+
end
|
168
|
+
|
169
|
+
rule table_expression
|
170
|
+
from_clause space where_clause space group_by_clause <Node::TableExpression>
|
171
|
+
end
|
172
|
+
|
173
|
+
rule from_clause
|
174
|
+
(from_kw required_space table_references / space) <Node::FromClause>
|
175
|
+
end
|
176
|
+
|
177
|
+
rule where_clause
|
178
|
+
where_kw required_space scalar_expression / space
|
179
|
+
end
|
180
|
+
|
181
|
+
rule group_by_clause
|
182
|
+
group_by_kw required_space expressions_list space having_clause / space
|
183
|
+
end
|
184
|
+
|
185
|
+
rule having_clause
|
186
|
+
having_kw required_space scalar_expression / space
|
187
|
+
end
|
188
|
+
|
189
|
+
rule table_references
|
190
|
+
table_joins r:( space ',' space table_joins )* <Node::TableReferences>
|
191
|
+
end
|
192
|
+
|
193
|
+
rule table_joins
|
194
|
+
table_reference r:( space joined_table )* <Node::TableJoins>
|
195
|
+
end
|
196
|
+
|
197
|
+
rule table_reference
|
198
|
+
(table_spec space (as_kw space)? table_name space column_list?
|
199
|
+
/
|
200
|
+
qualified_name) <Node::TableReference>
|
201
|
+
end
|
202
|
+
|
203
|
+
rule table_spec
|
204
|
+
'(' space query_expression space ')' <Node::TableSpec::Query>
|
205
|
+
/
|
206
|
+
'(' space table_joins space ')' <Node::TableSpec::Joins>
|
207
|
+
/
|
208
|
+
qualified_name <Node::TableSpec::Table>
|
209
|
+
end
|
210
|
+
|
211
|
+
rule joined_table
|
212
|
+
natural_join / predicate_join / columns_join
|
213
|
+
end
|
214
|
+
|
215
|
+
rule natural_join
|
216
|
+
natural_kw space join_type space join_kw space table_reference <Node::Join>
|
217
|
+
end
|
218
|
+
|
219
|
+
rule predicate_join
|
220
|
+
join_type space join_kw space table_reference space on_kw space scalar_expression <Node::Join>
|
221
|
+
end
|
222
|
+
|
223
|
+
rule columns_join
|
224
|
+
join_type space join_kw space table_reference space using_kw space column_list <Node::Join>
|
225
|
+
end
|
226
|
+
|
227
|
+
rule join_type
|
228
|
+
(left_kw / right_kw / full_kw) (space outer_kw)?
|
229
|
+
/
|
230
|
+
inner_kw
|
231
|
+
/
|
232
|
+
space
|
233
|
+
end
|
234
|
+
|
235
|
+
rule column_list
|
236
|
+
'(' column_name r:( space ',' space column_name)* ')'
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SQLiterate
|
2
|
+
grammar Identifier
|
3
|
+
include Keywords
|
4
|
+
|
5
|
+
rule identifier
|
6
|
+
literal_identifier / quoted_identifier
|
7
|
+
end
|
8
|
+
|
9
|
+
rule literal_identifier
|
10
|
+
!keyword [\p{Alpha}_] [\p{Alnum}_$]* <Node::LiteralIdentifier>
|
11
|
+
end
|
12
|
+
|
13
|
+
rule quoted_identifier
|
14
|
+
'"' c:( identifier_char )* '"' <Node::QuotedIdentifier>
|
15
|
+
end
|
16
|
+
|
17
|
+
rule identifier_char
|
18
|
+
'""' <Node::IdentifierChar::Quote>
|
19
|
+
/
|
20
|
+
[^"] <Node::IdentifierChar::Text>
|
21
|
+
end
|
22
|
+
|
23
|
+
rule qualified_name
|
24
|
+
schema_name '.' identifier <Node::QualifiedName>
|
25
|
+
/
|
26
|
+
table_name
|
27
|
+
end
|
28
|
+
|
29
|
+
rule schema_name
|
30
|
+
identifier
|
31
|
+
end
|
32
|
+
|
33
|
+
rule table_name
|
34
|
+
identifier
|
35
|
+
end
|
36
|
+
|
37
|
+
rule column_name
|
38
|
+
identifier
|
39
|
+
end
|
40
|
+
|
41
|
+
rule all_fields
|
42
|
+
'*' <Node::AllFields>
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
module SQLiterate
|
2
|
+
grammar Keywords
|
3
|
+
rule keyword
|
4
|
+
with_kw / as_kw / select_kw / from_kw / join_kw / inner_kw / outer_kw /
|
5
|
+
left_kw / right_kw / full_kw / natural_kw / on_kw / using_kw /
|
6
|
+
where_kw / not_kw / and_kw / or_kw / true_kw / false_kw /
|
7
|
+
is_kw / isnull_kw / notnull_kw / in_kw / between_kw / overlaps_kw /
|
8
|
+
like_kw / ilike_kw / similar_kw / null_kw / order_kw / by_kw /
|
9
|
+
desc_kw / asc_kw / all_kw / distinct_kw / cast_kw /
|
10
|
+
bigint_kw / boolean_kw / double_kw / float_kw / int_kw / real_kw /
|
11
|
+
smallint_kw / string_kw / timestamp_kw / tinyint_kw / integer_kw /
|
12
|
+
group_kw / having_kw / nulls_kw / first_kw / last_kw / union_kw /
|
13
|
+
intersect_kw / except_kw
|
14
|
+
end
|
15
|
+
|
16
|
+
rule type_name
|
17
|
+
bigint_kw / boolean_kw / double_kw / float_kw /
|
18
|
+
int_kw / real_kw / smallint_kw / string_kw /
|
19
|
+
timestamp_kw / tinyint_kw / integer_kw
|
20
|
+
<Node::TypeName>
|
21
|
+
end
|
22
|
+
|
23
|
+
rule kw_sep
|
24
|
+
![\p{Alpha}_]
|
25
|
+
end
|
26
|
+
|
27
|
+
rule with_kw
|
28
|
+
[wW] [iI] [tT] [hH] kw_sep
|
29
|
+
end
|
30
|
+
|
31
|
+
rule as_kw
|
32
|
+
[aA] [sS] kw_sep
|
33
|
+
end
|
34
|
+
|
35
|
+
rule select_kw
|
36
|
+
[sS] [eE] [lL] [eE] [cC] [tT] kw_sep
|
37
|
+
end
|
38
|
+
|
39
|
+
rule from_kw
|
40
|
+
[fF] [rR] [oO] [mM] kw_sep
|
41
|
+
end
|
42
|
+
|
43
|
+
rule join_kw
|
44
|
+
[jJ] [oO] [iI] [nN] kw_sep
|
45
|
+
end
|
46
|
+
|
47
|
+
rule inner_kw
|
48
|
+
[iI] [nN] [nN] [eE] [rR] kw_sep
|
49
|
+
end
|
50
|
+
|
51
|
+
rule outer_kw
|
52
|
+
[oO] [uU] [tT] [eE] [rR] kw_sep
|
53
|
+
end
|
54
|
+
|
55
|
+
rule left_kw
|
56
|
+
[lL] [eE] [fF] [tT] kw_sep
|
57
|
+
end
|
58
|
+
|
59
|
+
rule right_kw
|
60
|
+
[rR] [iI] [gG] [hH] [tT] kw_sep
|
61
|
+
end
|
62
|
+
|
63
|
+
rule full_kw
|
64
|
+
[fF] [uU] [lL] [lL] kw_sep
|
65
|
+
end
|
66
|
+
|
67
|
+
rule natural_kw
|
68
|
+
[nN] [aA] [tT] [uU] [rR] [aA] [lL] kw_sep
|
69
|
+
end
|
70
|
+
|
71
|
+
rule on_kw
|
72
|
+
[oO] [nN] kw_sep
|
73
|
+
end
|
74
|
+
|
75
|
+
rule using_kw
|
76
|
+
[uU] [sS] [iI] [nN] [gG] kw_sep
|
77
|
+
end
|
78
|
+
|
79
|
+
rule where_kw
|
80
|
+
[wW] [hH] [eE] [rR] [eE] kw_sep
|
81
|
+
end
|
82
|
+
|
83
|
+
rule not_kw
|
84
|
+
[nN] [oO] [tT] kw_sep
|
85
|
+
end
|
86
|
+
|
87
|
+
rule and_kw
|
88
|
+
[aA] [nN] [dD] kw_sep
|
89
|
+
end
|
90
|
+
|
91
|
+
rule or_kw
|
92
|
+
[oO] [rR] kw_sep
|
93
|
+
end
|
94
|
+
|
95
|
+
rule true_kw
|
96
|
+
[tT] [rR] [uU] [eE] kw_sep
|
97
|
+
end
|
98
|
+
|
99
|
+
rule false_kw
|
100
|
+
[fF] [aA] [lL] [sS] [eE] kw_sep
|
101
|
+
end
|
102
|
+
|
103
|
+
rule is_kw
|
104
|
+
[iI] [sS] kw_sep
|
105
|
+
end
|
106
|
+
|
107
|
+
rule isnull_kw
|
108
|
+
[iI] [sS] [nN] [uU] [lL] [lL] kw_sep
|
109
|
+
end
|
110
|
+
|
111
|
+
rule notnull_kw
|
112
|
+
[nN] [oO] [tT] [nN] [uU] [lL] [lL] kw_sep
|
113
|
+
end
|
114
|
+
|
115
|
+
rule in_kw
|
116
|
+
[iI] [nN] kw_sep
|
117
|
+
end
|
118
|
+
|
119
|
+
rule between_kw
|
120
|
+
[bB] [eE] [tT] [wW] [eE] [eE] [nN] kw_sep
|
121
|
+
end
|
122
|
+
|
123
|
+
rule overlaps_kw
|
124
|
+
[oO] [vV] [eE] [rR] [lL] [aA] [pP] [sS] kw_sep
|
125
|
+
end
|
126
|
+
|
127
|
+
rule like_kw
|
128
|
+
[lL] [iI] [kK] [eE] kw_sep
|
129
|
+
end
|
130
|
+
|
131
|
+
rule ilike_kw
|
132
|
+
[iI] [lL] [iI] [kK] [eE] kw_sep
|
133
|
+
end
|
134
|
+
|
135
|
+
rule similar_kw
|
136
|
+
[sS] [iI] [mM] [iI] [lL] [aA] [rR] kw_sep
|
137
|
+
end
|
138
|
+
|
139
|
+
rule null_kw
|
140
|
+
[nN] [uU] [lL] [lL] kw_sep
|
141
|
+
end
|
142
|
+
|
143
|
+
rule order_kw
|
144
|
+
[oO] [rR] [dD] [eE] [rR] kw_sep
|
145
|
+
end
|
146
|
+
|
147
|
+
rule by_kw
|
148
|
+
[bB] [yY] kw_sep
|
149
|
+
end
|
150
|
+
|
151
|
+
rule order_by_kw
|
152
|
+
order_kw required_space by_kw
|
153
|
+
end
|
154
|
+
|
155
|
+
rule desc_kw
|
156
|
+
[dD] [eE] [sS] [cC] kw_sep
|
157
|
+
end
|
158
|
+
|
159
|
+
rule asc_kw
|
160
|
+
[aA] [sS] [cC] kw_sep
|
161
|
+
end
|
162
|
+
|
163
|
+
rule all_kw
|
164
|
+
[aA] [lL] [lL] kw_sep
|
165
|
+
end
|
166
|
+
|
167
|
+
rule distinct_kw
|
168
|
+
[dD] [iI] [sS] [tT] [iI] [nN] [cC] [tT] kw_sep
|
169
|
+
end
|
170
|
+
|
171
|
+
rule cast_kw
|
172
|
+
[cC] [aA] [sS] [tT] kw_sep
|
173
|
+
end
|
174
|
+
|
175
|
+
rule bigint_kw
|
176
|
+
[bB] [iI] [gG] [iI] [nN] [tT] kw_sep
|
177
|
+
end
|
178
|
+
|
179
|
+
rule boolean_kw
|
180
|
+
[bB] [oO] [oO] [lL] [eE] [aA] [nN] kw_sep
|
181
|
+
end
|
182
|
+
|
183
|
+
rule double_kw
|
184
|
+
[dD] [oO] [uU] [bB] [lL] [eE] kw_sep
|
185
|
+
end
|
186
|
+
|
187
|
+
rule real_kw
|
188
|
+
[rR] [eE] [aA] [lL] kw_sep
|
189
|
+
end
|
190
|
+
|
191
|
+
rule float_kw
|
192
|
+
[fF] [lL] [oO] [aA] [tT] kw_sep
|
193
|
+
end
|
194
|
+
|
195
|
+
rule int_kw
|
196
|
+
[iI] [nN] [tT] kw_sep
|
197
|
+
end
|
198
|
+
|
199
|
+
rule integer_kw
|
200
|
+
[iI] [nN] [tT] [eE] [gG] [eE] [rR] kw_sep
|
201
|
+
end
|
202
|
+
|
203
|
+
rule smallint_kw
|
204
|
+
[sS] [mM] [aA] [lL] [lL] [iI] [nN] [tT] kw_sep
|
205
|
+
end
|
206
|
+
|
207
|
+
rule string_kw
|
208
|
+
[sS] [tT] [rR] [iI] [nN] [gG] kw_sep
|
209
|
+
end
|
210
|
+
|
211
|
+
rule timestamp_kw
|
212
|
+
[tT] [iI] [mM] [eE] [sS] [tT] [aA] [mM] [pP] kw_sep
|
213
|
+
end
|
214
|
+
|
215
|
+
rule tinyint_kw
|
216
|
+
[tT] [iI] [nN] [yY] [iI] [nN] [tT] kw_sep
|
217
|
+
end
|
218
|
+
|
219
|
+
rule group_kw
|
220
|
+
[gG] [rR] [oO] [uU] [pP] kw_sep
|
221
|
+
end
|
222
|
+
|
223
|
+
rule group_by_kw
|
224
|
+
group_kw required_space by_kw
|
225
|
+
end
|
226
|
+
|
227
|
+
rule having_kw
|
228
|
+
[hH] [aA] [vV] [iI] [nN] [gG] kw_sep
|
229
|
+
end
|
230
|
+
|
231
|
+
rule nulls_kw
|
232
|
+
[nN] [uU] [lL] [lL] [sS] kw_sep
|
233
|
+
end
|
234
|
+
|
235
|
+
rule first_kw
|
236
|
+
[fF] [iI] [rR] [sS] [tT] kw_sep
|
237
|
+
end
|
238
|
+
|
239
|
+
rule last_kw
|
240
|
+
[lL] [aA] [sS] [tT] kw_sep
|
241
|
+
end
|
242
|
+
|
243
|
+
rule union_kw
|
244
|
+
[uU] [nN] [iI] [oO] [nN] kw_sep
|
245
|
+
end
|
246
|
+
|
247
|
+
rule intersect_kw
|
248
|
+
[iI] [nN] [tT] [eE] [rR] [sS] [eE] [cC] [tT] kw_sep
|
249
|
+
end
|
250
|
+
|
251
|
+
rule except_kw
|
252
|
+
[eE] [xX] [cC] [eE] [pP] [tT] kw_sep
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|