oracle-sql-parser 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/README.md +58 -0
  6. data/Rakefile +41 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/lib/oracle-sql-parser.rb +7 -0
  10. data/lib/oracle-sql-parser/ast.rb +38 -0
  11. data/lib/oracle-sql-parser/ast/array.rb +37 -0
  12. data/lib/oracle-sql-parser/ast/base.rb +89 -0
  13. data/lib/oracle-sql-parser/ast/between_condition.rb +4 -0
  14. data/lib/oracle-sql-parser/ast/current_of.rb +4 -0
  15. data/lib/oracle-sql-parser/ast/delete_statement.rb +5 -0
  16. data/lib/oracle-sql-parser/ast/delete_target.rb +6 -0
  17. data/lib/oracle-sql-parser/ast/exists_condition.rb +4 -0
  18. data/lib/oracle-sql-parser/ast/for_update_clause.rb +4 -0
  19. data/lib/oracle-sql-parser/ast/function_expression.rb +4 -0
  20. data/lib/oracle-sql-parser/ast/group_by_clause.rb +4 -0
  21. data/lib/oracle-sql-parser/ast/hash.rb +44 -0
  22. data/lib/oracle-sql-parser/ast/identifier.rb +7 -0
  23. data/lib/oracle-sql-parser/ast/in_condition.rb +4 -0
  24. data/lib/oracle-sql-parser/ast/insert_statement.rb +5 -0
  25. data/lib/oracle-sql-parser/ast/keyword.rb +8 -0
  26. data/lib/oracle-sql-parser/ast/like_condition.rb +4 -0
  27. data/lib/oracle-sql-parser/ast/logical_condition.rb +4 -0
  28. data/lib/oracle-sql-parser/ast/null_condition.rb +4 -0
  29. data/lib/oracle-sql-parser/ast/number_literal.rb +8 -0
  30. data/lib/oracle-sql-parser/ast/order_by_clause.rb +4 -0
  31. data/lib/oracle-sql-parser/ast/order_by_clause_item.rb +4 -0
  32. data/lib/oracle-sql-parser/ast/query_block.rb +17 -0
  33. data/lib/oracle-sql-parser/ast/regexp_condition.rb +4 -0
  34. data/lib/oracle-sql-parser/ast/rollup_cube_clause.rb +4 -0
  35. data/lib/oracle-sql-parser/ast/searched_case_expression.rb +8 -0
  36. data/lib/oracle-sql-parser/ast/select_statement.rb +5 -0
  37. data/lib/oracle-sql-parser/ast/simple_case_expression.rb +7 -0
  38. data/lib/oracle-sql-parser/ast/simple_comparision_condition.rb +4 -0
  39. data/lib/oracle-sql-parser/ast/subquery.rb +5 -0
  40. data/lib/oracle-sql-parser/ast/text_literal.rb +7 -0
  41. data/lib/oracle-sql-parser/ast/update_set_column.rb +4 -0
  42. data/lib/oracle-sql-parser/ast/update_statement.rb +4 -0
  43. data/lib/oracle-sql-parser/ast/where_clause.rb +4 -0
  44. data/lib/oracle-sql-parser/grammar.rb +10 -0
  45. data/lib/oracle-sql-parser/grammar/condition.treetop +224 -0
  46. data/lib/oracle-sql-parser/grammar/delete.treetop +68 -0
  47. data/lib/oracle-sql-parser/grammar/expression.treetop +236 -0
  48. data/lib/oracle-sql-parser/grammar/grammar.treetop +166 -0
  49. data/lib/oracle-sql-parser/grammar/insert.treetop +112 -0
  50. data/lib/oracle-sql-parser/grammar/reserved_word_generator.rb +233 -0
  51. data/lib/oracle-sql-parser/grammar/select.treetop +388 -0
  52. data/lib/oracle-sql-parser/grammar/update.treetop +113 -0
  53. data/lib/oracle-sql-parser/treetop_ext.rb +11 -0
  54. data/lib/oracle-sql-parser/version.rb +3 -0
  55. data/oracle-sql-parser.gemspec +28 -0
  56. metadata +176 -0
