ddl_parser 0.0.10 → 0.0.11
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.
- 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
|