activerecord-sqlserver-adapter_new 4.2.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/CHANGELOG.md +212 -0
  4. data/CODE_OF_CONDUCT.md +31 -0
  5. data/Gemfile +61 -0
  6. data/Guardfile +29 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +201 -0
  9. data/RUNNING_UNIT_TESTS.md +121 -0
  10. data/Rakefile +48 -0
  11. data/VERSION +1 -0
  12. data/activerecord-sqlserver-adapter_new.gemspec +20 -0
  13. data/appveyor.yml +39 -0
  14. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +27 -0
  15. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +25 -0
  16. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +40 -0
  17. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +4 -0
  18. data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +34 -0
  19. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
  20. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +386 -0
  21. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +68 -0
  22. data/lib/active_record/connection_adapters/sqlserver/errors.rb +7 -0
  23. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +69 -0
  24. data/lib/active_record/connection_adapters/sqlserver/schema_cache.rb +114 -0
  25. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +52 -0
  26. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +473 -0
  27. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +66 -0
  28. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +66 -0
  29. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +22 -0
  30. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +76 -0
  31. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +57 -0
  32. data/lib/active_record/connection_adapters/sqlserver/type.rb +46 -0
  33. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +15 -0
  34. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +15 -0
  35. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +12 -0
  36. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +38 -0
  37. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +21 -0
  38. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +41 -0
  39. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +17 -0
  40. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +31 -0
  41. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +12 -0
  42. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +15 -0
  43. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +12 -0
  44. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +21 -0
  45. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +15 -0
  46. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +13 -0
  47. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +21 -0
  48. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +22 -0
  49. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +12 -0
  50. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +15 -0
  51. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +40 -0
  52. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +76 -0
  53. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +15 -0
  54. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +22 -0
  55. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +15 -0
  56. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +12 -0
  57. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +15 -0
  58. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +20 -0
  59. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +20 -0
  60. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +23 -0
  61. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +20 -0
  62. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +20 -0
  63. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +20 -0
  64. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +20 -0
  65. data/lib/active_record/connection_adapters/sqlserver/utils.rb +136 -0
  66. data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
  67. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +405 -0
  68. data/lib/active_record/connection_adapters/sqlserver_column.rb +53 -0
  69. data/lib/active_record/sqlserver_base.rb +20 -0
  70. data/lib/active_record/tasks/sqlserver_database_tasks.rb +131 -0
  71. data/lib/activerecord-sqlserver-adapter.rb +1 -0
  72. data/lib/arel/visitors/sqlserver.rb +214 -0
  73. data/lib/arel_sqlserver.rb +3 -0
  74. data/test/appveyor/dbsetup.ps1 +27 -0
  75. data/test/appveyor/dbsetup.sql +11 -0
  76. data/test/cases/adapter_test_sqlserver.rb +444 -0
  77. data/test/cases/coerced_tests.rb +713 -0
  78. data/test/cases/column_test_sqlserver.rb +780 -0
  79. data/test/cases/connection_test_sqlserver.rb +142 -0
  80. data/test/cases/execute_procedure_test_sqlserver.rb +44 -0
  81. data/test/cases/fetch_test_sqlserver.rb +57 -0
  82. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +76 -0
  83. data/test/cases/helper_sqlserver.rb +54 -0
  84. data/test/cases/migration_test_sqlserver.rb +61 -0
  85. data/test/cases/order_test_sqlserver.rb +147 -0
  86. data/test/cases/pessimistic_locking_test_sqlserver.rb +90 -0
  87. data/test/cases/rake_test_sqlserver.rb +163 -0
  88. data/test/cases/schema_dumper_test_sqlserver.rb +198 -0
  89. data/test/cases/schema_test_sqlserver.rb +54 -0
  90. data/test/cases/scratchpad_test_sqlserver.rb +9 -0
  91. data/test/cases/showplan_test_sqlserver.rb +65 -0
  92. data/test/cases/specific_schema_test_sqlserver.rb +167 -0
  93. data/test/cases/transaction_test_sqlserver.rb +66 -0
  94. data/test/cases/utils_test_sqlserver.rb +129 -0
  95. data/test/cases/uuid_test_sqlserver.rb +48 -0
  96. data/test/config.yml +41 -0
  97. data/test/debug.rb +14 -0
  98. data/test/fixtures/1px.gif +0 -0
  99. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
  100. data/test/models/sqlserver/booking.rb +3 -0
  101. data/test/models/sqlserver/customers_view.rb +3 -0
  102. data/test/models/sqlserver/datatype.rb +3 -0
  103. data/test/models/sqlserver/datatype_migration.rb +3 -0
  104. data/test/models/sqlserver/dollar_table_name.rb +3 -0
  105. data/test/models/sqlserver/dot_table_name.rb +3 -0
  106. data/test/models/sqlserver/edge_schema.rb +13 -0
  107. data/test/models/sqlserver/fk_has_fk.rb +3 -0
  108. data/test/models/sqlserver/fk_has_pk.rb +3 -0
  109. data/test/models/sqlserver/natural_pk_data.rb +4 -0
  110. data/test/models/sqlserver/natural_pk_int_data.rb +3 -0
  111. data/test/models/sqlserver/no_pk_data.rb +3 -0
  112. data/test/models/sqlserver/object_default.rb +3 -0
  113. data/test/models/sqlserver/quoted_table.rb +7 -0
  114. data/test/models/sqlserver/quoted_view_1.rb +3 -0
  115. data/test/models/sqlserver/quoted_view_2.rb +3 -0
  116. data/test/models/sqlserver/string_default.rb +3 -0
  117. data/test/models/sqlserver/string_defaults_big_view.rb +3 -0
  118. data/test/models/sqlserver/string_defaults_view.rb +3 -0
  119. data/test/models/sqlserver/tinyint_pk.rb +3 -0
  120. data/test/models/sqlserver/upper.rb +3 -0
  121. data/test/models/sqlserver/uppered.rb +3 -0
  122. data/test/models/sqlserver/uuid.rb +3 -0
  123. data/test/schema/datatypes/2012.sql +55 -0
  124. data/test/schema/sqlserver_specific_schema.rb +207 -0
  125. data/test/support/coerceable_test_sqlserver.rb +45 -0
  126. data/test/support/connection_reflection.rb +37 -0
  127. data/test/support/load_schema_sqlserver.rb +29 -0
  128. data/test/support/minitest_sqlserver.rb +1 -0
  129. data/test/support/paths_sqlserver.rb +50 -0
  130. data/test/support/rake_helpers.rb +41 -0
  131. data/test/support/sql_counter_sqlserver.rb +32 -0
  132. metadata +253 -0
