ddl_parser 0.0.8 → 0.0.9
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/shared_rules/data_types.rb +1 -1
- data/lib/ddl_parser/translator/column.rb +16 -4
- data/lib/ddl_parser/version.rb +1 -1
- data/spec/ddl_parser/ddl/db2/create_table_spec.rb +50 -0
- data/spec/ddl_parser/shared_rules/data_types_spec.rb +2 -0
- data/spec/ddl_parser/translator/column_spec.rb +18 -2
- metadata +17 -8
- checksums.yaml +0 -7
@@ -9,7 +9,7 @@ module DDLParser
|
|
9
9
|
rule(:type_integer) {(str('integer')| str('int'))}
|
10
10
|
rule(:type_bigint) {str('bigint').as(:bigint)}
|
11
11
|
rule(:type_decimal) {(((str('decimal') | str('dec') | str('numeric') | str('num')) >>
|
12
|
-
(lparen >> integer.as(:total) >> (comma >> integer.as(:scale)).maybe >> rparen).as(:precision))).as(:decimal)}
|
12
|
+
(lparen >> integer.as(:total) >> (comma >> integer.as(:scale)).maybe >> rparen).as(:precision).maybe)).as(:decimal)}
|
13
13
|
rule(:type_float) {(str('float') >> (lparen >> integer >> rparen).as(:precision)).as(:float)}
|
14
14
|
rule(:type_real) {str('real')}
|
15
15
|
rule(:type_double) {str('double')}
|
@@ -13,7 +13,7 @@ class DDLParser::Translator::Column
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def data_type
|
16
|
-
|
16
|
+
raise "DataType not specified #{@column_hash.inspect}" if @column_hash.nil? || @column_hash[:data_type].nil?
|
17
17
|
if @column_hash[:data_type].is_a?(Hash)
|
18
18
|
@column_hash[:data_type].keys.first
|
19
19
|
else
|
@@ -27,7 +27,11 @@ class DDLParser::Translator::Column
|
|
27
27
|
when :decimal
|
28
28
|
"#{precision}.#{scale}".to_f
|
29
29
|
when :char
|
30
|
-
|
30
|
+
begin
|
31
|
+
@column_hash[:data_type][:char][:length][:integer].to_i
|
32
|
+
rescue
|
33
|
+
raise "DataType CHAR length wrong format #{@column_hash[:data_type].inspect}"
|
34
|
+
end
|
31
35
|
else
|
32
36
|
nil
|
33
37
|
end
|
@@ -36,7 +40,11 @@ class DDLParser::Translator::Column
|
|
36
40
|
def precision
|
37
41
|
case data_type
|
38
42
|
when :decimal
|
39
|
-
|
43
|
+
begin
|
44
|
+
@column_hash[:data_type][:decimal][:precision][:total][:integer].to_i
|
45
|
+
rescue
|
46
|
+
5 # decimal default if no precision present
|
47
|
+
end
|
40
48
|
else
|
41
49
|
nil
|
42
50
|
end
|
@@ -45,7 +53,11 @@ class DDLParser::Translator::Column
|
|
45
53
|
def scale
|
46
54
|
case data_type
|
47
55
|
when :decimal
|
48
|
-
|
56
|
+
begin
|
57
|
+
@column_hash[:data_type][:decimal][:precision][:scale][:integer].to_i
|
58
|
+
rescue
|
59
|
+
0 # decimal default if no scale present
|
60
|
+
end
|
49
61
|
else
|
50
62
|
nil
|
51
63
|
end
|
data/lib/ddl_parser/version.rb
CHANGED
@@ -388,7 +388,32 @@ EOF
|
|
388
388
|
:data_type=>{:char=>{:length=>{:integer=> '30'}}},
|
389
389
|
:options=> ''}}]}
|
390
390
|
end
|
391
|
+
end
|
392
|
+
|
393
|
+
context 'real dsv examples 2' do
|
394
|
+
it 'parses Example 16a' do
|
395
|
+
sql = <<EOF
|
396
|
+
CREATE TABLE COSTINVOICE
|
397
|
+
(DOC_NO CHARACTER(8) NOT NULL,
|
398
|
+
STATUS CHARACTER(12))
|
399
|
+
EOF
|
391
400
|
|
401
|
+
begin
|
402
|
+
result = parser.parse(sql.downcase)
|
403
|
+
rescue Parslet::ParseFailed => error
|
404
|
+
puts error.cause.ascii_tree
|
405
|
+
end
|
406
|
+
|
407
|
+
result.should == {:operation=> 'create table',
|
408
|
+
:table_name=> 'costinvoice',
|
409
|
+
:elements => [
|
410
|
+
{:column=>{:field=> 'doc_no',
|
411
|
+
:data_type=>{:char=>{:length=>{:integer=> '8'}}},
|
412
|
+
:options=>[{:column_option=> 'not null'}]}},
|
413
|
+
{:column=>{:field=> 'status',
|
414
|
+
:data_type=>{:char=>{:length=>{:integer=> '12'}}},
|
415
|
+
:options=> ''}}]}
|
416
|
+
end
|
392
417
|
end
|
393
418
|
|
394
419
|
context 'real dsv examples' do
|
@@ -451,6 +476,31 @@ EOF
|
|
451
476
|
result[:operation].should == 'create table'
|
452
477
|
result[:table_name].should == 'cost_invoice'
|
453
478
|
end
|
479
|
+
end
|
480
|
+
context 'real dsv examples 3' do
|
481
|
+
it 'parses Example 18' do
|
482
|
+
sql = <<EOF
|
483
|
+
CREATE TABLE COSTINVOICE
|
484
|
+
(DOC_NO CHARACTER(8) NOT NULL DEFAULT 'TEST DEFAULT',
|
485
|
+
STATUS CHARACTER(12))
|
486
|
+
|
487
|
+
EOF
|
488
|
+
|
489
|
+
begin
|
490
|
+
result = parser.parse(sql.downcase)
|
491
|
+
rescue Parslet::ParseFailed => error
|
492
|
+
puts error.cause.ascii_tree
|
493
|
+
end
|
494
|
+
|
495
|
+
result.should == {:operation=>"create table",
|
496
|
+
:table_name=>"costinvoice",
|
497
|
+
:elements=>[{:column=>{:field=>"doc_no",
|
498
|
+
:data_type=>{:char=>{:length=>{:integer=>"8"}}},
|
499
|
+
:options=>[{:column_option=>"not null"},
|
500
|
+
{:default_clause=>[{:string=>"'test default'"}]}]}},
|
501
|
+
{:column=>{:field=>"status",
|
502
|
+
:data_type=>{:char=>{:length=>{:integer=>"12"}}}, :options=>""}}]}
|
503
|
+
end
|
454
504
|
|
455
505
|
end
|
456
506
|
end
|
@@ -11,6 +11,8 @@ describe DDLParser::SharedRules::DataTypes do
|
|
11
11
|
parser.data_type.parse('smallint').should == {:data_type=> 'smallint'}
|
12
12
|
parser.data_type.parse('int').should == {:data_type=> 'int'}
|
13
13
|
parser.data_type.parse('decimal(1,2)').should == {:data_type=>{:decimal=>{:precision => {:total=>{:integer=> '1'}, :scale=>{:integer=> '2'}}}}}
|
14
|
+
parser.data_type.parse('decimal(1)').should == {:data_type=>{:decimal=>{:precision => {:total=>{:integer=> '1'}}}}}
|
15
|
+
parser.data_type.parse('decimal').should == {:data_type=>{:decimal=>"decimal"}}
|
14
16
|
parser.data_type.parse('float(1)').should == {:data_type=>{:float=>{:precision=>{:integer=> '1'}}}}
|
15
17
|
parser.data_type.parse('real').should == {:data_type=> 'real'}
|
16
18
|
parser.data_type.parse('double').should == {:data_type=> 'double'}
|
@@ -23,9 +23,21 @@ describe 'DDLParser::Translator::Column' do
|
|
23
23
|
})
|
24
24
|
}
|
25
25
|
|
26
|
-
|
26
|
+
let(:decimal_no_scale_column) {
|
27
|
+
DDLParser::Translator::Column.new(
|
28
|
+
{:field=> 'decimal_field',
|
29
|
+
:data_type=>{:decimal=>{:precision=>{:total=>{:integer=> '15'}}}},
|
30
|
+
:options=>[{:column_option=> 'not null'}, {:default_clause=>[{:integer=> '0'}]}]
|
31
|
+
})
|
32
|
+
}
|
27
33
|
|
28
|
-
|
34
|
+
let(:decimal_no_precision_column) {
|
35
|
+
DDLParser::Translator::Column.new(
|
36
|
+
{:field=> 'decimal_field',
|
37
|
+
:data_type=>{:decimal=>"decimal"},
|
38
|
+
:options=>[{:column_option=> 'not null'}, {:default_clause=>[{:integer=> '0'}]}]
|
39
|
+
})
|
40
|
+
}
|
29
41
|
|
30
42
|
it 'must receive hash' do
|
31
43
|
DDLParser::Translator::Column.new('').to_hash.should == {}
|
@@ -54,12 +66,16 @@ describe 'DDLParser::Translator::Column' do
|
|
54
66
|
int_column.precision.should == nil
|
55
67
|
char_column.precision.should == nil
|
56
68
|
decimal_column.precision.should == 15
|
69
|
+
decimal_no_scale_column.precision.should == 15
|
70
|
+
decimal_no_precision_column.precision.should == 5
|
57
71
|
end
|
58
72
|
|
59
73
|
it 'should return scale' do
|
60
74
|
int_column.scale.should == nil
|
61
75
|
char_column.scale.should == nil
|
62
76
|
decimal_column.scale.should == 2
|
77
|
+
decimal_no_scale_column.scale.should == 0
|
78
|
+
decimal_no_precision_column.scale.should == 0
|
63
79
|
end
|
64
80
|
|
65
81
|
it 'should return options' do
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ddl_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Rasmus Bergholdt
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
12
|
+
date: 2014-07-15 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: parslet
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ~>
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: bundler
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: rake
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ~>
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ~>
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: rspec
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - '='
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :development
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - '='
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -111,26 +120,27 @@ files:
|
|
111
120
|
homepage: ''
|
112
121
|
licenses:
|
113
122
|
- MIT
|
114
|
-
metadata: {}
|
115
123
|
post_install_message:
|
116
124
|
rdoc_options: []
|
117
125
|
require_paths:
|
118
126
|
- lib
|
119
127
|
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
120
129
|
requirements:
|
121
|
-
- - '>='
|
130
|
+
- - ! '>='
|
122
131
|
- !ruby/object:Gem::Version
|
123
132
|
version: '0'
|
124
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
+
none: false
|
125
135
|
requirements:
|
126
|
-
- - '>='
|
136
|
+
- - ! '>='
|
127
137
|
- !ruby/object:Gem::Version
|
128
138
|
version: '0'
|
129
139
|
requirements: []
|
130
140
|
rubyforge_project:
|
131
|
-
rubygems_version:
|
141
|
+
rubygems_version: 1.8.28
|
132
142
|
signing_key:
|
133
|
-
specification_version:
|
143
|
+
specification_version: 3
|
134
144
|
summary: will parse statements and make it possible to extract content
|
135
145
|
test_files:
|
136
146
|
- spec/ddl_parser/ddl/db2/alter_table_spec.rb
|
@@ -142,4 +152,3 @@ test_files:
|
|
142
152
|
- spec/ddl_parser/sql/db2/select_parser_spec.rb
|
143
153
|
- spec/ddl_parser/translator/column_spec.rb
|
144
154
|
- spec/spec_helper.rb
|
145
|
-
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 43e8f3aea2bd03ccdd4c2a7b1a0b2c325f7bee84
|
4
|
-
data.tar.gz: 2a21651fe9805d07d7f80f79a160cec065557297
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: c6173cef6daad97465aac30304464b255d06955e88cbde966cdc940619cc2c653d2e872fdca48c534b2ac31678c35ad8697a025604eff2c2e0a2f49f51b75754
|
7
|
-
data.tar.gz: 10aa29aa0671fe7773d6b607c7b31fe1ffcb17dafa70ba49f9370e9f8fa89d6f7508692c4548a9d1ded2e5c6f8665671a28134fdbfa4dee367cdeaea366164e4
|