oracle-sql-parser 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b3505431e68f1b0fccaeb6dfe569e5bfbf38a70d
4
- data.tar.gz: 924e4f7151ebe7c5a3dc9c1e8da5ae4122eed3c1
3
+ metadata.gz: a018b591726cc7ed741116975e8e1b584290ecdb
4
+ data.tar.gz: af228b7b9f8c1d968741be535a3608c1769f0275
5
5
  SHA512:
6
- metadata.gz: 8c2dfb4cbfecfd84eca4bf9432e9a3c8541822c78706ec332ebec08949d39a7587c45f428a59c525c64011c12787b73b3747674bd263b7f813df9f0ddfbc7c55
7
- data.tar.gz: 0f2205686f45275e285f52ddbffa75cf49b9c5a2121bc89c489257a2b1f48f4c1cea24f5d974b8af04553cc479f729bdc7e0064fd5f339409f59859a102b396c
6
+ metadata.gz: 965fcce0d33993a725e371160860a696c9064969bddcf851cc04e77dca7e9b7a5326cead6c05a0cdd2a860b9e5aa24f49ddef04005b7e283d2d97ce214990d54
7
+ data.tar.gz: b98665f5a7b3074f6e5dd7f7b00a132a7fed6edc407d7962feaa01cbfb28e88441ffb35bf70c8c4873312be74b3926ed840edc4755e326870eb634a017144cb2
data/README.md CHANGED
@@ -58,6 +58,16 @@ ast.to_sql
58
58
  => "select 1 from dual"
59
59
  </pre>
60
60
 
