activerecord-sqlserver-adapter 5.2.1 → 6.0.2
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 +26 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +58 -20
- data/{Dockerfile → Dockerfile.ci} +1 -1
- data/Gemfile +48 -41
- data/Guardfile +9 -8
- data/README.md +28 -31
- 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 +24 -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 +3 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
- 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 +8 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +6 -4
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
- 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 +46 -8
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +210 -163
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
- 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/sql_type_metadata.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
- data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
- 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 +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
- 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/utils.rb +10 -11
- data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +145 -94
- data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
- data/lib/active_record/sqlserver_base.rb +9 -1
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
- data/lib/activerecord-sqlserver-adapter.rb +3 -1
- data/lib/arel/visitors/sqlserver.rb +108 -34
- data/lib/arel_sqlserver.rb +4 -2
- data/test/appveyor/dbsetup.ps1 +4 -4
- data/test/cases/adapter_test_sqlserver.rb +246 -171
- data/test/cases/change_column_null_test_sqlserver.rb +14 -12
- data/test/cases/coerced_tests.rb +722 -381
- data/test/cases/column_test_sqlserver.rb +287 -285
- data/test/cases/connection_test_sqlserver.rb +17 -20
- data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
- data/test/cases/fetch_test_sqlserver.rb +16 -22
- 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 +36 -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 +67 -27
- data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
- data/test/cases/order_test_sqlserver.rb +53 -54
- data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
- data/test/cases/rake_test_sqlserver.rb +33 -45
- data/test/cases/schema_dumper_test_sqlserver.rb +115 -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_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/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/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 +31 -21
- data/test/support/coerceable_test_sqlserver.rb +15 -9
- 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/minitest_sqlserver.rb +3 -1
- data/test/support/paths_sqlserver.rb +11 -11
- data/test/support/rake_helpers.rb +13 -10
- data/test/support/sql_counter_sqlserver.rb +3 -4
- data/test/support/test_in_memory_oltp.rb +9 -7
- metadata +27 -12
- data/.travis.yml +0 -25
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
require 'models/person'
|
|
3
|
-
require 'models/reader'
|
|
1
|
+
# frozen_string_literal: true
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
require "cases/helper_sqlserver"
|
|
4
|
+
require "models/person"
|
|
5
|
+
require "models/reader"
|
|
6
6
|
|
|
7
|
+
class PessimisticLockingTestSQLServer < ActiveRecord::TestCase
|
|
7
8
|
fixtures :people, :readers
|
|
8
9
|
|
|
9
10
|
before do
|
|
@@ -11,15 +12,14 @@ class PessimisticLockingTestSQLServer < ActiveRecord::TestCase
|
|
|
11
12
|
Reader.columns
|
|
12
13
|
end
|
|
13
14
|
|
|
14
|
-
it
|
|
15
|
+
it "uses with updlock by default" do
|
|
15
16
|
assert_sql %r|SELECT \[people\]\.\* FROM \[people\] WITH\(UPDLOCK\)| do
|
|
16
17
|
_(Person.lock(true).to_a).must_equal Person.all.to_a
|
|
17
18
|
end
|
|
18
19
|
end
|
|
19
20
|
|
|
20
|
-
describe
|
|
21
|
-
|
|
22
|
-
it 'lock with simple find' do
|
|
21
|
+
describe "For simple finds with default lock option" do
|
|
22
|
+
it "lock with simple find" do
|
|
23
23
|
assert_nothing_raised do
|
|
24
24
|
Person.transaction do
|
|
25
25
|
_(Person.lock(true).find(1)).must_equal Person.find(1)
|
|
@@ -27,7 +27,7 @@ class PessimisticLockingTestSQLServer < ActiveRecord::TestCase
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
it
|
|
30
|
+
it "lock with scoped find" do
|
|
31
31
|
assert_nothing_raised do
|
|
32
32
|
Person.transaction do
|
|
33
33
|
Person.lock(true).scoping do
|
|
@@ -37,8 +37,8 @@ class PessimisticLockingTestSQLServer < ActiveRecord::TestCase
|
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
it
|
|
41
|
-
|
|
40
|
+
it "lock with eager find" do
|
|
41
|
+
assert_nothing_raised do
|
|
42
42
|
Person.transaction do
|
|
43
43
|
person = Person.lock(true).includes(:readers).find(1)
|
|
44
44
|
_(person).must_equal Person.find(1)
|
|
@@ -46,62 +46,56 @@ class PessimisticLockingTestSQLServer < ActiveRecord::TestCase
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
it
|
|
49
|
+
it "can add a custom lock directive" do
|
|
50
50
|
assert_sql %r|SELECT \[people\]\.\* FROM \[people\] WITH\(HOLDLOCK, ROWLOCK\)| do
|
|
51
|
-
Person.lock(
|
|
51
|
+
Person.lock("WITH(HOLDLOCK, ROWLOCK)").load
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
describe
|
|
56
|
-
|
|
57
|
-
it 'joined tables use updlock by default' do
|
|
55
|
+
describe "joining tables" do
|
|
56
|
+
it "joined tables use updlock by default" do
|
|
58
57
|
assert_sql %r|SELECT \[people\]\.\* FROM \[people\] WITH\(UPDLOCK\) INNER JOIN \[readers\] WITH\(UPDLOCK\)\s+ON \[readers\]\.\[person_id\] = \[people\]\.\[id\]| do
|
|
59
58
|
Person.lock(true).joins(:readers).load
|
|
60
59
|
end
|
|
61
60
|
end
|
|
62
61
|
|
|
63
|
-
it
|
|
62
|
+
it "joined tables can use custom lock directive" do
|
|
64
63
|
assert_sql %r|SELECT \[people\]\.\* FROM \[people\] WITH\(NOLOCK\) INNER JOIN \[readers\] WITH\(NOLOCK\)\s+ON \[readers\]\.\[person_id\] = \[people\]\.\[id\]| do
|
|
65
|
-
Person.lock(
|
|
64
|
+
Person.lock("WITH(NOLOCK)").joins(:readers).load
|
|
66
65
|
end
|
|
67
66
|
end
|
|
68
67
|
|
|
69
|
-
it
|
|
68
|
+
it "left joined tables use updlock by default" do
|
|
70
69
|
assert_sql %r|SELECT \[people\]\.\* FROM \[people\] WITH\(UPDLOCK\) LEFT OUTER JOIN \[readers\] WITH\(UPDLOCK\)\s+ON \[readers\]\.\[person_id\] = \[people\]\.\[id\]| do
|
|
71
70
|
Person.lock(true).left_joins(:readers).load
|
|
72
71
|
end
|
|
73
72
|
end
|
|
74
73
|
|
|
75
|
-
it
|
|
74
|
+
it "left joined tables can use custom lock directive" do
|
|
76
75
|
assert_sql %r|SELECT \[people\]\.\* FROM \[people\] WITH\(NOLOCK\) LEFT OUTER JOIN \[readers\] WITH\(NOLOCK\)\s+ON \[readers\]\.\[person_id\] = \[people\]\.\[id\]| do
|
|
77
|
-
Person.lock(
|
|
76
|
+
Person.lock("WITH(NOLOCK)").left_joins(:readers).load
|
|
78
77
|
end
|
|
79
78
|
end
|
|
80
|
-
|
|
81
79
|
end
|
|
82
|
-
|
|
83
80
|
end
|
|
84
81
|
|
|
85
|
-
describe
|
|
86
|
-
|
|
82
|
+
describe "For paginated finds" do
|
|
87
83
|
before do
|
|
88
84
|
Person.delete_all
|
|
89
85
|
20.times { |n| Person.create!(first_name: "Thing_#{n}") }
|
|
90
86
|
end
|
|
91
87
|
|
|
92
|
-
it
|
|
88
|
+
it "copes with eager loading un-locked paginated" do
|
|
93
89
|
eager_ids_sql = /SELECT\s+DISTINCT \[people\].\[id\] FROM \[people\] WITH\(UPDLOCK\) LEFT OUTER JOIN \[readers\] WITH\(UPDLOCK\)\s+ON \[readers\].\[person_id\] = \[people\].\[id\]\s+ORDER BY \[people\].\[id\] ASC OFFSET @0 ROWS FETCH NEXT @1 ROWS ONLY/
|
|
94
90
|
loader_sql = /SELECT.*FROM \[people\] WITH\(UPDLOCK\).*WHERE \[people\]\.\[id\] IN/
|
|
95
91
|
assert_sql(eager_ids_sql, loader_sql) do
|
|
96
92
|
people = Person.lock(true).limit(5).offset(10).includes(:readers).references(:readers).to_a
|
|
97
|
-
_(people[0].first_name).must_equal
|
|
98
|
-
_(people[1].first_name).must_equal
|
|
99
|
-
_(people[2].first_name).must_equal
|
|
100
|
-
_(people[3].first_name).must_equal
|
|
101
|
-
_(people[4].first_name).must_equal
|
|
93
|
+
_(people[0].first_name).must_equal "Thing_10"
|
|
94
|
+
_(people[1].first_name).must_equal "Thing_11"
|
|
95
|
+
_(people[2].first_name).must_equal "Thing_12"
|
|
96
|
+
_(people[3].first_name).must_equal "Thing_13"
|
|
97
|
+
_(people[4].first_name).must_equal "Thing_14"
|
|
102
98
|
end
|
|
103
99
|
end
|
|
104
|
-
|
|
105
100
|
end
|
|
106
|
-
|
|
107
101
|
end
|
|
@@ -1,18 +1,19 @@
|
|
|
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.connection_config[
|
|
13
|
-
let(:configuration) { default_configuration.merge(
|
|
12
|
+
let(:new_database) { "activerecord_unittest_tasks" }
|
|
13
|
+
let(:default_configuration) { ARTest.connection_config["arunit"] }
|
|
14
|
+
let(:configuration) { default_configuration.merge("database" => new_database) }
|
|
14
15
|
|
|
15
|
-
before { skip
|
|
16
|
+
before { skip "on azure" if azure_skip }
|
|
16
17
|
before { disconnect! unless azure_skip }
|
|
17
18
|
after { reconnect unless azure_skip }
|
|
18
19
|
|
|
@@ -25,7 +26,7 @@ class SQLServerRakeTest < ActiveRecord::TestCase
|
|
|
25
26
|
def reconnect
|
|
26
27
|
config = default_configuration
|
|
27
28
|
if connection_sqlserver_azure?
|
|
28
|
-
ActiveRecord::Base.establish_connection(config.merge(
|
|
29
|
+
ActiveRecord::Base.establish_connection(config.merge("database" => "master"))
|
|
29
30
|
connection.drop_database(new_database) rescue nil
|
|
30
31
|
disconnect!
|
|
31
32
|
ActiveRecord::Base.establish_connection(config)
|
|
@@ -34,57 +35,51 @@ class SQLServerRakeTest < ActiveRecord::TestCase
|
|
|
34
35
|
connection.drop_database(new_database) rescue nil
|
|
35
36
|
end
|
|
36
37
|
end
|
|
37
|
-
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
class SQLServerRakeCreateTest < SQLServerRakeTest
|
|
41
|
-
|
|
42
41
|
self.azure_skip = false
|
|
43
42
|
|
|
44
|
-
it
|
|
43
|
+
it "establishes connection to database after create " do
|
|
45
44
|
quietly { db_tasks.create configuration }
|
|
46
45
|
_(connection.current_database).must_equal(new_database)
|
|
47
46
|
end
|
|
48
47
|
|
|
49
|
-
it
|
|
48
|
+
it "creates database with default collation" do
|
|
50
49
|
quietly { db_tasks.create configuration }
|
|
51
|
-
_(connection.collation).must_equal
|
|
50
|
+
_(connection.collation).must_equal "SQL_Latin1_General_CP1_CI_AS"
|
|
52
51
|
end
|
|
53
52
|
|
|
54
|
-
it
|
|
55
|
-
quietly { db_tasks.create configuration.merge(
|
|
56
|
-
_(connection.collation).must_equal
|
|
53
|
+
it "creates database with given collation" do
|
|
54
|
+
quietly { db_tasks.create configuration.merge("collation" => "Latin1_General_CI_AS") }
|
|
55
|
+
_(connection.collation).must_equal "Latin1_General_CI_AS"
|
|
57
56
|
end
|
|
58
57
|
|
|
59
|
-
it
|
|
58
|
+
it "prints error message when database exists" do
|
|
60
59
|
quietly { db_tasks.create configuration }
|
|
61
60
|
message = capture(:stderr) { db_tasks.create configuration }
|
|
62
61
|
_(message).must_match %r{activerecord_unittest_tasks.*already exists}
|
|
63
62
|
end
|
|
64
|
-
|
|
65
63
|
end
|
|
66
64
|
|
|
67
65
|
class SQLServerRakeDropTest < SQLServerRakeTest
|
|
68
|
-
|
|
69
66
|
self.azure_skip = false
|
|
70
67
|
|
|
71
|
-
it
|
|
68
|
+
it "drops database and uses master" do
|
|
72
69
|
quietly do
|
|
73
70
|
db_tasks.create configuration
|
|
74
71
|
db_tasks.drop configuration
|
|
75
72
|
end
|
|
76
|
-
_(connection.current_database).must_equal
|
|
73
|
+
_(connection.current_database).must_equal "master"
|
|
77
74
|
end
|
|
78
75
|
|
|
79
|
-
it
|
|
80
|
-
message = capture(:stderr) { db_tasks.drop configuration.merge(
|
|
76
|
+
it "prints error message when database does not exist" do
|
|
77
|
+
message = capture(:stderr) { db_tasks.drop configuration.merge("database" => "doesnotexist") }
|
|
81
78
|
_(message).must_match %r{'doesnotexist' does not exist}
|
|
82
79
|
end
|
|
83
|
-
|
|
84
80
|
end
|
|
85
81
|
|
|
86
82
|
class SQLServerRakePurgeTest < SQLServerRakeTest
|
|
87
|
-
|
|
88
83
|
before do
|
|
89
84
|
quietly { db_tasks.create(configuration) }
|
|
90
85
|
connection.create_table :users, force: true do |t|
|
|
@@ -93,43 +88,37 @@ class SQLServerRakePurgeTest < SQLServerRakeTest
|
|
|
93
88
|
end
|
|
94
89
|
end
|
|
95
90
|
|
|
96
|
-
it
|
|
91
|
+
it "clears active connections, drops database, and recreates with established connection" do
|
|
97
92
|
_(connection.current_database).must_equal(new_database)
|
|
98
|
-
_(connection.tables).must_include
|
|
93
|
+
_(connection.tables).must_include "users"
|
|
99
94
|
quietly { db_tasks.purge(configuration) }
|
|
100
95
|
_(connection.current_database).must_equal(new_database)
|
|
101
|
-
_(connection.tables).wont_include
|
|
96
|
+
_(connection.tables).wont_include "users"
|
|
102
97
|
end
|
|
103
|
-
|
|
104
98
|
end
|
|
105
99
|
|
|
106
100
|
class SQLServerRakeCharsetTest < SQLServerRakeTest
|
|
107
|
-
|
|
108
101
|
before do
|
|
109
102
|
quietly { db_tasks.create(configuration) }
|
|
110
103
|
end
|
|
111
104
|
|
|
112
|
-
it
|
|
113
|
-
_(db_tasks.charset(configuration)).must_equal
|
|
105
|
+
it "retrieves charset" do
|
|
106
|
+
_(db_tasks.charset(configuration)).must_equal "iso_1"
|
|
114
107
|
end
|
|
115
|
-
|
|
116
108
|
end
|
|
117
109
|
|
|
118
110
|
class SQLServerRakeCollationTest < SQLServerRakeTest
|
|
119
|
-
|
|
120
111
|
before do
|
|
121
112
|
quietly { db_tasks.create(configuration) }
|
|
122
113
|
end
|
|
123
114
|
|
|
124
|
-
it
|
|
125
|
-
_(db_tasks.collation(configuration)).must_equal
|
|
115
|
+
it "retrieves collation" do
|
|
116
|
+
_(db_tasks.collation(configuration)).must_equal "SQL_Latin1_General_CP1_CI_AS"
|
|
126
117
|
end
|
|
127
|
-
|
|
128
118
|
end
|
|
129
119
|
|
|
130
120
|
class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
|
|
131
|
-
|
|
132
|
-
let(:filename) { File.join ARTest::SQLServer.migrations_root, 'structure.sql' }
|
|
121
|
+
let(:filename) { File.join ARTest::SQLServer.migrations_root, "structure.sql" }
|
|
133
122
|
let(:filedata) { File.read(filename) }
|
|
134
123
|
|
|
135
124
|
before do
|
|
@@ -146,8 +135,8 @@ class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
|
|
|
146
135
|
FileUtils.rm_rf(filename)
|
|
147
136
|
end
|
|
148
137
|
|
|
149
|
-
it
|
|
150
|
-
skip
|
|
138
|
+
it "dumps structure and accounts for defncopy oddities" do
|
|
139
|
+
skip "debug defncopy on windows later" if host_windows?
|
|
151
140
|
quietly { db_tasks.structure_dump configuration, filename }
|
|
152
141
|
_(filedata).wont_match %r{\AUSE.*\z}
|
|
153
142
|
_(filedata).wont_match %r{\AGO.*\z}
|
|
@@ -156,14 +145,13 @@ class SQLServerRakeStructureDumpLoadTest < SQLServerRakeTest
|
|
|
156
145
|
_(filedata).must_match %r{background2\s+text\s+}
|
|
157
146
|
end
|
|
158
147
|
|
|
159
|
-
it
|
|
160
|
-
skip
|
|
148
|
+
it "can load dumped structure" do
|
|
149
|
+
skip "debug defncopy on windows later" if host_windows?
|
|
161
150
|
quietly { db_tasks.structure_dump configuration, filename }
|
|
162
151
|
_(filedata).must_match %r{CREATE TABLE dbo\.users}
|
|
163
152
|
db_tasks.purge(configuration)
|
|
164
|
-
_(connection.tables).wont_include
|
|
153
|
+
_(connection.tables).wont_include "users"
|
|
165
154
|
db_tasks.load_schema configuration, :sql, filename
|
|
166
|
-
_(connection.tables).must_include
|
|
155
|
+
_(connection.tables).must_include "users"
|
|
167
156
|
end
|
|
168
|
-
|
|
169
157
|
end
|
|
@@ -1,144 +1,150 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require "cases/helper_sqlserver"
|
|
4
4
|
|
|
5
|
+
class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
5
6
|
before { all_tables }
|
|
6
7
|
|
|
7
8
|
let(:all_tables) { ActiveRecord::Base.connection.tables }
|
|
8
9
|
let(:schema) { @generated_schema }
|
|
9
10
|
|
|
10
|
-
it
|
|
11
|
-
generate_schema_for_table
|
|
12
|
-
assert_line :bigint, type:
|
|
13
|
-
assert_line :int, type:
|
|
14
|
-
assert_line :smallint, type:
|
|
15
|
-
assert_line :tinyint, type:
|
|
16
|
-
assert_line :bit, type:
|
|
17
|
-
assert_line :decimal_9_2, type:
|
|
18
|
-
assert_line :numeric_18_0, type:
|
|
19
|
-
assert_line :numeric_36_2, type:
|
|
20
|
-
assert_line :money, type:
|
|
21
|
-
assert_line :smallmoney, type:
|
|
11
|
+
it "sst_datatypes" do
|
|
12
|
+
generate_schema_for_table "sst_datatypes"
|
|
13
|
+
assert_line :bigint, type: "bigint", limit: nil, precision: nil, scale: nil, default: 42
|
|
14
|
+
assert_line :int, type: "integer", limit: nil, precision: nil, scale: nil, default: 42
|
|
15
|
+
assert_line :smallint, type: "integer", limit: 2, precision: nil, scale: nil, default: 42
|
|
16
|
+
assert_line :tinyint, type: "integer", limit: 1, precision: nil, scale: nil, default: 42
|
|
17
|
+
assert_line :bit, type: "boolean", limit: nil, precision: nil, scale: nil, default: true
|
|
18
|
+
assert_line :decimal_9_2, type: "decimal", limit: nil, precision: 9, scale: 2, default: 12345.01
|
|
19
|
+
assert_line :numeric_18_0, type: "decimal", limit: nil, precision: 18, scale: nil, default: 191
|
|
20
|
+
assert_line :numeric_36_2, type: "decimal", limit: nil, precision: 36, scale: 2, default: 12345678901234567890.01
|
|
21
|
+
assert_line :money, type: "money", limit: nil, precision: 19, scale: 4, default: 4.2
|
|
22
|
+
assert_line :smallmoney, type: "smallmoney", limit: nil, precision: 10, scale: 4, default: 4.2
|
|
22
23
|
# Approximate Numerics
|
|
23
|
-
assert_line :float, type:
|
|
24
|
-
assert_line :real, type:
|
|
24
|
+
assert_line :float, type: "float", limit: nil, precision: nil, scale: nil, default: 123.00000001
|
|
25
|
+
assert_line :real, type: "real", limit: nil, precision: nil, scale: nil, default: 123.45
|
|
25
26
|
# Date and Time
|
|
26
|
-
assert_line :date, type:
|
|
27
|
-
assert_line :datetime, type:
|
|
27
|
+
assert_line :date, type: "date", limit: nil, precision: nil, scale: nil, default: "01-01-0001"
|
|
28
|
+
assert_line :datetime, type: "datetime", limit: nil, precision: nil, scale: nil, default: "01-01-1753 00:00:00.123"
|
|
28
29
|
if connection_dblib_73?
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
assert_line :datetime2_7, type: "datetime", limit: nil, precision: 7, scale: nil, default: "12-31-9999 23:59:59.9999999"
|
|
31
|
+
assert_line :datetime2_3, type: "datetime", limit: nil, precision: 3, scale: nil, default: nil
|
|
32
|
+
assert_line :datetime2_1, type: "datetime", limit: nil, precision: 1, scale: nil, default: nil
|
|
32
33
|
end
|
|
33
|
-
assert_line :smalldatetime,
|
|
34
|
+
assert_line :smalldatetime, type: "smalldatetime", limit: nil, precision: nil, scale: nil, default: "01-01-1901 15:45:00.0"
|
|
34
35
|
if connection_dblib_73?
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
assert_line :time_7, type: "time", limit: nil, precision: 7, scale: nil, default: "04:20:00.2883215"
|
|
37
|
+
assert_line :time_2, type: "time", limit: nil, precision: 2, scale: nil, default: nil
|
|
38
|
+
assert_line :time_default, type: "time", limit: nil, precision: 7, scale: nil, default: "15:03:42.0621978"
|
|
38
39
|
end
|
|
39
40
|
# Character Strings
|
|
40
|
-
assert_line :char_10, type:
|
|
41
|
-
assert_line :varchar_50, type:
|
|
42
|
-
assert_line :varchar_max, type:
|
|
43
|
-
assert_line :text, type:
|
|
41
|
+
assert_line :char_10, type: "char", limit: 10, precision: nil, scale: nil, default: "1234567890", collation: nil
|
|
42
|
+
assert_line :varchar_50, type: "varchar", limit: 50, precision: nil, scale: nil, default: "test varchar_50", collation: nil
|
|
43
|
+
assert_line :varchar_max, type: "varchar_max", limit: nil, precision: nil, scale: nil, default: "test varchar_max", collation: nil
|
|
44
|
+
assert_line :text, type: "text_basic", limit: nil, precision: nil, scale: nil, default: "test text", collation: nil
|
|
44
45
|
# Unicode Character Strings
|
|
45
|
-
assert_line :nchar_10, type:
|
|
46
|
-
assert_line :nvarchar_50, type:
|
|
47
|
-
assert_line :nvarchar_max, type:
|
|
48
|
-
assert_line :ntext, type:
|
|
46
|
+
assert_line :nchar_10, type: "nchar", limit: 10, precision: nil, scale: nil, default: "12345678åå", collation: nil
|
|
47
|
+
assert_line :nvarchar_50, type: "string", limit: 50, precision: nil, scale: nil, default: "test nvarchar_50 åå", collation: nil
|
|
48
|
+
assert_line :nvarchar_max, type: "text", limit: nil, precision: nil, scale: nil, default: "test nvarchar_max åå", collation: nil
|
|
49
|
+
assert_line :ntext, type: "ntext", limit: nil, precision: nil, scale: nil, default: "test ntext åå", collation: nil
|
|
49
50
|
# Binary Strings
|
|
50
|
-
assert_line :binary_49, type:
|
|
51
|
-
assert_line :varbinary_49, type:
|
|
52
|
-
assert_line :varbinary_max, type:
|
|
51
|
+
assert_line :binary_49, type: "binary_basic", limit: 49, precision: nil, scale: nil, default: nil
|
|
52
|
+
assert_line :varbinary_49, type: "varbinary", limit: 49, precision: nil, scale: nil, default: nil
|
|
53
|
+
assert_line :varbinary_max, type: "binary", limit: nil, precision: nil, scale: nil, default: nil
|
|
53
54
|
# Other Data Types
|
|
54
|
-
assert_line :uniqueidentifier, type:
|
|
55
|
-
assert_line :timestamp, type:
|
|
55
|
+
assert_line :uniqueidentifier, type: "uuid", limit: nil, precision: nil, scale: nil, default: -> { "newid()" }
|
|
56
|
+
assert_line :timestamp, type: "ss_timestamp", limit: nil, precision: nil, scale: nil, default: nil
|
|
56
57
|
end
|
|
57
58
|
|
|
58
|
-
it
|
|
59
|
+
it "sst_datatypes_migration" do
|
|
59
60
|
columns = SSTestDatatypeMigration.columns_hash
|
|
60
|
-
generate_schema_for_table
|
|
61
|
+
generate_schema_for_table "sst_datatypes_migration"
|
|
61
62
|
# Simple Rails conventions
|
|
62
|
-
_(columns[
|
|
63
|
-
_(columns[
|
|
64
|
-
_(columns[
|
|
65
|
-
_(columns[
|
|
66
|
-
_(columns[
|
|
67
|
-
_(columns[
|
|
68
|
-
_(columns[
|
|
69
|
-
_(columns[
|
|
70
|
-
_(columns[
|
|
71
|
-
_(columns[
|
|
72
|
-
_(columns[
|
|
73
|
-
_(columns[
|
|
74
|
-
assert_line :integer_col, type:
|
|
75
|
-
assert_line :bigint_col, type:
|
|
76
|
-
assert_line :boolean_col, type:
|
|
77
|
-
assert_line :decimal_col, type:
|
|
78
|
-
assert_line :float_col, type:
|
|
79
|
-
assert_line :string_col, type:
|
|
80
|
-
assert_line :text_col, type:
|
|
81
|
-
assert_line :datetime_col, type:
|
|
82
|
-
assert_line :timestamp_col, type:
|
|
83
|
-
assert_line :time_col, type:
|
|
84
|
-
assert_line :date_col, type:
|
|
85
|
-
assert_line :binary_col, type:
|
|
63
|
+
_(columns["integer_col"].sql_type).must_equal "int(4)"
|
|
64
|
+
_(columns["bigint_col"].sql_type).must_equal "bigint(8)"
|
|
65
|
+
_(columns["boolean_col"].sql_type).must_equal "bit"
|
|
66
|
+
_(columns["decimal_col"].sql_type).must_equal "decimal(18,0)"
|
|
67
|
+
_(columns["float_col"].sql_type).must_equal "float"
|
|
68
|
+
_(columns["string_col"].sql_type).must_equal "nvarchar(4000)"
|
|
69
|
+
_(columns["text_col"].sql_type).must_equal "nvarchar(max)"
|
|
70
|
+
_(columns["datetime_col"].sql_type).must_equal "datetime"
|
|
71
|
+
_(columns["timestamp_col"].sql_type).must_equal "datetime"
|
|
72
|
+
_(columns["time_col"].sql_type).must_equal "time(7)"
|
|
73
|
+
_(columns["date_col"].sql_type).must_equal "date"
|
|
74
|
+
_(columns["binary_col"].sql_type).must_equal "varbinary(max)"
|
|
75
|
+
assert_line :integer_col, type: "integer", limit: nil, precision: nil, scale: nil, default: nil
|
|
76
|
+
assert_line :bigint_col, type: "bigint", limit: nil, precision: nil, scale: nil, default: nil
|
|
77
|
+
assert_line :boolean_col, type: "boolean", limit: nil, precision: nil, scale: nil, default: nil
|
|
78
|
+
assert_line :decimal_col, type: "decimal", limit: nil, precision: 18, scale: nil, default: nil
|
|
79
|
+
assert_line :float_col, type: "float", limit: nil, precision: nil, scale: nil, default: nil
|
|
80
|
+
assert_line :string_col, type: "string", limit: nil, precision: nil, scale: nil, default: nil
|
|
81
|
+
assert_line :text_col, type: "text", limit: nil, precision: nil, scale: nil, default: nil
|
|
82
|
+
assert_line :datetime_col, type: "datetime", limit: nil, precision: nil, scale: nil, default: nil
|
|
83
|
+
assert_line :timestamp_col, type: "datetime", limit: nil, precision: nil, scale: nil, default: nil
|
|
84
|
+
assert_line :time_col, type: "time", limit: nil, precision: 7, scale: nil, default: nil
|
|
85
|
+
assert_line :date_col, type: "date", limit: nil, precision: nil, scale: nil, default: nil
|
|
86
|
+
assert_line :binary_col, type: "binary", limit: nil, precision: nil, scale: nil, default: nil
|
|
86
87
|
# Our type methods.
|
|
87
|
-
_(columns[
|
|
88
|
-
_(columns[
|
|
89
|
-
_(columns[
|
|
90
|
-
_(columns[
|
|
91
|
-
_(columns[
|
|
92
|
-
_(columns[
|
|
93
|
-
_(columns[
|
|
94
|
-
_(columns[
|
|
95
|
-
_(columns[
|
|
96
|
-
_(columns[
|
|
97
|
-
_(columns[
|
|
98
|
-
_(columns[
|
|
99
|
-
_(columns[
|
|
100
|
-
_(columns[
|
|
101
|
-
_(columns[
|
|
102
|
-
_(columns[
|
|
103
|
-
assert_line :real_col, type:
|
|
104
|
-
assert_line :money_col, type:
|
|
105
|
-
assert_line :smalldatetime_col, type:
|
|
106
|
-
assert_line :datetime2_col, type:
|
|
107
|
-
assert_line :datetimeoffset, type:
|
|
108
|
-
assert_line :smallmoney_col, type:
|
|
109
|
-
assert_line :char_col, type:
|
|
110
|
-
assert_line :varchar_col, type:
|
|
111
|
-
assert_line :text_basic_col, type:
|
|
112
|
-
assert_line :nchar_col, type:
|
|
113
|
-
assert_line :ntext_col, type:
|
|
114
|
-
assert_line :binary_basic_col, type:
|
|
115
|
-
assert_line :varbinary_col, type:
|
|
116
|
-
assert_line :uuid_col, type:
|
|
117
|
-
assert_line :sstimestamp_col, type:
|
|
118
|
-
assert_line :json_col, type:
|
|
88
|
+
_(columns["real_col"].sql_type).must_equal "real"
|
|
89
|
+
_(columns["money_col"].sql_type).must_equal "money"
|
|
90
|
+
_(columns["smalldatetime_col"].sql_type).must_equal "smalldatetime"
|
|
91
|
+
_(columns["datetime2_col"].sql_type).must_equal "datetime2(7)"
|
|
92
|
+
_(columns["datetimeoffset"].sql_type).must_equal "datetimeoffset(7)"
|
|
93
|
+
_(columns["smallmoney_col"].sql_type).must_equal "smallmoney"
|
|
94
|
+
_(columns["char_col"].sql_type).must_equal "char(1)"
|
|
95
|
+
_(columns["varchar_col"].sql_type).must_equal "varchar(8000)"
|
|
96
|
+
_(columns["text_basic_col"].sql_type).must_equal "text"
|
|
97
|
+
_(columns["nchar_col"].sql_type).must_equal "nchar(1)"
|
|
98
|
+
_(columns["ntext_col"].sql_type).must_equal "ntext"
|
|
99
|
+
_(columns["binary_basic_col"].sql_type).must_equal "binary(1)"
|
|
100
|
+
_(columns["varbinary_col"].sql_type).must_equal "varbinary(8000)"
|
|
101
|
+
_(columns["uuid_col"].sql_type).must_equal "uniqueidentifier"
|
|
102
|
+
_(columns["sstimestamp_col"].sql_type).must_equal "timestamp"
|
|
103
|
+
_(columns["json_col"].sql_type).must_equal "nvarchar(max)"
|
|
104
|
+
assert_line :real_col, type: "real", limit: nil, precision: nil, scale: nil, default: nil
|
|
105
|
+
assert_line :money_col, type: "money", limit: nil, precision: 19, scale: 4, default: nil
|
|
106
|
+
assert_line :smalldatetime_col, type: "smalldatetime", limit: nil, precision: nil, scale: nil, default: nil
|
|
107
|
+
assert_line :datetime2_col, type: "datetime", limit: nil, precision: 7, scale: nil, default: nil
|
|
108
|
+
assert_line :datetimeoffset, type: "datetimeoffset", limit: nil, precision: 7, scale: nil, default: nil
|
|
109
|
+
assert_line :smallmoney_col, type: "smallmoney", limit: nil, precision: 10, scale: 4, default: nil
|
|
110
|
+
assert_line :char_col, type: "char", limit: 1, precision: nil, scale: nil, default: nil
|
|
111
|
+
assert_line :varchar_col, type: "varchar", limit: nil, precision: nil, scale: nil, default: nil
|
|
112
|
+
assert_line :text_basic_col, type: "text_basic", limit: nil, precision: nil, scale: nil, default: nil
|
|
113
|
+
assert_line :nchar_col, type: "nchar", limit: 1, precision: nil, scale: nil, default: nil
|
|
114
|
+
assert_line :ntext_col, type: "ntext", limit: nil, precision: nil, scale: nil, default: nil
|
|
115
|
+
assert_line :binary_basic_col, type: "binary_basic", limit: 1, precision: nil, scale: nil, default: nil
|
|
116
|
+
assert_line :varbinary_col, type: "varbinary", limit: nil, precision: nil, scale: nil, default: nil
|
|
117
|
+
assert_line :uuid_col, type: "uuid", limit: nil, precision: nil, scale: nil, default: nil
|
|
118
|
+
assert_line :sstimestamp_col, type: "ss_timestamp", limit: nil, precision: nil, scale: nil, default: nil
|
|
119
|
+
assert_line :json_col, type: "text", limit: nil, precision: nil, scale: nil, default: nil
|
|
119
120
|
end
|
|
120
121
|
|
|
121
122
|
# Special Cases
|
|
122
123
|
|
|
123
|
-
it
|
|
124
|
-
generate_schema_for_table(
|
|
124
|
+
it "honor nonstandard primary keys" do
|
|
125
|
+
generate_schema_for_table("movies") do |output|
|
|
125
126
|
match = output.match(%r{create_table "movies"(.*)do})
|
|
126
127
|
assert_not_nil(match, "nonstandardpk table not found")
|
|
127
128
|
assert_match %r(primary_key: "movieid"), match[1], "non-standard primary key not preserved"
|
|
128
129
|
end
|
|
129
130
|
end
|
|
130
131
|
|
|
131
|
-
it
|
|
132
|
-
output = generate_schema_for_table
|
|
132
|
+
it "no id with model driven primary key" do
|
|
133
|
+
output = generate_schema_for_table "sst_no_pk_data"
|
|
133
134
|
_(output).must_match %r{create_table "sst_no_pk_data".*id:\sfalse.*do}
|
|
134
|
-
assert_line :name, type:
|
|
135
|
+
assert_line :name, type: "string", limit: nil, default: nil, collation: nil
|
|
135
136
|
end
|
|
136
137
|
|
|
138
|
+
it "dumps field with unique key constraints only once" do
|
|
139
|
+
output = generate_schema_for_table "unique_key_dumped_table"
|
|
140
|
+
|
|
141
|
+
_(output.scan('t.integer "unique_field"').length).must_equal(1)
|
|
142
|
+
end
|
|
137
143
|
|
|
138
144
|
private
|
|
139
145
|
|
|
140
146
|
def generate_schema_for_table(*table_names)
|
|
141
|
-
require
|
|
147
|
+
require "stringio"
|
|
142
148
|
stream = StringIO.new
|
|
143
149
|
ActiveRecord::SchemaDumper.ignore_tables = all_tables - table_names
|
|
144
150
|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
|
|
@@ -148,6 +154,7 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
|
148
154
|
type_matcher = /\A\s+t\.\w+\s+"(.*?)"[,\n]/
|
|
149
155
|
@generated_schema.each_line do |line|
|
|
150
156
|
next unless line =~ type_matcher
|
|
157
|
+
|
|
151
158
|
@schema_lines[Regexp.last_match[1]] = SchemaLine.new(line)
|
|
152
159
|
end
|
|
153
160
|
@generated_schema
|
|
@@ -157,18 +164,21 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
|
157
164
|
@schema_lines[column_name.to_s]
|
|
158
165
|
end
|
|
159
166
|
|
|
160
|
-
def assert_line(column_name, options={})
|
|
167
|
+
def assert_line(column_name, options = {})
|
|
161
168
|
line = line(column_name)
|
|
162
|
-
assert line, "
|
|
169
|
+
assert line, "Could not find line with column name: #{column_name.inspect} in schema:\n#{schema}"
|
|
170
|
+
|
|
163
171
|
[:type, :limit, :precision, :scale, :collation, :default].each do |key|
|
|
164
172
|
next unless options.key?(key)
|
|
173
|
+
|
|
165
174
|
actual = key == :type ? line.send(:type_method) : line.send(key)
|
|
166
175
|
expected = options[key]
|
|
167
176
|
message = "#{key.to_s.titleize} of #{expected.inspect} not found in:\n#{line}"
|
|
177
|
+
|
|
168
178
|
if expected.nil?
|
|
169
179
|
_(actual).must_be_nil message
|
|
170
180
|
elsif expected.is_a?(Array)
|
|
171
|
-
actual.must_include expected, message
|
|
181
|
+
_(actual).must_include expected, message
|
|
172
182
|
elsif expected.is_a?(Float)
|
|
173
183
|
_(actual).must_be_close_to expected, 0.001
|
|
174
184
|
elsif expected.is_a?(Proc)
|
|
@@ -180,7 +190,6 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
|
180
190
|
end
|
|
181
191
|
|
|
182
192
|
class SchemaLine
|
|
183
|
-
|
|
184
193
|
LINE_PARSER = %r{t\.(\w+)\s+"(.*?)"[,\s+](.*)}
|
|
185
194
|
|
|
186
195
|
attr_reader :line,
|
|
@@ -228,8 +237,5 @@ class SchemaDumperTestSQLServer < ActiveRecord::TestCase
|
|
|
228
237
|
rescue SyntaxError
|
|
229
238
|
{}
|
|
230
239
|
end
|
|
231
|
-
|
|
232
240
|
end
|
|
233
|
-
|
|
234
241
|
end
|
|
235
|
-
|