sqliterate 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,6 +7,61 @@ module SQLiterate
7
7
  include Operator
8
8
 
9
9
  rule scalar_expression
10
+ disjunction_expression
11
+ end
12
+
13
+ rule disjunction_expression
14
+ e:conjunction_expression r:( space or_kw space e:conjunction_expression )*
15
+ <Node::DisjunctionExpression>
16
+ end
17
+
18
+ rule conjunction_expression
19
+ e:negation_expression r:( space and_kw space e:negation_expression )*
20
+ <Node::ConjunctionExpression>
21
+ end
22
+
23
+ rule negation_expression
24
+ not_kw space e:equality_expression <Node::NegationExpression>
25
+ /
26
+ equality_expression
27
+ end
28
+
29
+ rule equality_expression
30
+ e:between_expression r:( space '=' space e:between_expression )*
31
+ <Node::EqualityExpression>
32
+ end
33
+
34
+ rule between_expression
35
+ e:set_predicate_expression r:( space
36
+ ( not_kw space )? between_kw space ( symmetric_kw space )?
37
+ l:set_predicate_expression space and_kw space
38
+ r:set_predicate_expression
39
+ )*
40
+ <Node::BetweenExpression>
41
+ end
42
+
43
+ rule set_predicate_expression
44
+ exists_expression
45
+ /
46
+ e:test_expression space set_predicate_operator space
47
+ '(' space query_expression space ')'
48
+ <Node::SetPredicateExpression>
49
+ /
50
+ test_expression
51
+ end
52
+
53
+ rule exists_expression
54
+ exists_kw space '(' space query_expression space ')'
55
+ <Node::ExistsExpression>
56
+ end
57
+
58
+ rule test_expression
59
+ l:gen_expression space binary_test_operator space r:gen_expression
60
+ <Node::TestExpression::Binary>
61
+ /
62
+ e:gen_expression space unary_test_operator
63
+ <Node::TestExpression::Unary>
64
+ /
10
65
  gen_expression
11
66
  end
12
67
 
@@ -21,13 +76,34 @@ module SQLiterate
21
76
  rule gen_value
22
77
  literal_value <Node::GenValue::Literal>
23
78
  /
24
- function_call <Node::GenValue::Function>
79
+ function_call
25
80
  /
26
81
  field_selection r:( space '['
27
82
  space range_expression space
28
83
  ']' )+ <Node::GenValue::Subscript>
29
84
  /
30
- field_selection <Node::GenValue::Field>
85
+ field_selection
86
+ /
87
+ case_expression
88
+ end
89
+
90
+ rule case_expression
91
+ case_kw required_space
92
+ case_when_section r:( space case_when_section )* space
93
+ case_else_section space
94
+ end_kw
95
+ <Node::CaseExpression>
96
+ end
97
+
98
+ rule case_when_section
99
+ when_kw required_space w:scalar_expression space
100
+ then_kw required_space t:scalar_expression
101
+ <Node::CaseWhenSection>
102
+ end
103
+
104
+ rule case_else_section
105
+ ( else_kw required_space scalar_expression / space )
106
+ <Node::CaseElseSection>
31
107
  end
32
108
 
33
109
  rule function_call
@@ -77,12 +153,19 @@ module SQLiterate
77
153
  end
78
154
 
79
155
  rule order_by_clause
80
- ( order_by_kw space expressions_list space ordering_specifier / space )
81
- <Node::OrderByClause>
156
+ ( order_by_kw required_space sort_expressions_list / space ) <Node::OrderByClause>
157
+ end
158
+
159
+ rule sort_expressions_list
160
+ sort_expression r:( space ',' space sort_expression)* <Node::SortExpressionsList>
161
+ end
162
+
163
+ rule sort_expression
164
+ scalar_expression space ordering_specifier <Node::SortExpression>
82
165
  end
83
166
 
84
167
  rule expressions_list
85
- gen_expression r:( space ',' space gen_expression)* <Node::ExpressionsList>
168
+ scalar_expression r:( space ',' space scalar_expression)* <Node::ExpressionsList>
86
169
  end
87
170
 
88
171
  rule range_expression
@@ -102,9 +185,9 @@ module SQLiterate
102
185
  end
103
186
 
104
187
  rule row_value
