sqliterate 0.1.1 → 0.1.2

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.
@@ -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