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.
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
+