@@ -0,0 +1,236 @@
1
+ module OracleSqlParser::Grammar
2
+ grammar Expression
3
+ rule sql_expression
4
+ function_expression /
5
+ case_expression /
6
+ cursor_expression /
7
+ compound_expression /
8
+ datetime_expression /
9
+ interval_expression /
10
+ object_access_expression /
11
+ scalar_subquery_expression /
12
+ model_expression /
13
+ type_constructor_expression /
14
+ simple_expression /
15
+ variable_expression {
16
+ def ast
17
+ super
18
+ end
19
+ }
20
+ end
21
+
22
+ rule simple_expression
23
+ rownum_keyword /
24
+ sysdate_keyword /
25
+ systimestamp_keyword /
26
+ null_keyword /
27
+ text_literal /
28
+ number_literal /
29
+ sequence /
30
+ simple_expression_column {
31
+ def ast
32
+ super
33
+ end
34
+ }
35
+ end
36
+
37
+ rule simple_expression_column
38
+ name:(
39
+ ( schema_name space? '.' space? table_name '.' / table_name space? '.' space? )?
40
+ ( rowid_keyword / column_name )
41
+ ) {
42
+ def ast
43
+ OracleSqlParser::Ast::Identifier.new(:name => text_value)
44
+ end
45
+ }
46
+ end
47
+
48
+ rule compound_expression
49
+ 'compound_expression' # not implemented
50
+ # (
51
+ # ('+' / '-' / prior_keyword) space? expr /
52
+ # (expr space? ('||' / '*' / '/' / '+' / '-') space? expr) /
53
+ # '(' space? expr space? ')'
54
+ # )
55
+ end
56
+
57
+ rule case_expression
58
+ case_keyword space? case_expression:(simple_case_expression / searched_case_expression) space?
59
+ else_clause:else_clause? space? end_keyword {
60
+ def ast
61
+ ast = case_expression.ast
62
+ ast.else_clause = else_clause.ast
63
+ ast
64
+ end
65
+ }
66
+ end
67
+
68
+ rule simple_case_expression
69
+ expr space w:(when_keyword space comparison_expr space then_keyword space? return_expr space?)+ {
70
+ def ast
71
+ OracleSqlParser::Ast::SimpleCaseExpression[
72
+ :condition => expr.ast,
73
+ :when_clauses => OracleSqlParser::Ast::Array[*when_clauses]
74
+ ]
75
+ end
76
+
77
+ def when_clauses
78
+ w.elements.map do |elem|
79
+ OracleSqlParser::Ast::Hash[
80
+ :when_expr => elem.comparison_expr.ast,
81
+ :return_expr => elem.return_expr.ast
82
+ ]
83
+ end
84
+ end
85
+ }
86
+ end
87
+
88
+ rule comparison_expr
89
+ expr {
90
+ def ast
91
+ super
92
+ end
93
+ }
94
+ end
95
+
96
+ rule return_expr
97
+ expr {
98
+ def ast
99
+ super
100
+ end
101
+ }
102
+ end
103
+
104
+ rule else_expr
105
+ expr {
106
+ def ast
107
+ super
108
+ end
109
+ }
110
+ end
111
+
112
+ rule searched_case_expression
113
+ when_keyword space? condition space? then_keyword space? return_expr {
114
+ def ast
115
+ OracleSqlParser::Ast::SearchedCaseExpression[
116
+ :when_condition => condition.ast,
117
+ :return_expr => return_expr.ast
118
+ ]
119
+ end
120
+ }
121
+ end
122
+
123
+ rule else_clause
124
+ else_keyword space? else_expr {
125
+ def ast
126
+ else_expr.ast
127
+ end
128
+ }
129
+ end
130
+
131
+ rule cursor_expression
132
+ 'cursor_expression' # not implemented
133
+ end
134
+
135
+ rule datetime_expression
136
+ 'datetime_expression' # not implemented
137
+ end
138
+
139
+ rule function_expression
140
+ function_name space? '(' space? function_args:function_args? space? ')' {
141
+ def ast
142
+ OracleSqlParser::Ast::FunctionExpressoin[
143
+ :name => function_name.ast,
144
+ :args => function_args ? function_args.ast : nil
145
+ ]
146
+ end
147
+ }
148
+ end
149
+
150
+ rule function_name
151
+ (
152
+ package_name '.' procedure_name /
153
+ procedure_name
154
+ ) {
155
+ def ast
156
+ OracleSqlParser::Ast::Identifier[:name => text_value]
157
+ end
158
+ }
159
+ end
160
+
161
+ rule function_args
162
+ function_arg more:(space? ',' space? function_arg)* {
163
+ def ast
164
+ OracleSqlParser::Ast::Array[function_arg.ast, *more_function_args.map(&:ast)]
165
+ end
166
+
167
+ def more_function_args
168
+ more.elements.map(&:function_arg)
169
+ end
170
+ }
171
+ end
172
+
173
+ rule function_arg
174
+ expr {
175
+ def ast
176
+ super
177
+ end
178
+ }
179
+ end
180
+
181
+ rule interval_expression
182
+ 'interval_expression' # not implemented
183
+ end
184
+
185
+ rule object_access_expression
186
+ 'object_access_expression'
187
+ end
188
+
189
+ rule scalar_subquery_expression
190
+ 'scalar_subquery_expression'
191
+ end
192
+
193
+ rule model_expression
194
+ 'model_expression' #
195
+ end
196
+
197
+ rule type_constructor_expression
198
+ 'type_constructor_expression'
199
+ end
200
+
201
+ rule variable_expression
202
+ 'variable_expression'
203
+ end
204
+
205
+ rule expr
206
+ sql_expression {
207
+ def ast
208
+ super
209
+ end
210
+ }
211
+ end
212
+
213
+ rule exprs
214
+ expr more:(space? ',' space? more_expr:expr)* {
215
+ def ast
216
+ OracleSqlParser::Ast::Array[expr.ast, *more_exprs.map(&:ast)]
217
+ end
218
+
219
+ def more_exprs
220
+ more.elements.map{|e| e.more_expr}
221
+ end
222
+ }
223
+ end
224
+
225
+ rule expression_list
226
+ (
227
+ '(' e:exprs ')' /
228
+ e:exprs
229
+ ) {
230
+ def ast
231
+ e.ast
232
+ end
233
+ }
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,166 @@
1
+ module OracleSqlParser::Grammar
2
+ grammar Grammar
3
+ include OracleSqlParser::Grammar::ReservedWord
4
+ include OracleSqlParser::Grammar::Condition
5
+ include OracleSqlParser::Grammar::Expression
6
+ include OracleSqlParser::Grammar::Select
7
+ include OracleSqlParser::Grammar::Update
8
+ include OracleSqlParser::Grammar::Insert
9
+ include OracleSqlParser::Grammar::Delete
10
+ rule sql
11
+ q:(
12
+ select_statement /
13
+ update_statement /
14
+ insert_statement /
15
+ delete_statement
16
+ ) {
17
+ def ast
18
+ q.ast
19
+ end
20
+ }
21
+ end
22
+
23
+ rule ident
24
+ !keyword [a-zA-Z] [a-zA-Z0-9_]* {
25
+ def ast
26
+ OracleSqlParser::Ast::Identifier.new(:name => text_value)
27
+ end
28
+ }
29
+ end
30
+
31
+ rule space
32
+ ' '+
33
+ end
34
+
35
+ rule hint # not implemented
36
+ '/*+' '*/' {
37
+ def ast
38
+ nil
39
+ end
40
+ }
41
+ end
42
+
43
+ rule t_alias
44
+ ident {
45
+ def ast
46
+ super
47
+ end
48
+ }
49
+ end
50
+
51
+ rule c_alias
52
+ ident {
53
+ def ast
54
+ super
55
+ end
56
+ }
57
+ end
58
+
59
+ rule table_name
60
+ ident {
61
+ def ast
62
+ super
63
+ end
64
+ }
65
+ end
66
+
67
+ rule column_name
68
+ ident {
69
+ def ast
70
+ super
71
+ end
72
+ }
73
+ end
74
+
75
+ rule schema_name
76
+ ident {
77
+ def ast
78
+ super
79
+ end
80
+ }
81
+ end
82
+
83
+ rule number_literal
84
+ '-'? [0-9]+ ([.] [0-9]+)? {
85
+ def ast
86
+ OracleSqlParser::Ast::NumberLiteral.new(:value => text_value)
87
+ end
88
+ }
89
+ end
90
+
91
+ rule position
92
+ integer {
93
+ def ast
94
+ super
95
+ end
96
+ }
97
+ end
98
+
99
+ rule integer
100
+ '-'? [0-9]+ {
101
+ def ast
102
+ OracleSqlParser::Ast::NumberLiteral.new(:value => text_value)
103
+ end
104
+ }
105
+ end
106
+
107
+ rule text_literal
108
+ "'" ("\\'" / !"'" .)* "'" {
109
+ def ast
110
+ OracleSqlParser::Ast::TextLiteral.new(:value => text_value[1..-2])
111
+ end
112
+ }
113
+ end
114
+
115
+ rule table_reference
116
+ (
117
+ schema_name '.' table_name /
118
+ table_name
119
+ ) ('@' dblink)? {
120
+ def ast
121
+ OracleSqlParser::Ast::Identifier.new(:name => text_value)
122
+ end
123
+ }
124
+ end
125
+
126
+ rule dblink
127
+ ident {
128
+ def ast
129
+ super
130
+ end
131
+ }
132
+ end
133
+
134
+ rule cursor_name
135
+ ident {
136
+ def ast
137
+ super
138
+ end
139
+ }
140
+ end
141
+
142
+ rule sequence
143
+ ident space? '.' space? n:(currval_keyword / nextval_keyword) {
144
+ def ast
145
+ OracleSqlParser::Ast::Identifier[:value => text_value]
146
+ end
147
+ }
148
+ end
149
+
150
+ rule package_name
151
+ ident {
152
+ def ast
153
+ super
154
+ end
155
+ }
156
+ end
157
+
158
+ rule procedure_name
159
+ ident {
160
+ def ast
161
+ super
162
+ end
163
+ }
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,112 @@
1
+ module OracleSqlParser::Grammar
2
+ grammar Insert
3
+ rule insert_statement
4
+ insert_keyword space?
5
+ hint?
6
+ t:(
7
+ single_table_insert /
8
+ multi_table_insert
9
+ ) {
10
+ def ast
11
+ t.ast
12
+ end
13
+ }
14
+ end
15
+
16
+ rule single_table_insert
17
+ insert_into_clause space?
18
+ t:(
19
+ values_clause returning_clause? /
20
+ subquery
21
+ ) space?
22
+ error_logging_clause? {
23
+ def ast
24
+ insert_into_ast = insert_into_clause.ast
25
+ OracleSqlParser::Ast::InsertStatement[
26
+ :insert => insert_into_ast.table,
27
+ :columns => insert_into_ast.column,
28
+ :values => values.ast
29
+ ]
30
+ end
31
+
32
+ def values
33
+ t.elements.first
34
+ end
35
+ }
36
+ end
37
+
38
+ rule insert_into_clause
39
+ into_keyword space
40
+ dml_table_expression_clause space
41
+ (t_alias space)?
42
+ insert_column_names:insert_column_names? {
43
+ def ast
44
+ OracleSqlParser::Ast::Hash[
45
+ :table => dml_table_expression_clause.ast,
46
+ :column => insert_column_names.ast
47
+ ]
48
+ end
49
+ }
50
+ end
51
+
52
+ rule insert_column_names
53
+ '(' space? column_name more:(space? ',' space? column_name)* ')' {
54
+ def ast
55
+ OracleSqlParser::Ast::Array[column_name.ast, *more_column_names.map(&:ast)]
56
+ end
57
+
58
+ def more_column_names
59
+ more.elements.map(&:column_name)
60
+ end
61
+ }
62
+ end
63
+
64
+ rule values_clause
65
+ values_keyword space? '(' space? insert_values space? ')' {
66
+ def ast
67
+ insert_values.ast
68
+ end
69
+ }
70
+ end
71
+
72
+ rule insert_values
73
+ expr_or_default more:(space? ',' space? e:expr_or_default)* {
74
+ def ast
75
+ OracleSqlParser::Ast::Array[expr_or_default.ast, *more_expr_or_defaults.map(&:ast)]
76
+ end
77
+
78
+ def more_expr_or_defaults
79
+ more.elements.map(&:e)
80
+ end
81
+ }
82
+ end
83
+
84
+ rule expr_or_default
85
+ expr / default_keyword {
86
+ def ast
87
+ super
88
+ end
89
+ }
90
+ end
91
+
92
+ rule dml_table_expression_clause
93
+ (
94
+ schema_name '.' table_name '@' dblink /
95
+ schema_name '.' table_name /
96
+ table_name
97
+ ) {
98
+ def ast
99
+ OracleSqlParser::Ast::Identifier[:name => text_value]
100
+ end
101
+ }
102
+ end
103
+
104
+ rule multi_table_insert
105
+ 'multi_table_insert' # do not support
106
+ end
107
+
108
+ rule error_logging_clause
109
+ 'error_logging_clause' # do not support
110
+ end
111
+ end
112
+ end