activerecord-sqlserver-adapter 5.2.1 → 7.0.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 +4 -4
- data/.editorconfig +9 -0
- data/.github/issue_template.md +23 -0
- data/.github/workflows/ci.yml +29 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +17 -27
- data/{Dockerfile → Dockerfile.ci} +1 -1
- data/Gemfile +49 -41
- data/Guardfile +9 -8
- data/MIT-LICENSE +1 -1
- data/README.md +65 -42
- data/RUNNING_UNIT_TESTS.md +3 -0
- data/Rakefile +14 -16
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +25 -14
- data/appveyor.yml +22 -17
- data/docker-compose.ci.yml +7 -5
- data/guides/RELEASING.md +11 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +10 -14
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +12 -5
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +10 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +30 -0
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -4
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +117 -52
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +9 -12
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +51 -14
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +40 -6
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +18 -10
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +235 -167
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +36 -7
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -45
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +8 -10
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +5 -3
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +7 -5
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +26 -12
- data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +271 -180
- data/lib/active_record/connection_adapters/sqlserver_column.rb +76 -16
- data/lib/active_record/sqlserver_base.rb +11 -9
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +38 -39
- data/lib/activerecord-sqlserver-adapter.rb +3 -1
- data/lib/arel/visitors/sqlserver.rb +177 -56
- data/lib/arel_sqlserver.rb +4 -2
- data/test/appveyor/dbsetup.ps1 +4 -4
- data/test/cases/active_schema_test_sqlserver.rb +55 -0
- data/test/cases/adapter_test_sqlserver.rb +258 -173
- data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
- data/test/cases/change_column_null_test_sqlserver.rb +14 -12
- data/test/cases/coerced_tests.rb +1421 -397
- data/test/cases/column_test_sqlserver.rb +321 -315
- data/test/cases/connection_test_sqlserver.rb +17 -20
- data/test/cases/disconnected_test_sqlserver.rb +39 -0
- data/test/cases/eager_load_too_many_ids_test_sqlserver.rb +18 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +28 -19
- data/test/cases/fetch_test_sqlserver.rb +33 -21
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
- data/test/cases/helper_sqlserver.rb +15 -15
- data/test/cases/in_clause_test_sqlserver.rb +63 -0
- data/test/cases/index_test_sqlserver.rb +15 -15
- data/test/cases/json_test_sqlserver.rb +25 -25
- data/test/cases/lateral_test_sqlserver.rb +35 -0
- data/test/cases/migration_test_sqlserver.rb +74 -27
- data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
- data/test/cases/order_test_sqlserver.rb +59 -53
- data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
- data/test/cases/primary_keys_test_sqlserver.rb +103 -0
- data/test/cases/rake_test_sqlserver.rb +70 -45
- data/test/cases/schema_dumper_test_sqlserver.rb +124 -109
- data/test/cases/schema_test_sqlserver.rb +20 -26
- data/test/cases/scratchpad_test_sqlserver.rb +4 -4
- data/test/cases/showplan_test_sqlserver.rb +28 -35
- data/test/cases/specific_schema_test_sqlserver.rb +68 -65
- data/test/cases/transaction_test_sqlserver.rb +18 -20
- data/test/cases/trigger_test_sqlserver.rb +14 -13
- data/test/cases/utils_test_sqlserver.rb +70 -70
- data/test/cases/uuid_test_sqlserver.rb +13 -14
- data/test/debug.rb +8 -6
- data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
- data/test/migrations/create_clients_and_change_column_null.rb +3 -1
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
- data/test/models/sqlserver/booking.rb +3 -1
- data/test/models/sqlserver/composite_pk.rb +9 -0
- data/test/models/sqlserver/customers_view.rb +3 -1
- data/test/models/sqlserver/datatype.rb +2 -0
- data/test/models/sqlserver/datatype_migration.rb +2 -0
- data/test/models/sqlserver/dollar_table_name.rb +3 -1
- data/test/models/sqlserver/edge_schema.rb +3 -3
- data/test/models/sqlserver/fk_has_fk.rb +3 -1
- data/test/models/sqlserver/fk_has_pk.rb +3 -1
- data/test/models/sqlserver/natural_pk_data.rb +4 -2
- data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
- data/test/models/sqlserver/no_pk_data.rb +3 -1
- data/test/models/sqlserver/object_default.rb +3 -1
- data/test/models/sqlserver/quoted_table.rb +4 -2
- data/test/models/sqlserver/quoted_view_1.rb +3 -1
- data/test/models/sqlserver/quoted_view_2.rb +3 -1
- data/test/models/sqlserver/sst_memory.rb +3 -1
- data/test/models/sqlserver/sst_string_collation.rb +3 -0
- data/test/models/sqlserver/string_default.rb +3 -1
- data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
- data/test/models/sqlserver/string_defaults_view.rb +3 -1
- data/test/models/sqlserver/tinyint_pk.rb +3 -1
- data/test/models/sqlserver/trigger.rb +4 -2
- data/test/models/sqlserver/trigger_history.rb +3 -1
- data/test/models/sqlserver/upper.rb +3 -1
- data/test/models/sqlserver/uppered.rb +3 -1
- data/test/models/sqlserver/uuid.rb +3 -1
- data/test/schema/sqlserver_specific_schema.rb +56 -21
- data/test/support/coerceable_test_sqlserver.rb +19 -13
- data/test/support/connection_reflection.rb +3 -2
- data/test/support/core_ext/query_cache.rb +4 -1
- data/test/support/load_schema_sqlserver.rb +5 -5
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
- data/test/support/minitest_sqlserver.rb +3 -1
- data/test/support/paths_sqlserver.rb +11 -11
- data/test/support/rake_helpers.rb +15 -10
- data/test/support/sql_counter_sqlserver.rb +16 -15
- data/test/support/test_in_memory_oltp.rb +9 -7
- metadata +47 -13
- data/.travis.yml +0 -25
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +0 -26
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "cases/helper_sqlserver"
|
|
4
|
+
require "support/schema_dumping_helper"
|
|
5
|
+
|
|
6
|
+
class PrimaryKeyUuidTypeTest < ActiveRecord::TestCase
|
|
7
|
+
include SchemaDumpingHelper
|
|
8
|
+
|
|
9
|
+
self.use_transactional_tests = false
|
|
10
|
+
|
|
11
|
+
class Barcode < ActiveRecord::Base
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
setup do
|
|
15
|
+
@connection = ActiveRecord::Base.connection
|
|
16
|
+
@connection.create_table(:barcodes, primary_key: "code", id: :uuid, force: true)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
teardown do
|
|
20
|
+
@connection.drop_table(:barcodes, if_exists: true)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_any_type_primary_key
|
|
24
|
+
assert_equal "code", Barcode.primary_key
|
|
25
|
+
|
|
26
|
+
column = Barcode.column_for_attribute(Barcode.primary_key)
|
|
27
|
+
assert_not column.null
|
|
28
|
+
assert_equal :uuid, column.type
|
|
29
|
+
assert_not_predicate column, :is_identity?
|
|
30
|
+
assert_predicate column, :is_primary?
|
|
31
|
+
ensure
|
|
32
|
+
Barcode.reset_column_information
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
test "schema dump primary key includes default" do
|
|
36
|
+
schema = dump_table_schema "barcodes"
|
|
37
|
+
assert_match %r/create_table "barcodes", primary_key: "code", id: :uuid, default: -> { "newid\(\)" }/, schema
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
class PrimaryKeyIntegerTest < ActiveRecord::TestCase
|
|
42
|
+
include SchemaDumpingHelper
|
|
43
|
+
|
|
44
|
+
self.use_transactional_tests = false
|
|
45
|
+
|
|
46
|
+
class Barcode < ActiveRecord::Base
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class Widget < ActiveRecord::Base
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
setup do
|
|
53
|
+
@connection = ActiveRecord::Base.connection
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
teardown do
|
|
57
|
+
@connection.drop_table :barcodes, if_exists: true
|
|
58
|
+
@connection.drop_table :widgets, if_exists: true
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
test "integer primary key without default" do
|
|
62
|
+
@connection.create_table(:widgets, id: :integer, force: true)
|
|
63
|
+
column = @connection.columns(:widgets).find { |c| c.name == "id" }
|
|
64
|
+
assert_predicate column, :is_primary?
|
|
65
|
+
assert_predicate column, :is_identity?
|
|
66
|
+
assert_equal :integer, column.type
|
|
67
|
+
assert_not_predicate column, :bigint?
|
|
68
|
+
|
|
69
|
+
schema = dump_table_schema "widgets"
|
|
70
|
+
assert_match %r/create_table "widgets", id: :integer, force: :cascade do/, schema
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
test "bigint primary key without default" do
|
|
74
|
+
@connection.create_table(:widgets, id: :bigint, force: true)
|
|
75
|
+
column = @connection.columns(:widgets).find { |c| c.name == "id" }
|
|
76
|
+
assert_predicate column, :is_primary?
|
|
77
|
+
assert_predicate column, :is_identity?
|
|
78
|
+
assert_equal :integer, column.type
|
|
79
|
+
assert_predicate column, :bigint?
|
|
80
|
+
|
|
81
|
+
schema = dump_table_schema "widgets"
|
|
82
|
+
assert_match %r/create_table "widgets", force: :cascade do/, schema
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
test "don't set identity to integer and bigint when there is a default" do
|
|
86
|
+
@connection.create_table(:barcodes, id: :integer, default: nil, force: true)
|
|
87
|
+
@connection.create_table(:widgets, id: :bigint, default: nil, force: true)
|
|
88
|
+
|
|
89
|
+
column = @connection.columns(:widgets).find { |c| c.name == "id" }
|
|
90
|
+
assert_predicate column, :is_primary?
|
|
91
|
+
assert_not_predicate column, :is_identity?
|
|
92
|
+
|
|
93
|
+
schema = dump_table_schema "widgets"
|
|
94
|
+
assert_match %r/create_table "widgets", id: :bigint, default: nil, force: :cascade do/, schema
|
|
95
|
+
|
|
96
|
+
column = @connection.columns(:barcodes).find { |c| c.name == "id" }
|
|
97
|
+
assert_predicate column, :is_primary?
|
|
98
|
+
assert_not_predicate column, :is_identity?
|
|
99
|
+
|
|
100
|
+
schema = dump_table_schema "barcodes"
|
|
101
|
+
assert_match %r/create_table "barcodes", id: :integer, default: nil, force: :cascade do/, schema
|
|
102
|
+
end
|
|
103
|
+
end
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require "cases/helper_sqlserver"
|
|
4
4
|
|
|
5
|
+
class SQLServerRakeTest < ActiveRecord::TestCase
|
|
5
6
|
self.use_transactional_tests = false
|
|
6
7
|
|
|
7
8
|
cattr_accessor :azure_skip
|
|
8
9
|
self.azure_skip = connection_sqlserver_azure?
|
|
9
10
|
|
|
10
11
|
let(:db_tasks) { ActiveRecord::Tasks::DatabaseTasks }
|
|
11
|
-
let(:new_database) {
|
|
12
|
-
let(:default_configuration) { ARTest.
|
|
13
|
-
let(:configuration) { default_configuration.merge(
|
|
12
|
+
let(:new_database) { "activerecord_unittest_tasks" }
|
|
13
|
+
let(:default_configuration) { ARTest.test_configuration_hashes["arunit"] }
|
|
14
|
+
let(:configuration) { default_configuration.merge("database" => new_database) }
|
|
15
|
+
let(:db_config) { ActiveRecord::Base.configurations.resolve(configuration) }
|
|
14
16
|
|
|
15
|
-
before { skip
|
|
17
|
+
before { skip "on azure" if azure_skip }
|
|
16
18
|
before { disconnect! unless azure_skip }
|
|
17
19
|
after { reconnect unless azure_skip }
|
|
18
20
|
|
|
@@ -25,7 +27,7 @@ class SQLServerRakeTest < ActiveRecord::TestCase
|
|
|
25
27
|
def reconnect
|
|
26
28
|
config = default_configuration
|
|
27
29
|
if connection_sqlserver_azure?
|
|
28
|
-
ActiveRecord::Base.establish_connection(config.merge(
|
|
30
|
+
ActiveRecord::Base.establish_connection(config.merge("database" => "master"))
|
|
29
31
|
connection.drop_database(new_database) rescue nil
|
|
30
32
|
disconnect!
|
|
31
33
|
ActiveRecord::Base.establish_connection(config)
|
|
@@ -34,57 +36,51 @@ class SQLServerRakeTest < ActiveRecord::TestCase
|
|
|
34
36
|
connection.drop_database(new_database) rescue nil
|
|
35
37
|
end
|
|
36
38
|
end
|
|
37
|
-
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
class SQLServerRakeCreateTest < SQLServerRakeTest
|
|
41
|
-
|
|
42
42
|
self.azure_skip = false
|
|
43
43
|
|
|
44
|
-
it
|
|
44
|
+
it "establishes connection to database after create " do
|
|
45
45
|
quietly { db_tasks.create configuration }
|
|
46
46
|
_(connection.current_database).must_equal(new_database)
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
it
|
|
49
|
+
it "creates database with default collation" do
|
|
50
50
|
quietly { db_tasks.create configuration }
|
|
51
|
-
_(connection.collation).must_equal
|
|
51
|
+
_(connection.collation).must_equal "SQL_Latin1_General_CP1_CI_AS"
|
|
52
52
|
end
|
|
53
53
|
|
|
54
|
-
it
|
|
55
|
-
quietly { db_tasks.create configuration.merge(
|
|
56
|
-
_(connection.collation).must_equal
|
|
54
|
+
it "creates database with given collation" do
|
|
55
|
+
quietly { db_tasks.create configuration.merge("collation" => "Latin1_General_CI_AS") }
|
|
56
|
+
_(connection.collation).must_equal "Latin1_General_CI_AS"
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
it
|
|
59
|
+
it "prints error message when database exists" do
|
|
60
60
|
quietly { db_tasks.create configuration }
|
|
61
61
|
message = capture(:stderr) { db_tasks.create configuration }
|
|
62
62
|
_(message).must_match %r{activerecord_unittest_tasks.*already exists}
|
|
63
63
|
end
|
|
64
|
-
|
|
65
64
|
end
|
|
66
65
|
|
|
67
66
|
class SQLServerRakeDropTest < SQLServerRakeTest
|
|
68
|
-
|
|
69
67
|
self.azure_skip = false
|
|
70
68
|
|
|
71
|
-
it
|
|
69
|
+
it "drops database and uses master" do
|
|
72
70
|
quietly do
|
|
73
71
|
db_tasks.create configuration
|
|
74
72
|
db_tasks.drop configuration
|
|
75
73
|
end
|
|
76
|
-
_(connection.current_database).must_equal
|
|
74
|
+
_(connection.current_database).must_equal "master"
|
|
77
75
|
end
|
|
78
76
|
|
|
79
|
-
it
|
|
80
|
-
message = capture(:stderr) { db_tasks.drop configuration.merge(
|
|
77
|
+
it "prints error message when database does not exist" do
|
|
78
|
+
message = capture(:stderr) { db_tasks.drop configuration.merge("database" => "doesnotexist") }
|
|
81
79
|
_(message).must_match %r{'doesnotexist' does not exist}
|
|
82
80
|
end
|
|
83
|
-
|
|
84
81
|
end
|
|
85
82
|
|
|
86
83
|
class SQLServerRakePurgeTest < SQLServerRakeTest
|
|
87
|
-
|
|
88
84
|
before do
|
|
89
85
|
quietly { db_tasks.create(configuration) }
|
|
90
86
|
connection.create_table :users, force: true do |t|
|
|
@@ -93,43 +89,37 @@ class SQLServerRakePurgeTest < SQLServerRakeTest
|
|
|
93
89
|
end
|
|
94
90
|
end
|
|
95
91
|
|
|
96
|
-
it
|
|
92
|
+
it "clears active connections, drops database, and recreates with established connection" do
|
|
97
93
|
_(connection.current_database).must_equal(new_database)
|
|
98
|
-
_(connection.tables).must_include
|
|
94
|
+
_(connection.tables).must_include "users"
|
|
99
95
|
quietly { db_tasks.purge(configuration) }
|
|
100
96
|
_(connection.current_database).must_equal(new_database)
|
|
101
|
-
_(connection.tables).wont_include
|
|
97
|
+
_(connection.tables).wont_include "users"
|
|
102
98
|
end
|
|
103
|
-
|
|
104
99
|
end
|
|
105
100
|
|
|
106
101
|
class SQLServerRakeCharsetTest < SQLServerRakeTest
|
|
107
|
-
|
|
108
102
|
before do
|
|
109
103
|
quietly { db_tasks.create(configuration) }
|
|
110
104
|
end
|
|
111
105
|
|
|
112
|
-
it
|
|
113
|
-
_(db_tasks.charset(configuration)).must_equal
|
|
106
|
+
it "retrieves charset" do
|
|
107
|
+
_(db_tasks.charset(configuration)).must_equal "iso_1"
|
|
114
108
|
end
|
|
115
|
-
|
|
116
109
|
end
|
|
117
110
|
|
|
118
111
|
class SQLServerRakeCollationTest < SQLServerRakeTest
|
|
119
|
-
|
|
120
112
|
before do
|
|
121
113
|
quietly { db_tasks.create(configuration) }
|
|
122
114
|
end
|
|
123
115
|
|
|
124
|
-
it
|
|
125
|
-
_(db_tasks.collation(configuration)).must_equal
|
|
116
|
+
it "retrieves collation" do
|
|
117
|
+
_(db_tasks.collation(configuration)).must_equal "SQL_Latin1_General_CP1_CI_AS"
|
|
126
118
|
end
|
|
127
|
-
|
|
128
119
|
end
|
|
129
120
|
|
|
130
121
|
class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
|
|
131
|
-
|
|
132
|
-
let(:filename) { File.join ARTest::SQLServer.migrations_root, 'structure.sql' }
|
|
122
|
+
let(:filename) { File.join ARTest::SQLServer.migrations_root, "structure.sql" }
|
|
133
123
|
let(:filedata) { File.read(filename) }
|
|
134
124
|
|
|
135
125
|
before do
|
|
@@ -146,8 +136,8 @@ class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
|
|
|
146
136
|
FileUtils.rm_rf(filename)
|
|
147
137
|
end
|
|
148
138
|
|
|
149
|
-
it
|
|
150
|
-
skip
|
|
139
|
+
it "dumps structure and accounts for defncopy oddities" do
|
|
140
|
+
skip "debug defncopy on windows later" if host_windows?
|
|
151
141
|
quietly { db_tasks.structure_dump configuration, filename }
|
|
152
142
|
_(filedata).wont_match %r{\AUSE.*\z}
|
|
153
143
|
_(filedata).wont_match %r{\AGO.*\z}
|
|
@@ -156,14 +146,49 @@ class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
|
|
|
156
146
|
_(filedata).must_match %r{background2\s+text\s+}
|
|
157
147
|
end
|
|
158
148
|
|
|
159
|
-
it
|
|
160
|
-
skip
|
|
149
|
+
it "can load dumped structure" do
|
|
150
|
+
skip "debug defncopy on windows later" if host_windows?
|
|
161
151
|
quietly { db_tasks.structure_dump configuration, filename }
|
|
162
152
|
_(filedata).must_match %r{CREATE TABLE dbo\.users}
|
|
163
153
|
db_tasks.purge(configuration)
|
|
164
|
-
_(connection.tables).wont_include
|
|
165
|
-
db_tasks.load_schema
|
|
166
|
-
_(connection.tables).must_include
|
|
154
|
+
_(connection.tables).wont_include "users"
|
|
155
|
+
db_tasks.load_schema db_config, :sql, filename
|
|
156
|
+
_(connection.tables).must_include "users"
|
|
167
157
|
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
class SQLServerRakeSchemaCacheDumpLoadTest < SQLServerRakeTest
|
|
161
|
+
let(:filename) { File.join ARTest::SQLServer.test_root_sqlserver, "schema_cache.yml" }
|
|
162
|
+
let(:filedata) { File.read(filename) }
|
|
168
163
|
|
|
164
|
+
before do
|
|
165
|
+
quietly { db_tasks.create(configuration) }
|
|
166
|
+
|
|
167
|
+
connection.create_table :users, force: true do |t|
|
|
168
|
+
t.string :name, null: false
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
after do
|
|
173
|
+
FileUtils.rm_rf(filename)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
it "dumps schema cache with SQL Server metadata" do
|
|
177
|
+
quietly { db_tasks.dump_schema_cache connection, filename }
|
|
178
|
+
|
|
179
|
+
filedata = File.read(filename)
|
|
180
|
+
schema_cache = YAML.respond_to?(:unsafe_load) ? YAML.unsafe_load(filedata) : YAML.load(filedata)
|
|
181
|
+
|
|
182
|
+
col_id, col_name = connection.schema_cache.columns("users")
|
|
183
|
+
|
|
184
|
+
assert col_id.is_identity
|
|
185
|
+
assert col_id.is_primary
|
|
186
|
+
assert_equal col_id.ordinal_position, 1
|
|
187
|
+
assert_equal col_id.table_name, "users"
|
|
188
|
+
|
|
189
|
+
assert_not col_name.is_identity
|
|
190
|
+
assert_not col_name.is_primary
|
|
191
|
+
assert_equal col_name.ordinal_position, 2
|
|
192
|
+
assert_equal col_name.table_name, "users"
|
|
193
|
+
end
|
|
169
194
|
end
|