@@ -0,0 +1,48 @@
1
+ # encoding: UTF-8
2
+ require 'cases/helper_sqlserver'
3
+
4
+ class SQLServerUuidTest < ActiveRecord::TestCase
5
+
6
+ let(:acceptable_uuid) { ActiveRecord::ConnectionAdapters::SQLServer::Type::Uuid::ACCEPTABLE_UUID }
7
+
8
+ it 'has a uuid primary key' do
9
+ SSTestUuid.columns_hash['id'].type.must_equal :uuid
10
+ assert SSTestUuid.primary_key
11
+ end
12
+
13
+ it 'can create with a new pk' do
14
+ # Type::Uuid::ACCEPTABLE_UUID
15
+ obj = SSTestUuid.create!
16
+ obj.id.must_be :present?
17
+ obj.id.must_match acceptable_uuid
18
+ end
19
+
20
+ it 'can create other uuid column on reload' do
21
+ obj = SSTestUuid.create!
22
+ obj.reload
23
+ obj.other_uuid.must_match acceptable_uuid
24
+ end
25
+
26
+ it 'can find uuid pk via connection' do
27
+ connection.primary_key(SSTestUuid.table_name).must_equal 'id'
28
+ end
29
+
30
+ it 'changing column default' do
31
+ table_name = SSTestUuid.table_name
32
+ connection.add_column table_name, :thingy, :uuid, null: false, default: "NEWSEQUENTIALID()"
33
+ SSTestUuid.reset_column_information
34
+ column = SSTestUuid.columns_hash['thingy']
35
+ column.default_function.must_equal "newsequentialid()"
36
+ # Now to a different function.
37
+ connection.change_column table_name, :thingy, :uuid, null: false, default: "NEWID()"
38
+ SSTestUuid.reset_column_information
39
+ column = SSTestUuid.columns_hash['thingy']
40
+ column.default_function.must_equal "newid()"
41
+ end
42
+
43
+ it 'can insert even when use_output_inserted to false ' do
44
+ obj = with_use_output_inserted_disabled { SSTestUuid.create!(name: "😢") }
45
+ obj.id.must_be :nil?
46
+ end
47
+
48
+ end
@@ -0,0 +1,41 @@
1
+ default_connection: dblib
2
+
3
+ default_connection_info: &default_connection_info
4
+ adapter: sqlserver
5
+ mode: <%= ENV['ARCONN'] || 'dblib' %>
6
+ host: <%= ENV['ACTIVERECORD_UNITTEST_HOST'] || 'localhost' %>
7
+ port: <%= ENV['ACTIVERECORD_UNITTEST_PORT'] %>
8
+ database: activerecord_unittest
9
+ username: <%= ENV['ACTIVERECORD_UNITTEST_USER'] || 'rails' %>
10
+ password: <%= ENV['ACTIVERECORD_UNITTEST_PASS'] || '' %>
11
+ collation: <%= ENV['ACTIVERECORD_UNITTEST_COLLATION'] || nil %>
12
+ encoding: utf8
13
+
14
+ connections:
15
+
16
+ dblib:
17
+ arunit:
18
+ <<: *default_connection_info
19
+ appname: SQLServerAdptrUnit
20
+ dataserver: <%= ENV['ACTIVERECORD_UNITTEST_DATASERVER'] %>
21
+ tds_version: <%= ENV['ACTIVERECORD_UNITTEST_TDSVERSION'] %>
22
+ azure: <%= !ENV['ACTIVERECORD_UNITTEST_AZURE'].nil? %>
23
+ timeout: <%= ENV['ACTIVERECORD_UNITTEST_AZURE'].present? ? 20 : nil %>
24
+ arunit2:
25
+ <<: *default_connection_info
26
+ database: activerecord_unittest2
27
+ appname: SQLServerAdptrUnit2
28
+ dataserver: <%= ENV['ACTIVERECORD_UNITTEST_DATASERVER'] %>
29
+ tds_version: <%= ENV['ACTIVERECORD_UNITTEST_TDSVERSION'] %>
30
+ azure: <%= !ENV['ACTIVERECORD_UNITTEST_AZURE'].nil? %>
31
+ timeout: <%= ENV['ACTIVERECORD_UNITTEST_AZURE'].present? ? 20 : nil %>
32
+
33
+ odbc:
34
+ arunit:
35
+ <<: *default_connection_info
36
+ dsn: <%= ENV['ACTIVERECORD_UNITTEST_DSN'] || 'activerecord_unittest' %>
37
+ arunit2:
38
+ <<: *default_connection_info
39
+ database: activerecord_unittest2
40
+ dsn: <%= ENV['ACTIVERECORD_UNITTEST2_DSN'] || 'activerecord_unittest2' %>
41
+
@@ -0,0 +1,14 @@
1
+ # require 'rails/all'
2
+ require 'tiny_tds'
3
+
4
+ c = TinyTds::Client.new(
5
+ host: ENV['CI_AZURE_HOST'],
6
+ username: 'rails',
7
+ password: ENV['CI_AZURE_PASS'],
8
+ database: 'activerecord_unittest',
9
+ azure: true,
10
+ tds_version: '7.3'
11
+ )
12
+
13
+ puts c.execute("SELECT 1 AS [one]").each
14
+ c.close
Binary file
@@ -0,0 +1,11 @@
1
+ class TableWillNeverBeCreated < ActiveRecord::Migration
2
+
3
+ def self.up
4
+ create_table(:sqlserver_trans_table1) { }
5
+ create_table(:sqlserver_trans_table2) { raise ActiveRecord::StatementInvalid }
6
+ end
7
+
8
+ def self.down
9
+ end
10
+
11
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestBooking < ActiveRecord::Base
2
+ self.table_name = 'sst_bookings'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestCustomersView < ActiveRecord::Base
2
+ self.table_name = 'sst_customers_view'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestDatatype < ActiveRecord::Base
2
+ self.table_name = :sst_datatypes
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestDatatypeMigration < ActiveRecord::Base
2
+ self.table_name = :sst_datatypes_migration
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestDollarTableName < ActiveRecord::Base
2
+ self.table_name = 'sst_my$strange_table'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestDotTableName < ActiveRecord::Base
2
+ self.table_name = '[dbo].[some.Name]'
3
+ end
@@ -0,0 +1,13 @@
1
+ class SSTestEdgeSchema < ActiveRecord::Base
2
+
3
+ self.table_name = 'sst_edge_schemas'
4
+
5
+ def with_spaces
6
+ read_attribute :'with spaces'
7
+ end
8
+
9
+ def with_spaces=(value)
10
+ write_attribute :'with spaces', value
11
+ end
12
+
13
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestHasFk < ActiveRecord::Base
2
+ self.table_name = 'sst_has_fks'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestHasPk < ActiveRecord::Base
2
+ self.table_name = 'sst_has_pks'
3
+ end
@@ -0,0 +1,4 @@
1
+ class SSTestNaturalPkData < ActiveRecord::Base
2
+ self.table_name = 'sst_natural_pk_data'
3
+ self.primary_key = 'legacy_id'
4
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestNaturalPkIntData < ActiveRecord::Base
2
+ self.table_name = 'sst_natural_pk_int_data'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestNoPkData < ActiveRecord::Base
2
+ self.table_name = 'sst_no_pk_data'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestObjectDefault < ActiveRecord::Base
2
+ self.table_name = 'sst_defaultobjects'
3
+ end
@@ -0,0 +1,7 @@
1
+ class SSTestQuotedTable < ActiveRecord::Base
2
+ self.table_name = '[sst_quoted-table]'
3
+ end
4
+
5
+ class SSTestQuotedTableUser < ActiveRecord::Base
6
+ self.table_name = '[dbo].[sst_quoted-table]'
7
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestQuotedView1 < ActiveRecord::Base
2
+ self.table_name = 'sst_quoted-view1'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestQuotedView2 < ActiveRecord::Base
2
+ self.table_name = 'sst_quoted-view2'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestStringDefault < ActiveRecord::Base
2
+ self.table_name = 'sst_string_defaults'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestStringDefaultsBigView < ActiveRecord::Base
2
+ self.table_name = 'sst_string_defaults_big_view'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestStringDefaultsView < ActiveRecord::Base
2
+ self.table_name = 'sst_string_defaults_view'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestTinyintPk < ActiveRecord::Base
2
+ self.table_name = 'sst_tinyint_pk'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestUpper < ActiveRecord::Base
2
+ self.table_name = 'sst_upper_tests'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestUppered < ActiveRecord::Base
2
+ self.table_name = 'SST_UPPER_TESTS'
3
+ end
@@ -0,0 +1,3 @@
1
+ class SSTestUuid < ActiveRecord::Base
2
+ self.table_name = 'sst_uuids'
3
+ end
@@ -0,0 +1,55 @@
1
+
2
+ IF EXISTS (
3
+ SELECT TABLE_NAME
4
+ FROM INFORMATION_SCHEMA.TABLES
5
+ WHERE TABLE_NAME = N'sst_datatypes'
6
+ ) DROP TABLE [sst_datatypes]
7
+
8
+ CREATE TABLE [sst_datatypes] (
9
+ -- Exact Numerics
10
+ [id] [int] NOT NULL IDENTITY(1,1) PRIMARY KEY,
11
+ [bigint] [bigint] NULL DEFAULT 42,
12
+ [int] [int] NULL DEFAULT 42,
13
+ [smallint] [smallint] NULL DEFAULT 42,
14
+ [tinyint] [tinyint] NULL DEFAULT 42,
15
+ [bit] [bit] NULL DEFAULT 1,
16
+ [decimal_9_2] [decimal](9, 2) NULL DEFAULT 12345.01,
17
+ [decimal_16_4] [decimal](16, 4) NULL DEFAULT 1234567.89,
18
+ [numeric_18_0] [numeric](18, 0) NULL DEFAULT 191,
19
+ [numeric_36_2] [numeric](36, 2) NULL DEFAULT 12345678901234567890.01,
20
+ [money] [money] NULL DEFAULT 4.20,
21
+ [smallmoney] [smallmoney] NULL DEFAULT 4.20,
22
+ -- Approximate Numerics
23
+ [float] [float] NULL DEFAULT 123.00000001,
24
+ [real] [real] NULL DEFAULT 123.45,
25
+ -- Date and Time
26
+ [date] [date] NULL DEFAULT '0001-01-01',
27
+ [datetime] [datetime] NULL DEFAULT '1753-01-01T00:00:00.123',
28
+ [datetime2_7] [datetime2](7) NULL DEFAULT '9999-12-31 23:59:59.9999999',
29
+ [datetime2_3] [datetime2](3) NULL,
30
+ [datetime2_1] [datetime2](1) NULL,
31
+ [datetime2_0] [datetime2](0) NULL,
32
+ [datetimeoffset_7] [datetimeoffset](7) NULL DEFAULT '1984-01-24 04:20:00.1234567 -08:00',
33
+ [datetimeoffset_3] [datetimeoffset](3) NULL,
34
+ [datetimeoffset_1] [datetimeoffset](1) NULL,
35
+ [smalldatetime] [smalldatetime] NULL DEFAULT '1901-01-01T15:45:00.000Z',
36
+ [time_7] [time](7) NULL DEFAULT '04:20:00.2883215',
37
+ [time_2] [time](2) NULL,
38
+ -- Character Strings
39
+ [char_10] [char](10) NULL DEFAULT '1234567890',
40
+ [varchar_50] [varchar](50) NULL DEFAULT 'test varchar_50',
41
+ [varchar_max] [varchar](max) NULL DEFAULT 'test varchar_max',
42
+ [text] [text] NULL DEFAULT 'test text',
43
+ -- Unicode Character Strings
44
+ [nchar_10] [nchar](10) NULL DEFAULT N'12345678åå',
45
+ [nvarchar_50] [nvarchar](50) NULL DEFAULT N'test nvarchar_50 åå',
46
+ [nvarchar_max] [nvarchar](max) NULL DEFAULT N'test nvarchar_max åå',
47
+ [ntext] [ntext] NULL DEFAULT N'test ntext åå',
48
+ -- Binary Strings
49
+ [binary_49] [binary](49) NULL,
50
+ [varbinary_49] [varbinary](49) NULL,
51
+ [varbinary_max] [varbinary](max) NULL,
52
+ -- Other Data Types
53
+ [uniqueidentifier] [uniqueidentifier] NULL DEFAULT NEWID(),
54
+ [timestamp] [timestamp] NULL,
55
+ ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
@@ -0,0 +1,207 @@
1
+ ActiveRecord::Schema.define do
2
+
3
+ # Exhaustive Data Types
4
+
5
+ execute File.read(ARTest::SQLServer.schema_datatypes_2012_file)
6
+
7
+ create_table :sst_datatypes_migration, force: true do |t|
8
+ # Simple Rails conventions.
9
+ t.integer :integer_col
10
+ t.bigint :bigint_col
11
+ t.boolean :boolean_col
12
+ t.decimal :decimal_col
13
+ t.float :float_col
14
+ t.string :string_col
15
+ t.text :text_col
16
+ t.datetime :datetime_col
17
+ t.timestamp :timestamp_col
18
+ t.time :time_col
19
+ t.date :date_col
20
+ t.binary :binary_col
21
+ # Our type methods.
22
+ t.real :real_col
23
+ t.money :money_col
24
+ t.datetime2 :datetime2_col
25
+ t.datetimeoffset :datetimeoffset
26
+ t.smallmoney :smallmoney_col
27
+ t.char :char_col
28
+ t.varchar :varchar_col
29
+ t.text_basic :text_basic_col
30
+ t.nchar :nchar_col
31
+ t.ntext :ntext_col
32
+ t.binary_basic :binary_basic_col
33
+ t.varbinary :varbinary_col
34
+ t.uuid :uuid_col
35
+ t.ss_timestamp :sstimestamp_col
36
+ end
37
+
38
+ # Edge Cases
39
+
40
+ create_table 'sst_bookings', force: true do |t|
41
+ t.string :name
42
+ t.datetime2 :created_at, null: false
43
+ t.datetime2 :updated_at, null: false
44
+ end
45
+
46
+ create_table 'sst_uuids', force: true, id: :uuid do |t|
47
+ t.string :name
48
+ t.uuid :other_uuid, default: 'NEWID()'
49
+ t.uuid :uuid_nil_default, default: nil
50
+ end
51
+
52
+ create_table '[some.Name]', force: true do |t|
53
+ t.varchar :name
54
+ end
55
+
56
+ create_table 'sst_my$strange_table', force: true do |t|
57
+ t.string :name
58
+ end
59
+
60
+ create_table :SST_UPPER_TESTS, force: true do |t|
61
+ t.column :COLUMN1, :string
62
+ t.column :COLUMN2, :integer
63
+ end
64
+
65
+ create_table :sst_no_pk_data, force: true, id: false do |t|
66
+ t.string :name
67
+ end
68
+
69
+ create_table 'sst_quoted-table', force: true do |t|
70
+ end
71
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_quoted-view1') DROP VIEW [sst_quoted-view1]"
72
+ execute "CREATE VIEW [sst_quoted-view1] AS SELECT * FROM [sst_quoted-table]"
73
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_quoted-view2') DROP VIEW [sst_quoted-view2]"
74
+ execute "CREATE VIEW [sst_quoted-view2] AS \n /*#{'x'*4000}}*/ \n SELECT * FROM [sst_quoted-table]"
75
+
76
+ create_table :sst_string_defaults, force: true do |t|
77
+ t.column :string_with_null_default, :string, default: nil
78
+ t.column :string_with_pretend_null_one, :string, default: 'null'
79
+ t.column :string_with_pretend_null_two, :string, default: '(null)'
80
+ t.column :string_with_pretend_null_three, :string, default: 'NULL'
81
+ t.column :string_with_pretend_null_four, :string, default: '(NULL)'
82
+ t.column :string_with_pretend_paren_three, :string, default: '(3)'
83
+ t.column :string_with_multiline_default, :string, default: "Some long default with a\nnew line."
84
+ end
85
+
86
+ create_table :sst_edge_schemas, force: true do |t|
87
+ t.string :description
88
+ t.column 'crazy]]quote', :string
89
+ t.column 'with spaces', :string
90
+ end
91
+
92
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_natural_pk_data') DROP TABLE sst_natural_pk_data"
93
+ execute <<-NATURALPKTABLESQL
94
+ CREATE TABLE sst_natural_pk_data(
95
+ parent_id int,
96
+ name nvarchar(255),
97
+ description nvarchar(1000),
98
+ legacy_id nvarchar(10) NOT NULL PRIMARY KEY
99
+ )
100
+ NATURALPKTABLESQL
101
+
102
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_natural_pk_int_data') DROP TABLE sst_natural_pk_int_data"
103
+ execute <<-NATURALPKINTTABLESQL
104
+ CREATE TABLE sst_natural_pk_int_data(
105
+ legacy_id int NOT NULL PRIMARY KEY,
106
+ parent_id int,
107
+ name nvarchar(255),
108
+ description nvarchar(1000)
109
+ )
110
+ NATURALPKINTTABLESQL
111
+
112
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_tinyint_pk') DROP TABLE sst_tinyint_pk"
113
+ execute <<-TINYITPKTABLE
114
+ CREATE TABLE sst_tinyint_pk(
115
+ id tinyint IDENTITY NOT NULL PRIMARY KEY,
116
+ name nvarchar(255)
117
+ )
118
+ TINYITPKTABLE
119
+
120
+ execute "DROP DEFAULT [sst_getdateobject];" rescue nil
121
+ execute "CREATE DEFAULT [sst_getdateobject] AS getdate();" rescue nil
122
+ create_table 'sst_defaultobjects', force: true do |t|
123
+ t.string :name
124
+ t.date :date
125
+ end
126
+ execute "sp_bindefault 'sst_getdateobject', 'sst_defaultobjects.date'"
127
+
128
+ execute "DROP PROCEDURE my_getutcdate" rescue nil
129
+ execute <<-SQL
130
+ CREATE PROCEDURE my_getutcdate AS
131
+ SELECT GETUTCDATE() utcdate
132
+ SQL
133
+
134
+ # Constraints
135
+
136
+ create_table(:sst_has_fks, force: true) { |t| t.column(:fk_id, :integer, null: false) }
137
+ create_table(:sst_has_pks, force: true) { }
138
+ execute <<-ADDFKSQL
139
+ ALTER TABLE sst_has_fks
140
+ ADD CONSTRAINT FK__sst_has_fks_id
141
+ FOREIGN KEY ([fk_id])
142
+ REFERENCES [sst_has_pks] ([id])
143
+ ADDFKSQL
144
+
145
+ # Views
146
+
147
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_customers_view') DROP VIEW sst_customers_view"
148
+ execute <<-CUSTOMERSVIEW
149
+ CREATE VIEW sst_customers_view AS
150
+ SELECT id, name, balance
151
+ FROM customers
152
+ CUSTOMERSVIEW
153
+
154
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_string_defaults_view') DROP VIEW sst_string_defaults_view"
155
+ execute <<-STRINGDEFAULTSVIEW
156
+ CREATE VIEW sst_string_defaults_view AS
157
+ SELECT id, string_with_pretend_null_one as pretend_null
158
+ FROM sst_string_defaults
159
+ STRINGDEFAULTSVIEW
160
+
161
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_string_defaults_big_view') DROP VIEW sst_string_defaults_big_view"
162
+ execute <<-STRINGDEFAULTSBIGVIEW
163
+ CREATE VIEW sst_string_defaults_big_view AS
164
+ SELECT id, string_with_pretend_null_one as pretend_null
165
+ /*#{'x'*4000}}*/
166
+ FROM sst_string_defaults
167
+ STRINGDEFAULTSBIGVIEW
168
+
169
+ # Another schema.
170
+
171
+ create_table :sst_schema_columns, force: true do |t|
172
+ t.column :field1 , :integer
173
+ end
174
+
175
+ execute "IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'test') EXEC sp_executesql N'CREATE SCHEMA test'"
176
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_schema_columns' and TABLE_SCHEMA = 'test') DROP TABLE test.sst_schema_columns"
177
+ execute <<-SIMILIARTABLEINOTHERSCHEMA
178
+ CREATE TABLE test.sst_schema_columns(
179
+ id int IDENTITY NOT NULL primary key,
180
+ filed_1 int,
181
+ field_2 int,
182
+ name varchar(255),
183
+ description varchar(1000),
184
+ n_name nvarchar(255),
185
+ n_description nvarchar(1000)
186
+ )
187
+ SIMILIARTABLEINOTHERSCHEMA
188
+
189
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_schema_identity' and TABLE_SCHEMA = 'test') DROP TABLE test.sst_schema_identity"
190
+ execute <<-SIMILIARTABLEINOTHERSCHEMA
191
+ CREATE TABLE test.sst_schema_identity(
192
+ id int IDENTITY NOT NULL primary key,
193
+ filed_1 int
194
+ )
195
+ SIMILIARTABLEINOTHERSCHEMA
196
+
197
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_schema_natural_id' and TABLE_SCHEMA = 'test') DROP TABLE test.sst_schema_natural_id"
198
+ execute <<-NATURALPKTABLESQLINOTHERSCHEMA
199
+ CREATE TABLE test.sst_schema_natural_id(
200
+ parent_id int,
201
+ name nvarchar(255),
202
+ description nvarchar(1000),
203
+ legacy_id nvarchar(10) NOT NULL PRIMARY KEY,
204
+ )
205
+ NATURALPKTABLESQLINOTHERSCHEMA
206
+
207
+ end