105
- '(' query_expression ')' <Node::RowValue::Query>
188
+ '(' space query_expression space ')' <Node::RowValue::Query>
106
189
  /
107
- '(' space gen_expression space ')' <Node::RowValue::Expression>
190
+ '(' space scalar_expression space ')' <Node::RowValue::Expression>
108
191
  /
109
192
  positional_param <Node::RowValue::Positional>
110
193
  /
@@ -155,7 +238,7 @@ module SQLiterate
155
238
  end
156
239
 
157
240
  rule named_expression
158
- gen_expression ( space (as_kw space)? column_name )? <Node::NamedExpression>
241
+ scalar_expression ( space (as_kw space)? column_name )? <Node::NamedExpression>
159
242
  end
160
243
 
161
244
  rule table_reference
@@ -173,19 +256,20 @@ module SQLiterate
173
256
  end
174
257
 
175
258
  rule from_clause
176
- (from_kw required_space table_references / space) <Node::FromClause>
259
+ ( from_kw required_space table_references / space ) <Node::FromClause>
177
260
  end
178
261
 
179
262
  rule where_clause
180
- where_kw required_space scalar_expression / space
263
+ ( where_kw required_space scalar_expression / space ) <Node::WhereClause>
181
264
  end
182
265
 
183
266
  rule group_by_clause
184
- group_by_kw required_space expressions_list space having_clause / space
267
+ ( group_by_kw required_space expressions_list space having_clause / space )
268
+ <Node::GroupByClause>
185
269
  end
186
270
 
187
271
  rule having_clause
188
- having_kw required_space scalar_expression / space
272
+ ( having_kw required_space scalar_expression / space ) <Node::HavingClause>
189
273
  end
190
274
 
191
275
  rule table_references
@@ -10,7 +10,9 @@ module SQLiterate
10
10
  bigint_kw / boolean_kw / double_kw / float_kw / int_kw / real_kw /
11
11
  smallint_kw / string_kw / timestamp_kw / tinyint_kw / integer_kw /
12
12
  group_kw / having_kw / nulls_kw / first_kw / last_kw / union_kw /
13
- intersect_kw / except_kw / limit_kw / offset_kw
13
+ intersect_kw / except_kw / limit_kw / offset_kw /
14
+ case_kw / when_kw / then_kw / else_kw / end_kw / symmetric_kw /
15
+ unknown_kw / exists_kw / any_kw / some_kw
14
16
  end
15
17
 
16
18
  rule type_name
@@ -259,5 +261,45 @@ module SQLiterate
259
261
  rule offset_kw
260
262
  [oO] [fF] [fF] [sS] [eE] [tT] kw_sep
261
263
  end
264
+
265
+ rule case_kw
266
+ [cC] [aA] [sS] [eE] kw_sep
267
+ end
268
+
269
+ rule when_kw
270
+ [wW] [hH] [eE] [nN] kw_sep
271
+ end
272
+
273
+ rule then_kw
274
+ [tT] [hH] [eE] [nN] kw_sep
275
+ end
276
+
277
+ rule else_kw
278
+ [eE] [lL] [sS] [eE] kw_sep
279
+ end
280
+
281
+ rule end_kw
282
+ [eE] [nN] [dD] kw_sep
283
+ end
284
+
285
+ rule symmetric_kw
286
+ [sS] [yY] [mM] [mM] [eE] [tT] [rR] [iI] [cC] kw_sep
287
+ end
288
+
289
+ rule unknown_kw
290
+ [uU] [nN] [kK] [nN] [oO] [wW] [nN] kw_sep
291
+ end
292
+
293
+ rule exists_kw
294
+ [eE] [xX] [iI] [sS] [tT] [sS] kw_sep
295
+ end
296
+
297
+ rule any_kw
298
+ [aA] [nN] [yY] kw_sep
299
+ end
300
+
301
+ rule some_kw
302
+ [sS] [oO] [mM] [eE] kw_sep
303
+ end
262
304
  end
263
305
  end
@@ -5,16 +5,14 @@ module SQLiterate
5
5
  include Keywords
6
6
 
7
7
  rule gen_operator
8
- symbol_operator / keyword_operator
9
- end
10
-
11
- rule keyword_operator
12
- ( and_kw / or_kw / not_kw ) <Node::KeywordOperator>
8
+ symbol_operator
13
9
  end
