activerecord-jdbcsqlserver-adapter 50.0.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 (148) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +27 -0
  4. data/CHANGELOG.md +124 -0
  5. data/CODE_OF_CONDUCT.md +31 -0
  6. data/Dockerfile +20 -0
  7. data/Gemfile +77 -0
  8. data/Guardfile +29 -0
  9. data/MIT-LICENSE +20 -0
  10. data/RAILS5-TODO.md +5 -0
  11. data/README.md +93 -0
  12. data/RUNNING_UNIT_TESTS.md +96 -0
  13. data/Rakefile +46 -0
  14. data/VERSION +1 -0
  15. data/activerecord-jdbcsqlserver-adapter.gemspec +21 -0
  16. data/appveyor.yml +39 -0
  17. data/docker-compose.ci.yml +11 -0
  18. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +27 -0
  19. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +25 -0
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/date_time.rb +58 -0
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +47 -0
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +4 -0
  23. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
  24. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +362 -0
  25. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +67 -0
  26. data/lib/active_record/connection_adapters/sqlserver/errors.rb +7 -0
  27. data/lib/active_record/connection_adapters/sqlserver/jdbc_overrides.rb +192 -0
  28. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +99 -0
  29. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +34 -0
  30. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -0
  31. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +517 -0
  32. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +66 -0
  33. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +66 -0
  34. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +22 -0
  35. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +20 -0
  36. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +112 -0
  37. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +64 -0
  38. data/lib/active_record/connection_adapters/sqlserver/type.rb +49 -0
  39. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +19 -0
  40. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +21 -0
  41. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +15 -0
  42. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +32 -0
  43. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +30 -0
  44. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +61 -0
  45. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +71 -0
  46. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +17 -0
  47. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +23 -0
  48. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +21 -0
  49. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +19 -0
  50. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +15 -0
  51. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +11 -0
  52. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +25 -0
  53. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +19 -0
  54. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +15 -0
  55. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +25 -0
  56. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +29 -0
  57. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +12 -0
  58. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +19 -0
  59. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +68 -0
  60. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +93 -0
  61. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +19 -0
  62. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +25 -0
  63. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +21 -0
  64. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +12 -0
  65. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +19 -0
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +26 -0
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +24 -0
  68. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +36 -0
  69. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +26 -0
  70. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +24 -0
  71. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +26 -0
  72. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +24 -0
  73. data/lib/active_record/connection_adapters/sqlserver/utils.rb +146 -0
  74. data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
  75. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +445 -0
  76. data/lib/active_record/connection_adapters/sqlserver_column.rb +28 -0
  77. data/lib/active_record/jdbc_sqlserver_connection_methods.rb +31 -0
  78. data/lib/active_record/sqlserver_base.rb +16 -0
  79. data/lib/active_record/tasks/sqlserver_database_tasks.rb +131 -0
  80. data/lib/activerecord-jdbcsqlserver-adapter.rb +24 -0
  81. data/lib/activerecord-sqlserver-adapter.rb +1 -0
  82. data/lib/arel/visitors/sqlserver.rb +205 -0
  83. data/lib/arel_sqlserver.rb +3 -0
  84. data/test/appveyor/dbsetup.ps1 +27 -0
  85. data/test/appveyor/dbsetup.sql +11 -0
  86. data/test/bin/wait-for.sh +79 -0
  87. data/test/cases/adapter_test_sqlserver.rb +430 -0
  88. data/test/cases/coerced_tests.rb +845 -0
  89. data/test/cases/column_test_sqlserver.rb +812 -0
  90. data/test/cases/connection_test_sqlserver.rb +71 -0
  91. data/test/cases/execute_procedure_test_sqlserver.rb +45 -0
  92. data/test/cases/fetch_test_sqlserver.rb +57 -0
  93. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +76 -0
  94. data/test/cases/helper_sqlserver.rb +44 -0
  95. data/test/cases/index_test_sqlserver.rb +47 -0
  96. data/test/cases/json_test_sqlserver.rb +32 -0
  97. data/test/cases/migration_test_sqlserver.rb +61 -0
  98. data/test/cases/order_test_sqlserver.rb +147 -0
  99. data/test/cases/pessimistic_locking_test_sqlserver.rb +94 -0
  100. data/test/cases/rake_test_sqlserver.rb +169 -0
  101. data/test/cases/schema_dumper_test_sqlserver.rb +234 -0
  102. data/test/cases/schema_test_sqlserver.rb +54 -0
  103. data/test/cases/scratchpad_test_sqlserver.rb +8 -0
  104. data/test/cases/showplan_test_sqlserver.rb +65 -0
  105. data/test/cases/specific_schema_test_sqlserver.rb +180 -0
  106. data/test/cases/transaction_test_sqlserver.rb +91 -0
  107. data/test/cases/utils_test_sqlserver.rb +129 -0
  108. data/test/cases/uuid_test_sqlserver.rb +49 -0
  109. data/test/config.yml +38 -0
  110. data/test/debug.rb +14 -0
  111. data/test/fixtures/1px.gif +0 -0
  112. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
  113. data/test/models/sqlserver/booking.rb +3 -0
  114. data/test/models/sqlserver/customers_view.rb +3 -0
  115. data/test/models/sqlserver/datatype.rb +3 -0
  116. data/test/models/sqlserver/datatype_migration.rb +8 -0
  117. data/test/models/sqlserver/dollar_table_name.rb +3 -0
  118. data/test/models/sqlserver/dot_table_name.rb +3 -0
  119. data/test/models/sqlserver/edge_schema.rb +13 -0
  120. data/test/models/sqlserver/fk_has_fk.rb +3 -0
  121. data/test/models/sqlserver/fk_has_pk.rb +3 -0
  122. data/test/models/sqlserver/natural_pk_data.rb +4 -0
  123. data/test/models/sqlserver/natural_pk_int_data.rb +3 -0
  124. data/test/models/sqlserver/no_pk_data.rb +3 -0
  125. data/test/models/sqlserver/object_default.rb +3 -0
  126. data/test/models/sqlserver/quoted_table.rb +7 -0
  127. data/test/models/sqlserver/quoted_view_1.rb +3 -0
  128. data/test/models/sqlserver/quoted_view_2.rb +3 -0
  129. data/test/models/sqlserver/sst_memory.rb +3 -0
  130. data/test/models/sqlserver/string_default.rb +3 -0
  131. data/test/models/sqlserver/string_defaults_big_view.rb +3 -0
  132. data/test/models/sqlserver/string_defaults_view.rb +3 -0
  133. data/test/models/sqlserver/tinyint_pk.rb +3 -0
  134. data/test/models/sqlserver/upper.rb +3 -0
  135. data/test/models/sqlserver/uppered.rb +3 -0
  136. data/test/models/sqlserver/uuid.rb +3 -0
  137. data/test/schema/datatypes/2012.sql +55 -0
  138. data/test/schema/enable-in-memory-oltp.sql +81 -0
  139. data/test/schema/sqlserver_specific_schema.rb +238 -0
  140. data/test/support/coerceable_test_sqlserver.rb +49 -0
  141. data/test/support/connection_reflection.rb +34 -0
  142. data/test/support/load_schema_sqlserver.rb +29 -0
  143. data/test/support/minitest_sqlserver.rb +1 -0
  144. data/test/support/paths_sqlserver.rb +50 -0
  145. data/test/support/rake_helpers.rb +41 -0
  146. data/test/support/sql_counter_sqlserver.rb +28 -0
  147. data/test/support/test_in_memory_oltp.rb +15 -0
  148. metadata +310 -0
