create_table 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +82 -0
- data/Rakefile +89 -0
- data/create_table.gemspec +28 -0
- data/features/parsing.feature +736 -0
- data/features/step_definitions/create_table/parsing_steps.rb +60 -0
- data/features/support/env.rb +28 -0
- data/lib/create_table.rb +2545 -0
- data/lib/create_table.rl +185 -0
- data/lib/create_table/column.rb +4920 -0
- data/lib/create_table/column.rl +338 -0
- data/lib/create_table/column_name_based_collection.rb +26 -0
- data/lib/create_table/common.rb +5 -0
- data/lib/create_table/common.rl +13 -0
- data/lib/create_table/index.rb +315 -0
- data/lib/create_table/index.rl +91 -0
- data/lib/create_table/mysql_reserved.txt +226 -0
- data/lib/create_table/parser.rb +36 -0
- data/lib/create_table/pg_reserved.txt +742 -0
- data/lib/create_table/unique.rb +7 -0
- data/lib/create_table/version.rb +3 -0
- data/spec/create_table_spec.rb +88 -0
- data/spec/generating/autoincrement_primary_key.yml +74 -0
- data/spec/generating/backticks.yml +22 -0
- data/spec/generating/charset.yml +21 -0
- data/spec/generating/comments.yml +34 -0
- data/spec/generating/doublequoted.yml +25 -0
- data/spec/generating/index.yml +37 -0
- data/spec/generating/named_unique.yml +37 -0
- data/spec/generating/reservedwords.yml +23 -0
- data/spec/generating/string_primary_key.yml +35 -0
- data/spec/generating/temporary.yml +25 -0
- data/spec/generating/unique.yml +35 -0
- data/spec/generating/unquoted.yml +25 -0
- data/spec/generating_spec.rb +27 -0
- data/spec/spec_helper.rb +66 -0
- metadata +263 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CreateTable do
|
4
|
+
describe 'parsing SQL' do
|
5
|
+
before do
|
6
|
+
@c = CreateTable.new(%{
|
7
|
+
CREATE TABLE cats (
|
8
|
+
nickname CHARACTER VARYING(255),
|
9
|
+
birthday DATE NOT NULL DEFAULT '2005-01-01',
|
10
|
+
license_id INTEGER NULL,
|
11
|
+
price NUMERIC(5,2) DEFAULT '14.50',
|
12
|
+
PRIMARY KEY (nickname),
|
13
|
+
UNIQUE KEY uindex_cats_on_license_id (license_id),
|
14
|
+
INDEX index_cats_on_price (price)
|
15
|
+
)
|
16
|
+
})
|
17
|
+
end
|
18
|
+
it "gets table name" do
|
19
|
+
@c.table_name.should == 'cats'
|
20
|
+
end
|
21
|
+
it "gets all columns" do
|
22
|
+
@c.columns.length.should == 4
|
23
|
+
end
|
24
|
+
it "gets column names" do
|
25
|
+
@c.columns.map(&:name).should == ['nickname', 'birthday', 'license_id', 'price']
|
26
|
+
end
|
27
|
+
it "gets data types" do
|
28
|
+
@c.columns.map(&:data_type).should == ['CHARACTER VARYING(255)', "DATE", 'INTEGER', "NUMERIC(5,2)"]
|
29
|
+
end
|
30
|
+
it "gets defaults" do
|
31
|
+
@c.columns.map(&:default).should == [%{}, %{2005-01-01}, nil, %{14.50}]
|
32
|
+
end
|
33
|
+
it "gets [not] null" do
|
34
|
+
@c.columns.map(&:null).should == [false, false, true, true]
|
35
|
+
end
|
36
|
+
it "gets primary key" do
|
37
|
+
@c.primary_key.column_names.should == ['nickname']
|
38
|
+
end
|
39
|
+
it "gets all indexes" do
|
40
|
+
@c.indexes.length.should == 3
|
41
|
+
@c.indexes.map(&:column_names).should == [['nickname'], ['license_id'], ['price']]
|
42
|
+
end
|
43
|
+
it "gets unique indexes" do
|
44
|
+
u = @c.indexes['license_id']
|
45
|
+
u.unique.should == true
|
46
|
+
u.name.should == 'uindex_cats_on_license_id'
|
47
|
+
u.column_names.should == ['license_id']
|
48
|
+
end
|
49
|
+
it "gets normal indexes" do
|
50
|
+
i = @c.indexes['price']
|
51
|
+
i.unique.should == false
|
52
|
+
i.name.should == 'index_cats_on_price'
|
53
|
+
i.column_names.should == ['price']
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'generating SQL' do
|
58
|
+
before do
|
59
|
+
@c = CreateTable.new
|
60
|
+
@c.table_name = 'where' # reserved
|
61
|
+
@c.parse_column 'nickname CHARACTER VARYING(255) PRIMARY KEY'
|
62
|
+
@c.parse_column 'false CHARACTER VARYING(255)' # reserved word
|
63
|
+
@c.parse_column 'else NUMERIC(5,2)' # reserved word
|
64
|
+
end
|
65
|
+
it "gets table name" do
|
66
|
+
@c.table_name.should == 'where'
|
67
|
+
end
|
68
|
+
it "gets all columns" do
|
69
|
+
@c.columns.length.should == 3
|
70
|
+
end
|
71
|
+
it "gets column names" do
|
72
|
+
@c.columns.map(&:name).should == ['nickname', 'false', 'else']
|
73
|
+
end
|
74
|
+
it "gets all indexes" do
|
75
|
+
@c.indexes.length.should == 1
|
76
|
+
end
|
77
|
+
it "writes minimal SQL" do
|
78
|
+
ref = %{
|
79
|
+
CREATE TABLE "where" (
|
80
|
+
nickname CHARACTER VARYING(255) PRIMARY KEY,
|
81
|
+
"false" CHARACTER VARYING(255),
|
82
|
+
"else" NUMERIC(5,2)
|
83
|
+
)
|
84
|
+
}
|
85
|
+
assert_same_sql @c.to_postgresql, ref
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: Auto-incrementing primary key defined inline
|
4
|
+
input:
|
5
|
+
postgresql:
|
6
|
+
- |
|
7
|
+
CREATE TABLE cats (
|
8
|
+
id SERIAL PRIMARY KEY,
|
9
|
+
nickname CHARACTER VARYING(255),
|
10
|
+
birthday DATE,
|
11
|
+
license_id INTEGER,
|
12
|
+
price NUMERIC(5,2)
|
13
|
+
)
|
14
|
+
- |
|
15
|
+
CREATE TABLE cats (
|
16
|
+
id SERIAL,
|
17
|
+
nickname CHARACTER VARYING(255),
|
18
|
+
birthday DATE,
|
19
|
+
license_id INTEGER,
|
20
|
+
price NUMERIC(5,2),
|
21
|
+
PRIMARY KEY ("id")
|
22
|
+
)
|
23
|
+
mysql:
|
24
|
+
- |
|
25
|
+
CREATE TABLE cats (
|
26
|
+
id INTEGER PRIMARY KEY AUTO_INCREMENT,
|
27
|
+
nickname CHARACTER VARYING(255),
|
28
|
+
birthday DATE,
|
29
|
+
license_id INTEGER,
|
30
|
+
price NUMERIC(5,2)
|
31
|
+
)
|
32
|
+
- |
|
33
|
+
CREATE TABLE cats (
|
34
|
+
id INTEGER AUTO_INCREMENT,
|
35
|
+
nickname CHARACTER VARYING(255),
|
36
|
+
birthday DATE,
|
37
|
+
license_id INTEGER,
|
38
|
+
price NUMERIC(5,2),
|
39
|
+
PRIMARY KEY ("id")
|
40
|
+
)
|
41
|
+
sqlite3: |
|
42
|
+
CREATE TABLE cats (
|
43
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
44
|
+
nickname CHARACTER VARYING(255),
|
45
|
+
birthday DATE,
|
46
|
+
license_id INTEGER,
|
47
|
+
price NUMERIC(5,2)
|
48
|
+
)
|
49
|
+
|
50
|
+
output:
|
51
|
+
postgresql: |
|
52
|
+
CREATE TABLE cats (
|
53
|
+
"id" SERIAL PRIMARY KEY,
|
54
|
+
nickname CHARACTER VARYING(255),
|
55
|
+
birthday DATE,
|
56
|
+
license_id INTEGER,
|
57
|
+
price NUMERIC(5,2)
|
58
|
+
)
|
59
|
+
mysql: |-
|
60
|
+
CREATE TABLE cats (
|
61
|
+
"id" INTEGER PRIMARY KEY AUTO_INCREMENT,
|
62
|
+
nickname CHARACTER VARYING(255),
|
63
|
+
birthday DATE,
|
64
|
+
license_id INTEGER,
|
65
|
+
price NUMERIC(5,2)
|
66
|
+
)
|
67
|
+
sqlite3: |-
|
68
|
+
CREATE TABLE cats (
|
69
|
+
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
70
|
+
nickname CHARACTER VARYING(255),
|
71
|
+
birthday DATE,
|
72
|
+
license_id INTEGER,
|
73
|
+
price NUMERIC(5,2)
|
74
|
+
)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: MySQL-style backticks
|
4
|
+
input:
|
5
|
+
mysql: |
|
6
|
+
CREATE TABLE `cats` (
|
7
|
+
`nickname` CHARACTER VARYING(255),
|
8
|
+
`birthday` DATE,
|
9
|
+
`license_id` INTEGER,
|
10
|
+
`price` NUMERIC(5,2)
|
11
|
+
)
|
12
|
+
output:
|
13
|
+
postgresql: &id002 |
|
14
|
+
CREATE TABLE cats (
|
15
|
+
nickname CHARACTER VARYING(255),
|
16
|
+
birthday DATE,
|
17
|
+
license_id INTEGER,
|
18
|
+
price NUMERIC(5,2)
|
19
|
+
)
|
20
|
+
|
21
|
+
mysql: *id002
|
22
|
+
sqlite3: *id002
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: MySQL-style specification of table charset in CREATE TABLE sql
|
4
|
+
input:
|
5
|
+
postgresql: &id001 |
|
6
|
+
CREATE TABLE cats (
|
7
|
+
nickname CHARACTER VARYING(255),
|
8
|
+
birthday DATE,
|
9
|
+
license_id INTEGER,
|
10
|
+
price NUMERIC(5,2)
|
11
|
+
) DEFAULT CHARSET=utf8
|
12
|
+
output:
|
13
|
+
postgresql: &id002 |
|
14
|
+
CREATE TABLE cats (
|
15
|
+
nickname CHARACTER VARYING(255),
|
16
|
+
birthday DATE,
|
17
|
+
license_id INTEGER,
|
18
|
+
price NUMERIC(5,2)
|
19
|
+
)
|
20
|
+
mysql: *id002
|
21
|
+
sqlite3: *id002
|
@@ -0,0 +1,34 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: Comments with "/* */", including multiline
|
4
|
+
input:
|
5
|
+
postgresql: &id001 |
|
6
|
+
/* b o yah */CREATE TABLE cats (/* daom */
|
7
|
+
nickname /*yah
|
8
|
+
see
|
9
|
+
i didn't
|
10
|
+
think
|
11
|
+
so*/ CHARACTER VARYING(255), /*this is a great nickname*/
|
12
|
+
birthday /* did you notice this? */ DATE,
|
13
|
+
license_id INTEGER, /* oh yah that's cool too */
|
14
|
+
/* oh yah that's hilarious */ price NUMERIC(5,2)
|
15
|
+
)/* gosh
|
16
|
+
when
|
17
|
+
will
|
18
|
+
it
|
19
|
+
end
|
20
|
+
*/
|
21
|
+
|
22
|
+
mysql: *id001
|
23
|
+
sqlite3: *id001
|
24
|
+
output:
|
25
|
+
postgresql: &id002 |
|
26
|
+
CREATE TABLE cats (
|
27
|
+
nickname CHARACTER VARYING(255),
|
28
|
+
birthday DATE,
|
29
|
+
license_id INTEGER,
|
30
|
+
price NUMERIC(5,2)
|
31
|
+
)
|
32
|
+
|
33
|
+
mysql: *id002
|
34
|
+
sqlite3: *id002
|
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: Double-quoted
|
4
|
+
input:
|
5
|
+
postgresql: &id001 |
|
6
|
+
CREATE TABLE "cats" (
|
7
|
+
"nickname" CHARACTER VARYING(255),
|
8
|
+
"birthday" DATE,
|
9
|
+
"license_id" INTEGER,
|
10
|
+
"price" NUMERIC(5,2)
|
11
|
+
)
|
12
|
+
|
13
|
+
mysql: *id001
|
14
|
+
sqlite3: *id001
|
15
|
+
output:
|
16
|
+
postgresql: &id002 |
|
17
|
+
CREATE TABLE cats (
|
18
|
+
nickname CHARACTER VARYING(255),
|
19
|
+
birthday DATE,
|
20
|
+
license_id INTEGER,
|
21
|
+
price NUMERIC(5,2)
|
22
|
+
)
|
23
|
+
|
24
|
+
mysql: *id002
|
25
|
+
sqlite3: *id002
|
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: Index defined in the "table constraints" section
|
4
|
+
input:
|
5
|
+
mysql:
|
6
|
+
- |
|
7
|
+
CREATE TABLE cats (
|
8
|
+
nickname CHARACTER VARYING(255),
|
9
|
+
birthday DATE,
|
10
|
+
license_id INTEGER,
|
11
|
+
price NUMERIC(5,2),
|
12
|
+
INDEX index_cats_on_nickname (nickname)
|
13
|
+
)
|
14
|
+
- |
|
15
|
+
CREATE TABLE cats (
|
16
|
+
nickname CHARACTER VARYING(255),
|
17
|
+
birthday DATE,
|
18
|
+
license_id INTEGER,
|
19
|
+
price NUMERIC(5,2),
|
20
|
+
KEY index_cats_on_nickname (nickname)
|
21
|
+
)
|
22
|
+
output:
|
23
|
+
postgresql:
|
24
|
+
- &create_table |
|
25
|
+
CREATE TABLE cats (
|
26
|
+
nickname CHARACTER VARYING(255),
|
27
|
+
birthday DATE,
|
28
|
+
license_id INTEGER,
|
29
|
+
price NUMERIC(5,2)
|
30
|
+
)
|
31
|
+
- &create_indexes CREATE INDEX index_cats_on_nickname ON cats (nickname)
|
32
|
+
mysql:
|
33
|
+
- *create_table
|
34
|
+
- *create_indexes
|
35
|
+
sqlite3:
|
36
|
+
- *create_table
|
37
|
+
- *create_indexes
|
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: Named unique indexes
|
4
|
+
input:
|
5
|
+
mysql:
|
6
|
+
- |
|
7
|
+
CREATE TABLE cats (
|
8
|
+
nickname CHARACTER VARYING(255),
|
9
|
+
birthday DATE,
|
10
|
+
license_id INTEGER,
|
11
|
+
price NUMERIC(5,2),
|
12
|
+
UNIQUE KEY uindex_cats_on_nickname (nickname)
|
13
|
+
)
|
14
|
+
- |
|
15
|
+
CREATE TABLE cats (
|
16
|
+
nickname CHARACTER VARYING(255),
|
17
|
+
birthday DATE,
|
18
|
+
license_id INTEGER,
|
19
|
+
price NUMERIC(5,2),
|
20
|
+
UNIQUE INDEX uindex_cats_on_nickname (nickname)
|
21
|
+
)
|
22
|
+
output:
|
23
|
+
postgresql:
|
24
|
+
- &id002 |
|
25
|
+
CREATE TABLE cats (
|
26
|
+
nickname CHARACTER VARYING(255),
|
27
|
+
birthday DATE,
|
28
|
+
license_id INTEGER,
|
29
|
+
price NUMERIC(5,2)
|
30
|
+
)
|
31
|
+
- CREATE UNIQUE INDEX uindex_cats_on_nickname ON cats (nickname)
|
32
|
+
mysql:
|
33
|
+
- *id002
|
34
|
+
- CREATE UNIQUE INDEX uindex_cats_on_nickname ON cats (nickname)
|
35
|
+
sqlite3:
|
36
|
+
- *id002
|
37
|
+
- CREATE UNIQUE INDEX uindex_cats_on_nickname ON cats (nickname)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
---
|
2
|
+
table_name: where
|
3
|
+
description: Reserved words in table and column names
|
4
|
+
input:
|
5
|
+
postgresql: &id001 |
|
6
|
+
CREATE TABLE "where" (
|
7
|
+
nickname CHARACTER VARYING(255),
|
8
|
+
"false" CHARACTER VARYING(255),
|
9
|
+
"else" NUMERIC(5,2)
|
10
|
+
)
|
11
|
+
|
12
|
+
mysql: *id001
|
13
|
+
sqlite3: *id001
|
14
|
+
output:
|
15
|
+
postgresql: &id002 |
|
16
|
+
CREATE TABLE "where" (
|
17
|
+
nickname CHARACTER VARYING(255),
|
18
|
+
"false" CHARACTER VARYING(255),
|
19
|
+
"else" NUMERIC(5,2)
|
20
|
+
)
|
21
|
+
|
22
|
+
mysql: *id002
|
23
|
+
sqlite3: *id002
|
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: String primary key
|
4
|
+
input:
|
5
|
+
postgresql: &id001
|
6
|
+
- |
|
7
|
+
CREATE TABLE cats (
|
8
|
+
nickname CHARACTER VARYING(255) PRIMARY KEY,
|
9
|
+
birthday DATE,
|
10
|
+
license_id INTEGER,
|
11
|
+
price NUMERIC(5,2)
|
12
|
+
)
|
13
|
+
|
14
|
+
- |
|
15
|
+
CREATE TABLE cats (
|
16
|
+
nickname CHARACTER VARYING(255),
|
17
|
+
birthday DATE,
|
18
|
+
license_id INTEGER,
|
19
|
+
price NUMERIC(5,2),
|
20
|
+
PRIMARY KEY (nickname)
|
21
|
+
)
|
22
|
+
|
23
|
+
mysql: *id001
|
24
|
+
sqlite3: *id001
|
25
|
+
output:
|
26
|
+
postgresql: &id002 |
|
27
|
+
CREATE TABLE cats (
|
28
|
+
nickname CHARACTER VARYING(255) PRIMARY KEY,
|
29
|
+
birthday DATE,
|
30
|
+
license_id INTEGER,
|
31
|
+
price NUMERIC(5,2)
|
32
|
+
)
|
33
|
+
|
34
|
+
mysql: *id002
|
35
|
+
sqlite3: *id002
|
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
table_name: cats
|
3
|
+
description: Temporary tables
|
4
|
+
input:
|
5
|
+
mysql: &id001 |
|
6
|
+
CREATE TEMPORARY TABLE cats (
|
7
|
+
nickname CHARACTER VARYING(255),
|
8
|
+
birthday DATE,
|
9
|
+
license_id INTEGER,
|
10
|
+
price NUMERIC(5,2)
|
11
|
+
)
|
12
|
+
|
13
|
+
mysql: *id001
|
14
|
+
sqlite3: *id001
|
15
|
+
output:
|
16
|
+
postgresql: &id002 |
|
17
|
+
CREATE TEMPORARY TABLE cats (
|
18
|
+
nickname CHARACTER VARYING(255),
|
19
|
+
birthday DATE,
|
20
|
+
license_id INTEGER,
|
21
|
+
price NUMERIC(5,2)
|
22
|
+
)
|
23
|
+
|
24
|
+
mysql: *id002
|
25
|
+
sqlite3: *id002
|