14
10
 
15
11
  rule symbol_operator
16
12
  sign_ending_operator
17
13
  /
14
+ comparison_operator
15
+ /
18
16
  nonsign_ending_operator
19
17
  /
20
18
  ambiguous_operator
@@ -22,10 +20,6 @@ module SQLiterate
22
20
  single_char_operator
23
21
  end
24
22
 
25
- rule single_char_operator
26
- c:op_char <Node::SingleCharOperator>
27
- end
28
-
29
23
  rule sign_ending_operator
30
24
  b:( r:( basic_op_char !special_op_char )* basic_op_char )? special_op_char
31
25
  o:( r:( op_char !(sign_op_char !op_char) )* op_char )? sign_op_char !op_char
@@ -33,15 +27,22 @@ module SQLiterate
33
27
  end
34
28
 
35
29
  rule nonsign_ending_operator
30
+ !comparison_operator
36
31
  r:( op_char !(nonsign_op_char !op_char) )* op_char nonsign_op_char !op_char
37
32
  <Node::NonsignEndingOperator>
38
33
  end
39
34
 
40
35
  rule ambiguous_operator
36
+ !comparison_operator
41
37
  r:( op_char !(sign_op_char !op_char) )* op_char
42
38
  <Node::AmbiguousOperator>
43
39
  end
44
40
 
41
+ rule single_char_operator
42
+ !comparison_operator
43
+ c:op_char <Node::SingleCharOperator>
44
+ end
45
+
45
46
  rule sign_op_char
46
47
  c:[+\-] comment* <Node::OperatorChar>
47
48
  end
@@ -61,5 +62,34 @@ module SQLiterate
61
62
  rule op_char