@@ -0,0 +1,49 @@
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
+ skip 'We do not support uuid autogenerated primary keys at this time' if defined? JRUBY_VERSION
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
+ skip 'We do not support uuid autogenerated primary keys at this time' if defined? JRUBY_VERSION
22
+ obj = SSTestUuid.create!
23
+ obj.reload
24
+ obj.other_uuid.must_match acceptable_uuid
25
+ end
26
+
27
+ it 'can find uuid pk via connection' do
28
+ connection.primary_key(SSTestUuid.table_name).must_equal 'id'
29
+ end
30
+
31
+ it 'changing column default' do
32
+ table_name = SSTestUuid.table_name
33
+ connection.add_column table_name, :thingy, :uuid, null: false, default: "NEWSEQUENTIALID()"
34
+ SSTestUuid.reset_column_information
35
+ column = SSTestUuid.columns_hash['thingy']
36
+ column.default_function.must_equal "newsequentialid()"
37
+ # Now to a different function.
38
+ connection.change_column table_name, :thingy, :uuid, null: false, default: "NEWID()"
39
+ SSTestUuid.reset_column_information
40
+ column = SSTestUuid.columns_hash['thingy']
41
+ column.default_function.must_equal "newid()"
42
+ end
43
+
44
+ it 'can insert even when use_output_inserted to false ' do
45
+ obj = with_use_output_inserted_disabled { SSTestUuid.create!(name: "😢") }
46
+ obj.id.must_be :nil?
47
+ end
48
+
49
+ end
@@ -0,0 +1,38 @@
1
+
2
+ default_connection_info: &default_connection_info
3
+ adapter: sqlserver
4
+ mode: <%= ENV['ARCONN'] || 'dblib' %>
5
+ host: <%= ENV['ACTIVERECORD_UNITTEST_HOST'] || 'localhost' %>
6
+ port: <%= ENV['ACTIVERECORD_UNITTEST_PORT'] %>
7
+ database: activerecord_unittest
8
+ username: <%= ENV['ACTIVERECORD_UNITTEST_USER'] || 'rails' %>
9
+ password: <%= ENV['ACTIVERECORD_UNITTEST_PASS'] || '' %>
10
+ collation: <%= ENV['ACTIVERECORD_UNITTEST_COLLATION'] || nil %>
11
+ encoding: utf8
12
+
13
+ connections:
14
+
15
+ dblib:
16
+ arunit:
17
+ <<: *default_connection_info
18
+ appname: SQLServerAdptrUnit
19
+ dataserver: <%= ENV['ACTIVERECORD_UNITTEST_DATASERVER'] %>
20
+ tds_version: <%= ENV['ACTIVERECORD_UNITTEST_TDSVERSION'] %>
21
+ azure: <%= !ENV['ACTIVERECORD_UNITTEST_AZURE'].nil? %>
22
+ timeout: <%= ENV['ACTIVERECORD_UNITTEST_AZURE'].present? ? 20 : nil %>
23
+ arunit2:
24
+ <<: *default_connection_info
25
+ database: activerecord_unittest2
26
+ appname: SQLServerAdptrUnit2
27
+ dataserver: <%= ENV['ACTIVERECORD_UNITTEST_DATASERVER'] %>
28
+ tds_version: <%= ENV['ACTIVERECORD_UNITTEST_TDSVERSION'] %>
29
+ azure: <%= !ENV['ACTIVERECORD_UNITTEST_AZURE'].nil? %>
30
+ timeout: <%= ENV['ACTIVERECORD_UNITTEST_AZURE'].present? ? 20 : nil %>
31
+
32
+ jdbc:
33
+ arunit:
34
+ <<: *default_connection_info
35
+ database: activerecord_unittest
36
+ arunit2:
37
+ <<: *default_connection_info
38
+ database: activerecord_unittest2
@@ -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('HELL') }
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,8 @@
1
+ class SSTestDatatypeMigration < ActiveRecord::Base
2
+ self.table_name = :sst_datatypes_migration
3
+ end
4
+
5
+ class SSTestDatatypeMigrationJson < ActiveRecord::Base
6
+ self.table_name = :sst_datatypes_migration
7
+ attribute :json_col, ActiveRecord::Type::SQLServer::Json.new
8
+ 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 SSTMemory < ActiveRecord::Base
2
+ self.table_name = 'sst_memory'
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,81 @@
1
+ -- https://msdn.microsoft.com/en-us/library/mt694156.aspx
2
+ -- https://raw.githubusercontent.com/Microsoft/sql-server-samples/master/samples/features/in-memory/t-sql-scripts/enable-in-memory-oltp.sql
3
+ --
4
+ -- The below scipt enables the use of In-Memory OLTP in the current database,
5
+ -- provided it is supported in the edition / pricing tier of the database.
6
+ -- It does the following:
7
+ -- 1. Validate that In-Memory OLTP is supported.
8
+ -- 2. In SQL Server, it will add a MEMORY_OPTIMIZED_DATA filegroup to the database
9
+ -- and create a container within the filegroup in the default data folder.
10
+ -- 3. Change the database compatibility level to 130 (needed for parallel queries
11
+ -- and auto-update of statistics).
12
+ -- 4. Enables the database option MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT to avoid the
13
+ -- need to use the WITH (SNAPSHOT) hint for ad hoc queries accessing memory-optimized
14
+ -- tables.
15
+ --
16
+ -- Applies To: SQL Server 2016 (or higher); Azure SQL Database
17
+ -- Author: Jos de Bruijn (Microsoft)
18
+ -- Last Updated: 2016-05-02
19
+
20
+ SET NOCOUNT ON;
21
+ SET XACT_ABORT ON;
22
+
23
+ -- 1. validate that In-Memory OLTP is supported
24
+ IF SERVERPROPERTY(N'IsXTPSupported') = 0
25
+ BEGIN
26
+ PRINT N'Error: In-Memory OLTP is not supported for this server edition or database pricing tier.';
27
+ END
28
+ IF DB_ID() < 5
29
+ BEGIN
30
+ PRINT N'Error: In-Memory OLTP is not supported in system databases. Connect to a user database.';
31
+ END
32
+ ELSE
33
+ BEGIN
34
+ BEGIN TRY;
35
+ -- 2. add MEMORY_OPTIMIZED_DATA filegroup when not using Azure SQL DB
36
+ IF SERVERPROPERTY('EngineEdition') != 5
37
+ BEGIN
38
+ DECLARE @SQLDataFolder nvarchar(max) = cast(SERVERPROPERTY('InstanceDefaultDataPath') as nvarchar(max))
39
+ DECLARE @MODName nvarchar(max) = DB_NAME() + N'_mod';
40
+ DECLARE @MemoryOptimizedFilegroupFolder nvarchar(max) = @SQLDataFolder + @MODName;
41
+
42
+ DECLARE @SQL nvarchar(max) = N'';
43
+
44
+ -- add filegroup
45
+ IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE type = N'FX')
46
+ BEGIN
47
+ SET @SQL = N'
48
+ ALTER DATABASE CURRENT
49
+ ADD FILEGROUP ' + QUOTENAME(@MODName) + N' CONTAINS MEMORY_OPTIMIZED_DATA;';
50
+ EXECUTE (@SQL);
51
+
52
+ END;
53
+
54
+ -- add container in the filegroup
55
+ IF NOT EXISTS (SELECT * FROM sys.database_files WHERE data_space_id IN (SELECT data_space_id FROM sys.filegroups WHERE type = N'FX'))
56
+ BEGIN
57
+ SET @SQL = N'
58
+ ALTER DATABASE CURRENT
59
+ ADD FILE (name = N''' + @MODName + ''', filename = '''
60
+ + @MemoryOptimizedFilegroupFolder + N''')
61
+ TO FILEGROUP ' + QUOTENAME(@MODName);
62
+ EXECUTE (@SQL);
63
+ END
64
+ END
65
+
66
+ -- 3. set compat level to 130 if it is lower
67
+ IF (SELECT compatibility_level FROM sys.databases WHERE database_id=DB_ID()) < 130
68
+ ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130
69
+
70
+ -- 4. enable MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT for the database
71
+ ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;
72
+
73
+
74
+ END TRY
75
+ BEGIN CATCH
76
+ PRINT N'Error enabling In-Memory OLTP';
77
+ IF XACT_STATE() != 0
78
+ ROLLBACK;
79
+ THROW;
80
+ END CATCH;
81
+ END;
@@ -0,0 +1,238 @@
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.smalldatetime :smalldatetime_col
25
+ t.datetime2 :datetime2_col
26
+ t.datetimeoffset :datetimeoffset
27
+ t.smallmoney :smallmoney_col
28
+ t.char :char_col
29
+ t.varchar :varchar_col
30
+ t.text_basic :text_basic_col
31
+ t.nchar :nchar_col
32
+ t.ntext :ntext_col
33
+ t.binary_basic :binary_basic_col
34
+ t.varbinary :varbinary_col
35
+ t.uuid :uuid_col
36
+ t.ss_timestamp :sstimestamp_col
37
+ if supports_json?
38
+ t.json :json_col
39
+ else
40
+ t.text :json_col
41
+ end
42
+ end
43
+
44
+ # Edge Cases
45
+
46
+ if ENV['IN_MEMORY_OLTP'] && supports_in_memory_oltp?
47
+ create_table 'sst_memory', force: true, id: false,
48
+ options: 'WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)' do |t|
49
+ t.primary_key_nonclustered :id
50
+ t.string :name
51
+ t.timestamps
52
+ end
53
+ end
54
+
55
+ create_table 'sst_bookings', force: true do |t|
56
+ t.string :name
57
+ t.datetime2 :created_at, null: false
58
+ t.datetime2 :updated_at, null: false
59
+ end
60
+
61
+ create_table 'sst_uuids', force: true, id: :uuid do |t|
62
+ t.string :name
63
+ t.uuid :other_uuid, default: 'NEWID()'
64
+ t.uuid :uuid_nil_default, default: nil
65
+ end
66
+
67
+ create_table '[some.Name]', force: true do |t|
68
+ t.varchar :name
69
+ end
70
+
71
+ create_table 'sst_my$strange_table', force: true do |t|
72
+ t.string :name
73
+ end
74
+
75
+ create_table :SST_UPPER_TESTS, force: true do |t|
76
+ t.column :COLUMN1, :string
77
+ t.column :COLUMN2, :integer
78
+ end
79
+
80
+ create_table :sst_no_pk_data, force: true, id: false do |t|
81
+ t.string :name
82
+ end
83
+
84
+ create_table 'sst_quoted-table', force: true do |t|
85
+ end
86
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_quoted-view1') DROP VIEW [sst_quoted-view1]"
87
+ execute "CREATE VIEW [sst_quoted-view1] AS SELECT * FROM [sst_quoted-table]"
88
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_quoted-view2') DROP VIEW [sst_quoted-view2]"
89
+ execute "CREATE VIEW [sst_quoted-view2] AS \n /*#{'x'*4000}}*/ \n SELECT * FROM [sst_quoted-table]"
90
+
91
+ create_table :sst_string_defaults, force: true do |t|
92
+ t.column :string_with_null_default, :string, default: nil
93
+ t.column :string_with_pretend_null_one, :string, default: 'null'
94
+ t.column :string_with_pretend_null_two, :string, default: '(null)'
95
+ t.column :string_with_pretend_null_three, :string, default: 'NULL'
96
+ t.column :string_with_pretend_null_four, :string, default: '(NULL)'
97
+ t.column :string_with_pretend_paren_three, :string, default: '(3)'
98
+ t.column :string_with_multiline_default, :string, default: "Some long default with a\nnew line."
99
+ end
100
+
101
+ create_table :sst_edge_schemas, force: true do |t|
102
+ t.string :description
103
+ t.column 'crazy]]quote', :string
104
+ t.column 'with spaces', :string
105
+ end
106
+
107
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_natural_pk_data') DROP TABLE sst_natural_pk_data"
108
+ execute <<-NATURALPKTABLESQL
109
+ CREATE TABLE sst_natural_pk_data(
110
+ parent_id int,
111
+ name nvarchar(255),
112
+ description nvarchar(1000),
113
+ legacy_id nvarchar(10) NOT NULL PRIMARY KEY
114
+ )
115
+ NATURALPKTABLESQL
116
+
117
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_natural_pk_int_data') DROP TABLE sst_natural_pk_int_data"
118
+ execute <<-NATURALPKINTTABLESQL
119
+ CREATE TABLE sst_natural_pk_int_data(
120
+ legacy_id int NOT NULL PRIMARY KEY,
121
+ parent_id int,
122
+ name nvarchar(255),
123
+ description nvarchar(1000)
124
+ )
125
+ NATURALPKINTTABLESQL
126
+
127
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_tinyint_pk') DROP TABLE sst_tinyint_pk"
128
+ execute <<-TINYITPKTABLE
129
+ CREATE TABLE sst_tinyint_pk(
130
+ id tinyint IDENTITY NOT NULL PRIMARY KEY,
131
+ name nvarchar(255)
132
+ )
133
+ TINYITPKTABLE
134
+
135
+ execute "DROP DEFAULT [sst_getdateobject];" rescue nil
136
+ execute "CREATE DEFAULT [sst_getdateobject] AS getdate();" rescue nil
137
+ create_table 'sst_defaultobjects', force: true do |t|
138
+ t.string :name
139
+ t.date :date
140
+ end
141
+ execute "sp_bindefault 'sst_getdateobject', 'sst_defaultobjects.date'"
142
+
143
+ execute "DROP PROCEDURE my_getutcdate" rescue nil
144
+ execute <<-SQL
145
+ CREATE PROCEDURE my_getutcdate AS
146
+ SELECT GETUTCDATE() utcdate
147
+ SQL
148
+
149
+ # Constraints
150
+
151
+ create_table(:sst_has_fks, force: true) { |t| t.column(:fk_id, :integer, null: false) }
152
+ create_table(:sst_has_pks, force: true) { }
153
+ execute <<-ADDFKSQL
154
+ ALTER TABLE sst_has_fks
155
+ ADD CONSTRAINT FK__sst_has_fks_id
156
+ FOREIGN KEY ([fk_id])
157
+ REFERENCES [sst_has_pks] ([id])
158
+ ADDFKSQL
159
+
160
+ # Views
161
+
162
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_customers_view') DROP VIEW sst_customers_view"
163
+ execute <<-CUSTOMERSVIEW
164
+ CREATE VIEW sst_customers_view AS
165
+ SELECT id, name, balance
166
+ FROM customers
167
+ CUSTOMERSVIEW
168
+
169
+ execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_string_defaults_view') DROP VIEW sst_string_defaults_view"
170
+ execute <<-STRINGDEFAULTSVIEW
171
+ CREATE VIEW sst_string_defaults_view AS
172
+ SELECT id, string_with_pretend_null_one as pretend_null
173
+ FROM sst_string_defaults
174
+ STRINGDEFAULTSVIEW
175
+
176
+ 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"
177
+ execute <<-STRINGDEFAULTSBIGVIEW
178
+ CREATE VIEW sst_string_defaults_big_view AS
179
+ SELECT id, string_with_pretend_null_one as pretend_null
180
+ /*#{'x'*4000}}*/
181
+ FROM sst_string_defaults
182
+ STRINGDEFAULTSBIGVIEW
183
+
184
+ # Another schema.
185
+
186
+ create_table :sst_schema_columns, force: true do |t|
187
+ t.column :field1 , :integer
188
+ end
189
+
190
+ execute "IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'test') EXEC sp_executesql N'CREATE SCHEMA test'"
191
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_schema_columns' and TABLE_SCHEMA = 'test') DROP TABLE test.sst_schema_columns"
192
+ execute <<-SIMILIARTABLEINOTHERSCHEMA
193
+ CREATE TABLE test.sst_schema_columns(
194
+ id int IDENTITY NOT NULL primary key,
195
+ filed_1 int,
196
+ field_2 int,
197
+ name varchar(255),
198
+ description varchar(1000),
199
+ n_name nvarchar(255),
200
+ n_description nvarchar(1000)
201
+ )
202
+ SIMILIARTABLEINOTHERSCHEMA
203
+
204
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_schema_identity' and TABLE_SCHEMA = 'test') DROP TABLE test.sst_schema_identity"
205
+ execute <<-SIMILIARTABLEINOTHERSCHEMA
206
+ CREATE TABLE test.sst_schema_identity(
207
+ id int IDENTITY NOT NULL primary key,
208
+ filed_1 int
209
+ )
210
+ SIMILIARTABLEINOTHERSCHEMA
211
+
212
+ 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"
213
+ execute <<-NATURALPKTABLESQLINOTHERSCHEMA
214
+ CREATE TABLE test.sst_schema_natural_id(
215
+ parent_id int,
216
+ name nvarchar(255),
217
+ description nvarchar(1000),
218
+ legacy_id nvarchar(10) NOT NULL PRIMARY KEY,
219
+ )
220
+ NATURALPKTABLESQLINOTHERSCHEMA
221
+
222
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_schema_test_mulitple_schema' and TABLE_SCHEMA = 'test') DROP TABLE test.sst_schema_test_mulitple_schema"
223
+ execute <<-SCHEMATESTMULTIPLESCHEMA
224
+ CREATE TABLE test.sst_schema_test_mulitple_schema(
225
+ field_1 int NOT NULL PRIMARY KEY,
226
+ field_2 int,
227
+ )
228
+ SCHEMATESTMULTIPLESCHEMA
229
+ execute "IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'test2') EXEC sp_executesql N'CREATE SCHEMA test2'"
230
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_schema_test_mulitple_schema' and TABLE_SCHEMA = 'test2') DROP TABLE test2.sst_schema_test_mulitple_schema"
231
+ execute <<-SCHEMATESTMULTIPLESCHEMA
232
+ CREATE TABLE test2.sst_schema_test_mulitple_schema(
233
+ field_1 int,
234
+ field_2 int NOT NULL PRIMARY KEY,
235
+ )
236
+ SCHEMATESTMULTIPLESCHEMA
237
+
238
+ end