activerecord-jdbcsqlserver-adapter 50.0.0

Sign up to get free protection for your applications and to get access to all the features.
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