62
63
  c:[+\-*/<>=~!@#%^&|`?] comment* <Node::OperatorChar>
63
64
  end
65
+
66
+ rule comparison_operator
67
+ o:( '>=' / '<=' / '<>' / '!=' / '=' / '>' / '<' ) comment* !nonsign_op_char
68
+ <Node::ComparisonOperator>
69
+ end
70
+
71
+ rule binary_test_operator
72
+ is_kw space ( not_kw space )? distinct_kw space from_kw
73
+ end
74
+
75
+ rule unary_test_operator
76
+ is_kw space ( not_kw space )? null_kw
77
+ /
78
+ isnull_kw
79
+ /
80
+ notnull_kw
81
+ /
82
+ is_kw space ( not_kw space )? true_kw
83
+ /
84
+ is_kw space ( not_kw space )? false_kw
85
+ /
86
+ is_kw space ( not_kw space )? unknown_kw
87
+ end
88
+
89
+ rule set_predicate_operator
90
+ ( not_kw space )? in_kw
91
+ /
92
+ comparison_operator space ( any_kw / some_kw / all_kw )
93
+ end
64
94
  end
65
95
  end
@@ -1,5 +1,62 @@
1
1
  module SQLiterate
2
2
  module Node
3
+ module DisjunctionExpression
4
+ def tables
5
+ e.tables + r.elements.flat_map { |e| e.e.tables }
6
+ end
7
+ end
8
+
9
+ module ConjunctionExpression
10
+ def tables
11
+ e.tables + r.elements.flat_map { |e| e.e.tables }
12
+ end
13
+ end
14
+
15
+ module NegationExpression
16
+ def tables
17
+ e.tables
18
+ end
19
+ end
20
+
21
+ module EqualityExpression
22
+ def tables
23
+ e.tables + r.elements.flat_map { |e| e.e.tables }
24
+ end
25
+ end
26
+
27
+ module BetweenExpression
28
+ def tables
29
+ e.tables + r.elements.flat_map do |e|
30
+ e.l.tables + e.r.tables
31
+ end
32
+ end
33
+ end
34
+
35
+ module SetPredicateExpression
36
+ def tables
37
+ e.tables + query_expression.tables
38
+ end
39
+ end
40
+
41
+ module ExistsExpression
42
+ def tables
43
+ query_expression.tables
44
+ end
45
+ end
46
+
47
+ module TestExpression
48
+ module Binary
49
+ def tables
50
+ l.tables + r.tables
51
+ end
52
+ end
53
+ module Unary
54
+ def tables
55
+ e.tables
56
+ end
57
+ end
58
+ end
59
+
3
60
  module GenExpression
4
61
  def tables
5
62
  gen_value.tables + r.elements.flat_map { |e| e.gen_value.tables }
@@ -21,6 +78,27 @@ module SQLiterate
21
78
  end
22
79
  end
23
80
 
81
+ module CaseExpression
82
+ def tables
83
+ case_else_section.tables + \
84
+ case_when_section.tables + r.elements.flat_map do |e|
85
+ e.case_when_section.tables
86
+ end
87
+ end
88
+ end
89
+
90
+ module CaseWhenSection
91
+ def tables
92
+ w.tables + t.tables
93
+ end
94
+ end
95
+
96
+ module CaseElseSection
97
+ def tables
98
+ respond_to?(:scalar_expression) ? scalar_expression.tables : []
99
+ end
100
+ end
101
+
24
102
  module FunctionCall
25
103
  def tables
26
104
  function_params.tables
@@ -47,14 +125,28 @@ module SQLiterate
47
125
 
48
126
  module OrderByClause
49
127
  def tables
50
- respond_to?(:expressions_list) ? expressions_list.tables : []
128
+ respond_to?(:sort_expressions_list) ? sort_expressions_list.tables : []
129
+ end
130
+ end
131
+
132
+ module SortExpressionsList
133
+ def tables
134
+ sort_expression.tables + r.elements.flat_map do |e|
135
+ e.sort_expression.tables
136
+ end
137
+ end
138
+ end
139
+
140
+ module SortExpression
141
+ def tables
142
+ scalar_expression.tables
51
143
  end
52
144
  end
53
145
 
54
146
  module ExpressionsList
55
147
  def tables
56
- gen_expression.tables + r.elements.flat_map do |e|
57
- e.gen_expression.tables
148
+ scalar_expression.tables + r.elements.flat_map do |e|
149
+ e.scalar_expression.tables
58
150
  end
59
151
  end
60
152
  end
@@ -69,7 +161,7 @@ module SQLiterate
69
161
 
70
162
  module NamedExpression
71
163
  def tables
72
- gen_expression.tables
164
+ scalar_expression.tables
73
165
  end
74
166
  end
75
167
 
@@ -99,7 +191,7 @@ module SQLiterate
99
191
  end
100
192
  module Expression
101
193
  def tables
102
- gen_expression.tables
194
+ scalar_expression.tables
103
195
  end
104
196
  end
105
197
  module Identifier
@@ -127,13 +219,13 @@ module SQLiterate
127
219
 
128
220
  module SelectQuery
129
221
  def tables
130
- select_list.tables + table_expression.tables
222
+ select_list.tables + table_expression.tables + order_by_clause.tables
131
223
  end
132
224
  end
133
225
 
134
226
  module TableExpression
135
227
  def tables
136
- from_clause.tables
228
+ from_clause.tables + where_clause.tables + group_by_clause.tables
137
229
  end
138
230
  end
139
231
 
@@ -143,6 +235,28 @@ module SQLiterate
143
235
  end
144
236
  end
145
237
 
238
+ module WhereClause
239
+ def tables
240
+ respond_to?(:scalar_expression) ? scalar_expression.tables : []
241
+ end
242
+ end
243
+
244
+ module GroupByClause
245
+ def tables
246
+ if respond_to?(:expressions_list)
247
+ expressions_list.tables + having_clause.tables
248
+ else
249
+ []
250
+ end
251
+ end
252
+ end
253
+
254
+ module HavingClause
255
+ def tables
256
+ respond_to?(:scalar_expression) ? scalar_expression.tables : []
257
+ end
258
+ end
259
+
146
260
  module TableReferences
147
261
  def tables
148
262
  table_joins.tables + r.elements.flat_map { |e| e.table_joins.tables }
@@ -1,5 +1,78 @@
1
1
  module SQLiterate
2
2
  module Node
3
+ module DisjunctionExpression
4
+ def value
5
+ if r.empty?
6
+ e.value
7
+ else
8
+ [:or, e.value ] + r.elements.flat_map { |e| e.e.value }
9
+ end
10
+ end
11
+ end
12
+
13
+ module ConjunctionExpression
14
+ def value
15
+ if r.empty?
16
+ e.value
17
+ else
18
+ [:and, e.value ] + r.elements.flat_map { |e| e.e.value }
19
+ end
20
+ end
21
+ end
22
+
23
+ module NegationExpression
24
+ def value
25
+ [:not, e.value]
26
+ end
27
+ end
28
+
29
+ module EqualityExpression
30
+ def value
31
+ if r.empty?
32
+ e.value
33
+ else
34
+ [:eq, e.value ] + r.elements.flat_map { |e| e.e.value }
35
+ end
36
+ end
37
+ end
38
+
39
+ module BetweenExpression
40
+ def value
41
+ if r.empty?
42
+ e.value
43
+ else
44
+ [:b, gen_expression.value] + r.elements.flat_map do |e|
45
+ [e.l.value, e.r.value]
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ module SetPredicateExpression
52
+ def value
53
+ [:set, e.value, query_expression.value]
54
+ end
55
+ end
56
+
57
+ module ExistsExpression
58
+ def value
59
+ [:exists, query_expression.value]
60
+ end
61
+ end
62
+
63
+ module TestExpression
64
+ module Binary
65
+ def value
66
+ [:test, l.value, r.value]
67
+ end
68
+ end
69
+ module Unary
70
+ def value
71
+ [:test, e.value]
72
+ end
73
+ end
74
+ end
75
+
3
76
  module GenExpression
4
77
  def value
5
78
  h.elements.map { |e| e.gen_operator.operator } +
@@ -12,10 +85,6 @@ module SQLiterate
12
85
  end
13
86
 
14
87
  module GenValue
15
- module Literal
16
- end
17
- module Function
18
- end
19
88
  module Subscript
20
89
  def value
21
90
  [:s, field_selection.value] + r.elements.map do |e|
@@ -23,8 +92,6 @@ module SQLiterate
23
92
  end
24
93
  end
25
94
  end
26
- module Field
27
- end
28
95
  end
29
96
 
30
97
  module FunctionCall
@@ -59,8 +126,8 @@ module SQLiterate
59
126
 
60
127
  module ExpressionsList
61
128
  def value
62
- [gen_expression.value] + r.elements.map do |e|
63
- e.gen_expression.value
129
+ [scalar_expression.value] + r.elements.map do |e|
130
+ e.scalar_expression.value
64
131
  end
65
132
  end
66
133
  end
@@ -76,9 +143,9 @@ module SQLiterate
76
143
  module NamedExpression
77
144
  def value
78
145
  if respond_to?(:column_name)
79
- [column_name.name, gen_expression.value]
146
+ [column_name.name, scalar_expression.value]
80
147
  else
81
- gen_expression.value
148
+ scalar_expression.value
82
149
  end
83
150
  end
84
151
  end
@@ -109,7 +176,7 @@ module SQLiterate
109
176
  end
110
177
  module Expression
111
178
  def value
112
- gen_expression.value
179
+ scalar_expression.value
113
180
  end
114
181
  end
115
182
  module Positional
@@ -1,11 +1,5 @@
1
1
  module SQLiterate
2
2
  module Node
3
- module KeywordOperator
4
- def operator
5
- text_value.to_sym
6
- end
7
- end
8
-
9
3
  module OperatorChar
10
4
  def char
11
5
  c.text_value
@@ -47,5 +41,11 @@ module SQLiterate
47
41
  ( r.elements.map { |e| e.op_char.char } + [op_char.char] ).join.to_sym
48
42
  end
49
43
  end
44
+
45
+ module ComparisonOperator
46
+ def operator
47
+ o.text_value.to_sym
48
+ end
49
+ end
50
50
  end
51
51
  end
@@ -1,3 +1,3 @@
1
1
  module SQLiterate
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqliterate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -121,7 +121,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
121
  version: '0'
122
122
  segments:
123
123
  - 0
124
- hash: 382804920443655143
124
+ hash: 2802900881270778442
125
125
  required_rubygems_version: !ruby/object:Gem::Requirement
126
126
  none: false
127
127
  requirements:
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  version: '0'
131
131
  segments:
132
132
  - 0
133
- hash: 382804920443655143
133
+ hash: 2802900881270778442
134
134
  requirements: []
135
135
  rubyforge_project:
136
136
  rubygems_version: 1.8.23