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 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,13 @@
1
+ module SQLiterate
2
+ grammar Command
3
+ include Query
4
+
5
+ rule commands
6
+ command r:( space ';' space command )*
7
+ end
8
+
9
+ rule command
10
+ query / space
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module SQLiterate
2
+ grammar Comment
3
+ rule comment
4
+ c_comment / line_comment
5
+ end
6
+
7
+ rule line_comment
8
+ '--' [^\n]* "\n"?
9
+ end
10
+
11
+ rule c_comment
12
+ '/*' ( !'*/' (c_comment / . / "\n") )* '*/'
13
+ end
14
+ end
15
+ end
@@ -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