oracle-sql-parser 0.7.0 → 0.8.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 +4 -4
- data/HISTORY.md +26 -13
- data/README.md +23 -15
- data/Rakefile +16 -5
- data/lib/oracle-sql-parser/ast.rb +2 -0
- data/lib/oracle-sql-parser/ast/compound_expression.rb +15 -0
- data/lib/oracle-sql-parser/ast/cross_natural_join_clause.rb +1 -1
- data/lib/oracle-sql-parser/ast/function_expression.rb +1 -1
- data/lib/oracle-sql-parser/ast/inner_join_clause.rb +1 -1
- data/lib/oracle-sql-parser/ast/outer_join_clause.rb +1 -1
- data/lib/oracle-sql-parser/ast/query_block.rb +2 -2
- data/lib/oracle-sql-parser/ast/select_column.rb +7 -0
- data/lib/oracle-sql-parser/ast/select_statement.rb +1 -3
- data/lib/oracle-sql-parser/ast/subquery.rb +8 -16
- data/lib/oracle-sql-parser/ast/table_reference.rb +2 -1
- data/lib/oracle-sql-parser/grammar/delete.treetop +14 -7
- data/lib/oracle-sql-parser/grammar/expression.treetop +66 -15
- data/lib/oracle-sql-parser/grammar/grammar.treetop +2 -0
- data/lib/oracle-sql-parser/grammar/select.treetop +96 -51
- data/lib/oracle-sql-parser/version.rb +1 -1
- data/oracle-sql-parser.gemspec +2 -0
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ca85fca6a5a499cfd899ec639203fd2ec3cd499
|
4
|
+
data.tar.gz: ffa6d405cc453774b56b5c304835aff5e26aa41b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e104b3c6ffac399c5b022871c6305eae5b84cdba4a6b3a84a29d6b5a8ad197c428946c5ac3321491b98c3d6e985b09a13d1c910b5e6c92ca223d371e9e671b5
|
7
|
+
data.tar.gz: 39ee53de849e013c2a86399fd6780a201729b4fbd68f7c2e24ee76edca4b08fa914e97c933a1ecd7be9ba1dbbb80487e73636ab646fb8afab9bdebf75f5489ce
|
data/HISTORY.md
CHANGED
@@ -1,11 +1,24 @@
|
|
1
|
+
<<<<<<< HEAD
|
2
|
+
### next version
|
3
|
+
* Syntax
|
4
|
+
* subquery https://github.com/jksy/sql_parser/issues/8
|
5
|
+
* "select col1 from table1 union select col2 from table2 union select col3 from table3"
|
6
|
+
* "select col1 from table1 union (select col2 from table2)"
|
7
|
+
* compound expression https://github.com/jksy/sql_parser/issues/8
|
8
|
+
* "select 1-1 from table1"
|
9
|
+
* Broken changes
|
10
|
+
* select_list.
|
11
|
+
Ast::Array[ Ast::Ident[..], Ast::Ident[..]] Ast::Array[ Ast::SelectColumn[:expr => Ast::Ident[..]],...]
|
12
|
+
|
1
13
|
### 0.7.0
|
2
|
-
*
|
3
|
-
*
|
14
|
+
* Syntax
|
15
|
+
* table alias, like "select a.* from table1 a". https://github.com/jksy/sql_parser/issues/8
|
4
16
|
|
5
17
|
### 0.6.0
|
6
18
|
* Enchancement
|
7
19
|
* added travis-ci
|
8
20
|
* added oracle enhanced adapter query(select, includes, joins, where)
|
21
|
+
* Syntax
|
9
22
|
* added syntax for column_alias
|
10
23
|
|
11
24
|
### 0.5.1
|
@@ -17,17 +30,17 @@
|
|
17
30
|
* added NumberLiteral#to_cecimal, TextLiteral#to_s
|
18
31
|
|
19
32
|
### 0.4.0
|
20
|
-
*
|
33
|
+
* Bugfix
|
21
34
|
* rename ParameternizedQuery#query -> ParameternizedQuery#to_sql
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
35
|
+
* Syntax
|
36
|
+
* union [all]
|
37
|
+
* intersect
|
38
|
+
* minus
|
39
|
+
* [inner|outer] join
|
40
|
+
* conditions
|
41
|
+
* floating point condition
|
42
|
+
* multiset condition
|
43
|
+
* is_of_type condition
|
31
44
|
|
32
45
|
### 0.3.0
|
33
46
|
* Enchancement
|
@@ -42,7 +55,7 @@
|
|
42
55
|
* refactor test cases
|
43
56
|
|
44
57
|
### 0.1.1
|
45
|
-
*
|
58
|
+
* Syntax
|
46
59
|
* support double-quoted identifer
|
47
60
|
|
48
61
|
### 0.1.0
|
data/README.md
CHANGED
@@ -33,23 +33,31 @@ end
|
|
33
33
|
ast = syntax_tree.ast
|
34
34
|
```
|
35
35
|
<pre>
|
36
|
-
=> #<OracleSqlParser::Ast::SelectStatement
|
37
|
-
:
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
:model_clause => nil}>
|
36
|
+
=> #<OracleSqlParser::Ast::SelectStatement {:subquery=>#<OracleSqlParser::Ast::Subquery
|
37
|
+
:has_parenthesis => nil,
|
38
|
+
:query_block => #<OracleSqlParser::Ast::QueryBlock
|
39
|
+
:hint => nil,
|
40
|
+
:modifier => nil,
|
41
|
+
:select_list => #<OracleSqlParser::Ast::Array [
|
42
|
+
#<OracleSqlParser::Ast::SelectColumn
|
43
|
+
:expr => #<OracleSqlParser::Ast::NumberLiteral {:value=>"1"}>,
|
44
|
+
:as => nil,
|
45
|
+
:c_alias => nil}>
|
46
|
+
|
47
|
+
]>
|
49
48
|
,
|
50
|
-
:
|
49
|
+
:select_sources => #<OracleSqlParser::Ast::Array [
|
50
|
+
#<OracleSqlParser::Ast::TableReference {:schema_name=>nil, :table_name=>#<OracleSqlParser::Ast::Identifier {:name=>"dual"}>, :dblink=>nil, :subquery=>nil, :table_alias=>nil}>
|
51
|
+
]>
|
52
|
+
,
|
53
|
+
:where_clause => nil,
|
54
|
+
:group_by_clause => nil,
|
55
|
+
:model_clause => nil}>
|
51
56
|
,
|
52
|
-
:
|
57
|
+
:subqueries => nil,
|
58
|
+
:subquery => nil,
|
59
|
+
:order_by_clause => nil}>
|
60
|
+
, :for_update_clause=>nil}>=> nil
|
53
61
|
</pre>
|
54
62
|
|
55
63
|
```ruby
|
data/Rakefile
CHANGED
@@ -47,18 +47,29 @@ end
|
|
47
47
|
|
48
48
|
|
49
49
|
def generate_parser_files(force = false)
|
50
|
-
|
50
|
+
word_generator = "lib/oracle-sql-parser/grammar/reserved_word_generator.rb"
|
51
|
+
output = "lib/oracle-sql-parser/grammar/reserved_word.treetop"
|
52
|
+
do_if_changed(word_generator, output, force) do
|
53
|
+
sh "ruby #{word_generator}"
|
54
|
+
end
|
55
|
+
|
51
56
|
GRAMMAR_FILES.each do |f|
|
52
57
|
tt(f, force)
|
53
58
|
end
|
54
59
|
end
|
55
60
|
|
56
61
|
def tt(f, force = false)
|
57
|
-
|
62
|
+
output = "#{f.gsub(/\.treetop$/,'')}.rb"
|
63
|
+
|
64
|
+
do_if_changed(f, output, force) do
|
65
|
+
sh "tt #{f} -f -o #{output}"
|
66
|
+
end
|
67
|
+
end
|
58
68
|
|
59
|
-
|
60
|
-
|
61
|
-
|
69
|
+
def do_if_changed(src, output, force = false, &block)
|
70
|
+
force = true unless File.exists?(output)
|
71
|
+
if force || File::Stat.new(src).mtime >= File::Stat.new(output).mtime
|
72
|
+
yield
|
62
73
|
end
|
63
74
|
end
|
64
75
|
|
@@ -7,6 +7,7 @@ require 'oracle-sql-parser/ast/base.rb'
|
|
7
7
|
require 'oracle-sql-parser/ast/array.rb'
|
8
8
|
require 'oracle-sql-parser/ast/hash.rb'
|
9
9
|
require 'oracle-sql-parser/ast/select_statement.rb'
|
10
|
+
require 'oracle-sql-parser/ast/select_column.rb'
|
10
11
|
require 'oracle-sql-parser/ast/subquery.rb'
|
11
12
|
require 'oracle-sql-parser/ast/query_block.rb'
|
12
13
|
require 'oracle-sql-parser/ast/inner_cross_join_clause.rb'
|
@@ -40,6 +41,7 @@ require 'oracle-sql-parser/ast/order_by_clause_item.rb'
|
|
40
41
|
require 'oracle-sql-parser/ast/update_statement.rb'
|
41
42
|
require 'oracle-sql-parser/ast/update_set_column.rb'
|
42
43
|
require 'oracle-sql-parser/ast/update_set_clause.rb'
|
44
|
+
require 'oracle-sql-parser/ast/compound_expression.rb'
|
43
45
|
require 'oracle-sql-parser/ast/simple_case_expression.rb'
|
44
46
|
require 'oracle-sql-parser/ast/searched_case_expression.rb'
|
45
47
|
require 'oracle-sql-parser/ast/function_expression.rb'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module OracleSqlParser::Ast
|
2
|
+
class CompoundExpression < Hash
|
3
|
+
def to_sql(options = {})
|
4
|
+
r = @ast.values_at(:left,
|
5
|
+
:op,
|
6
|
+
:right,
|
7
|
+
).map(&:to_sql)
|
8
|
+
if @ast[:has_parenthesis]
|
9
|
+
r.unshift('(')
|
10
|
+
r.push(')')
|
11
|
+
end
|
12
|
+
r.compact.join(' ')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -5,9 +5,9 @@ module OracleSqlParser::Ast
|
|
5
5
|
"select",
|
6
6
|
@ast[:hint],
|
7
7
|
@ast[:modifier],
|
8
|
-
@ast[:select_list].
|
8
|
+
@ast[:select_list].to_sql(:separator => ','),
|
9
9
|
"from",
|
10
|
-
@ast[:select_sources],
|
10
|
+
@ast[:select_sources].to_sql(:separator => ','),
|
11
11
|
@ast[:where_clause],
|
12
12
|
@ast[:group_by_clause],
|
13
13
|
@ast[:model_clause]
|
@@ -1,9 +1,7 @@
|
|
1
1
|
module OracleSqlParser::Ast
|
2
2
|
class SelectStatement < Hash
|
3
3
|
def to_sql(options = {})
|
4
|
-
|
5
|
-
sql += " #{@ast[:for_update_clause].to_sql}" if @ast[:for_update_clause]
|
6
|
-
sql
|
4
|
+
@ast.values_at(:subquery, :for_update_clause).compact.map(&:to_sql).join(' ')
|
7
5
|
end
|
8
6
|
end
|
9
7
|
end
|
@@ -1,23 +1,15 @@
|
|
1
1
|
module OracleSqlParser::Ast
|
2
2
|
class Subquery < Hash
|
3
3
|
def to_sql(options = {})
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
else
|
12
|
-
[
|
13
|
-
@ast[:query_block],
|
14
|
-
@ast[:order_by_clause]
|
15
|
-
].compact.map(&:to_sql).join(' ')
|
4
|
+
result = @ast.values_at(:query_block,
|
5
|
+
:subqueries,
|
6
|
+
:subquery,
|
7
|
+
:order_by_clause).map(&:to_sql)
|
8
|
+
if @ast[:has_parenthesis]
|
9
|
+
result.unshift('(')
|
10
|
+
result.push(')')
|
16
11
|
end
|
17
|
-
|
18
|
-
|
19
|
-
def order_by_clause=(value)
|
20
|
-
@ast[:order_by_clause] = value
|
12
|
+
result.compact.map(&:to_sql).join(' ')
|
21
13
|
end
|
22
14
|
end
|
23
15
|
end
|
@@ -8,8 +8,9 @@ module OracleSqlParser::Ast
|
|
8
8
|
def to_sql(options = {})
|
9
9
|
result = ''
|
10
10
|
result += "#{@ast[:schema_name].to_sql}." if @ast[:schema_name]
|
11
|
-
result += @ast[:table_name].to_sql
|
11
|
+
result += @ast[:table_name].to_sql if @ast[:table_name]
|
12
12
|
result += "@#{@ast[:dblink].to_sql}" if @ast[:dblink]
|
13
|
+
result += @ast[:subquery].to_sql if @ast[:subquery]
|
13
14
|
result += " #{@ast[:table_alias].to_sql}" if @ast[:table_alias]
|
14
15
|
result
|
15
16
|
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
module OracleSqlParser::Grammar
|
2
2
|
grammar Delete
|
3
3
|
rule delete_statement
|
4
|
-
delete_keyword space
|
5
|
-
|
6
|
-
delete_condition:delete_condition?
|
4
|
+
delete_keyword space delete_from_clause
|
5
|
+
condition:(space delete_condition)?
|
7
6
|
returning_clause:returning_clause? {
|
8
7
|
def ast
|
9
8
|
OracleSqlParser::Ast::DeleteStatement[
|
@@ -11,11 +10,15 @@ module OracleSqlParser::Grammar
|
|
11
10
|
:where_clause => delete_condition.ast
|
12
11
|
]
|
13
12
|
end
|
13
|
+
|
14
|
+
def delete_condition
|
15
|
+
condition.delete_condition if condition.respond_to? :delete_condition
|
16
|
+
end
|
14
17
|
}
|
15
18
|
end
|
16
19
|
|
17
20
|
rule delete_from_clause
|
18
|
-
from_keyword space
|
21
|
+
from_keyword space delete_target {
|
19
22
|
def ast
|
20
23
|
delete_target.ast
|
21
24
|
end
|
@@ -26,8 +29,8 @@ module OracleSqlParser::Grammar
|
|
26
29
|
t:(
|
27
30
|
table_reference /
|
28
31
|
delete_target_subquery
|
29
|
-
)
|
30
|
-
|
32
|
+
)
|
33
|
+
a:(space t_alias)? {
|
31
34
|
def ast
|
32
35
|
table_or_subquery = t.ast
|
33
36
|
if table_or_subquery.instance_of? OracleSqlParser::Ast::DeleteTarget
|
@@ -39,6 +42,10 @@ module OracleSqlParser::Grammar
|
|
39
42
|
]
|
40
43
|
end
|
41
44
|
end
|
45
|
+
|
46
|
+
def t_alias
|
47
|
+
a.t_alias if a.respond_to? :t_alias
|
48
|
+
end
|
42
49
|
}
|
43
50
|
end
|
44
51
|
|
@@ -54,7 +61,7 @@ module OracleSqlParser::Grammar
|
|
54
61
|
end
|
55
62
|
|
56
63
|
rule delete_condition
|
57
|
-
where_keyword space
|
64
|
+
where_keyword space
|
58
65
|
where:(
|
59
66
|
search_condition /
|
60
67
|
delete_current_of
|
@@ -2,10 +2,10 @@ module OracleSqlParser::Grammar
|
|
2
2
|
grammar Expression
|
3
3
|
rule sql_expression
|
4
4
|
ex:(
|
5
|
+
compound_expression /
|
5
6
|
function_expression /
|
6
7
|
case_expression /
|
7
8
|
cursor_expression /
|
8
|
-
compound_expression /
|
9
9
|
datetime_expression /
|
10
10
|
interval_expression /
|
11
11
|
object_access_expression /
|
@@ -13,14 +13,15 @@ module OracleSqlParser::Grammar
|
|
13
13
|
model_expression /
|
14
14
|
type_constructor_expression /
|
15
15
|
simple_expression /
|
16
|
-
variable_expression
|
17
|
-
|
18
|
-
{
|
16
|
+
variable_expression
|
17
|
+
) {
|
19
18
|
def ast
|
20
|
-
|
21
|
-
|
22
|
-
tree
|
23
|
-
tree
|
19
|
+
ex.ast
|
20
|
+
# super
|
21
|
+
# tree = ex.ast
|
22
|
+
## tree[:as] = alias_name.try(:as_keyword).try(:ast)
|
23
|
+
# tree[:alias] = alias_name.try(:ident).try(:ast)
|
24
|
+
# tree
|
24
25
|
end
|
25
26
|
}
|
26
27
|
end
|
@@ -51,13 +52,63 @@ module OracleSqlParser::Grammar
|
|
51
52
|
}
|
52
53
|
end
|
53
54
|
|
55
|
+
rule not_compound_expressions
|
56
|
+
ex:(
|
57
|
+
function_expression /
|
58
|
+
case_expression /
|
59
|
+
cursor_expression /
|
60
|
+
datetime_expression /
|
61
|
+
interval_expression /
|
62
|
+
object_access_expression /
|
63
|
+
scalar_subquery_expression /
|
64
|
+
model_expression /
|
65
|
+
type_constructor_expression /
|
66
|
+
simple_expression /
|
67
|
+
variable_expression)
|
68
|
+
{
|
69
|
+
def ast
|
70
|
+
ex.ast
|
71
|
+
end
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
54
75
|
rule compound_expression
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
76
|
+
ex:(
|
77
|
+
left_parenthesis:'(' space? left:expr space? right_parenthesis:')' /
|
78
|
+
left:not_compound_expressions space? op:('*' / '/' / '+' / '-' / '||') space? right:expr /
|
79
|
+
!number_literal op:(prior_keyword / '-' / '+') space? right:expr
|
80
|
+
)
|
81
|
+
|
82
|
+
{
|
83
|
+
def ast
|
84
|
+
OracleSqlParser::Ast::CompoundExpression[
|
85
|
+
:has_parenthesis => ex.respond_to?(:left_parenthesis) ? true : nil,
|
86
|
+
:left => left.ast,
|
87
|
+
:op => op.ast,
|
88
|
+
:right => right.ast,
|
89
|
+
]
|
90
|
+
end
|
91
|
+
|
92
|
+
def left
|
93
|
+
ex.left if ex.respond_to? :left
|
94
|
+
end
|
95
|
+
|
96
|
+
def not_compound_expressions
|
97
|
+
ex.not_compound_expressions if ex.respond_to? :not_compound_expressions
|
98
|
+
end
|
99
|
+
|
100
|
+
def op
|
101
|
+
ex.op if ex.respond_to? :op
|
102
|
+
end
|
103
|
+
|
104
|
+
def right
|
105
|
+
ex.right if ex.respond_to? :right
|
106
|
+
end
|
107
|
+
|
108
|
+
def right_parenthesis
|
109
|
+
ex.right_parenthesis if ex.respond_to? :right_parenthesis
|
110
|
+
end
|
111
|
+
}
|
61
112
|
end
|
62
113
|
|
63
114
|
rule case_expression
|
@@ -145,7 +196,7 @@ module OracleSqlParser::Grammar
|
|
145
196
|
rule function_expression
|
146
197
|
function_name space? '(' space? function_args:function_args? space? ')' {
|
147
198
|
def ast
|
148
|
-
OracleSqlParser::Ast::
|
199
|
+
OracleSqlParser::Ast::FunctionExpression[
|
149
200
|
:name => function_name.ast,
|
150
201
|
:args => function_args.ast
|
151
202
|
]
|
@@ -134,6 +134,7 @@ module OracleSqlParser::Grammar
|
|
134
134
|
|
135
135
|
rule table_reference
|
136
136
|
t:(
|
137
|
+
&'(' space? subquery /
|
137
138
|
schema_name:schema_name '.' table_name:table_name /
|
138
139
|
table_name:table_name
|
139
140
|
) l:('@' dblink)? a:(space t_alias)? {
|
@@ -142,6 +143,7 @@ module OracleSqlParser::Grammar
|
|
142
143
|
:schema_name => t.try(:schema_name).ast,
|
143
144
|
:table_name => t.try(:table_name).ast,
|
144
145
|
:dblink => l.try(:dblink).ast,
|
146
|
+
:subquery => t.try(:subquery).ast,
|
145
147
|
:table_alias => a.try(:t_alias).ast,
|
146
148
|
]
|
147
149
|
end
|
@@ -1,49 +1,63 @@
|
|
1
1
|
module OracleSqlParser::Grammar
|
2
2
|
grammar Select
|
3
3
|
rule select_statement
|
4
|
-
subquery
|
4
|
+
space? subquery for_update:(space for_update_clause)? space? {
|
5
5
|
def ast
|
6
6
|
OracleSqlParser::Ast::SelectStatement[
|
7
7
|
:subquery => subquery.ast,
|
8
|
-
:for_update_clause => for_update_clause.ast
|
8
|
+
:for_update_clause => for_update.try(:for_update_clause).ast
|
9
|
+
]
|
9
10
|
end
|
10
11
|
}
|
11
12
|
end
|
12
13
|
|
13
14
|
rule subquery
|
14
15
|
query:(
|
15
|
-
|
16
|
-
|
16
|
+
left_parenthesis:'(' space? subquery space? right_parenthesis:')' /
|
17
|
+
query_block !(space union_or_intersect_or_minus) /
|
18
|
+
subqueries:subqueries_with_union
|
17
19
|
)
|
18
|
-
space
|
20
|
+
order:(space order_by_clause)? {
|
19
21
|
def ast
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
OracleSqlParser::Ast::Subquery[
|
23
|
+
:has_parenthesis => has_parenthesis,
|
24
|
+
:query_block => query_block.ast,
|
25
|
+
:subqueries => subqueries.ast,
|
26
|
+
:subquery => subquery.ast,
|
27
|
+
:order_by_clause => order.try(:order_by_clause).ast,
|
28
|
+
]
|
29
|
+
end
|
30
|
+
|
31
|
+
def has_parenthesis
|
32
|
+
true if query.respond_to? :left_parenthesis
|
33
|
+
end
|
34
|
+
|
35
|
+
def query_block
|
36
|
+
query.query_block if query.respond_to? :query_block
|
37
|
+
end
|
38
|
+
|
39
|
+
def subqueries
|
40
|
+
query.subqueries if query.respond_to? :subqueries
|
41
|
+
end
|
42
|
+
|
43
|
+
def subquery
|
44
|
+
query.subquery if query.respond_to? :subquery
|
23
45
|
end
|
24
46
|
}
|
25
47
|
end
|
26
48
|
|
27
|
-
rule
|
28
|
-
|
29
|
-
|
49
|
+
rule subqueries_with_union
|
50
|
+
query_block space? more:(union_or_intersect_or_minus space? subquery)+
|
51
|
+
{
|
30
52
|
def ast
|
31
|
-
OracleSqlParser::Ast::
|
32
|
-
|
53
|
+
OracleSqlParser::Ast::Array[
|
54
|
+
query_block.ast,
|
55
|
+
*more_queries.map(&:ast),
|
33
56
|
]
|
34
57
|
end
|
35
|
-
}
|
36
|
-
end
|
37
58
|
|
38
|
-
|
39
|
-
|
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
|
-
]
|
59
|
+
def more_queries
|
60
|
+
more.elements.map{|e| [e.union_or_intersect_or_minus, e.subquery]}.flatten
|
47
61
|
end
|
48
62
|
}
|
49
63
|
end
|
@@ -82,21 +96,21 @@ module OracleSqlParser::Grammar
|
|
82
96
|
select_keyword space
|
83
97
|
hint:hint?
|
84
98
|
mod:(modifier:(all_keyword / distinct_keyword / unique_keyword) space)?
|
85
|
-
select_list space
|
86
|
-
from_keyword
|
87
|
-
select_sources
|
88
|
-
|
89
|
-
|
90
|
-
|
99
|
+
select_list space
|
100
|
+
from_keyword
|
101
|
+
select:(space select_sources)?
|
102
|
+
where:(space where_clause)?
|
103
|
+
group:(space group_by_clause)?
|
104
|
+
model:(space model_clause)? {
|
91
105
|
def ast
|
92
106
|
OracleSqlParser::Ast::QueryBlock[
|
93
107
|
:hint => hint.ast,
|
94
108
|
:modifier => modifier.ast,
|
95
109
|
:select_list => select_list.ast,
|
96
|
-
:select_sources => select_sources.ast,
|
97
|
-
:where_clause => where_clause.ast,
|
98
|
-
:group_by_clause => group_by_clause.ast,
|
99
|
-
:model_clause => model_clause.ast]
|
110
|
+
:select_sources => select.try(:select_sources).ast,
|
111
|
+
:where_clause => where.try(:where_clause).ast,
|
112
|
+
:group_by_clause => group.try(:group_by_clause).ast,
|
113
|
+
:model_clause => model.try(:model_clause).ast]
|
100
114
|
end
|
101
115
|
|
102
116
|
def modifier
|
@@ -106,9 +120,26 @@ module OracleSqlParser::Grammar
|
|
106
120
|
end
|
107
121
|
|
108
122
|
rule select_sources
|
123
|
+
select_source more:(space? ',' space? select_source)* {
|
124
|
+
def ast
|
125
|
+
OracleSqlParser::Ast::Array[
|
126
|
+
select_source.ast,
|
127
|
+
*more_select_sources.map(&:ast),
|
128
|
+
]
|
129
|
+
end
|
130
|
+
|
131
|
+
def more_select_sources
|
132
|
+
more.elements.map(&:select_source)
|
133
|
+
end
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
137
|
+
rule select_source
|
109
138
|
join_clause /
|
110
139
|
'(' space? join_clause:join_clause space? ')' /
|
111
|
-
table_reference
|
140
|
+
table_reference /
|
141
|
+
subquery
|
142
|
+
{
|
112
143
|
def ast
|
113
144
|
if respond_to? :join_clause
|
114
145
|
join_clause.ast
|
@@ -281,12 +312,11 @@ module OracleSqlParser::Grammar
|
|
281
312
|
end
|
282
313
|
|
283
314
|
rule for_update_clause
|
284
|
-
for_keyword space
|
285
|
-
|
286
|
-
of:(of_keyword space for_update_clause_columns space?)?
|
315
|
+
for_keyword space update_keyword
|
316
|
+
of:(space of_keyword space for_update_clause_columns)?
|
287
317
|
wait:(
|
288
|
-
w:wait_keyword space
|
289
|
-
w:nowait_keyword
|
318
|
+
space w:wait_keyword space time:integer /
|
319
|
+
space w:nowait_keyword
|
290
320
|
)? {
|
291
321
|
def ast
|
292
322
|
OracleSqlParser::Ast::ForUpdateClause[
|
@@ -299,7 +329,7 @@ module OracleSqlParser::Grammar
|
|
299
329
|
end
|
300
330
|
|
301
331
|
rule for_update_clause_columns
|
302
|
-
for_update_clause_column more:(space? ',' space?
|
332
|
+
for_update_clause_column more:(space? ',' space? for_update_clause_column)* {
|
303
333
|
def ast
|
304
334
|
OracleSqlParser::Ast::Array[
|
305
335
|
for_update_clause_column.ast, *more_for_update_clause_columns.map(&:ast)
|
@@ -307,7 +337,7 @@ module OracleSqlParser::Grammar
|
|
307
337
|
end
|
308
338
|
|
309
339
|
def more_for_update_clause_columns
|
310
|
-
more.elements.map(&:
|
340
|
+
more.elements.map(&:for_update_clause_column)
|
311
341
|
end
|
312
342
|
}
|
313
343
|
end
|
@@ -381,22 +411,21 @@ module OracleSqlParser::Grammar
|
|
381
411
|
end
|
382
412
|
|
383
413
|
rule select_list
|
384
|
-
|
414
|
+
select_one more_list:( space? ',' space? select_one)* {
|
385
415
|
def ast
|
386
|
-
OracleSqlParser::Ast::Array[
|
416
|
+
OracleSqlParser::Ast::Array[select_one.ast, *more_columns.map(&:ast)]
|
387
417
|
end
|
388
418
|
|
389
419
|
def more_columns
|
390
|
-
more_list.elements.map
|
420
|
+
more_list.elements.map(&:select_one)
|
391
421
|
end
|
392
422
|
}
|
393
423
|
end
|
394
424
|
|
395
|
-
rule
|
396
|
-
|
397
|
-
expr /
|
425
|
+
rule select_one
|
426
|
+
select_table /
|
398
427
|
select_column
|
399
|
-
|
428
|
+
{
|
400
429
|
def ast
|
401
430
|
super
|
402
431
|
end
|
@@ -412,9 +441,25 @@ module OracleSqlParser::Grammar
|
|
412
441
|
end
|
413
442
|
|
414
443
|
rule select_column
|
415
|
-
|
444
|
+
expr _alias:( space as:( as_keyword space )? c_alias )? {
|
416
445
|
def ast
|
417
|
-
|
446
|
+
OracleSqlParser::Ast::SelectColumn[
|
447
|
+
:expr => expr.ast,
|
448
|
+
:as => as_keyword.ast,
|
449
|
+
:c_alias => c_alias.ast,
|
450
|
+
]
|
451
|
+
end
|
452
|
+
|
453
|
+
def c_alias
|
454
|
+
if _alias.respond_to? :c_alias
|
455
|
+
_alias.c_alias
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
def as_keyword
|
460
|
+
if respond_to? :_alias and _alias.respond_to? :as
|
461
|
+
_alias.as.as_keyword
|
462
|
+
end
|
418
463
|
end
|
419
464
|
}
|
420
465
|
end
|
data/oracle-sql-parser.gemspec
CHANGED
@@ -26,4 +26,6 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency "activerecord", "~> 4.2"
|
27
27
|
spec.add_development_dependency "activerecord-oracle_enhanced-adapter", "~> 1.6.0"
|
28
28
|
spec.add_development_dependency "ruby-oci8", "~> 2.0"
|
29
|
+
spec.add_development_dependency "pry-byebug", "3.4.0" if RUBY_VERSION >= '2.0.0'
|
30
|
+
spec.add_development_dependency "colorize", "~> 0.8"
|
29
31
|
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.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Junichiro Kasuya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: treetop
|
@@ -108,6 +108,34 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '2.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-byebug
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 3.4.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.4.0
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: colorize
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.8'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.8'
|
111
139
|
description: SQL Parser for Oracle
|
112
140
|
email:
|
113
141
|
- junichiro.kasuya@gmail.com
|
@@ -126,6 +154,7 @@ files:
|
|
126
154
|
- lib/oracle-sql-parser/ast/base.rb
|
127
155
|
- lib/oracle-sql-parser/ast/between_condition.rb
|
128
156
|
- lib/oracle-sql-parser/ast/compound_condition.rb
|
157
|
+
- lib/oracle-sql-parser/ast/compound_expression.rb
|
129
158
|
- lib/oracle-sql-parser/ast/cross_natural_join_clause.rb
|
130
159
|
- lib/oracle-sql-parser/ast/current_of.rb
|
131
160
|
- lib/oracle-sql-parser/ast/delete_statement.rb
|
@@ -160,6 +189,7 @@ files:
|
|
160
189
|
- lib/oracle-sql-parser/ast/regexp_condition.rb
|
161
190
|
- lib/oracle-sql-parser/ast/rollup_cube_clause.rb
|
162
191
|
- lib/oracle-sql-parser/ast/searched_case_expression.rb
|
192
|
+
- lib/oracle-sql-parser/ast/select_column.rb
|
163
193
|
- lib/oracle-sql-parser/ast/select_statement.rb
|
164
194
|
- lib/oracle-sql-parser/ast/simple_case_expression.rb
|
165
195
|
- lib/oracle-sql-parser/ast/simple_comparision_condition.rb
|