ddl_parser 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ddl_parser/ddl/db2/parser.rb +20 -5
- data/lib/ddl_parser/translator/column.rb +60 -17
- data/lib/ddl_parser/translator/create_index.rb +28 -27
- data/lib/ddl_parser/translator/create_table.rb +28 -26
- data/lib/ddl_parser/version.rb +3 -3
- data/spec/ddl_parser/ddl/db2/create_index_spec.rb +153 -25
- data/spec/ddl_parser/ddl/db2/create_table_spec.rb +43 -26
- data/spec/ddl_parser/translator/column_spec.rb +89 -18
- metadata +1 -1
@@ -31,11 +31,11 @@ module DDLParser
|
|
31
31
|
|
32
32
|
rule(:column_name) { identifier }
|
33
33
|
rule(:constraint_name) { identifier }
|
34
|
-
rule(:column_sort) { str('ascending') | str('descending')}
|
34
|
+
rule(:column_sort) { str('ascending') |str('asc') | str('descending')|str('desc')}
|
35
35
|
|
36
36
|
rule(:column_definition) { (column_name.as(:field) >> space.repeat >> data_type >> space.repeat >> (column_options.maybe).as(:options)).as(:column)}
|
37
37
|
|
38
|
-
rule(:index_column_definition) { column_name.as(:field) >> space
|
38
|
+
rule(:index_column_definition) { column_name.as(:field) >> (space? >> column_sort.as(:sort_id) >> space.repeat).maybe }
|
39
39
|
|
40
40
|
rule(:element_list) { (lparen >> space? >> (column_definition | constraint | primary_key) >> space? >>
|
41
41
|
(comma >> space? >> (column_definition | constraint | primary_key) >> space?).repeat >> rparen).as(:elements)
|
@@ -77,6 +77,10 @@ module DDLParser
|
|
77
77
|
(identifier.as(:name) >> space? >>
|
78
78
|
lparen >> arglist.as(:arguments) >> rparen).as(:function)
|
79
79
|
}
|
80
|
+
# index options
|
81
|
+
|
82
|
+
rule(:option_reverse_scans) { str('allow reverse scans') }
|
83
|
+
rule(:index_option) { (option_reverse_scans).as(:index_option) }
|
80
84
|
|
81
85
|
rule(:item) { function | identifier | string }
|
82
86
|
rule(:arglist) {
|
@@ -90,8 +94,19 @@ module DDLParser
|
|
90
94
|
str('alter table').as(:operation) >> space? >> (identifier).as(:table_name)
|
91
95
|
}
|
92
96
|
rule(:create_index_statement) {
|
93
|
-
str('create').as(:operation) >> (space? >> str('unique').as(:object_property)).maybe >> space? >> str('index').as(:object_type) >> space? >>
|
94
|
-
|
97
|
+
str('create').as(:operation) >> (space? >> str('unique').as(:object_property)).maybe >> space? >> str('index').as(:object_type) >> space? >> (identifier).as(:index_name)
|
98
|
+
}
|
99
|
+
rule(:create_index_statement_1) {
|
100
|
+
str('create').as(:operation) >> (space? >> str('unique').as(:object_property)).maybe
|
101
|
+
}
|
102
|
+
rule(:create_index_statement_1_a) {
|
103
|
+
str('create').as(:operation)
|
104
|
+
}
|
105
|
+
rule(:create_index_statement_2) {
|
106
|
+
str('index').as(:object_type) >> space? >> (identifier).as(:index_name)
|
107
|
+
}
|
108
|
+
rule(:index_table) {
|
109
|
+
space? >> str('on') >> space? >> (identifier).as(:table_name) >> space?
|
95
110
|
}
|
96
111
|
rule(:create_table) {
|
97
112
|
spaces.maybe >> create_table_statement >> spaces >> element_list >> spaces.maybe >> (item >> spaces.maybe).repeat
|
@@ -100,7 +115,7 @@ module DDLParser
|
|
100
115
|
spaces.maybe >> alter_table_statement >> spaces >> (alter_table_element.repeat).as(:elements)
|
101
116
|
}
|
102
117
|
rule(:create_index) {
|
103
|
-
spaces.maybe >> create_index_statement >> spaces >> lparen >> element_list_index >> spaces.maybe >> rparen
|
118
|
+
spaces.maybe >> create_index_statement >> spaces >> index_table >> spaces >> lparen >> element_list_index >> spaces.maybe >> rparen >> (space? >> index_option).maybe
|
104
119
|
}
|
105
120
|
|
106
121
|
rule(:expression) { create_table | alter_table | create_index}
|
@@ -67,10 +67,6 @@ class DDLParser::Translator::Column
|
|
67
67
|
@column_hash[:options] if @column_hash[:options].length > 0
|
68
68
|
end
|
69
69
|
|
70
|
-
def option(key)
|
71
|
-
# return the right option
|
72
|
-
options.select{|o| o.is_a?(Hash) || o.has_key?(key)}.first
|
73
|
-
end
|
74
70
|
|
75
71
|
def not_null
|
76
72
|
if options.nil?
|
@@ -88,10 +84,10 @@ class DDLParser::Translator::Column
|
|
88
84
|
default_value[:default_clause].each do |c|
|
89
85
|
# TODO must handle other then integer
|
90
86
|
case c.keys.first
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
87
|
+
when :integer
|
88
|
+
return c[:integer].to_i
|
89
|
+
else
|
90
|
+
return c[c.keys.first].to_s
|
95
91
|
end
|
96
92
|
end
|
97
93
|
else
|
@@ -101,32 +97,79 @@ class DDLParser::Translator::Column
|
|
101
97
|
end
|
102
98
|
end
|
103
99
|
|
100
|
+
def identity_options
|
101
|
+
unless options.nil?
|
102
|
+
start_value = options.select{|h|h.has_key?(:identity_options)}.first
|
103
|
+
if start_value
|
104
|
+
if start_value[:identity_options].is_a?(Array)
|
105
|
+
start_value[:identity_options].each do |c|
|
106
|
+
return c[c.keys.first]
|
107
|
+
end
|
108
|
+
else
|
109
|
+
raise "Unknown identity_options #{start_value.inspect}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
104
115
|
def identity?
|
105
116
|
if options.nil?
|
106
117
|
false
|
107
118
|
else
|
108
|
-
options.select{|h|h.has_key?(:column_option) && h.has_value?('identity')}.length > 0
|
119
|
+
# options.select{|h|h.has_key?(:column_option) && h.has_value?('identity')}.length > 0
|
120
|
+
options.select{|h|h.has_key?(:identity)}.length > 0
|
109
121
|
end
|
110
122
|
end
|
111
123
|
|
112
|
-
def
|
124
|
+
def option(key)
|
125
|
+
return if options.nil?
|
126
|
+
options.select{|h|h.has_key?(:column_option)}.length > 0 # return the right option
|
127
|
+
options.select{|o| o.is_a?(Hash) && o.has_key?(key)}.first
|
128
|
+
end
|
129
|
+
|
130
|
+
def default_value
|
131
|
+
unless option(:default_clause).nil?
|
132
|
+
begin
|
133
|
+
return option(:default_clause)[:default_clause].first[:string]
|
134
|
+
rescue
|
135
|
+
end
|
136
|
+
else
|
137
|
+
return ''
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def start_value
|
113
142
|
unless option(:identity).nil?
|
114
|
-
|
143
|
+
begin
|
144
|
+
return option(:identity)[:identity][:start_value][:integer].to_i
|
145
|
+
rescue
|
146
|
+
end
|
147
|
+
else
|
148
|
+
return 0
|
115
149
|
end
|
116
150
|
end
|
117
151
|
|
118
152
|
def increment_value
|
119
|
-
|
120
|
-
|
153
|
+
unless option(:identity).nil?
|
154
|
+
begin
|
155
|
+
return option(:identity)[:identity][:increment_value][:integer].to_i
|
156
|
+
rescue
|
157
|
+
end
|
121
158
|
else
|
122
|
-
|
159
|
+
return 0
|
123
160
|
end
|
124
161
|
end
|
162
|
+
|
125
163
|
def cache_value
|
126
|
-
|
127
|
-
|
164
|
+
unless option(:identity).nil?
|
165
|
+
begin
|
166
|
+
return option(:identity)[:identity][:cache_value][:integer].to_i
|
167
|
+
rescue
|
168
|
+
end
|
128
169
|
else
|
129
|
-
|
170
|
+
return 0
|
130
171
|
end
|
131
172
|
end
|
173
|
+
|
174
|
+
|
132
175
|
end
|
@@ -1,28 +1,29 @@
|
|
1
|
-
class DDLParser::Translator::CreateIndex
|
2
|
-
|
3
|
-
attr_accessor :parse_tree
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
1
|
+
class DDLParser::Translator::CreateIndex
|
2
|
+
|
3
|
+
attr_accessor :parse_tree
|
4
|
+
|
5
|
+
def initialize(parse_tree)
|
6
|
+
@parse_tree=parse_tree
|
7
|
+
end
|
8
|
+
|
9
|
+
def elements
|
10
|
+
[@parse_tree[:elements]].flatten
|
11
|
+
end
|
12
|
+
|
13
|
+
def table_name
|
14
|
+
@parse_tree.first[:table_name].to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def index_name
|
18
|
+
@parse_tree.first[:index_name].to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def fields
|
22
|
+
@parse_tree.select{|e|e.has_key?(:field)}.compact
|
23
|
+
end
|
24
|
+
|
25
|
+
def primary_key
|
26
|
+
elements.map{|e| e[:primary_key]}.compact.first[:item]
|
27
|
+
end
|
28
|
+
|
28
29
|
end
|
@@ -1,27 +1,29 @@
|
|
1
|
-
class DDLParser::Translator::CreateTable
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
1
|
+
class DDLParser::Translator::CreateTable
|
2
|
+
|
3
|
+
attr_accessor :parse_tree
|
4
|
+
|
5
|
+
def initialize(parse_tree)
|
6
|
+
@parse_tree=parse_tree
|
7
|
+
end
|
8
|
+
|
9
|
+
def elements
|
10
|
+
[@parse_tree[:elements]].flatten
|
11
|
+
end
|
12
|
+
|
13
|
+
def table_name
|
14
|
+
@parse_tree[:table_name].to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def columns
|
18
|
+
elements.map{|e|e[:column]}.compact.map{|e|DDLParser::Translator::Column.new(e)}
|
19
|
+
end
|
20
|
+
|
21
|
+
def primary_key
|
22
|
+
elements.map{|e| e[:primary_key]}.compact.first[:item]
|
23
|
+
end
|
24
|
+
|
25
|
+
def constraints
|
26
|
+
elements.map{|e|e[:constraint]}.compact
|
27
|
+
end
|
28
|
+
|
27
29
|
end
|
data/lib/ddl_parser/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module DDLParser
|
2
|
-
VERSION = '0.0.
|
3
|
-
end
|
1
|
+
module DDLParser
|
2
|
+
VERSION = '0.0.11'
|
3
|
+
end
|
@@ -1,26 +1,154 @@
|
|
1
|
-
require_relative '../../../../spec/spec_helper'
|
2
|
-
|
3
|
-
describe 'Create index parsing' do
|
4
|
-
let(:parser) { DDLParser::DDL::DB2::Parser.new }
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
1
|
+
require_relative '../../../../spec/spec_helper'
|
2
|
+
|
3
|
+
describe 'Create index parsing' do
|
4
|
+
let(:parser) { DDLParser::DDL::DB2::Parser.new }
|
5
|
+
context 'create index 1' do
|
6
|
+
it 'parses create_unique_index' do
|
7
|
+
sql = <<EOF
|
8
|
+
CREATE UNIQUE INDEX COST_INVOICE_1 ON COST_INVOICE
|
9
|
+
(DOC_NO, DOC_NO_2 )
|
10
|
+
EOF
|
11
|
+
begin
|
12
|
+
result = parser.parse(sql.downcase)
|
13
|
+
rescue Parslet::ParseFailed => error
|
14
|
+
puts error.cause.ascii_tree
|
15
|
+
end
|
16
|
+
|
17
|
+
result.count.should == 3
|
18
|
+
result[0].should include(:operation, :object_property, :object_type, :index_name)
|
19
|
+
result[0].should include(:operation => 'create')
|
20
|
+
result[0].should include(:object_property => 'unique')
|
21
|
+
result[0].should include(:object_type => 'index')
|
22
|
+
result[1].should include(:field)
|
23
|
+
end
|
24
|
+
it 'parses create_unique_index with one column' do
|
25
|
+
sql = <<EOF
|
26
|
+
CREATE UNIQUE INDEX COST_INVOICE_1 ON COST_INVOICE
|
27
|
+
(DOC_NO)
|
28
|
+
EOF
|
29
|
+
begin
|
30
|
+
result = parser.parse(sql.downcase)
|
31
|
+
rescue Parslet::ParseFailed => error
|
32
|
+
puts error.cause.ascii_tree
|
33
|
+
end
|
34
|
+
|
35
|
+
result.count.should == 6
|
36
|
+
result.should include(:operation => 'create')
|
37
|
+
result.should include(:object_property => 'unique')
|
38
|
+
result.should include(:object_type => 'index')
|
39
|
+
result.should include(:index_name => 'cost_invoice_1')
|
40
|
+
result.should include(:table_name => 'cost_invoice')
|
41
|
+
result.should include(:field => 'doc_no')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
context 'element list index' do
|
45
|
+
it 'parses one element', pending:true do
|
46
|
+
sql = 'deptno asc'
|
47
|
+
parser.element_list_index.parse(sql).should == {:elements => {:column=>{:field=> 'deptno',
|
48
|
+
:data_type=>{:char=>{:length=>{:integer=> '3'}}},
|
49
|
+
:options=>[{:column_option=> 'not null'}]}}}
|
50
|
+
end
|
51
|
+
it 'parses two element' do
|
52
|
+
sql = 'field1, field2'
|
53
|
+
parser.element_list_index.parse(sql).should == [{:field=> 'field1'},
|
54
|
+
{:field=> 'field2'}]
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'parses with new lines' do
|
59
|
+
sql = <<EOF
|
60
|
+
DEPTNO desc,
|
61
|
+
DEPTNAME asc
|
62
|
+
EOF
|
63
|
+
parser.element_list_index.parse(sql.downcase).should == [{:field=> 'deptno',:sort_id=> 'desc'},
|
64
|
+
{:field=> 'deptname',:sort_id=> 'asc'}]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
context 'index column definition' do
|
68
|
+
it 'parses two element' do
|
69
|
+
sql = 'field1'
|
70
|
+
parser.index_column_definition.parse(sql).should == {:field=> 'field1'}
|
71
|
+
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'parses with new lines' do
|
76
|
+
sql = <<EOF
|
77
|
+
DEPTNO descending
|
78
|
+
EOF
|
79
|
+
parser.index_column_definition.parse(sql.downcase).should == {:field=> 'deptno',:sort_id=> 'descending'}
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
context 'reverse scan' do
|
84
|
+
it 'parses reverse scans option' do
|
85
|
+
sql = 'allow reverse scans'
|
86
|
+
end
|
87
|
+
it 'parses index_option with reverse scans' do
|
88
|
+
sql = 'allow reverse scans'
|
89
|
+
parser.index_option.parse(sql).should == {:index_option => 'allow reverse scans'}
|
90
|
+
end
|
91
|
+
end
|
92
|
+
context 'create_index_statement' do
|
93
|
+
it 'create_index_statement_unique_1', :pending => true do
|
94
|
+
sql = <<EOF
|
95
|
+
CREATE
|
96
|
+
EOF
|
97
|
+
parser.create_index_statement_1.parse(sql.downcase).should == {:operation=>'create',:object_property=>'unique'}
|
98
|
+
|
99
|
+
end
|
100
|
+
it 'create_index_statement_unique_1_a', :pending => true do
|
101
|
+
sql = <<EOF
|
102
|
+
CREATE
|
103
|
+
EOF
|
104
|
+
parser.create_index_statement_1_a.parse(sql.downcase).should == {:operation=>'create',:object_property=>'unique'}
|
105
|
+
|
106
|
+
end
|
107
|
+
it 'create_index_statement_unique_2', pending:true do
|
108
|
+
sql = <<EOF
|
109
|
+
INDEX COST_INVOICE_1
|
110
|
+
EOF
|
111
|
+
parser.create_index_statement_2.parse(sql.downcase).should == {:object_type=>'index',:index_name=>'cost_invoice_1'}
|
112
|
+
|
113
|
+
end
|
114
|
+
it 'create_index_statement_unique', pending:true do
|
115
|
+
sql = <<EOF
|
116
|
+
CREATE UNIQUE INDEX COST_INVOICE_1
|
117
|
+
EOF
|
118
|
+
parser.create_index_statement.parse(sql.downcase).should == {:operation=>'create',:object_property=>'unique',:object_type=>'index',:index_name=>'cost_invoice_1'}
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
122
|
+
context 'index_table' do
|
123
|
+
it 'index_table_example' do
|
124
|
+
sql = <<EOF
|
125
|
+
ON COST_INVOICE
|
126
|
+
EOF
|
127
|
+
parser.index_table.parse(sql.downcase).should == {:table_name => 'cost_invoice'}
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
131
|
+
context 'full index example with reverse scan option' do
|
132
|
+
it 'with reverse scan', pending:true do
|
133
|
+
sql = <<EOF
|
134
|
+
CREATE UNIQUE INDEX COST_INVOICE_1
|
135
|
+
ON COST_INVOICE
|
136
|
+
(DOC_NO)
|
137
|
+
ALLOW REVERSE SCANS
|
138
|
+
EOF
|
139
|
+
begin
|
140
|
+
result = parser.parse(sql.downcase)
|
141
|
+
rescue Parslet::ParseFailed => error
|
142
|
+
puts error.cause.ascii_tree
|
143
|
+
end
|
144
|
+
result.count.should == 6
|
145
|
+
result.should include(:operation => 'create')
|
146
|
+
result.should include(:object_property => 'unique')
|
147
|
+
result.should include(:object_type => 'index')
|
148
|
+
result.should include(:index_name => 'cost_invoice_1')
|
149
|
+
result.should include(:table_name => 'cost_invoice')
|
150
|
+
result.should include(:field => 'doc_no')
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
26
154
|
end
|
@@ -42,7 +42,7 @@ describe DDLParser::DDL::DB2::Parser do
|
|
42
42
|
:cache_value=>{:integer=> '20'}}}]
|
43
43
|
end
|
44
44
|
|
45
|
-
it 'parses generated by' do
|
45
|
+
it 'parses 1 generated by 1' do
|
46
46
|
sql = 'generated by default as identity (start with 1, increment by 1, cache 20 )'
|
47
47
|
begin
|
48
48
|
result = parser.column_options.parse(sql.downcase)
|
@@ -254,31 +254,6 @@ EOF
|
|
254
254
|
expect(parser).to parse(sql.downcase)
|
255
255
|
end
|
256
256
|
|
257
|
-
it 'parses Example 6' do
|
258
|
-
pending 'we do not support CHECK statements'
|
259
|
-
sql = <<EOF
|
260
|
-
CREATE TABLE EMPLOYEE
|
261
|
-
(ID SMALLINT NOT NULL,
|
262
|
-
NAME VARCHAR(9),
|
263
|
-
DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100),
|
264
|
-
JOB CHAR(5) CHECK (JOB IN ('Sales','Mgr','Clerk')),
|
265
|
-
HIREDATE DATE,
|
266
|
-
SALARY DECIMAL(7,2),
|
267
|
-
COMM DECIMAL(7,2),
|
268
|
-
PRIMARY KEY (ID),
|
269
|
-
CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) > 1986
|
270
|
-
OR SALARY > 40500)
|
271
|
-
)
|
272
|
-
IN HUMRES
|
273
|
-
EOF
|
274
|
-
begin
|
275
|
-
result = parser.parse(sql.downcase)
|
276
|
-
# rescue Parslet::ParseFailed => error
|
277
|
-
# puts error.cause.ascii_tree
|
278
|
-
end
|
279
|
-
result.should == [{:operation=> 'create table', :table_name=> 'emp_act'}]
|
280
|
-
end
|
281
|
-
|
282
257
|
it 'parses Example 11' do
|
283
258
|
sql = <<EOF
|
284
259
|
CREATE TABLE EMP_ACT
|
@@ -515,4 +490,46 @@ EOF
|
|
515
490
|
end
|
516
491
|
|
517
492
|
end
|
493
|
+
context 'create table one column' do
|
494
|
+
it 'parses Example 19' do
|
495
|
+
sql = <<EOF
|
496
|
+
CREATE TABLE COSTINVOICEX
|
497
|
+
(DOC_NO CHARACTER(8) NOT NULL DEFAULT 'TEST DEFAULT')
|
498
|
+
|
499
|
+
EOF
|
500
|
+
|
501
|
+
begin
|
502
|
+
result = parser.parse(sql.downcase)
|
503
|
+
rescue Parslet::ParseFailed => error
|
504
|
+
puts error.cause.ascii_tree
|
505
|
+
end
|
506
|
+
|
507
|
+
result.should == {:operation=>"create table",
|
508
|
+
:table_name=>"costinvoicex",
|
509
|
+
:elements=>{:column=>{:field=>"doc_no",
|
510
|
+
:data_type=>{:char=>{:length=>{:integer=>"8"}}},
|
511
|
+
:options=>[{:column_option=>"not null"},
|
512
|
+
{:default_clause=>[{:string=>"'test default'"}]}]}}}
|
513
|
+
end
|
514
|
+
|
515
|
+
it 'parses Example 19 1 simple column' do
|
516
|
+
sql = <<EOF
|
517
|
+
CREATE TABLE COSTINVOICEX
|
518
|
+
(DOC_NO INTEGER)
|
519
|
+
|
520
|
+
EOF
|
521
|
+
|
522
|
+
begin
|
523
|
+
result = parser.parse(sql.downcase)
|
524
|
+
rescue Parslet::ParseFailed => error
|
525
|
+
puts error.cause.ascii_tree
|
526
|
+
end
|
527
|
+
|
528
|
+
result.should == {:operation=>"create table",
|
529
|
+
:table_name=>"costinvoicex",
|
530
|
+
:elements=>{:column=>{:field=>"doc_no",
|
531
|
+
:data_type=> 'integer', :options=>""}}}
|
532
|
+
end
|
533
|
+
|
534
|
+
end
|
518
535
|
end
|
@@ -4,7 +4,18 @@ require_relative '../../../lib/ddl_parser/translator/column'
|
|
4
4
|
describe 'DDLParser::Translator::Column' do
|
5
5
|
|
6
6
|
let(:unique_no_column) {
|
7
|
-
DDLParser::Translator::Column.new(
|
7
|
+
DDLParser::Translator::Column.new(
|
8
|
+
{:field=> 'unique_no',
|
9
|
+
:data_type=> 'integer',
|
10
|
+
:options=>
|
11
|
+
[{:column_option=> 'identity'},
|
12
|
+
{:identity=>
|
13
|
+
{:start_value=>{:integer=> '1'},
|
14
|
+
:increment_value=>{:integer=> '1'},
|
15
|
+
:cache_value=>{:integer=> '20'}
|
16
|
+
}
|
17
|
+
}]
|
18
|
+
})
|
8
19
|
}
|
9
20
|
|
10
21
|
let(:int_column) {
|
@@ -43,6 +54,8 @@ describe 'DDLParser::Translator::Column' do
|
|
43
54
|
})
|
44
55
|
}
|
45
56
|
|
57
|
+
|
58
|
+
|
46
59
|
it 'must receive hash' do
|
47
60
|
DDLParser::Translator::Column.new('').to_hash.should == {}
|
48
61
|
DDLParser::Translator::Column.new({:foo => :bar}).to_hash.should == {:foo => :bar}
|
@@ -88,24 +101,82 @@ describe 'DDLParser::Translator::Column' do
|
|
88
101
|
decimal_column.options.should == [{:column_option=> 'not null'}, {:default_clause=>[{:integer=> '0'}]}]
|
89
102
|
end
|
90
103
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
104
|
+
it 'should return not null' do
|
105
|
+
int_column.not_null.should == false
|
106
|
+
char_column.not_null.should == false
|
107
|
+
decimal_column.not_null.should == true
|
108
|
+
end
|
96
109
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
110
|
+
it 'should return default clause' do
|
111
|
+
int_column.default_clause.should == nil
|
112
|
+
char_column.default_clause.should == "'foobar'"
|
113
|
+
decimal_column.default_clause.should == 0
|
114
|
+
end
|
102
115
|
|
103
|
-
it 'should return identity flag' do
|
104
|
-
unique_no_column.identity?.should == true
|
105
|
-
end
|
106
116
|
|
107
|
-
|
108
|
-
|
109
|
-
|
117
|
+
it 'should return default value' do
|
118
|
+
char_column.default_value.should == "'foobar'"
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should return identity flag' do
|
122
|
+
unique_no_column.identity?.should == true
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should return start value for identity' do
|
126
|
+
unique_no_column.start_value.should == 1
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
it 'should return start value 0 for int_column' do
|
131
|
+
int_column.start_value.should == 0
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'should return start value 0 for decimal_column' do
|
135
|
+
decimal_column.start_value.should == 0
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'should return increment value for identity' do
|
139
|
+
unique_no_column.increment_value.should == 1
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should return cache value for identity' do
|
143
|
+
unique_no_column.cache_value.should == 20
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should return name via int_column_identity' do
|
147
|
+
int_column_identity.name.should == 'identity_field'
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'should return data_type via int_column_identity' do
|
151
|
+
int_column_identity.data_type.should == :integer
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should return length via int_column_identity' do
|
155
|
+
int_column_identity.length.should == nil
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should return precision via int_column_identity' do
|
159
|
+
int_column_identity.precision.should == nil
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should return scale via int_column_identity' do
|
163
|
+
int_column_identity.scale.should == nil
|
164
|
+
end
|
165
|
+
|
166
|
+
let(:int_column_identity) {
|
167
|
+
DDLParser::Translator::Column.new(
|
168
|
+
{:field=> 'identity_field',
|
169
|
+
:data_type=>{:integer=> '1'},
|
170
|
+
:options=>[{:column_option=> 'identity'}, {:identity_options=>[{:start_value=>[{:integer=> '1'},{:increment_value=>[{:integer=> '1'}]},{:cache_value=>[{:integer=> '20'}]}]}]
|
171
|
+
}]})
|
172
|
+
}
|
173
|
+
|
174
|
+
it 'should return options via int_column_identity' do
|
175
|
+
int_column_identity.options.should == [{:column_option=> 'identity'}, {:identity_options=>[{:start_value=>[{:integer=> '1'},{:increment_value=>[{:integer=> '1'}]},{:cache_value=>[{:integer=> '20'}]}]}]}]
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'should return options alt via int_column_identity' do
|
179
|
+
int_column_identity.identity_options.should == [{:integer=>'1'},{:increment_value=>[{:integer=>'1'}]},{:cache_value=>[{:integer=>'20'}]}]
|
180
|
+
end
|
110
181
|
|
111
|
-
end
|
182
|
+
end
|