61
+ ```ruby
62
+ p = ast.to_parameternized
63
+ p.to_sql
64
+ p.params.inspect
65
+ ```
66
+ <pre>
67
+ =&gt; "select :a0 from dual"
68
+ =&gt; {"a0"=&gt;#&lt;OracleSqlParser::Ast::NumberLiteral {:value=&gt;"1"}&gt;}
69
+ </pre>
70
+
61
71
  ## Contributing
62
72
 
63
73
  Bug reports and pull requests are welcome on GitHub at https://github.com/jksy/sql_parser.
@@ -1,5 +1,6 @@
1
1
  module OracleSqlParser
2
2
  end
3
+ require 'pry-byebug'
3
4
  require 'treetop'
4
5
  require 'oracle-sql-parser/version.rb'
5
6
  require 'oracle-sql-parser/util.rb'
@@ -9,6 +9,12 @@ require 'oracle-sql-parser/ast/hash.rb'
9
9
  require 'oracle-sql-parser/ast/select_statement.rb'
10
10
  require 'oracle-sql-parser/ast/subquery.rb'
11
11
  require 'oracle-sql-parser/ast/query_block.rb'
12
+ require 'oracle-sql-parser/ast/inner_cross_join_clause.rb'
13
+ require 'oracle-sql-parser/ast/inner_join_clause.rb'
14
+ require 'oracle-sql-parser/ast/outer_join_clause.rb'
15
+ require 'oracle-sql-parser/ast/on_clause.rb'
16
+ require 'oracle-sql-parser/ast/using_clause.rb'
17
+ require 'oracle-sql-parser/ast/cross_natural_join_clause.rb'
12
18
  require 'oracle-sql-parser/ast/where_clause.rb'
13
19
  require 'oracle-sql-parser/ast/simple_comparision_condition.rb'
14
20
  require 'oracle-sql-parser/ast/logical_condition.rb'
@@ -18,6 +24,14 @@ require 'oracle-sql-parser/ast/null_condition.rb'
18
24
  require 'oracle-sql-parser/ast/between_condition.rb'
19
25
  require 'oracle-sql-parser/ast/exists_condition.rb'
20
26
  require 'oracle-sql-parser/ast/in_condition.rb'
27
+ require 'oracle-sql-parser/ast/compound_condition.rb'
28
+ require 'oracle-sql-parser/ast/floating_point_condition.rb'
29
+ require 'oracle-sql-parser/ast/is_a_set_condition.rb'
30
+ require 'oracle-sql-parser/ast/is_empty_condition.rb'
31
+ require 'oracle-sql-parser/ast/member_condition.rb'
32
+ require 'oracle-sql-parser/ast/submultiset_condition.rb'
33
+ require 'oracle-sql-parser/ast/is_of_type_condition.rb'
34
+ require 'oracle-sql-parser/ast/only_and_type.rb'
21
35
  require 'oracle-sql-parser/ast/group_by_clause.rb'
22
36
  require 'oracle-sql-parser/ast/rollup_cube_clause.rb'
23
37
  require 'oracle-sql-parser/ast/for_update_clause.rb'
@@ -38,6 +52,5 @@ require 'oracle-sql-parser/ast/identifier.rb'
38
52
  require 'oracle-sql-parser/ast/text_literal.rb'
39
53
  require 'oracle-sql-parser/ast/number_literal.rb'
40
54
  require 'oracle-sql-parser/ast/table_reference.rb'
41
- require 'oracle-sql-parser/ast/compound_condition.rb'
42
55
  require 'oracle-sql-parser/ast/variable.rb'
43
56
  require 'oracle-sql-parser/ast/keyword.rb'
@@ -1,3 +1,4 @@
1
+
1
2
  def nil.ast
2
3
  nil
3
4
  end
@@ -0,0 +1,8 @@
1
+ module OracleSqlParser::Ast
2
+ class CrossNaturalJoinClause < InnerCrossJoinClause
3
+ def to_sql
4
+ @ast.values_at(:table1, :cross, :natural, :inner, :join, :table2).
5
+ compact.map(&:to_sql).join(' ')
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module OracleSqlParser::Ast
2
+ class FloatingPointCondition < Hash
3
+ def to_sql(options = {})
4
+ @ast.values_at(:target, :is, :not, :value).compact.map(&:to_sql).join(' ')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module OracleSqlParser::Ast
2
+ class InnerCrossJoinClause < Hash
3
+ def table1=(value)
4
+ @ast[:table1] = value
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ module OracleSqlParser::Ast
2
+ class InnerJoinClause < InnerCrossJoinClause
3
+ def to_sql
4
+ @ast.values_at(:table1, :inner, :join, :table2, :on_or_using_clause).
5
+ map(&:to_sql).compact.join(' ')
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module OracleSqlParser::Ast
2
+ class IsASetCondition < Hash
3
+ def to_sql(options = {})
4
+ @ast.values_at(:target, :is, :not, :a, :set).compact.map(&:to_sql).join(' ')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module OracleSqlParser::Ast
2
+ class IsEmptyCondition < Hash
3
+ def to_sql(options = {})
4
+ @ast.values_at(:target, :is, :not, :empty).compact.map(&:to_sql).join(' ')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ module OracleSqlParser::Ast
2
+ class IsOfTypeCondition < Hash
3
+ def to_sql(options = {})
4
+ [
5
+ @ast[:target],
6
+ @ast[:is],
7
+ @ast[:not],
8
+ @ast[:of],
9
+ @ast[:type],
10
+ "(#{@ast[:types].map(&:to_sql).join(',')})",
11
+ ].compact.map(&:to_sql).join(' ')
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ module OracleSqlParser::Ast
2
+ class MemberCondition < Hash
3
+ def to_sql(options = {})
4
+ @ast.values_at(:target, :is, :not, :member, :of, :table).
5
+ compact.map(&:to_sql).join(' ')
6
+ end
7
+ end
8
+ end
9
+
@@ -0,0 +1,7 @@
1
+ module OracleSqlParser::Ast
2
+ class OnClause < Hash
3
+ def to_sql
4
+ @ast.values_at(:on, :condition).map(&:to_sql).join(' ')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module OracleSqlParser::Ast
2
+ class OnlyAndType < Hash
3
+ def to_sql(options ={})
4
+ @ast.values_at(:only, :type).compact.map(&:to_sql).join(' ')
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ module OracleSqlParser::Ast
2
+ class OuterJoinClause < Hash
3
+ def table1=(value)
4
+ @ast[:table1] = value
5
+ end
6
+
7
+ def to_sql
8
+ @ast.values_at(:table1, :natural, :join_type, :outer, :join, :table2, :on_or_using_clause).
9
+ compact.map(&:to_sql).join(' ')
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ module OracleSqlParser::Ast
2
+ class SubmultisetCondition < Hash
3
+ def to_sql(options = {})
4
+ @ast.values_at(:target, :not, :submultiset,:of, :table).compact.map(&:to_sql).join(' ')
5
+ end
6
+ end
7
+ end
8
+
@@ -1,5 +1,23 @@
1
1
  module OracleSqlParser::Ast
2
2
  class Subquery < Hash
3
+ def to_sql(options = {})
4
+ if @ast[:union]
5
+ [
6
+ @ast[:query_block1],
7
+ @ast[:union].map(&:to_sql).join(' '),
8
+ @ast[:query_block2],
9
+ @ast[:order_by_clause],
10
+ ].compact.map(&:to_sql).join(' ')
11
+ else
12
+ [
13
+ @ast[:query_block],
14
+ @ast[:order_by_clause]
15
+ ].compact.map(&:to_sql).join(' ')
16
+ end
17
+ end
3
18
 
19
+ def order_by_clause=(value)
20
+ @ast[:order_by_clause] = value
21
+ end
4
22
  end
5
23
  end
@@ -0,0 +1,10 @@
1
+ module OracleSqlParser::Ast
2
+ class UsingClause < Hash
3
+ def to_sql
4
+ result = []
5
+ result << @ast[:using]
6
+ result << "(#{@ast[:column_list].map(&:to_sql).join(',')})"
7
+ result.map(&:to_sql).join(' ')
8
+ end
9
+ end
10
+ end
@@ -15,7 +15,6 @@ module OracleSqlParser::Grammar
15
15
  model_condition /
16
16
  mutiset_condition /
17
17
  pattern_maching_condition /
18
- range_condition /
19
18
  null_condition /
20
19
  xml_condition /
21
20
  compound_condition /
@@ -85,7 +84,20 @@ module OracleSqlParser::Grammar
85
84
  end
86
85
 
87
86
  rule floating_point_condition
88
- 'floating_point_condition'
87
+ expr space? is_keyword space? not_keyword:not_keyword? space?
88
+ value:(
89
+ nan_keyword /
90
+ infinite_keyword
91
+ ) {
92
+ def ast
93
+ OracleSqlParser::Ast::FloatingPointCondition[
94
+ :target => expr.ast,
95
+ :is => is_keyword.ast,
96
+ :not => not_keyword.ast,
97
+ :value => value.ast
98
+ ]
99
+ end
100
+ }
89
101
  end
90
102
 
91
103
  rule model_condition
@@ -93,7 +105,81 @@ module OracleSqlParser::Grammar
93
105
  end
94
106
 
95
107
  rule mutiset_condition
96
- 'mutiset_condition'
108
+ is_a_set_condition /
109
+ is_empty_condition /
110
+ member_condition /
111
+ submultiset_condition {
112
+ def ast
113
+ super
114
+ end
115
+ }
116
+ end
117
+
118
+ rule nested_table
119
+ ident {
120
+ def ast
121
+ super
122
+ end
123
+ }
124
+ end
125
+
126
+ rule is_a_set_condition
127
+ nested_table space? is_keyword space? not_keyword:not_keyword? space? a:[Aa] space? set_keyword {
128
+ def ast
129
+ OracleSqlParser::Ast::IsASetCondition[
130
+ :target => nested_table.ast,
131
+ :is => is_keyword.ast,
132
+ :not => not_keyword.ast,
133
+ :a => OracleSqlParser::Ast::Keyword[:name => a.text_value],
134
+ :set => set_keyword.ast
135
+ ]
136
+ end
137
+ }
138
+ end
139
+
140
+ rule is_empty_condition
141
+ nested_table space? is_keyword space? not_keyword:not_keyword? space? empty_keyword {
142
+ def ast
143
+ OracleSqlParser::Ast::IsEmptyCondition[
144
+ :target => nested_table.ast,
145
+ :is => is_keyword.ast,
146
+ :not => not_keyword.ast,
147
+ :empty => empty_keyword.ast
148
+ ]
149
+ end
150
+ }
151
+ end
152
+
153
+ rule member_condition
154
+ expr space? not_keyword:not_keyword? space? member_keyword space? of_keyword space? nested_table {
155
+ def ast
156
+ OracleSqlParser::Ast::MemberCondition[
157
+ :target => expr.ast,
158
+ :not => not_keyword.ast,
159
+ :member => member_keyword.ast,
160
+ :of => of_keyword.ast,
161
+ :table => nested_table.ast
162
+ ]
163
+ end
164
+ }
165
+ end
166
+
167
+ rule submultiset_condition
168
+ table1:nested_table space?
169
+ not_keyword:not_keyword? space?
170
+ submultiset_keyword space?
171
+ of_keyword:of_keyword? space?
172
+ table2:nested_table {
173
+ def ast
174
+ OracleSqlParser::Ast::SubmultisetCondition[
175
+ :target => table1.ast,
176
+ :not => not_keyword.ast,
177
+ :submultiset => submultiset_keyword.ast,
178
+ :of => of_keyword.ast,
179
+ :table => table2.ast
180
+ ]
181
+ end
182
+ }
97
183
  end
98
184
 
99
185
  rule pattern_maching_condition
@@ -144,10 +230,6 @@ module OracleSqlParser::Grammar
144
230
  }
