sqliterate 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|