oracle-sql-parser 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.
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