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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/README.md +58 -0
- data/Rakefile +41 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/oracle-sql-parser.rb +7 -0
- data/lib/oracle-sql-parser/ast.rb +38 -0
- data/lib/oracle-sql-parser/ast/array.rb +37 -0
- data/lib/oracle-sql-parser/ast/base.rb +89 -0
- data/lib/oracle-sql-parser/ast/between_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/current_of.rb +4 -0
- data/lib/oracle-sql-parser/ast/delete_statement.rb +5 -0
- data/lib/oracle-sql-parser/ast/delete_target.rb +6 -0
- data/lib/oracle-sql-parser/ast/exists_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/for_update_clause.rb +4 -0
- data/lib/oracle-sql-parser/ast/function_expression.rb +4 -0
- data/lib/oracle-sql-parser/ast/group_by_clause.rb +4 -0
- data/lib/oracle-sql-parser/ast/hash.rb +44 -0
- data/lib/oracle-sql-parser/ast/identifier.rb +7 -0
- data/lib/oracle-sql-parser/ast/in_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/insert_statement.rb +5 -0
- data/lib/oracle-sql-parser/ast/keyword.rb +8 -0
- data/lib/oracle-sql-parser/ast/like_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/logical_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/null_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/number_literal.rb +8 -0
- data/lib/oracle-sql-parser/ast/order_by_clause.rb +4 -0
- data/lib/oracle-sql-parser/ast/order_by_clause_item.rb +4 -0
- data/lib/oracle-sql-parser/ast/query_block.rb +17 -0
- data/lib/oracle-sql-parser/ast/regexp_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/rollup_cube_clause.rb +4 -0
- data/lib/oracle-sql-parser/ast/searched_case_expression.rb +8 -0
- data/lib/oracle-sql-parser/ast/select_statement.rb +5 -0
- data/lib/oracle-sql-parser/ast/simple_case_expression.rb +7 -0
- data/lib/oracle-sql-parser/ast/simple_comparision_condition.rb +4 -0
- data/lib/oracle-sql-parser/ast/subquery.rb +5 -0
- data/lib/oracle-sql-parser/ast/text_literal.rb +7 -0
- data/lib/oracle-sql-parser/ast/update_set_column.rb +4 -0
- data/lib/oracle-sql-parser/ast/update_statement.rb +4 -0
- data/lib/oracle-sql-parser/ast/where_clause.rb +4 -0
- data/lib/oracle-sql-parser/grammar.rb +10 -0
- data/lib/oracle-sql-parser/grammar/condition.treetop +224 -0
- data/lib/oracle-sql-parser/grammar/delete.treetop +68 -0
- data/lib/oracle-sql-parser/grammar/expression.treetop +236 -0
- data/lib/oracle-sql-parser/grammar/grammar.treetop +166 -0
- data/lib/oracle-sql-parser/grammar/insert.treetop +112 -0
- data/lib/oracle-sql-parser/grammar/reserved_word_generator.rb +233 -0
- data/lib/oracle-sql-parser/grammar/select.treetop +388 -0
- data/lib/oracle-sql-parser/grammar/update.treetop +113 -0
- data/lib/oracle-sql-parser/treetop_ext.rb +11 -0
- data/lib/oracle-sql-parser/version.rb +3 -0
- data/oracle-sql-parser.gemspec +28 -0
- 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
|