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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +27 -0
- data/CHANGELOG.md +124 -0
- data/CODE_OF_CONDUCT.md +31 -0
- data/Dockerfile +20 -0
- data/Gemfile +77 -0
- data/Guardfile +29 -0
- data/MIT-LICENSE +20 -0
- data/RAILS5-TODO.md +5 -0
- data/README.md +93 -0
- data/RUNNING_UNIT_TESTS.md +96 -0
- data/Rakefile +46 -0
- data/VERSION +1 -0
- data/activerecord-jdbcsqlserver-adapter.gemspec +21 -0
- data/appveyor.yml +39 -0
- data/docker-compose.ci.yml +11 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +27 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/date_time.rb +58 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +47 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +362 -0
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +67 -0
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +7 -0
- data/lib/active_record/connection_adapters/sqlserver/jdbc_overrides.rb +192 -0
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +99 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +34 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +517 -0
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +66 -0
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +66 -0
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +112 -0
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +64 -0
- data/lib/active_record/connection_adapters/sqlserver/type.rb +49 -0
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +32 -0
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +30 -0
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +61 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +71 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +17 -0
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +23 -0
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +11 -0
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +15 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +29 -0
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +68 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +93 -0
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +25 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +21 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +12 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +19 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +26 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +36 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +26 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +26 -0
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +146 -0
- data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +445 -0
- data/lib/active_record/connection_adapters/sqlserver_column.rb +28 -0
- data/lib/active_record/jdbc_sqlserver_connection_methods.rb +31 -0
- data/lib/active_record/sqlserver_base.rb +16 -0
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +131 -0
- data/lib/activerecord-jdbcsqlserver-adapter.rb +24 -0
- data/lib/activerecord-sqlserver-adapter.rb +1 -0
- data/lib/arel/visitors/sqlserver.rb +205 -0
- data/lib/arel_sqlserver.rb +3 -0
- data/test/appveyor/dbsetup.ps1 +27 -0
- data/test/appveyor/dbsetup.sql +11 -0
- data/test/bin/wait-for.sh +79 -0
- data/test/cases/adapter_test_sqlserver.rb +430 -0
- data/test/cases/coerced_tests.rb +845 -0
- data/test/cases/column_test_sqlserver.rb +812 -0
- data/test/cases/connection_test_sqlserver.rb +71 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +45 -0
- data/test/cases/fetch_test_sqlserver.rb +57 -0
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +76 -0
- data/test/cases/helper_sqlserver.rb +44 -0
- data/test/cases/index_test_sqlserver.rb +47 -0
- data/test/cases/json_test_sqlserver.rb +32 -0
- data/test/cases/migration_test_sqlserver.rb +61 -0
- data/test/cases/order_test_sqlserver.rb +147 -0
- data/test/cases/pessimistic_locking_test_sqlserver.rb +94 -0
- data/test/cases/rake_test_sqlserver.rb +169 -0
- data/test/cases/schema_dumper_test_sqlserver.rb +234 -0
- data/test/cases/schema_test_sqlserver.rb +54 -0
- data/test/cases/scratchpad_test_sqlserver.rb +8 -0
- data/test/cases/showplan_test_sqlserver.rb +65 -0
- data/test/cases/specific_schema_test_sqlserver.rb +180 -0
- data/test/cases/transaction_test_sqlserver.rb +91 -0
- data/test/cases/utils_test_sqlserver.rb +129 -0
- data/test/cases/uuid_test_sqlserver.rb +49 -0
- data/test/config.yml +38 -0
- data/test/debug.rb +14 -0
- data/test/fixtures/1px.gif +0 -0
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
- data/test/models/sqlserver/booking.rb +3 -0
- data/test/models/sqlserver/customers_view.rb +3 -0
- data/test/models/sqlserver/datatype.rb +3 -0
- data/test/models/sqlserver/datatype_migration.rb +8 -0
- data/test/models/sqlserver/dollar_table_name.rb +3 -0
- data/test/models/sqlserver/dot_table_name.rb +3 -0
- data/test/models/sqlserver/edge_schema.rb +13 -0
- data/test/models/sqlserver/fk_has_fk.rb +3 -0
- data/test/models/sqlserver/fk_has_pk.rb +3 -0
- data/test/models/sqlserver/natural_pk_data.rb +4 -0
- data/test/models/sqlserver/natural_pk_int_data.rb +3 -0
- data/test/models/sqlserver/no_pk_data.rb +3 -0
- data/test/models/sqlserver/object_default.rb +3 -0
- data/test/models/sqlserver/quoted_table.rb +7 -0
- data/test/models/sqlserver/quoted_view_1.rb +3 -0
- data/test/models/sqlserver/quoted_view_2.rb +3 -0
- data/test/models/sqlserver/sst_memory.rb +3 -0
- data/test/models/sqlserver/string_default.rb +3 -0
- data/test/models/sqlserver/string_defaults_big_view.rb +3 -0
- data/test/models/sqlserver/string_defaults_view.rb +3 -0
- data/test/models/sqlserver/tinyint_pk.rb +3 -0
- data/test/models/sqlserver/upper.rb +3 -0
- data/test/models/sqlserver/uppered.rb +3 -0
- data/test/models/sqlserver/uuid.rb +3 -0
- data/test/schema/datatypes/2012.sql +55 -0
- data/test/schema/enable-in-memory-oltp.sql +81 -0
- data/test/schema/sqlserver_specific_schema.rb +238 -0
- data/test/support/coerceable_test_sqlserver.rb +49 -0
- data/test/support/connection_reflection.rb +34 -0
- data/test/support/load_schema_sqlserver.rb +29 -0
- data/test/support/minitest_sqlserver.rb +1 -0
- data/test/support/paths_sqlserver.rb +50 -0
- data/test/support/rake_helpers.rb +41 -0
- data/test/support/sql_counter_sqlserver.rb +28 -0
- data/test/support/test_in_memory_oltp.rb +15 -0
- 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
|
data/test/config.yml
ADDED
|
@@ -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
|
data/test/debug.rb
ADDED
|
@@ -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,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,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
|