create_table 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +82 -0
  5. data/Rakefile +89 -0
  6. data/create_table.gemspec +28 -0
  7. data/features/parsing.feature +736 -0
  8. data/features/step_definitions/create_table/parsing_steps.rb +60 -0
  9. data/features/support/env.rb +28 -0
  10. data/lib/create_table.rb +2545 -0
  11. data/lib/create_table.rl +185 -0
  12. data/lib/create_table/column.rb +4920 -0
  13. data/lib/create_table/column.rl +338 -0
  14. data/lib/create_table/column_name_based_collection.rb +26 -0
  15. data/lib/create_table/common.rb +5 -0
  16. data/lib/create_table/common.rl +13 -0
  17. data/lib/create_table/index.rb +315 -0
  18. data/lib/create_table/index.rl +91 -0
  19. data/lib/create_table/mysql_reserved.txt +226 -0
  20. data/lib/create_table/parser.rb +36 -0
  21. data/lib/create_table/pg_reserved.txt +742 -0
  22. data/lib/create_table/unique.rb +7 -0
  23. data/lib/create_table/version.rb +3 -0
  24. data/spec/create_table_spec.rb +88 -0
  25. data/spec/generating/autoincrement_primary_key.yml +74 -0
  26. data/spec/generating/backticks.yml +22 -0
  27. data/spec/generating/charset.yml +21 -0
  28. data/spec/generating/comments.yml +34 -0
  29. data/spec/generating/doublequoted.yml +25 -0
  30. data/spec/generating/index.yml +37 -0
  31. data/spec/generating/named_unique.yml +37 -0
  32. data/spec/generating/reservedwords.yml +23 -0
  33. data/spec/generating/string_primary_key.yml +35 -0
  34. data/spec/generating/temporary.yml +25 -0
  35. data/spec/generating/unique.yml +35 -0
  36. data/spec/generating/unquoted.yml +25 -0
  37. data/spec/generating_spec.rb +27 -0
  38. data/spec/spec_helper.rb +66 -0
  39. metadata +263 -0
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in create_table.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Seamus Abshere
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,82 @@
1
+ # CreateTable
2
+
3
+ Analyze and inspect CREATE TABLE SQL statements and translate across databases.
4
+
5
+ ## BETA
6
+
7
+ Tests and documentation are being added constantly.
8
+
9
+ TODO: stop making excuses and write a proper README.
10
+
11
+ ## Quickstart
12
+
13
+ ### Parsing
14
+
15
+ >> require 'create_table'
16
+ => true
17
+ >> c = CreateTable.new(%{
18
+ CREATE TABLE employees
19
+ (employeeid INTEGER NOT NULL,
20
+ lastname VARCHAR(25) NOT NULL,
21
+ firstname VARCHAR(25) NOT NULL,
22
+ reportsto INTEGER NULL);
23
+ })
24
+ => #<CreateTable>
25
+ >> c.columns.map(&:name)
26
+ => ["employeeid", "lastname", "firstname", "reportsto"]
27
+ >> c.columns.map(&:data_type)
28
+ => ["INTEGER", "CHARACTER VARYING(25)", "CHARACTER VARYING(25)", "INTEGER"]
29
+ >> c.columns.map(&:allow_null)
30
+ => [false, false, false, true]
31
+
32
+ ### Generating cross-platform SQL
33
+
34
+ >> require 'create_table'
35
+ => true
36
+ >> c = CreateTable.new(%{
37
+ CREATE TABLE cats (
38
+ id INTEGER AUTO_INCREMENT, /* AUTO_INCREMENT with an underscore is MySQL-style... */
39
+ nickname CHARACTER VARYING(255),
40
+ birthday DATE,
41
+ license_id INTEGER,
42
+ price NUMERIC(5,2),
43
+ PRIMARY KEY ("id")
44
+ )
45
+ })
46
+ => #<CreateTable>
47
+ >> c.to_mysql
48
+ => ["CREATE TABLE cats ( `id` INTEGER PRIMARY KEY AUTO_INCREMENT, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2) )"]
49
+ >> c.to_postgresql
50
+ => ["CREATE TABLE cats ( \"id\" SERIAL PRIMARY KEY, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2) )"]
51
+ >> c.to_sqlite3
52
+ => ["CREATE TABLE cats ( \"id\" INTEGER PRIMARY KEY AUTOINCREMENT, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2) )"]
53
+
54
+ ## As a web service
55
+
56
+ Check out the [CreateTable demo web service](http://create-table.herokuapp.com)!
57
+
58
+ $ curl -i -X POST -H "Accept: application/json" --data "CREATE TABLE cats ( id INTEGER AUTO_INCREMENT, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2), PRIMARY KEY (\"id\") )" http://create-table.herokuapp.com/statements
59
+ HTTP/1.1 201 Created
60
+ Cache-Control: max-age=0, private, must-revalidate
61
+ Content-Type: application/json; charset=utf-8
62
+ Date: Fri, 24 Aug 2012 22:24:52 GMT
63
+ Etag: "f13513b9126eb1fb909229e828c6a7cd"
64
+ Location: http://create-table.herokuapp.com/statements/9
65
+ Server: thin 1.4.1 codename Chromeo
66
+ X-Rack-Cache: invalidate, pass
67
+ X-Runtime: 0.051092
68
+ X-Ua-Compatible: IE=Edge,chrome=1
69
+ Content-Length: 1490
70
+ Connection: keep-alive
71
+
72
+ {"statement":{"original":"CREATE TABLE cats ( id INTEGER AUTO_INCREMENT, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2), PRIMARY KEY (\"id\") )","mysql":"CREATE TABLE cats ( `id` INTEGER PRIMARY KEY AUTO_INCREMENT, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2) )","postgresql":"CREATE TABLE cats ( \"id\" SERIAL PRIMARY KEY, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2) )","sqlite3":"CREATE TABLE cats ( \"id\" INTEGER PRIMARY KEY AUTOINCREMENT, nickname CHARACTER VARYING(255), birthday DATE, license_id INTEGER, price NUMERIC(5,2) )","columns":[{"name":"id","data_type":"INTEGER","allow_null":false,"default":null,"primary_key":true,"unique":true,"autoincrement":true,"charset":null,"collate":null},{"name":"nickname","data_type":"CHARACTER VARYING(255)","allow_null":true,"default":null,"primary_key":false,"unique":false,"autoincrement":false,"charset":null,"collate":null},{"name":"birthday","data_type":"DATE","allow_null":true,"default":null,"primary_key":false,"unique":false,"autoincrement":false,"charset":null,"collate":null},{"name":"license_id","data_type":"INTEGER","allow_null":true,"default":null,"primary_key":false,"unique":false,"autoincrement":false,"charset":null,"collate":null},{"name":"price","data_type":"NUMERIC(5,2)","allow_null":true,"default":null,"primary_key":false,"unique":false,"autoincrement":false,"charset":null,"collate":null}]}}
73
+
74
+ ## Real-world usage
75
+
76
+ <p><a href="http://brighterplanet.com"><img src="https://s3.amazonaws.com/static.brighterplanet.com/assets/logos/flush-left/inline/green/rasterized/brighter_planet-160-transparent.png" alt="Brighter Planet logo"/></a></p>
77
+
78
+ We will soon use `create_table` for the [Brighter Planet reference data web service](http://data.brighterplanet.com).
79
+
80
+ ## Copyright
81
+
82
+ Copyright 2012 Brighter Planet, Inc.
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:rspec) do |spec|
6
+ spec.rspec_opts = ['--format', 'documentation']
7
+ end
8
+
9
+ require 'cucumber/rake/task'
10
+ Cucumber::Rake::Task.new(:cucumber) do |t|
11
+ t.cucumber_opts = %w{--format pretty}
12
+ end
13
+
14
+ task :rspec_all_databases do
15
+ require 'posix-spawn'
16
+ %w{ postgresql mysql sqlite3 }.each do |db|
17
+ puts
18
+ puts '#'*50
19
+ puts "# Running specs against #{db}"
20
+ puts '#'*50
21
+ puts
22
+ pid = POSIX::Spawn.spawn({'DB' => db}, 'rspec', File.expand_path('../spec', __FILE__))
23
+ Process.waitpid pid
24
+ end
25
+ end
26
+
27
+ task :default => [:cucumber, :rspec_all_databases]
28
+
29
+ task :ragel do
30
+ require 'posix/spawn'
31
+ require 'active_support/core_ext'
32
+ require 'fileutils'
33
+ Dir[File.expand_path('../lib/**/*.rl', __FILE__)].each do |path|
34
+ next if File.basename(path).include?('common')
35
+ $stderr.write "#{File.basename(path)}:"
36
+ debugged = "#{path}.tmp"
37
+ if ENV['VERBOSE'] == 'true'
38
+ $stderr.write " adding debugging to #{File.basename(debugged)}..."
39
+ lines = IO.readlines(path).map(&:chomp)
40
+ File.open(debugged, 'w') do |f|
41
+ lines.each do |line|
42
+ if line =~ /action ([^{]*) \{([^}]*)\}?/
43
+ action = $1.strip
44
+ inline = $2.strip
45
+ is_inline = inline.length > 0
46
+ base = action.sub('Quoted', '').sub('Unquoted', '').sub(/^(Mark|Start|End)/, '').underscore
47
+ vars = [ "mark_#{base}", "start_#{base}", "end_#{base}", 'end_data_type' ].uniq
48
+ l1 = []
49
+ l1 << "p=\#{p} \#{data[p..p].pack('c*').inspect}"
50
+ l2 = vars.map { |name| "#{name}=\#{#{name}.inspect if defined?(#{name})}" }
51
+ start = "start_#{base}"
52
+ pre = <<-EOS
53
+ $stderr.puts "\n#{action}\n #{l1.join(', ')}\n #{l2.join(', ')}"
54
+ if defined?(#{start}) and #{start}
55
+ $stderr.puts ' ***' + read(data, #{start}, p).inspect
56
+ end
57
+ EOS
58
+ if is_inline
59
+ f.puts "action #{action} {"
60
+ f.puts pre
61
+ f.puts inline
62
+ else
63
+ f.puts line
64
+ f.puts pre
65
+ end
66
+ if is_inline
67
+ f.puts '}'
68
+ end
69
+ else
70
+ f.puts line
71
+ end
72
+ end
73
+ end
74
+ else
75
+ # didn't add
76
+ FileUtils.cp path, debugged
77
+ end
78
+ ragel = "#{path}.rb"
79
+ $stderr.write " compiling Ragel to #{File.basename(ragel)}..."
80
+ if (child = POSIX::Spawn::Child.new('ragel', '-R', '-L', debugged)).status.success?
81
+ # File.unlink debugged
82
+ else
83
+ raise "Error: #{child.err}"
84
+ end
85
+ final = ragel.sub('.rl.rb', '.rb')
86
+ $stderr.write " moving to #{File.basename(final)}.\n"
87
+ FileUtils.mv ragel, final
88
+ end
89
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/create_table/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Seamus Abshere"]
6
+ gem.email = ["seamus@abshere.net"]
7
+ gem.description = %q{Analyze and inspect CREATE TABLE SQL statements and translate across databases.}
8
+ gem.summary = %q{Analyze and inspect CREATE TABLE SQL statements and translate across databases.}
9
+ gem.homepage = "https://github.com/seamusabshere/create_table"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "create_table"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = CreateTable::VERSION
17
+
18
+ gem.add_development_dependency 'rspec-core'
19
+ gem.add_development_dependency 'rspec-expectations'
20
+ gem.add_development_dependency 'rspec-mocks'
21
+ gem.add_development_dependency 'posix-spawn'
22
+ gem.add_development_dependency 'activerecord'
23
+ gem.add_development_dependency 'activesupport'
24
+ gem.add_development_dependency 'mysql2'
25
+ gem.add_development_dependency 'pg'
26
+ gem.add_development_dependency 'sqlite3'
27
+ gem.add_development_dependency 'cucumber'
28
+ end
@@ -0,0 +1,736 @@
1
+ Feature: Parsing
2
+
3
+ # yah i know this is long, just add stuff to the bottom
4
+
5
+ Scenario Outline: parsing columns
6
+ Given column definition <column_definition>
7
+ Then the name should be <name>
8
+ And the default should be <default>
9
+ And the charset should be <charset>
10
+ And the collate should be <collate>
11
+ And the data_type should be <data_type>
12
+ And the primary_key should be <primary_key>
13
+ And the unique should be <unique>
14
+ And the autoincrement should be <autoincrement>
15
+ And the allow_null should be <allow_null>
16
+ Examples:
17
+ | column_definition | name | data_type | primary_key | unique | autoincrement | allow_null | default | charset | collate |
18
+ | "foo" INTEGER | foo | INTEGER | false | false | false | true | nil | nil | nil |
19
+ | "foo" NUMERIC(5,2) UNIQUE | foo | NUMERIC(5,2) | false | true | false | true | nil | nil | nil |
20
+ | "foo" CHARACTER VARYING(255) UNIQUE | foo | CHARACTER VARYING(255) | false | true | false | true | nil | nil | nil |
21
+ | "foo" INTEGER PRIMARY KEY AUTO_INCREMENT | foo | INTEGER | true | true | true | false | nil | nil | nil |
22
+ | "foo" INTEGER PRIMARY KEY AUTOINCREMENT | foo | INTEGER | true | true | true | false | nil | nil | nil |
23
+ | "foo" CHARACTER VARYING(255) PRIMARY KEY | foo | CHARACTER VARYING(255) | true | true | false | false | | nil | nil |
24
+ | "foo" AUTO AUTO AUTOINCREMEN | foo | AUTO AUTO AUTOINCREMEN | false | false | false | true | nil | nil | nil |
25
+ | "foo" UN UNI UNIQ UNIQU UNIQU UNIQUE | foo | UN UNI UNIQ UNIQU UNIQU | false | true | false | true | nil | nil | nil |
26
+ | "foo" INTEGER NULL | foo | INTEGER | false | false | false | true | nil | nil | nil |
27
+ | "foo" INTEGER NOT NULL | foo | INTEGER | false | false | false | false | nil | nil | nil |
28
+ | "foo" INTEGER UNIQUE AUTOINCREMENT | foo | INTEGER | false | true | true | true | nil | nil | nil |
29
+ | "foo" SERIAL | foo | INTEGER | false | false | true | true | nil | nil | nil |
30
+ | "foo" SERIAL PRIMARY KEY | foo | INTEGER | true | true | true | false | nil | nil | nil |
31
+ | "foo" INTEGER UNIQUE GAR | foo | INTEGER | false | true | false | true | nil | nil | nil |
32
+ | "foo" INTEGER DEFAULT 4 | foo | INTEGER | false | false | false | true | "4" | nil | nil |
33
+ | "foo" INTEGER DEFAULT 44 | foo | INTEGER | false | false | false | true | "44" | nil | nil |
34
+ | "foo" INTEGER DEFAULT '4' | foo | INTEGER | false | false | false | true | "4" | nil | nil |
35
+ | "foo" INTEGER DEFAULT '44' | foo | INTEGER | false | false | false | true | "44" | nil | nil |
36
+ | "foo" CHARACTER VARYING(255) DEFAULT a | foo | CHARACTER VARYING(255) | false | false | false | true | a | nil | nil |
37
+ | "foo" CHARACTER VARYING(255) DEFAULT a('b') | foo | CHARACTER VARYING(255) | false | false | false | true | a('b') | nil | nil |
38
+ | "foo" CHARACTER VARYING(255) DEFAULT a('b c') | foo | CHARACTER VARYING(255) | false | false | false | true | a('b c') | nil | nil |
39
+ | "foo" CHARACTER VARYING(255) DEFAULT ' z x y ' | foo | CHARACTER VARYING(255) | false | false | false | true | " z x y " | nil | nil |
40
+ | "foo" CHARACTER VARYING(255) DEFAULT ' z ''x ''y' | foo | CHARACTER VARYING(255) | false | false | false | true | " z 'x 'y" | nil | nil |
41
+ | "foo" CHARACTER VARYING(255) DEFAULT ' z ''x ''y ' | foo | CHARACTER VARYING(255) | false | false | false | true | " z 'x 'y " | nil | nil |
42
+ | "foo" CHARACTER VARYING(255) DEFAULT " z x y " | foo | CHARACTER VARYING(255) | false | false | false | true | " z x y " | nil | nil |
43
+ | "foo" CHARACTER VARYING(255) DEFAULT " z ''x ''y" | foo | CHARACTER VARYING(255) | false | false | false | true | " z 'x 'y" | nil | nil |
44
+ | "foo" CHARACTER VARYING(255) DEFAULT " z ''x ''y " | foo | CHARACTER VARYING(255) | false | false | false | true | " z 'x 'y " | nil | nil |
45
+ | "foo" CHARACTER VARYING(255) DEFAULT ' z \\\'x \\\'y' | foo | CHARACTER VARYING(255) | false | false | false | true | " z 'x 'y" | nil | nil |
46
+ | "foo" CHARACTER VARYING(255) DEFAULT ' z \\\'x \\\'y ' | foo | CHARACTER VARYING(255) | false | false | false | true | " z 'x 'y " | nil | nil |
47
+ | "foo" CHARACTER VARYING(255) DEFAULT " z x y " | foo | CHARACTER VARYING(255) | false | false | false | true | " z x y " | nil | nil |
48
+ | "foo" CHARACTER VARYING(255) DEFAULT " z \\\"x \\\'y" | foo | CHARACTER VARYING(255) | false | false | false | true | " z "x 'y" | nil | nil |
49
+ | "foo" CHARACTER VARYING(255) DEFAULT " z \\\'x \\\"y " | foo | CHARACTER VARYING(255) | false | false | false | true | " z 'x "y " | nil | nil |
50
+ | "foo" INTEGER DEFAULT NULL | foo | INTEGER | false | false | false | true | NULL | nil | nil |
51
+ | "foo" INTEGER DEFAULT '4' AUTOINCREMENT | foo | INTEGER | false | false | true | true | "4" | nil | nil |
52
+ | "foo" INTEGER DEFAULT 4 AUTOINCREMENT | foo | INTEGER | false | false | true | true | "4" | nil | nil |
53
+ | "foo" INTEGER DEFAULT NULL AUTOINCREMENT | foo | INTEGER | false | false | true | true | NULL | nil | nil |
54
+ | "foo" INTEGER NULL DEFAULT NULL AUTOINCREMENT | foo | INTEGER | false | false | true | true | NULL | nil | nil |
55
+ | "foo" INTEGER NOT NULL DEFAULT NULL AUTOINCREMENT | foo | INTEGER | false | false | true | false | NULL | nil | nil |
56
+ | "foo" INTEGER COLLATE utf8_bin | foo | INTEGER | false | false | false | true | nil | nil | utf8_bin |
57
+ | "foo" INTEGER CHARACTER SET iso_8859-1 | foo | INTEGER | false | false | false | true | nil | iso_8859-1 | nil |
58
+ | "foo" INTEGER CHARSET iso_8859-1 | foo | INTEGER | false | false | false | true | nil | iso_8859-1 | nil |
59
+ | "foo" INTEGER CHARACTER SET iso_8859-1 COLLATE utf8_bin | foo | INTEGER | false | false | false | true | nil | iso_8859-1 | utf8_bin |
60
+ | "foo" INTEGER CHARSET iso_8859-1 COLLATE utf8_bin | foo | INTEGER | false | false | false | true | nil | iso_8859-1 | utf8_bin |
61
+ | "foo" INTEGER CHARACTER SET iso_8859-1 | foo | INTEGER | false | false | false | true | nil | iso_8859-1 | nil |
62
+ | "foo" INTEGER CHARACTER SET iso_8859-1 COLLATE utf8_bin | foo | INTEGER | false | false | false | true | nil | iso_8859-1 | utf8_bin |
63
+ | "foo" VARCHAR(123) | foo | CHARACTER VARYING(123) | false | false | false | true | nil | nil | nil |
64
+ | "foo" TINYINT(1) | foo | BOOLEAN | false | false | false | true | nil | nil | nil |
65
+ | "foo" INT(11) | foo | INTEGER | false | false | false | true | nil | nil | nil |
66
+ | "foo" SERIAL | foo | INTEGER | false | false | true | true | nil | nil | nil |
67
+ | "foo" SERIAL UNIQUE | foo | INTEGER | false | true | true | true | nil | nil | nil |
68
+ | "foo" SERIAL PRIMARY KEY | foo | INTEGER | true | true | true | false | nil | nil | nil |
69
+ | "foo" integer NOT NULL DEFAULT nextval('foo_seq') | foo | INTEGER | false | false | true | false | nextval('foo_seq') | nil | nil |
70
+ | "foo" INT IDENTITY(1,1) | foo | INTEGER | true | true | true | false | nil | nil | nil |
71
+
72
+ # | column_definition | name | data_type | primary_key | unique | autoincrement | allow_null | default | charset | collate |
73
+
74
+ #-------------------------------------------
75
+
76
+ Scenario Outline: parsing indexes
77
+ Given index definition <index_definition>
78
+ Then the name should be <name>
79
+ And the column_names should be <column_names>
80
+ And the unique should be false
81
+ Examples:
82
+ | index_definition | name | column_names |
83
+ | ( `column1` ) | nil | column1 |
84
+ | ( `column1`, "column2" ) | nil | column1, column2 |
85
+ | "index_table1_on_column1" ( `column1` ) | index_table1_on_column1 | column1 |
86
+ | "index_table1_on_column1_and_column2" ( `column1`, "column2" ) | index_table1_on_column1_and_column2 | column1, column2 |
87
+
88
+ #-------------------------------------------
89
+
90
+ Scenario Outline: parsing uniques
91
+ Given unique definition <unique_definition>
92
+ Then the name should be <name>
93
+ And the column_names should be <column_names>
94
+ And the unique should be true
95
+ Examples:
96
+ | unique_definition | name | column_names |
97
+ | ( `column1` ) | nil | column1 |
98
+ | ( `column1`, "column2" ) | nil | column1, column2 |
99
+ | "uindex_table1_on_column1" ( `column1` ) | uindex_table1_on_column1 | column1 |
100
+ | "uindex_table1_on_column1_and_column2" ( `column1`, "column2" ) | uindex_table1_on_column1_and_column2 | column1, column2 |
101
+
102
+ #-------------------------------------------
103
+
104
+ Scenario Outline: Auto-increment in the PostgreSQL style
105
+ Given CREATE TABLE sql
106
+ """
107
+ CREATE TABLE cats (
108
+ id SERIAL PRIMARY KEY,
109
+ nickname CHARACTER VARYING(255),
110
+ birthday DATE NOT NULL DEFAULT '2010-01-05',
111
+ license_id INTEGER UNIQUE,
112
+ price NUMERIC(5,2) DEFAULT '15.05',
113
+ INDEX idx_p (price)
114
+ )
115
+ """
116
+ Then column <column_name> name should be <column_name>
117
+ And column <column_name> data_type should be <data_type>
118
+ And column <column_name> primary_key should be <primary_key>
119
+ And column <column_name> indexed should be <indexed>
120
+ And column <column_name> unique should be <unique>
121
+ And column <column_name> autoincrement should be <autoincrement>
122
+ And column <column_name> allow_null should be <allow_null>
123
+ And column <column_name> default should be <default>
124
+ Examples:
125
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
126
+ | id | INTEGER | true | true | true | true | false | nil |
127
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
128
+ | birthday | DATE | false | false | false | false | false | 2010-01-05 |
129
+ | license_id | INTEGER | false | true | true | false | true | nil |
130
+ | price | NUMERIC(5,2) | false | true | false | false | true | 15.05 |
131
+
132
+ Scenario Outline: Auto-incrementing primary key defined inline (0)
133
+ Given CREATE TABLE sql
134
+ """
135
+ CREATE TABLE cats (
136
+ id SERIAL PRIMARY KEY,
137
+ nickname CHARACTER VARYING(255),
138
+ birthday DATE,
139
+ license_id INTEGER,
140
+ price NUMERIC(5,2)
141
+ )
142
+ """
143
+ Then column <column_name> name should be <column_name>
144
+ And column <column_name> data_type should be <data_type>
145
+ And column <column_name> primary_key should be <primary_key>
146
+ And column <column_name> indexed should be <indexed>
147
+ And column <column_name> unique should be <unique>
148
+ And column <column_name> autoincrement should be <autoincrement>
149
+ And column <column_name> allow_null should be <allow_null>
150
+ And column <column_name> default should be <default>
151
+ Examples:
152
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
153
+ | id | INTEGER | true | true | true | true | false | nil |
154
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
155
+ | birthday | DATE | false | false | false | false | true | nil |
156
+ | license_id | INTEGER | false | false | false | false | true | nil |
157
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
158
+
159
+
160
+ Scenario Outline: Auto-incrementing primary key defined inline (1)
161
+ Given CREATE TABLE sql
162
+ """
163
+ CREATE TABLE cats (
164
+ id SERIAL,
165
+ nickname CHARACTER VARYING(255),
166
+ birthday DATE,
167
+ license_id INTEGER,
168
+ price NUMERIC(5,2),
169
+ PRIMARY KEY ("id")
170
+ )
171
+ """
172
+ Then column <column_name> name should be <column_name>
173
+ And column <column_name> data_type should be <data_type>
174
+ And column <column_name> primary_key should be <primary_key>
175
+ And column <column_name> indexed should be <indexed>
176
+ And column <column_name> unique should be <unique>
177
+ And column <column_name> autoincrement should be <autoincrement>
178
+ And column <column_name> allow_null should be <allow_null>
179
+ And column <column_name> default should be <default>
180
+ Examples:
181
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
182
+ | id | INTEGER | true | true | true | true | false | nil |
183
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
184
+ | birthday | DATE | false | false | false | false | true | nil |
185
+ | license_id | INTEGER | false | false | false | false | true | nil |
186
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
187
+
188
+
189
+ Scenario Outline: Auto-incrementing primary key defined inline (2)
190
+ Given CREATE TABLE sql
191
+ """
192
+ CREATE TABLE cats (
193
+ id INTEGER PRIMARY KEY AUTO_INCREMENT,
194
+ nickname CHARACTER VARYING(255),
195
+ birthday DATE,
196
+ license_id INTEGER,
197
+ price NUMERIC(5,2)
198
+ )
199
+ """
200
+ Then column <column_name> name should be <column_name>
201
+ And column <column_name> data_type should be <data_type>
202
+ And column <column_name> primary_key should be <primary_key>
203
+ And column <column_name> indexed should be <indexed>
204
+ And column <column_name> unique should be <unique>
205
+ And column <column_name> autoincrement should be <autoincrement>
206
+ And column <column_name> allow_null should be <allow_null>
207
+ And column <column_name> default should be <default>
208
+ Examples:
209
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
210
+ | id | INTEGER | true | true | true | true | false | nil |
211
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
212
+ | birthday | DATE | false | false | false | false | true | nil |
213
+ | license_id | INTEGER | false | false | false | false | true | nil |
214
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
215
+
216
+
217
+ Scenario Outline: Auto-incrementing primary key defined inline (3)
218
+ Given CREATE TABLE sql
219
+ """
220
+ CREATE TABLE cats (
221
+ id INTEGER AUTO_INCREMENT,
222
+ nickname CHARACTER VARYING(255),
223
+ birthday DATE,
224
+ license_id INTEGER,
225
+ price NUMERIC(5,2),
226
+ PRIMARY KEY ("id")
227
+ )
228
+ """
229
+ Then column <column_name> name should be <column_name>
230
+ And column <column_name> data_type should be <data_type>
231
+ And column <column_name> primary_key should be <primary_key>
232
+ And column <column_name> indexed should be <indexed>
233
+ And column <column_name> unique should be <unique>
234
+ And column <column_name> autoincrement should be <autoincrement>
235
+ And column <column_name> allow_null should be <allow_null>
236
+ And column <column_name> default should be <default>
237
+ Examples:
238
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
239
+ | id | INTEGER | true | true | true | true | false | nil |
240
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
241
+ | birthday | DATE | false | false | false | false | true | nil |
242
+ | license_id | INTEGER | false | false | false | false | true | nil |
243
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
244
+
245
+
246
+ Scenario Outline: Auto-incrementing primary key defined inline (4)
247
+ Given CREATE TABLE sql
248
+ """
249
+ CREATE TABLE cats (
250
+ id INTEGER AUTO_INCREMENT,
251
+ nickname CHARACTER VARYING(255),
252
+ birthday DATE,
253
+ license_id INTEGER,
254
+ price NUMERIC(5,2),
255
+ CONSTRAINT PRIMARY KEY ("id")
256
+ )
257
+ """
258
+ Then the column_count should be 5
259
+ And column <column_name> name should be <column_name>
260
+ And column <column_name> data_type should be <data_type>
261
+ And column <column_name> primary_key should be <primary_key>
262
+ And column <column_name> indexed should be <indexed>
263
+ And column <column_name> unique should be <unique>
264
+ And column <column_name> autoincrement should be <autoincrement>
265
+ And column <column_name> allow_null should be <allow_null>
266
+ And column <column_name> default should be <default>
267
+ Examples:
268
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
269
+ | id | INTEGER | true | true | true | true | false | nil |
270
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
271
+ | birthday | DATE | false | false | false | false | true | nil |
272
+ | license_id | INTEGER | false | false | false | false | true | nil |
273
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
274
+
275
+
276
+ Scenario Outline: Auto-incrementing primary key defined inline (5)
277
+ Given CREATE TABLE sql
278
+ """
279
+ CREATE TABLE cats (
280
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
281
+ nickname CHARACTER VARYING(255),
282
+ birthday DATE,
283
+ license_id INTEGER,
284
+ price NUMERIC(5,2)
285
+ )
286
+ """
287
+ Then column <column_name> name should be <column_name>
288
+ And column <column_name> data_type should be <data_type>
289
+ And column <column_name> primary_key should be <primary_key>
290
+ And column <column_name> indexed should be <indexed>
291
+ And column <column_name> unique should be <unique>
292
+ And column <column_name> autoincrement should be <autoincrement>
293
+ And column <column_name> allow_null should be <allow_null>
294
+ And column <column_name> default should be <default>
295
+ Examples:
296
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
297
+ | id | INTEGER | true | true | true | true | false | nil |
298
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
299
+ | birthday | DATE | false | false | false | false | true | nil |
300
+ | license_id | INTEGER | false | false | false | false | true | nil |
301
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
302
+
303
+
304
+ Scenario Outline: Auto-incrementing primary key defined inline (6)
305
+ Given CREATE TABLE sql
306
+ """
307
+ CREATE TABLE cats (
308
+ id INTEGER AUTOINCREMENT,
309
+ nickname CHARACTER VARYING(255),
310
+ birthday DATE,
311
+ license_id INTEGER,
312
+ price NUMERIC(5,2),
313
+ PRIMARY KEY ("id")
314
+ )
315
+ """
316
+ Then column <column_name> name should be <column_name>
317
+ And column <column_name> data_type should be <data_type>
318
+ And column <column_name> primary_key should be <primary_key>
319
+ And column <column_name> indexed should be <indexed>
320
+ And column <column_name> unique should be <unique>
321
+ And column <column_name> autoincrement should be <autoincrement>
322
+ And column <column_name> allow_null should be <allow_null>
323
+ And column <column_name> default should be <default>
324
+ Examples:
325
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
326
+ | id | INTEGER | true | true | true | true | false | nil |
327
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
328
+ | birthday | DATE | false | false | false | false | true | nil |
329
+ | license_id | INTEGER | false | false | false | false | true | nil |
330
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
331
+
332
+
333
+ Scenario Outline: MySQL-style backticks with TEMPORARY (0)
334
+ Given CREATE TABLE sql
335
+ """
336
+ CREATE TEMPORARY TABLE `cats` (
337
+ `nickname` CHARACTER VARYING(255),
338
+ `birthday` DATE,
339
+ `license_id` INTEGER,
340
+ `price` NUMERIC(5,2)
341
+ )
342
+ """
343
+ Then the temporary should be true
344
+ And column <column_name> name should be <column_name>
345
+ And column <column_name> data_type should be <data_type>
346
+ And column <column_name> primary_key should be <primary_key>
347
+ And column <column_name> indexed should be <indexed>
348
+ And column <column_name> unique should be <unique>
349
+ And column <column_name> autoincrement should be <autoincrement>
350
+ And column <column_name> allow_null should be <allow_null>
351
+ And column <column_name> default should be <default>
352
+ Examples:
353
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
354
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
355
+ | birthday | DATE | false | false | false | false | true | nil |
356
+ | license_id | INTEGER | false | false | false | false | true | nil |
357
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
358
+
359
+
360
+ Scenario Outline: MySQL-style backticks (0)
361
+ Given CREATE TABLE sql
362
+ """
363
+ CREATE TABLE `cats` (
364
+ `nickname` CHARACTER VARYING(255),
365
+ `birthday` DATE,
366
+ `license_id` INTEGER,
367
+ `price` NUMERIC(5,2)
368
+ )
369
+ """
370
+ Then column <column_name> name should be <column_name>
371
+ And column <column_name> data_type should be <data_type>
372
+ And column <column_name> primary_key should be <primary_key>
373
+ And column <column_name> indexed should be <indexed>
374
+ And column <column_name> unique should be <unique>
375
+ And column <column_name> autoincrement should be <autoincrement>
376
+ And column <column_name> allow_null should be <allow_null>
377
+ And column <column_name> default should be <default>
378
+ Examples:
379
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
380
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
381
+ | birthday | DATE | false | false | false | false | true | nil |
382
+ | license_id | INTEGER | false | false | false | false | true | nil |
383
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
384
+
385
+
386
+ Scenario Outline: Comments with "/* */", including multiline (0)
387
+ Given CREATE TABLE sql
388
+ """
389
+ /* b o yah */CREATE TABLE cats (/* daom */
390
+ nickname /*yah
391
+ see
392
+ i didn't
393
+ think
394
+ so*/ CHARACTER VARYING(255), /*this is a great nickname*/
395
+ birthday /* did you notice this? */ DATE,
396
+ license_id INTEGER, /* oh yah that's cool too */
397
+ /* oh yah that's hilarious */ price NUMERIC(5,2)
398
+ )/* gosh
399
+ when
400
+ will
401
+ it
402
+ end
403
+ */
404
+ """
405
+ Then column <column_name> name should be <column_name>
406
+ And column <column_name> data_type should be <data_type>
407
+ And column <column_name> primary_key should be <primary_key>
408
+ And column <column_name> indexed should be <indexed>
409
+ And column <column_name> unique should be <unique>
410
+ And column <column_name> autoincrement should be <autoincrement>
411
+ And column <column_name> allow_null should be <allow_null>
412
+ And column <column_name> default should be <default>
413
+ Examples:
414
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
415
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
416
+ | birthday | DATE | false | false | false | false | true | nil |
417
+ | license_id | INTEGER | false | false | false | false | true | nil |
418
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
419
+
420
+
421
+ Scenario Outline: Double-quoted (0)
422
+ Given CREATE TABLE sql
423
+ """
424
+ CREATE TABLE "cats" (
425
+ "nickname" CHARACTER VARYING(255),
426
+ "birthday" DATE,
427
+ "license_id" INTEGER,
428
+ "price" NUMERIC(5,2)
429
+ )
430
+ """
431
+ Then column <column_name> name should be <column_name>
432
+ And column <column_name> data_type should be <data_type>
433
+ And column <column_name> primary_key should be <primary_key>
434
+ And column <column_name> indexed should be <indexed>
435
+ And column <column_name> unique should be <unique>
436
+ And column <column_name> autoincrement should be <autoincrement>
437
+ And column <column_name> allow_null should be <allow_null>
438
+ And column <column_name> default should be <default>
439
+ Examples:
440
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
441
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
442
+ | birthday | DATE | false | false | false | false | true | nil |
443
+ | license_id | INTEGER | false | false | false | false | true | nil |
444
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
445
+
446
+
447
+ Scenario Outline: Index defined in the "table constraints" section (0)
448
+ Given CREATE TABLE sql
449
+ """
450
+ CREATE TABLE cats (
451
+ nickname CHARACTER VARYING(255),
452
+ birthday DATE,
453
+ license_id INTEGER,
454
+ price NUMERIC(5,2),
455
+ KEY index_cats_on_nickname (nickname)
456
+ )
457
+ """
458
+ Then column <column_name> name should be <column_name>
459
+ And column <column_name> data_type should be <data_type>
460
+ And column <column_name> primary_key should be <primary_key>
461
+ And column <column_name> indexed should be <indexed>
462
+ And column <column_name> unique should be <unique>
463
+ And column <column_name> autoincrement should be <autoincrement>
464
+ And column <column_name> allow_null should be <allow_null>
465
+ And column <column_name> default should be <default>
466
+ Examples:
467
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
468
+ | nickname | CHARACTER VARYING(255) | false | true | false | false | true | nil |
469
+ | birthday | DATE | false | false | false | false | true | nil |
470
+ | license_id | INTEGER | false | false | false | false | true | nil |
471
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
472
+
473
+
474
+ Scenario Outline: Index defined in the "table constraints" section (1)
475
+ Given CREATE TABLE sql
476
+ """
477
+ CREATE TABLE cats (
478
+ nickname CHARACTER VARYING(255),
479
+ birthday DATE,
480
+ license_id INTEGER,
481
+ price NUMERIC(5,2),
482
+ INDEX index_cats_on_nickname (nickname)
483
+ )
484
+ """
485
+ Then column <column_name> name should be <column_name>
486
+ And column <column_name> data_type should be <data_type>
487
+ And column <column_name> primary_key should be <primary_key>
488
+ And column <column_name> indexed should be <indexed>
489
+ And column <column_name> unique should be <unique>
490
+ And column <column_name> autoincrement should be <autoincrement>
491
+ And column <column_name> allow_null should be <allow_null>
492
+ And column <column_name> default should be <default>
493
+ Examples:
494
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
495
+ | nickname | CHARACTER VARYING(255) | false | true | false | false | true | nil |
496
+ | birthday | DATE | false | false | false | false | true | nil |
497
+ | license_id | INTEGER | false | false | false | false | true | nil |
498
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
499
+
500
+
501
+ Scenario Outline: Named unique indexes (0)
502
+ Given CREATE TABLE sql
503
+ """
504
+ CREATE TABLE cats (
505
+ nickname CHARACTER VARYING(255),
506
+ birthday DATE,
507
+ license_id INTEGER,
508
+ price NUMERIC(5,2),
509
+ UNIQUE KEY uindex_cats_on_nickname (nickname)
510
+ )
511
+ """
512
+ Then column <column_name> name should be <column_name>
513
+ And column <column_name> data_type should be <data_type>
514
+ And column <column_name> primary_key should be <primary_key>
515
+ And column <column_name> indexed should be <indexed>
516
+ And column <column_name> unique should be <unique>
517
+ And column <column_name> autoincrement should be <autoincrement>
518
+ And column <column_name> allow_null should be <allow_null>
519
+ And column <column_name> default should be <default>
520
+ Examples:
521
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
522
+ | nickname | CHARACTER VARYING(255) | false | true | true | false | true | nil |
523
+ | birthday | DATE | false | false | false | false | true | nil |
524
+ | license_id | INTEGER | false | false | false | false | true | nil |
525
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
526
+
527
+
528
+ Scenario Outline: Named unique indexes (1)
529
+ Given CREATE TABLE sql
530
+ """
531
+ CREATE TABLE cats (
532
+ nickname CHARACTER VARYING(255),
533
+ birthday DATE,
534
+ license_id INTEGER,
535
+ price NUMERIC(5,2),
536
+ UNIQUE INDEX uindex_cats_on_nickname (nickname)
537
+ )
538
+ """
539
+ Then column <column_name> name should be <column_name>
540
+ And column <column_name> data_type should be <data_type>
541
+ And column <column_name> primary_key should be <primary_key>
542
+ And column <column_name> indexed should be <indexed>
543
+ And column <column_name> unique should be <unique>
544
+ And column <column_name> autoincrement should be <autoincrement>
545
+ And column <column_name> allow_null should be <allow_null>
546
+ And column <column_name> default should be <default>
547
+ Examples:
548
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
549
+ | nickname | CHARACTER VARYING(255) | false | true | true | false | true | nil |
550
+ | birthday | DATE | false | false | false | false | true | nil |
551
+ | license_id | INTEGER | false | false | false | false | true | nil |
552
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
553
+
554
+
555
+ Scenario Outline: Reserved words in table and column names (0)
556
+ Given CREATE TABLE sql
557
+ """
558
+ CREATE TABLE "where" (
559
+ nickname CHARACTER VARYING(255),
560
+ "false" CHARACTER VARYING(255),
561
+ "else" NUMERIC(5,2)
562
+ )
563
+ """
564
+ Then column <column_name> name should be <column_name>
565
+ And column <column_name> data_type should be <data_type>
566
+ And column <column_name> primary_key should be <primary_key>
567
+ And column <column_name> indexed should be <indexed>
568
+ And column <column_name> unique should be <unique>
569
+ And column <column_name> autoincrement should be <autoincrement>
570
+ And column <column_name> allow_null should be <allow_null>
571
+ And column <column_name> default should be <default>
572
+ Examples:
573
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
574
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
575
+ | "false" | CHARACTER VARYING(255) | false | false | false | false | true | nil |
576
+ | else | NUMERIC(5,2) | false | false | false | false | true | nil |
577
+
578
+
579
+ Scenario Outline: String primary key (0)
580
+ Given CREATE TABLE sql
581
+ """
582
+ CREATE TABLE cats (
583
+ nickname CHARACTER VARYING(255) PRIMARY KEY,
584
+ birthday DATE,
585
+ license_id INTEGER,
586
+ price NUMERIC(5,2)
587
+ )
588
+ """
589
+ Then column <column_name> name should be <column_name>
590
+ And column <column_name> data_type should be <data_type>
591
+ And column <column_name> primary_key should be <primary_key>
592
+ And column <column_name> indexed should be <indexed>
593
+ And column <column_name> unique should be <unique>
594
+ And column <column_name> autoincrement should be <autoincrement>
595
+ And column <column_name> allow_null should be <allow_null>
596
+ And column <column_name> default should be <default>
597
+ Examples:
598
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
599
+ | nickname | CHARACTER VARYING(255) | true | true | true | false | false | "" |
600
+ | birthday | DATE | false | false | false | false | true | nil |
601
+ | license_id | INTEGER | false | false | false | false | true | nil |
602
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
603
+
604
+
605
+ Scenario Outline: String primary key (1)
606
+ Given CREATE TABLE sql
607
+ """
608
+ CREATE TABLE cats (
609
+ nickname CHARACTER VARYING(255),
610
+ birthday DATE,
611
+ license_id INTEGER,
612
+ price NUMERIC(5,2),
613
+ PRIMARY KEY (nickname)
614
+ )
615
+ """
616
+ Then column <column_name> name should be <column_name>
617
+ And column <column_name> data_type should be <data_type>
618
+ And column <column_name> primary_key should be <primary_key>
619
+ And column <column_name> indexed should be <indexed>
620
+ And column <column_name> unique should be <unique>
621
+ And column <column_name> autoincrement should be <autoincrement>
622
+ And column <column_name> allow_null should be <allow_null>
623
+ And column <column_name> default should be <default>
624
+ Examples:
625
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
626
+ | nickname | CHARACTER VARYING(255) | true | true | true | false | false | "" |
627
+ | birthday | DATE | false | false | false | false | true | nil |
628
+ | license_id | INTEGER | false | false | false | false | true | nil |
629
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
630
+
631
+
632
+ Scenario Outline: Uniques (0)
633
+ Given CREATE TABLE sql
634
+ """
635
+ CREATE TABLE cats (
636
+ nickname CHARACTER VARYING(255) UNIQUE,
637
+ birthday DATE,
638
+ license_id INTEGER,
639
+ price NUMERIC(5,2)
640
+ )
641
+ """
642
+ Then column <column_name> name should be <column_name>
643
+ And column <column_name> data_type should be <data_type>
644
+ And column <column_name> primary_key should be <primary_key>
645
+ And column <column_name> indexed should be <indexed>
646
+ And column <column_name> unique should be <unique>
647
+ And column <column_name> autoincrement should be <autoincrement>
648
+ And column <column_name> allow_null should be <allow_null>
649
+ And column <column_name> default should be <default>
650
+ Examples:
651
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
652
+ | nickname | CHARACTER VARYING(255) | false | true | true | false | true | nil |
653
+ | birthday | DATE | false | false | false | false | true | nil |
654
+ | license_id | INTEGER | false | false | false | false | true | nil |
655
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
656
+
657
+
658
+ Scenario Outline: Uniques (1)
659
+ Given CREATE TABLE sql
660
+ """
661
+ CREATE TABLE cats (
662
+ nickname CHARACTER VARYING(255),
663
+ birthday DATE,
664
+ license_id INTEGER,
665
+ price NUMERIC(5,2),
666
+ UNIQUE (nickname)
667
+ )
668
+ """
669
+ Then column <column_name> name should be <column_name>
670
+ And column <column_name> data_type should be <data_type>
671
+ And column <column_name> primary_key should be <primary_key>
672
+ And column <column_name> indexed should be <indexed>
673
+ And column <column_name> unique should be <unique>
674
+ And column <column_name> autoincrement should be <autoincrement>
675
+ And column <column_name> allow_null should be <allow_null>
676
+ And column <column_name> default should be <default>
677
+ Examples:
678
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
679
+ | nickname | CHARACTER VARYING(255) | false | true | true | false | true | nil |
680
+ | birthday | DATE | false | false | false | false | true | nil |
681
+ | license_id | INTEGER | false | false | false | false | true | nil |
682
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
683
+
684
+
685
+ Scenario Outline: Uniques (2)
686
+ Given CREATE TABLE sql
687
+ """
688
+ CREATE TABLE cats (
689
+ nickname CHARACTER VARYING(255),
690
+ birthday DATE,
691
+ license_id INTEGER,
692
+ price NUMERIC(5,2),
693
+ CONSTRAINT UNIQUE (nickname)
694
+ )
695
+ """
696
+ Then column <column_name> name should be <column_name>
697
+ And column <column_name> data_type should be <data_type>
698
+ And column <column_name> primary_key should be <primary_key>
699
+ And column <column_name> indexed should be <indexed>
700
+ And column <column_name> unique should be <unique>
701
+ And column <column_name> autoincrement should be <autoincrement>
702
+ And column <column_name> allow_null should be <allow_null>
703
+ And column <column_name> default should be <default>
704
+ Examples:
705
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
706
+ | nickname | CHARACTER VARYING(255) | false | true | true | false | true | nil |
707
+ | birthday | DATE | false | false | false | false | true | nil |
708
+ | license_id | INTEGER | false | false | false | false | true | nil |
709
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
710
+
711
+
712
+ Scenario Outline: Unquoted (0)
713
+ Given CREATE TABLE sql
714
+ """
715
+ CREATE TABLE cats (
716
+ nickname CHARACTER VARYING(255),
717
+ birthday DATE,
718
+ license_id INTEGER,
719
+ price NUMERIC(5,2)
720
+ )
721
+ """
722
+ Then column <column_name> name should be <column_name>
723
+ And column <column_name> data_type should be <data_type>
724
+ And column <column_name> primary_key should be <primary_key>
725
+ And column <column_name> indexed should be <indexed>
726
+ And column <column_name> unique should be <unique>
727
+ And column <column_name> autoincrement should be <autoincrement>
728
+ And column <column_name> allow_null should be <allow_null>
729
+ And column <column_name> default should be <default>
730
+ Examples:
731
+ | column_name | data_type | primary_key | indexed | unique | autoincrement | allow_null | default |
732
+ | nickname | CHARACTER VARYING(255) | false | false | false | false | true | nil |
733
+ | birthday | DATE | false | false | false | false | true | nil |
734
+ | license_id | INTEGER | false | false | false | false | true | nil |
735
+ | price | NUMERIC(5,2) | false | false | false | false | true | nil |
736
+