activerecord-sqlserver-adapter_new 4.2.15

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 (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