create_table 0.1.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.
- 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
|