145
231
  end
146
232
 
147
- rule range_condition
148
- 'range_condition'
149
- end
150
-
151
233
  rule null_condition
152
234
  expr space is_keyword space n:(not_keyword space)? null_keyword {
153
235
  def ast
@@ -218,7 +300,55 @@ module OracleSqlParser::Grammar
218
300
  end
219
301
 
220
302
  rule is_of_type_condition
221
- 'is_of_type_condition'
303
+ expr space?
304
+ is_keyword space?
305
+ not_keyword:not_keyword? space?
306
+ of_keyword space?
307
+ type_keyword:type_keyword? space?
308
+ '(' space? types space? ')' {
309
+ def ast
310
+ OracleSqlParser::Ast::IsOfTypeCondition[
311
+ :target => expr.ast,
312
+ :is => is_keyword.ast,
313
+ :not => not_keyword.ast,
314
+ :of => of_keyword.ast,
315
+ :type => type_keyword.ast,
316
+ :types => types.ast
317
+ ]
318
+ end
319
+ }
320
+ end
321
+
322
+ rule types
323
+ only_and_type space? more:(',' space? only_and_type space?)* {
324
+ def ast
325
+ OracleSqlParser::Ast::Array[only_and_type.ast, *more_only_and_types.map(&:ast)]
326
+ end
327
+
328
+ def more_only_and_types
329
+ more.elements.map(&:only_and_type)
330
+ end
331
+ }
332
+ end
333
+
334
+ rule only_and_type
335
+ only_keyword:only_keyword? space? type {
336
+ def ast
337
+ OracleSqlParser::Ast::OnlyAndType[
338
+ :only => only_keyword.ast,
339
+ :type => type.ast
340
+ ]
341
+ end
342
+ }
343
+ end
344
+
345
+ rule type
346
+ schema_name '.' ident /
347
+ ident {
348
+ def ast
349
+ OracleSqlParser::Ast::Identifier[:name => text_value]
350
+ end
351
+ }
222
352
  end
223
353
  end
224
354
  end
@@ -120,6 +120,7 @@ EOS
120
120
  'DISTINCT',
121
121
  'DROP',
122
122
  'ELSE',
123
+ 'EMPTY',
123
124
  'END',
124
125
  'ESCAPE',
125
126
  'EXCLUSIVE',
@@ -138,6 +139,7 @@ EOS
138
139
  'IN',
139
140
  'INCREMENT',
140
141
  'INDEX',
142
+ 'INFINITE',
141
143
  'INITIAL',
142
144
  'INNER',
143
145
  'INSERT',
@@ -156,10 +158,12 @@ EOS
156
158
  'LOCK',
157
159
  'LONG',
158
160
  'MAXEXTENTS',
161
+ 'MEMBER',
159
162
  'MINUS',
160
163
  'MLSLABEL',
161
164
  'MODE',
162
165
  'MODIFY',
166
+ 'NAN',
163
167
  'NATURAL',
164
168
  'NESTED_TABLE_ID',
165
169
  'NEXTVAL',
@@ -174,6 +178,7 @@ EOS
174
178
  'OFFLINE',
175
179
  'ON',
176
180
  'ONLINE',
181
+ 'ONLY',
177
182
  'OPTION',
178
183
  'OR',
179
184
  'ORDER',
@@ -201,6 +206,7 @@ EOS
201
206
  'SIBLINGS',
202
207
  'SMALLINT',
203
208
  'START',
209
+ 'SUBMULTISET',
204
210
  'SUCCESSFUL',
205
211
  'SYNONYM',
206
212
  'SYSDATE',
@@ -209,6 +215,7 @@ EOS
209
215
  'THEN',
210
216
  'TO',
211
217
  'TRIGGER',
218
+ 'TYPE',
212
219
  'UID',
213
220
  'UNION',
214
221
  'UNIQUE',
@@ -11,18 +11,68 @@ module OracleSqlParser::Grammar
11
11
  end
12
12
 
13
13
  rule subquery
14
- query_block
15
- (
16
- more_queries:(
17
- union_keyword (space all_keyword?) /
18
- intersect_keyword /
19
- minus_keyword
20
- ) space? subquery )?
21
- order_by_clause:order_by_clause? {
14
+ query:(
15
+ subquery_with_union /
16
+ subquery_only_query_block
17
+ )
18
+ space? order_by_clause:order_by_clause? {
19
+ def ast
20
+ result = query.ast
21
+ result.order_by_clause = order_by_clause.ast
22
+ result
23
+ end
24
+ }
25
+ end
26
+
27
+ rule subquery_only_query_block
28
+ '(' space? query_block:query_block space? ')' /
29
+ query_block:query_block {
22
30
  def ast
23
31
  OracleSqlParser::Ast::Subquery[
24
- :query_block => query_block.ast,
25
- :order_by_clause => order_by_clause.ast]
32
+ :query_block => query_block.ast
33
+ ]
34
+ end
35
+ }
36
+ end
37
+
38
+ rule subquery_with_union
39
+ '(' query_block1:query_block space? union_or_intersect_or_minus space? query_block2:query_block ')' /
40
+ query_block1:query_block space? union_or_intersect_or_minus space? query_block2:query_block {
41
+ def ast
42
+ OracleSqlParser::Ast::Subquery[
43
+ :query_block1 => query_block1.ast,
44
+ :union => union_or_intersect_or_minus.ast,
45
+ :query_block2 => query_block2.ast
46
+ ]
47
+ end
48
+ }
49
+ end
50
+
51
+ rule union_or_intersect_or_minus
52
+ (
53
+ union:union_all /
54
+ intersect:intersect_keyword /
55
+ minus:minus_keyword
56
+ ) {
57
+ def ast
58
+ if respond_to? :union
59
+ union.ast
60
+ elsif respond_to? :intersect
61
+ OracleSqlParser::Ast::Array[intersect.ast]
62
+ elsif respond_to? :minus
63
+ OracleSqlParser::Ast::Array[minus.ast]
64
+ end
65
+ end
66
+ }
67
+ end
68
+
69
+ rule union_all
70
+ union_keyword all:(space all_keyword)? {
71
+ def ast
72
+ OracleSqlParser::Ast::Array[
73
+ union_keyword.ast,
74
+ all.try(:all_keyword).ast
75
+ ]
26
76
  end
27
77
  }
28
78
  end
@@ -57,7 +107,7 @@ module OracleSqlParser::Grammar
57
107
 
58
108
  rule select_sources
59
109
  join_clause /
60
- '(' space? join_clause space? ')' /
110
+ '(' space? join_clause:join_clause space? ')' /
61
111
  table_reference {
62
112
  def ast
63
113
  if respond_to? :join_clause
@@ -71,14 +121,16 @@ module OracleSqlParser::Grammar
71
121
 
72
122
  rule join_clause
73
123
  table_reference space
74
- (
124
+ join:(
75
125
  outer_join_clause /
76
- inner_cross_join_clause {
77
- def ast
78
- super
79
- end
80
- }
81
- )
126
+ inner_cross_join_clause
127
+ ) {
128
+ def ast
129
+ result = join.ast
130
+ result.table1 = table_reference.ast
131
+ result
132
+ end
133
+ }
82
134
  end
83
135
 
84
136
  rule inner_cross_join_clause
@@ -91,50 +143,119 @@ module OracleSqlParser::Grammar
91
143
  end
92
144
 
93
145
  rule inner_join_clause
94
- inner_keyword space? join_keyword space? table_reference space?
95
- (
96
- on_keyword space? condition /
97
- using_keyword space? '(' space? column_list space? ')'
98
- ) {
146
+ inner_join space? table_reference space? on_or_using_clause {
147
+ def ast
148
+ OracleSqlParser::Ast::InnerJoinClause[
149
+ :inner => inner_join.inner_keyword.ast,
150
+ :join => inner_join.try(:join_keyword).ast,
151
+ :table2 => table_reference.ast,
152
+ :on_or_using_clause => on_or_using_clause.ast
153
+ ]
154
+ end
155
+ }
156
+ end
157
+
158
+ rule inner_join
159
+ inner_keyword space? join_keyword
160
+ end
161
+
162
+ rule on_or_using_clause
163
+ on_clause /
164
+ using_clause {
99
165
  def ast
100
- 'inner_join_clause'
166
+ super
167
+ end
168
+ }
169
+ end
170
+
171
+ rule on_clause
172
+ on_keyword space? condition {
173
+ def ast
174
+ OracleSqlParser::Ast::OnClause[
175
+ :on => on_keyword.ast,
176
+ :condition => condition.ast
177
+ ]
178
+ end
179
+ }
180
+ end
181
+
182
+ rule using_clause
183
+ using_keyword space? '(' space? column_list space? ')' {
184
+ def ast
185
+ OracleSqlParser::Ast::UsingClause[
186
+ :using => using_keyword.ast,
187
+ :column_list => column_list.ast
188
+ ]
101
189
  end
102
190
  }
103
191
  end
104
192
 
105
193
  rule cross_join_clause
106
- (
107
- cross_keyword /
108
- natural_keyword (space inner_keyword)?
109
- ) space join_keyword space table_reference {
194
+ cross_natural_join space table_reference {
110
195
  def ast
111
- 'cross_join_clause'
196
+ OracleSqlParser::Ast::CrossNaturalJoinClause[
197
+ :cross => cross_natural_join.cross_keyword.ast,
198
+ :natural => cross_natural_join.natural_keyword.ast,
199
+ :inner => cross_natural_join.inner_keyword.ast,
200
+ :join => cross_natural_join.try(:join_keyword).ast,
201
+ :table2 => table_reference.ast
202
+ ]
203
+ end
204
+ }
205
+ end
206
+
207
+ rule cross_natural_join
208
+ (
209
+ cross_keyword:cross_keyword /
210
+ natural_keyword:natural_keyword inner:(space inner_keyword)?
211
+ ) space join_keyword {
212
+
213
+ def cross_keyword
214
+ elements.first.try(:cross_keyword)
215
+ end
216
+
217
+ def natural_keyword
218
+ elements.first.try(:natural_keyword)
219
+ end
220
+
221
+ def inner_keyword
222
+ elements.first.try(:inner).try(:inner_keyword)
112
223
  end
113
224
  }
114
225
  end
115
226
 
116
227
  rule column_list
117
- column_name (space? ',' space? column_name)* {
228
+ column_name more:(space? ',' space? column_name)* {
118
229
  def ast
119
- 'column_list'
230
+ OracleSqlParser::Ast::Array[
231
+ column_name.ast,
232
+ *more_column_names.map(&:ast)
233
+ ]
234
+ end
235
+
236
+ def more_column_names
237
+ more.elements.map(&:column_name)
120
238
  end
121
239
  }
122
240
  end
123
241
 
124
242
  rule outer_join_clause
125
243
  query_partition_clause?
126
- (
127
- outer_join_type space? join_keyword /
128
- natural_keyword space? outer_join_type? space? join_keyword
244
+ join_type:(
245
+ natural_keyword:natural_keyword? space? outer_join_type:outer_join_type? space? join_keyword
129
246
  ) space
130
247
  table_reference space
131
248
  (query_partition_clause space)?
132
- (
133
- on_keyword space? condition /
134
- using_keyword space '(' space? column_list space? ')'
135
- ) {
249
+ on_or_using_clause {
136
250
  def ast
137
- 'outer_join_clause'
251
+ OracleSqlParser::Ast::OuterJoinClause[
252
+ :natural => join_type.try(:natural_keyword).ast,
253
+ :join_type => join_type.outer_join_type.try(:type).ast,
254
+ :outer => join_type.outer_join_type.try(:outer).ast,
255
+ :join => join_type.join_keyword.ast,
256
+ :table2 => table_reference.ast,
257
+ :on_or_using_clause => on_or_using_clause.ast
258
+ ]
138
259
  end
139
260
  }
140
261
  end
@@ -142,19 +263,19 @@ module OracleSqlParser::Grammar
142
263
  rule query_partition_clause
143
264
  'query_partition_clause' {
144
265
  def ast
145
- 'query_partition_clause'
266
+ 'query_partition_clause' # do not supported
146
267
  end
147
268
  }
148
269
  end
149
270
 
150
271
  rule outer_join_type
151
- (
272
+ type:(
152
273
  full_keyword /
153
274
  left_keyword /
154
275
  right_keyword
155
- ) (space outer_keyword)? {
156
- def ast
157
- 'outer_join_type'
276
+ ) o:(space outer_keyword)? {
277
+ def outer
278
+ o.try(:outer_keyword)
158
279
  end
159
280
  }
160
281
  end
@@ -164,7 +285,7 @@ module OracleSqlParser::Grammar
164
285
  update_keyword space?
165
286
  of:(of_keyword space for_update_clause_columns space?)?
166
287
  wait:(
167
- w:wait_keyword space? time:integer /
288
+ w:wait_keyword space? time:integer /
168
289
  w:nowait_keyword
169
290
  )? {
170
291
  def ast
@@ -1,3 +1,3 @@
1
1
  module OracleSqlParser
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oracle-sql-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Junichiro Kasuya
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-27 00:00:00.000000000 Z
11
+ date: 2015-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,25 +100,36 @@ files:
100
100
  - lib/oracle-sql-parser/ast/base.rb
101
101
  - lib/oracle-sql-parser/ast/between_condition.rb
102
102
  - lib/oracle-sql-parser/ast/compound_condition.rb
103
+ - lib/oracle-sql-parser/ast/cross_natural_join_clause.rb
103
104
  - lib/oracle-sql-parser/ast/current_of.rb
104
105
  - lib/oracle-sql-parser/ast/delete_statement.rb
105
106
  - lib/oracle-sql-parser/ast/delete_target.rb
106
107
  - lib/oracle-sql-parser/ast/exists_condition.rb
108
+ - lib/oracle-sql-parser/ast/floating_point_condition.rb
107
109
  - lib/oracle-sql-parser/ast/for_update_clause.rb
108
110
  - lib/oracle-sql-parser/ast/function_expression.rb
109
111
  - lib/oracle-sql-parser/ast/group_by_clause.rb
110
112
  - lib/oracle-sql-parser/ast/hash.rb
111
113
  - lib/oracle-sql-parser/ast/identifier.rb
112
114
  - lib/oracle-sql-parser/ast/in_condition.rb
115
+ - lib/oracle-sql-parser/ast/inner_cross_join_clause.rb
116
+ - lib/oracle-sql-parser/ast/inner_join_clause.rb
113
117
  - lib/oracle-sql-parser/ast/insert_statement.rb
114
118
  - lib/oracle-sql-parser/ast/insert_values_clause.rb
119
+ - lib/oracle-sql-parser/ast/is_a_set_condition.rb
120
+ - lib/oracle-sql-parser/ast/is_empty_condition.rb
121
+ - lib/oracle-sql-parser/ast/is_of_type_condition.rb
115
122
  - lib/oracle-sql-parser/ast/keyword.rb
116
123
  - lib/oracle-sql-parser/ast/like_condition.rb
117
124
  - lib/oracle-sql-parser/ast/logical_condition.rb
125
+ - lib/oracle-sql-parser/ast/member_condition.rb
118
126
  - lib/oracle-sql-parser/ast/null_condition.rb
119
127
  - lib/oracle-sql-parser/ast/number_literal.rb
128
+ - lib/oracle-sql-parser/ast/on_clause.rb
129
+ - lib/oracle-sql-parser/ast/only_and_type.rb
120
130
  - lib/oracle-sql-parser/ast/order_by_clause.rb
121
131
  - lib/oracle-sql-parser/ast/order_by_clause_item.rb
132
+ - lib/oracle-sql-parser/ast/outer_join_clause.rb
122
133
  - lib/oracle-sql-parser/ast/query_block.rb
123
134
  - lib/oracle-sql-parser/ast/regexp_condition.rb
124
135
  - lib/oracle-sql-parser/ast/rollup_cube_clause.rb
@@ -126,12 +137,14 @@ files:
126
137
  - lib/oracle-sql-parser/ast/select_statement.rb
127
138
  - lib/oracle-sql-parser/ast/simple_case_expression.rb
128
139
  - lib/oracle-sql-parser/ast/simple_comparision_condition.rb
140
+ - lib/oracle-sql-parser/ast/submultiset_condition.rb
129
141
  - lib/oracle-sql-parser/ast/subquery.rb
130
142
  - lib/oracle-sql-parser/ast/table_reference.rb
131
143
  - lib/oracle-sql-parser/ast/text_literal.rb
132
144
  - lib/oracle-sql-parser/ast/update_set_clause.rb
133
145
  - lib/oracle-sql-parser/ast/update_set_column.rb
134
146
  - lib/oracle-sql-parser/ast/update_statement.rb
147
+ - lib/oracle-sql-parser/ast/using_clause.rb
135
148
  - lib/oracle-sql-parser/ast/variable.rb
136
149
  - lib/oracle-sql-parser/ast/where_clause.rb
137
150
  - lib/oracle-sql-parser/grammar.rb