activerecord-sqlserver-adapter 6.0.0.rc1 → 6.1.0.0.rc1
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/.github/workflows/ci.yml +26 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +18 -23
- data/Gemfile +11 -5
- data/Guardfile +9 -8
- data/README.md +32 -3
- data/RUNNING_UNIT_TESTS.md +1 -1
- data/Rakefile +12 -16
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +4 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +0 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +1 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +3 -13
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +8 -5
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +0 -4
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +58 -43
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +7 -12
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +0 -3
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +15 -15
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +22 -3
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -10
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +131 -105
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +6 -8
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +1 -1
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +25 -7
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +1 -5
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +6 -10
- data/lib/active_record/connection_adapters/sqlserver/type.rb +36 -35
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +0 -1
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +6 -9
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +1 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +1 -2
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +1 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +1 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +8 -11
- data/lib/active_record/connection_adapters/sqlserver/version.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +170 -136
- data/lib/active_record/connection_adapters/sqlserver_column.rb +16 -1
- data/lib/active_record/sqlserver_base.rb +9 -15
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +36 -39
- data/lib/activerecord-sqlserver-adapter.rb +1 -1
- data/lib/arel/visitors/sqlserver.rb +126 -50
- data/lib/arel_sqlserver.rb +2 -2
- data/test/cases/adapter_test_sqlserver.rb +203 -190
- data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
- data/test/cases/change_column_null_test_sqlserver.rb +12 -12
- data/test/cases/coerced_tests.rb +656 -318
- data/test/cases/column_test_sqlserver.rb +285 -284
- data/test/cases/connection_test_sqlserver.rb +15 -20
- data/test/cases/disconnected_test_sqlserver.rb +39 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +26 -19
- data/test/cases/fetch_test_sqlserver.rb +14 -22
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +12 -18
- data/test/cases/helper_sqlserver.rb +13 -15
- data/test/cases/in_clause_test_sqlserver.rb +36 -9
- data/test/cases/index_test_sqlserver.rb +13 -15
- data/test/cases/json_test_sqlserver.rb +23 -25
- data/test/cases/lateral_test_sqlserver.rb +35 -0
- data/test/cases/migration_test_sqlserver.rb +71 -26
- data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
- data/test/cases/order_test_sqlserver.rb +57 -53
- data/test/cases/pessimistic_locking_test_sqlserver.rb +25 -33
- data/test/cases/primary_keys_test_sqlserver.rb +103 -0
- data/test/cases/rake_test_sqlserver.rb +33 -46
- data/test/cases/schema_dumper_test_sqlserver.rb +121 -108
- data/test/cases/schema_test_sqlserver.rb +18 -26
- data/test/cases/scratchpad_test_sqlserver.rb +2 -4
- data/test/cases/showplan_test_sqlserver.rb +24 -33
- data/test/cases/specific_schema_test_sqlserver.rb +66 -65
- data/test/cases/transaction_test_sqlserver.rb +16 -19
- data/test/cases/trigger_test_sqlserver.rb +12 -12
- data/test/cases/utils_test_sqlserver.rb +68 -70
- data/test/cases/uuid_test_sqlserver.rb +11 -13
- data/test/debug.rb +6 -6
- data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
- data/test/migrations/create_clients_and_change_column_null.rb +1 -1
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +2 -4
- data/test/models/sqlserver/booking.rb +1 -1
- data/test/models/sqlserver/customers_view.rb +1 -1
- data/test/models/sqlserver/dollar_table_name.rb +1 -1
- data/test/models/sqlserver/edge_schema.rb +1 -3
- data/test/models/sqlserver/fk_has_fk.rb +1 -1
- data/test/models/sqlserver/fk_has_pk.rb +1 -1
- data/test/models/sqlserver/natural_pk_data.rb +2 -2
- data/test/models/sqlserver/natural_pk_int_data.rb +1 -1
- data/test/models/sqlserver/no_pk_data.rb +1 -1
- data/test/models/sqlserver/object_default.rb +1 -1
- data/test/models/sqlserver/quoted_table.rb +2 -2
- data/test/models/sqlserver/quoted_view_1.rb +1 -1
- data/test/models/sqlserver/quoted_view_2.rb +1 -1
- data/test/models/sqlserver/sst_memory.rb +1 -1
- data/test/models/sqlserver/sst_string_collation.rb +3 -0
- data/test/models/sqlserver/string_default.rb +1 -1
- data/test/models/sqlserver/string_defaults_big_view.rb +1 -1
- data/test/models/sqlserver/string_defaults_view.rb +1 -1
- data/test/models/sqlserver/tinyint_pk.rb +1 -1
- data/test/models/sqlserver/trigger.rb +2 -2
- data/test/models/sqlserver/trigger_history.rb +1 -1
- data/test/models/sqlserver/upper.rb +1 -1
- data/test/models/sqlserver/uppered.rb +1 -1
- data/test/models/sqlserver/uuid.rb +1 -1
- data/test/schema/sqlserver_specific_schema.rb +36 -21
- data/test/support/coerceable_test_sqlserver.rb +1 -4
- data/test/support/connection_reflection.rb +1 -2
- data/test/support/core_ext/query_cache.rb +1 -1
- data/test/support/load_schema_sqlserver.rb +3 -5
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_0_topic_associations.dump +0 -0
- data/test/support/minitest_sqlserver.rb +1 -1
- data/test/support/paths_sqlserver.rb +9 -11
- data/test/support/rake_helpers.rb +12 -10
- data/test/support/sql_counter_sqlserver.rb +14 -16
- data/test/support/test_in_memory_oltp.rb +7 -7
- metadata +31 -11
- data/.travis.yml +0 -23
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "cases/helper_sqlserver"
|
|
4
4
|
|
|
5
5
|
class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
assert
|
|
9
|
-
assert SSTestCustomersView.columns.all? { |c| c.table_name == 'customers' }
|
|
6
|
+
it "#table_name" do
|
|
7
|
+
assert SSTestDatatype.columns.all? { |c| c.table_name == "sst_datatypes" }
|
|
8
|
+
assert SSTestCustomersView.columns.all? { |c| c.table_name == "customers" }
|
|
10
9
|
end
|
|
11
10
|
|
|
12
|
-
describe
|
|
13
|
-
|
|
11
|
+
describe "ActiveRecord::ConnectionAdapters::SQLServer::Type" do
|
|
14
12
|
let(:obj) { SSTestDatatype.new }
|
|
15
13
|
|
|
16
14
|
Type = ActiveRecord::ConnectionAdapters::SQLServer::Type
|
|
17
15
|
|
|
18
|
-
def new_obj
|
|
19
|
-
|
|
16
|
+
def new_obj; SSTestDatatype.new; end
|
|
17
|
+
|
|
18
|
+
def column(name); SSTestDatatype.columns_hash[name]; end
|
|
19
|
+
|
|
20
20
|
def assert_obj_set_and_save(attribute, value)
|
|
21
21
|
obj.send :"#{attribute}=", value
|
|
22
22
|
_(obj.send(attribute)).must_equal value
|
|
@@ -28,15 +28,15 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
28
28
|
|
|
29
29
|
# Exact Numerics
|
|
30
30
|
|
|
31
|
-
it
|
|
32
|
-
col = column(
|
|
33
|
-
_(col.sql_type).must_equal
|
|
31
|
+
it "int(4) PRIMARY KEY" do
|
|
32
|
+
col = column("id")
|
|
33
|
+
_(col.sql_type).must_equal "int(4)"
|
|
34
34
|
_(col.null).must_equal false
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
it
|
|
38
|
-
col = column(
|
|
39
|
-
_(col.sql_type).must_equal
|
|
37
|
+
it "bigint(8)" do
|
|
38
|
+
col = column("bigint")
|
|
39
|
+
_(col.sql_type).must_equal "bigint(8)"
|
|
40
40
|
_(col.type).must_equal :integer
|
|
41
41
|
_(col.null).must_equal true
|
|
42
42
|
_(col.default).must_equal 42
|
|
@@ -49,9 +49,9 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
49
49
|
assert_obj_set_and_save :bigint, 9_223_372_036_854_775_807
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
it
|
|
53
|
-
col = column(
|
|
54
|
-
_(col.sql_type).must_equal
|
|
52
|
+
it "int(4)" do
|
|
53
|
+
col = column("int")
|
|
54
|
+
_(col.sql_type).must_equal "int(4)"
|
|
55
55
|
_(col.type).must_equal :integer
|
|
56
56
|
_(col.null).must_equal true
|
|
57
57
|
_(col.default).must_equal 42
|
|
@@ -64,9 +64,9 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
64
64
|
assert_obj_set_and_save :int, 2_147_483_647
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
it
|
|
68
|
-
col = column(
|
|
69
|
-
_(col.sql_type).must_equal
|
|
67
|
+
it "smallint(2)" do
|
|
68
|
+
col = column("smallint")
|
|
69
|
+
_(col.sql_type).must_equal "smallint(2)"
|
|
70
70
|
_(col.type).must_equal :integer
|
|
71
71
|
_(col.null).must_equal true
|
|
72
72
|
_(col.default).must_equal 42
|
|
@@ -79,9 +79,9 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
79
79
|
assert_obj_set_and_save :smallint, 32_767
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
it
|
|
83
|
-
col = column(
|
|
84
|
-
_(col.sql_type).must_equal
|
|
82
|
+
it "tinyint(1)" do
|
|
83
|
+
col = column("tinyint")
|
|
84
|
+
_(col.sql_type).must_equal "tinyint(1)"
|
|
85
85
|
_(col.type).must_equal :integer
|
|
86
86
|
_(col.null).must_equal true
|
|
87
87
|
_(col.default).must_equal 42
|
|
@@ -94,220 +94,223 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
94
94
|
assert_obj_set_and_save :tinyint, 255
|
|
95
95
|
end
|
|
96
96
|
|
|
97
|
-
it
|
|
98
|
-
col = column(
|
|
99
|
-
_(col.sql_type).must_equal
|
|
97
|
+
it "bit" do
|
|
98
|
+
col = column("bit")
|
|
99
|
+
_(col.sql_type).must_equal "bit"
|
|
100
100
|
_(col.type).must_equal :boolean
|
|
101
101
|
_(col.null).must_equal true
|
|
102
102
|
_(col.default).must_equal true
|
|
103
103
|
_(obj.bit).must_equal true
|
|
104
104
|
_(col.default_function).must_be_nil
|
|
105
105
|
type = connection.lookup_cast_type_from_column(col)
|
|
106
|
-
_(type).must_be_instance_of
|
|
106
|
+
_(type).must_be_instance_of Type::Boolean
|
|
107
107
|
_(type.limit).must_be_nil
|
|
108
108
|
obj.bit = 0
|
|
109
109
|
_(obj.bit).must_equal false
|
|
110
110
|
obj.save!
|
|
111
111
|
_(obj.reload.bit).must_equal false
|
|
112
|
-
obj.bit =
|
|
112
|
+
obj.bit = "1"
|
|
113
113
|
_(obj.bit).must_equal true
|
|
114
114
|
obj.save!
|
|
115
115
|
_(obj.reload.bit).must_equal true
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
it
|
|
119
|
-
col = column(
|
|
120
|
-
_(col.sql_type).must_equal
|
|
118
|
+
it "decimal(9,2)" do
|
|
119
|
+
col = column("decimal_9_2")
|
|
120
|
+
_(col.sql_type).must_equal "decimal(9,2)"
|
|
121
121
|
_(col.type).must_equal :decimal
|
|
122
122
|
_(col.null).must_equal true
|
|
123
|
-
_(col.default).must_equal BigDecimal(
|
|
124
|
-
_(obj.decimal_9_2).must_equal BigDecimal(
|
|
123
|
+
_(col.default).must_equal BigDecimal("12345.01")
|
|
124
|
+
_(obj.decimal_9_2).must_equal BigDecimal("12345.01")
|
|
125
125
|
_(col.default_function).must_be_nil
|
|
126
126
|
type = connection.lookup_cast_type_from_column(col)
|
|
127
|
-
_(type).must_be_instance_of
|
|
127
|
+
_(type).must_be_instance_of Type::Decimal
|
|
128
128
|
_(type.limit).must_be_nil
|
|
129
129
|
_(type.precision).must_equal 9
|
|
130
130
|
_(type.scale).must_equal 2
|
|
131
|
-
obj.decimal_9_2 =
|
|
132
|
-
_(obj.decimal_9_2).must_equal
|
|
131
|
+
obj.decimal_9_2 = "1234567.8901"
|
|
132
|
+
_(obj.decimal_9_2).must_equal BigDecimal("1234567.89")
|
|
133
133
|
obj.save!
|
|
134
|
-
_(obj.reload.decimal_9_2).must_equal BigDecimal(
|
|
134
|
+
_(obj.reload.decimal_9_2).must_equal BigDecimal("1234567.89")
|
|
135
135
|
end
|
|
136
136
|
|
|
137
|
-
it
|
|
138
|
-
col = column(
|
|
139
|
-
_(col.sql_type).must_equal
|
|
140
|
-
_(col.default).must_equal BigDecimal(
|
|
141
|
-
_(obj.decimal_16_4).must_equal BigDecimal(
|
|
137
|
+
it "decimal(16,4)" do
|
|
138
|
+
col = column("decimal_16_4")
|
|
139
|
+
_(col.sql_type).must_equal "decimal(16,4)"
|
|
140
|
+
_(col.default).must_equal BigDecimal("1234567.89")
|
|
141
|
+
_(obj.decimal_16_4).must_equal BigDecimal("1234567.89")
|
|
142
142
|
_(col.default_function).must_be_nil
|
|
143
143
|
type = connection.lookup_cast_type_from_column(col)
|
|
144
144
|
_(type.precision).must_equal 16
|
|
145
145
|
_(type.scale).must_equal 4
|
|
146
|
-
obj.decimal_16_4 =
|
|
147
|
-
_(obj.decimal_16_4).must_equal
|
|
146
|
+
obj.decimal_16_4 = "1234567.8901001"
|
|
147
|
+
_(obj.decimal_16_4).must_equal BigDecimal("1234567.8901")
|
|
148
148
|
obj.save!
|
|
149
|
-
_(obj.reload.decimal_16_4).must_equal BigDecimal(
|
|
149
|
+
_(obj.reload.decimal_16_4).must_equal BigDecimal("1234567.8901")
|
|
150
150
|
end
|
|
151
151
|
|
|
152
|
-
it
|
|
153
|
-
col = column(
|
|
154
|
-
_(col.sql_type).must_equal
|
|
152
|
+
it "numeric(18,0)" do
|
|
153
|
+
col = column("numeric_18_0")
|
|
154
|
+
_(col.sql_type).must_equal "numeric(18,0)"
|
|
155
155
|
_(col.type).must_equal :decimal
|
|
156
156
|
_(col.null).must_equal true
|
|
157
|
-
_(col.default).must_equal BigDecimal(
|
|
158
|
-
_(obj.numeric_18_0).must_equal BigDecimal(
|
|
157
|
+
_(col.default).must_equal BigDecimal("191")
|
|
158
|
+
_(obj.numeric_18_0).must_equal BigDecimal("191")
|
|
159
159
|
_(col.default_function).must_be_nil
|
|
160
|
+
|
|
160
161
|
type = connection.lookup_cast_type_from_column(col)
|
|
161
|
-
_(type).must_be_instance_of
|
|
162
|
+
_(type).must_be_instance_of Type::DecimalWithoutScale
|
|
162
163
|
_(type.limit).must_be_nil
|
|
163
164
|
_(type.precision).must_equal 18
|
|
164
|
-
_(type.scale).
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
_(type.scale).must_be_nil
|
|
166
|
+
|
|
167
|
+
obj.numeric_18_0 = "192.1"
|
|
168
|
+
_(obj.numeric_18_0).must_equal BigDecimal("192")
|
|
169
|
+
|
|
167
170
|
obj.save!
|
|
168
|
-
_(obj.reload.numeric_18_0).must_equal BigDecimal(
|
|
171
|
+
_(obj.reload.numeric_18_0).must_equal BigDecimal("192")
|
|
169
172
|
end
|
|
170
173
|
|
|
171
|
-
it
|
|
172
|
-
col = column(
|
|
173
|
-
_(col.sql_type).must_equal
|
|
174
|
+
it "numeric(36,2)" do
|
|
175
|
+
col = column("numeric_36_2")
|
|
176
|
+
_(col.sql_type).must_equal "numeric(36,2)"
|
|
174
177
|
_(col.type).must_equal :decimal
|
|
175
178
|
_(col.null).must_equal true
|
|
176
|
-
_(col.default).must_equal BigDecimal(
|
|
177
|
-
_(obj.numeric_36_2).must_equal BigDecimal(
|
|
179
|
+
_(col.default).must_equal BigDecimal("12345678901234567890.01")
|
|
180
|
+
_(obj.numeric_36_2).must_equal BigDecimal("12345678901234567890.01")
|
|
178
181
|
_(col.default_function).must_be_nil
|
|
179
182
|
type = connection.lookup_cast_type_from_column(col)
|
|
180
|
-
_(type).must_be_instance_of
|
|
183
|
+
_(type).must_be_instance_of Type::Decimal
|
|
181
184
|
_(type.limit).must_be_nil
|
|
182
185
|
_(type.precision).must_equal 36
|
|
183
186
|
_(type.scale).must_equal 2
|
|
184
|
-
obj.numeric_36_2 =
|
|
185
|
-
_(obj.numeric_36_2).must_equal
|
|
187
|
+
obj.numeric_36_2 = "192.123"
|
|
188
|
+
_(obj.numeric_36_2).must_equal BigDecimal("192.12")
|
|
186
189
|
obj.save!
|
|
187
|
-
_(obj.reload.numeric_36_2).must_equal BigDecimal(
|
|
190
|
+
_(obj.reload.numeric_36_2).must_equal BigDecimal("192.12")
|
|
188
191
|
end
|
|
189
192
|
|
|
190
|
-
it
|
|
191
|
-
col = column(
|
|
192
|
-
_(col.sql_type).must_equal
|
|
193
|
+
it "money" do
|
|
194
|
+
col = column("money")
|
|
195
|
+
_(col.sql_type).must_equal "money"
|
|
193
196
|
_(col.type).must_equal :money
|
|
194
197
|
_(col.null).must_equal true
|
|
195
|
-
_(col.default).must_equal BigDecimal(
|
|
196
|
-
_(obj.money).must_equal BigDecimal(
|
|
198
|
+
_(col.default).must_equal BigDecimal("4.20")
|
|
199
|
+
_(obj.money).must_equal BigDecimal("4.20")
|
|
197
200
|
_(col.default_function).must_be_nil
|
|
198
201
|
type = connection.lookup_cast_type_from_column(col)
|
|
199
|
-
_(type).must_be_instance_of
|
|
202
|
+
_(type).must_be_instance_of Type::Money
|
|
200
203
|
_(type.limit).must_be_nil
|
|
201
204
|
_(type.precision).must_equal 19
|
|
202
205
|
_(type.scale).must_equal 4
|
|
203
|
-
obj.money =
|
|
204
|
-
_(obj.money).must_equal
|
|
206
|
+
obj.money = "922337203685477.58061"
|
|
207
|
+
_(obj.money).must_equal BigDecimal("922337203685477.5806")
|
|
205
208
|
obj.save!
|
|
206
|
-
_(obj.reload.money).must_equal
|
|
209
|
+
_(obj.reload.money).must_equal BigDecimal("922337203685477.5806")
|
|
207
210
|
end
|
|
208
211
|
|
|
209
|
-
it
|
|
210
|
-
col = column(
|
|
211
|
-
_(col.sql_type).must_equal
|
|
212
|
+
it "smallmoney" do
|
|
213
|
+
col = column("smallmoney")
|
|
214
|
+
_(col.sql_type).must_equal "smallmoney"
|
|
212
215
|
_(col.type).must_equal :smallmoney
|
|
213
216
|
_(col.null).must_equal true
|
|
214
|
-
_(col.default).must_equal BigDecimal(
|
|
215
|
-
_(obj.smallmoney).must_equal BigDecimal(
|
|
217
|
+
_(col.default).must_equal BigDecimal("4.20")
|
|
218
|
+
_(obj.smallmoney).must_equal BigDecimal("4.20")
|
|
216
219
|
_(col.default_function).must_be_nil
|
|
217
220
|
type = connection.lookup_cast_type_from_column(col)
|
|
218
|
-
_(type).must_be_instance_of
|
|
221
|
+
_(type).must_be_instance_of Type::SmallMoney
|
|
219
222
|
_(type.limit).must_be_nil
|
|
220
223
|
_(type.precision).must_equal 10
|
|
221
224
|
_(type.scale).must_equal 4
|
|
222
|
-
obj.smallmoney =
|
|
223
|
-
_(obj.smallmoney).must_equal
|
|
225
|
+
obj.smallmoney = "214748.36461"
|
|
226
|
+
_(obj.smallmoney).must_equal BigDecimal("214748.3646")
|
|
224
227
|
obj.save!
|
|
225
|
-
_(obj.reload.smallmoney).must_equal BigDecimal(
|
|
228
|
+
_(obj.reload.smallmoney).must_equal BigDecimal("214748.3646")
|
|
226
229
|
end
|
|
227
230
|
|
|
228
231
|
# Approximate Numerics
|
|
229
232
|
# Float limits are adjusted to 24 or 53 by the database as per http://msdn.microsoft.com/en-us/library/ms173773.aspx
|
|
230
233
|
# Floats with a limit of <= 24 are reduced to reals by sqlserver on creation.
|
|
231
234
|
|
|
232
|
-
it
|
|
233
|
-
col = column(
|
|
234
|
-
_(col.sql_type).must_equal
|
|
235
|
+
it "float" do
|
|
236
|
+
col = column("float")
|
|
237
|
+
_(col.sql_type).must_equal "float"
|
|
235
238
|
_(col.type).must_equal :float
|
|
236
239
|
_(col.null).must_equal true
|
|
237
240
|
_(col.default).must_equal 123.00000001
|
|
238
241
|
_(obj.float).must_equal 123.00000001
|
|
239
242
|
_(col.default_function).must_be_nil
|
|
240
243
|
type = connection.lookup_cast_type_from_column(col)
|
|
241
|
-
_(type).must_be_instance_of
|
|
244
|
+
_(type).must_be_instance_of Type::Float
|
|
242
245
|
_(type.limit).must_be_nil
|
|
243
246
|
_(type.precision).must_be_nil
|
|
244
247
|
_(type.scale).must_be_nil
|
|
245
|
-
obj.float =
|
|
246
|
-
_(obj.float).must_equal
|
|
248
|
+
obj.float = "214748.36461"
|
|
249
|
+
_(obj.float).must_equal 214748.36461
|
|
247
250
|
obj.save!
|
|
248
251
|
_(obj.reload.float).must_equal 214748.36461
|
|
249
252
|
end
|
|
250
253
|
|
|
251
|
-
it
|
|
252
|
-
col = column(
|
|
253
|
-
_(col.sql_type).must_equal
|
|
254
|
+
it "real" do
|
|
255
|
+
col = column("real")
|
|
256
|
+
_(col.sql_type).must_equal "real"
|
|
254
257
|
_(col.type).must_equal :real
|
|
255
258
|
_(col.null).must_equal true
|
|
256
259
|
_(col.default).must_be_close_to 123.45, 0.01
|
|
257
260
|
_(obj.real).must_be_close_to 123.45, 0.01
|
|
258
261
|
_(col.default_function).must_be_nil
|
|
259
262
|
type = connection.lookup_cast_type_from_column(col)
|
|
260
|
-
_(type).must_be_instance_of
|
|
263
|
+
_(type).must_be_instance_of Type::Real
|
|
261
264
|
_(type.limit).must_be_nil
|
|
262
265
|
_(type.precision).must_be_nil
|
|
263
266
|
_(type.scale).must_be_nil
|
|
264
|
-
obj.real =
|
|
265
|
-
_(obj.real).must_be_close_to
|
|
267
|
+
obj.real = "214748.36461"
|
|
268
|
+
_(obj.real).must_be_close_to 214748.36461, 0.01
|
|
266
269
|
obj.save!
|
|
267
|
-
_(obj.reload.real).must_be_close_to
|
|
270
|
+
_(obj.reload.real).must_be_close_to 214748.36461, 0.01
|
|
268
271
|
end
|
|
269
272
|
|
|
270
273
|
# Date and Time
|
|
271
274
|
|
|
272
|
-
it
|
|
273
|
-
col = column(
|
|
274
|
-
_(col.sql_type).must_equal
|
|
275
|
+
it "date" do
|
|
276
|
+
col = column("date")
|
|
277
|
+
_(col.sql_type).must_equal "date"
|
|
275
278
|
_(col.type).must_equal :date
|
|
276
279
|
_(col.null).must_equal true
|
|
277
|
-
_(col.default).must_equal connection_dblib_73? ? Date.civil(0001, 1, 1) :
|
|
280
|
+
_(col.default).must_equal connection_dblib_73? ? Date.civil(0001, 1, 1) : "0001-01-01"
|
|
278
281
|
_(obj.date).must_equal Date.civil(0001, 1, 1)
|
|
279
282
|
_(col.default_function).must_be_nil
|
|
280
283
|
type = connection.lookup_cast_type_from_column(col)
|
|
281
|
-
_(type).must_be_instance_of
|
|
284
|
+
_(type).must_be_instance_of Type::Date
|
|
282
285
|
_(type.limit).must_be_nil
|
|
283
286
|
_(type.precision).must_be_nil
|
|
284
287
|
_(type.scale).must_be_nil
|
|
285
288
|
# Can cast strings. SQL Server format.
|
|
286
|
-
obj.date =
|
|
287
|
-
_(obj.date).must_equal
|
|
289
|
+
obj.date = "04-01-0001"
|
|
290
|
+
_(obj.date).must_equal Date.civil(0001, 4, 1)
|
|
288
291
|
obj.save!
|
|
289
|
-
_(obj.date).must_equal
|
|
292
|
+
_(obj.date).must_equal Date.civil(0001, 4, 1)
|
|
290
293
|
obj.reload
|
|
291
|
-
_(obj.date).must_equal
|
|
294
|
+
_(obj.date).must_equal Date.civil(0001, 4, 1)
|
|
292
295
|
# Can cast strings. ISO format.
|
|
293
|
-
obj.date =
|
|
294
|
-
_(obj.date).must_equal
|
|
296
|
+
obj.date = "0001-04-01"
|
|
297
|
+
_(obj.date).must_equal Date.civil(0001, 4, 1)
|
|
295
298
|
obj.save!
|
|
296
|
-
_(obj.date).must_equal
|
|
299
|
+
_(obj.date).must_equal Date.civil(0001, 4, 1)
|
|
297
300
|
obj.reload
|
|
298
|
-
_(obj.date).must_equal
|
|
301
|
+
_(obj.date).must_equal Date.civil(0001, 4, 1)
|
|
299
302
|
# Can keep and return assigned date.
|
|
300
303
|
assert_obj_set_and_save :date, Date.civil(1972, 04, 14)
|
|
301
304
|
# Can accept and cast time objects.
|
|
302
305
|
obj.date = Time.utc(2010, 4, 14, 12, 34, 56, 3000)
|
|
303
306
|
_(obj.date).must_equal Date.civil(2010, 4, 14)
|
|
304
307
|
obj.save!
|
|
305
|
-
_(obj.reload.date).must_equal
|
|
308
|
+
_(obj.reload.date).must_equal Date.civil(2010, 4, 14)
|
|
306
309
|
end
|
|
307
310
|
|
|
308
|
-
it
|
|
309
|
-
col = column(
|
|
310
|
-
_(col.sql_type).must_equal
|
|
311
|
+
it "datetime" do
|
|
312
|
+
col = column("datetime")
|
|
313
|
+
_(col.sql_type).must_equal "datetime"
|
|
311
314
|
_(col.type).must_equal :datetime
|
|
312
315
|
_(col.null).must_equal true
|
|
313
316
|
time = Time.utc 1753, 01, 01, 00, 00, 00, 123000
|
|
@@ -315,7 +318,7 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
315
318
|
_(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <123000>"
|
|
316
319
|
_(col.default_function).must_be_nil
|
|
317
320
|
type = connection.lookup_cast_type_from_column(col)
|
|
318
|
-
_(type).must_be_instance_of
|
|
321
|
+
_(type).must_be_instance_of Type::DateTime
|
|
319
322
|
_(type.limit).must_be_nil
|
|
320
323
|
_(type.precision).must_be_nil
|
|
321
324
|
_(type.scale).must_be_nil
|
|
@@ -324,21 +327,21 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
324
327
|
# Can save to proper accuracy and return again.
|
|
325
328
|
time = Time.utc 2010, 04, 01, 12, 34, 56, 3000
|
|
326
329
|
obj.datetime = time
|
|
327
|
-
_(obj.datetime).must_equal
|
|
330
|
+
_(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
|
|
328
331
|
obj.save!
|
|
329
|
-
_(obj.datetime).must_equal
|
|
332
|
+
_(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
|
|
330
333
|
obj.reload
|
|
331
|
-
_(obj.datetime).must_equal
|
|
334
|
+
_(obj.datetime).must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
|
|
332
335
|
_(obj).must_equal obj.class.where(datetime: time).first
|
|
333
336
|
# Will cast to true DB value on attribute write, save and return again.
|
|
334
|
-
time
|
|
337
|
+
time = Time.utc 2010, 04, 01, 12, 34, 56, 234567
|
|
335
338
|
time2 = Time.utc 2010, 04, 01, 12, 34, 56, 233000
|
|
336
339
|
obj.datetime = time
|
|
337
|
-
_(obj.datetime).must_equal
|
|
340
|
+
_(obj.datetime).must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
|
|
338
341
|
obj.save!
|
|
339
|
-
_(obj.datetime).must_equal
|
|
342
|
+
_(obj.datetime).must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
|
|
340
343
|
obj.reload
|
|
341
|
-
_(obj.datetime).must_equal
|
|
344
|
+
_(obj.datetime).must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
|
|
342
345
|
_(obj).must_equal obj.class.where(datetime: time).first
|
|
343
346
|
_(obj).must_equal obj.class.where(datetime: time2).first
|
|
344
347
|
# Set and find nil.
|
|
@@ -349,10 +352,10 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
349
352
|
_(obj).must_equal obj.class.where(datetime: nil).first
|
|
350
353
|
end
|
|
351
354
|
|
|
352
|
-
it
|
|
353
|
-
skip
|
|
354
|
-
col = column(
|
|
355
|
-
_(col.sql_type).must_equal
|
|
355
|
+
it "datetime2" do
|
|
356
|
+
skip "datetime2 not supported in this protocol version" unless connection_dblib_73?
|
|
357
|
+
col = column("datetime2_7")
|
|
358
|
+
_(col.sql_type).must_equal "datetime2(7)"
|
|
356
359
|
_(col.type).must_equal :datetime
|
|
357
360
|
_(col.null).must_equal true
|
|
358
361
|
time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(999999900, 1000)
|
|
@@ -360,97 +363,97 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
360
363
|
_(obj.datetime2_7).must_equal time, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <999999900>"
|
|
361
364
|
_(col.default_function).must_be_nil
|
|
362
365
|
type = connection.lookup_cast_type_from_column(col)
|
|
363
|
-
_(type).must_be_instance_of
|
|
366
|
+
_(type).must_be_instance_of Type::DateTime2
|
|
364
367
|
_(type.limit).must_be_nil
|
|
365
|
-
_(type.precision).must_equal
|
|
368
|
+
_(type.precision).must_equal 7
|
|
366
369
|
_(type.scale).must_be_nil
|
|
367
370
|
obj.save!
|
|
368
371
|
_(obj).must_equal obj.class.where(datetime2_7: time).first
|
|
369
372
|
# Can save 100 nanosecond precisoins and return again.
|
|
370
|
-
time
|
|
373
|
+
time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456755, 1000)
|
|
371
374
|
time2 = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456800, 1000)
|
|
372
375
|
obj.datetime2_7 = time
|
|
373
|
-
_(obj.datetime2_7).must_equal
|
|
376
|
+
_(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
|
|
374
377
|
obj.save!
|
|
375
|
-
_(obj.datetime2_7).must_equal
|
|
378
|
+
_(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
|
|
376
379
|
obj.reload
|
|
377
|
-
_(obj.datetime2_7).must_equal
|
|
380
|
+
_(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
|
|
378
381
|
_(obj).must_equal obj.class.where(datetime2_7: time).first
|
|
379
382
|
_(obj).must_equal obj.class.where(datetime2_7: time2).first
|
|
380
383
|
# Can save small fraction nanosecond precisoins and return again.
|
|
381
|
-
time
|
|
384
|
+
time = Time.utc 2008, 6, 21, 13, 30, 0, Rational(15020, 1000)
|
|
382
385
|
time2 = Time.utc 2008, 6, 21, 13, 30, 0, Rational(15000, 1000)
|
|
383
386
|
obj.datetime2_7 = time
|
|
384
|
-
_(obj.datetime2_7).must_equal
|
|
387
|
+
_(obj.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
|
|
385
388
|
obj.save!
|
|
386
|
-
_(obj.reload.datetime2_7).must_equal
|
|
389
|
+
_(obj.reload.datetime2_7).must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
|
|
387
390
|
_(obj).must_equal obj.class.where(datetime2_7: time).first
|
|
388
391
|
_(obj).must_equal obj.class.where(datetime2_7: time2).first
|
|
389
392
|
# datetime2_3
|
|
390
393
|
time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456789, 1000)
|
|
391
|
-
col = column(
|
|
394
|
+
col = column("datetime2_3")
|
|
392
395
|
_(connection.lookup_cast_type_from_column(col).precision).must_equal 3
|
|
393
396
|
obj.datetime2_3 = time
|
|
394
397
|
_(obj.datetime2_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
|
|
395
|
-
obj.save
|
|
398
|
+
obj.save!; obj.reload
|
|
396
399
|
_(obj.datetime2_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
|
|
397
400
|
_(obj).must_equal obj.class.where(datetime2_3: time).first
|
|
398
401
|
# datetime2_1
|
|
399
|
-
col = column(
|
|
402
|
+
col = column("datetime2_1")
|
|
400
403
|
_(connection.lookup_cast_type_from_column(col).precision).must_equal 1
|
|
401
404
|
obj.datetime2_1 = time
|
|
402
405
|
_(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
|
|
403
|
-
obj.save
|
|
406
|
+
obj.save!; obj.reload
|
|
404
407
|
_(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
|
|
405
408
|
_(obj).must_equal obj.class.where(datetime2_1: time).first
|
|
406
409
|
# datetime2_0
|
|
407
|
-
col = column(
|
|
410
|
+
col = column("datetime2_0")
|
|
408
411
|
_(connection.lookup_cast_type_from_column(col).precision).must_equal 0
|
|
409
412
|
time = Time.utc 2016, 4, 19, 16, 45, 40, 771036
|
|
410
413
|
obj.datetime2_0 = time
|
|
411
414
|
_(obj.datetime2_0).must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
|
|
412
|
-
obj.save
|
|
415
|
+
obj.save!; obj.reload
|
|
413
416
|
_(obj.datetime2_0).must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
|
|
414
417
|
_(obj).must_equal obj.class.where(datetime2_0: time).first
|
|
415
418
|
end
|
|
416
419
|
|
|
417
|
-
it
|
|
418
|
-
skip
|
|
419
|
-
col = column(
|
|
420
|
-
_(col.sql_type).must_equal
|
|
420
|
+
it "datetimeoffset" do
|
|
421
|
+
skip "datetimeoffset not supported in this protocol version" unless connection_dblib_73?
|
|
422
|
+
col = column("datetimeoffset_7")
|
|
423
|
+
_(col.sql_type).must_equal "datetimeoffset(7)"
|
|
421
424
|
_(col.type).must_equal :datetimeoffset
|
|
422
425
|
_(col.null).must_equal true
|
|
423
426
|
_(col.default).must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds <#{col.default.nsec}> vs <123456700>"
|
|
424
427
|
_(obj.datetimeoffset_7).must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <999999900>"
|
|
425
428
|
_(col.default_function).must_be_nil
|
|
426
429
|
type = connection.lookup_cast_type_from_column(col)
|
|
427
|
-
_(type).must_be_instance_of
|
|
430
|
+
_(type).must_be_instance_of Type::DateTimeOffset
|
|
428
431
|
_(type.limit).must_be_nil
|
|
429
|
-
_(type.precision).must_equal
|
|
432
|
+
_(type.precision).must_equal 7
|
|
430
433
|
_(type.scale).must_be_nil
|
|
431
434
|
# Can save 100 nanosecond precisoins and return again.
|
|
432
435
|
obj.datetimeoffset_7 = Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456755)
|
|
433
|
-
_(obj.datetimeoffset_7).must_equal
|
|
436
|
+
_(obj.datetimeoffset_7).must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
|
|
434
437
|
obj.save!
|
|
435
|
-
_(obj.datetimeoffset_7).must_equal
|
|
438
|
+
_(obj.datetimeoffset_7).must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
|
|
436
439
|
obj.reload
|
|
437
|
-
_(obj.datetimeoffset_7).must_equal
|
|
440
|
+
_(obj.datetimeoffset_7).must_equal Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
|
|
438
441
|
# Maintains the timezone
|
|
439
|
-
time = ActiveSupport::TimeZone[
|
|
442
|
+
time = ActiveSupport::TimeZone["America/Los_Angeles"].local 2010, 12, 31, 23, 59, 59, Rational(123456800, 1000)
|
|
440
443
|
obj.datetimeoffset_7 = time
|
|
441
444
|
_(obj.datetimeoffset_7).must_equal time
|
|
442
445
|
obj.save!
|
|
443
446
|
_(obj.datetimeoffset_7).must_equal time
|
|
444
447
|
_(obj.reload.datetimeoffset_7).must_equal time
|
|
445
448
|
# With other precisions.
|
|
446
|
-
time = ActiveSupport::TimeZone[
|
|
447
|
-
col = column(
|
|
449
|
+
time = ActiveSupport::TimeZone["America/Los_Angeles"].local 2010, 12, 31, 23, 59, 59, Rational(123456755, 1000)
|
|
450
|
+
col = column("datetimeoffset_3")
|
|
448
451
|
_(connection.lookup_cast_type_from_column(col).precision).must_equal 3
|
|
449
452
|
obj.datetimeoffset_3 = time
|
|
450
453
|
_(obj.datetimeoffset_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
|
|
451
454
|
obj.save!
|
|
452
455
|
_(obj.datetimeoffset_3).must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
|
|
453
|
-
col = column(
|
|
456
|
+
col = column("datetime2_1")
|
|
454
457
|
_(connection.lookup_cast_type_from_column(col).precision).must_equal 1
|
|
455
458
|
obj.datetime2_1 = time
|
|
456
459
|
_(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
|
|
@@ -458,131 +461,131 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
458
461
|
_(obj.datetime2_1).must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
|
|
459
462
|
end
|
|
460
463
|
|
|
461
|
-
it
|
|
462
|
-
col = column(
|
|
463
|
-
_(col.sql_type).must_equal
|
|
464
|
+
it "smalldatetime" do
|
|
465
|
+
col = column("smalldatetime")
|
|
466
|
+
_(col.sql_type).must_equal "smalldatetime"
|
|
464
467
|
_(col.type).must_equal :smalldatetime
|
|
465
468
|
_(col.null).must_equal true
|
|
466
469
|
_(col.default).must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
|
|
467
470
|
_(obj.smalldatetime).must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
|
|
468
471
|
_(col.default_function).must_be_nil
|
|
469
472
|
type = connection.lookup_cast_type_from_column(col)
|
|
470
|
-
_(type).must_be_instance_of
|
|
473
|
+
_(type).must_be_instance_of Type::SmallDateTime
|
|
471
474
|
_(type.limit).must_be_nil
|
|
472
475
|
_(type.precision).must_be_nil
|
|
473
476
|
_(type.scale).must_be_nil
|
|
474
477
|
# Will remove fractional seconds and return again.
|
|
475
478
|
obj.smalldatetime = Time.utc(2078, 06, 05, 4, 20, 00, 3000)
|
|
476
|
-
_(obj.smalldatetime).must_equal
|
|
479
|
+
_(obj.smalldatetime).must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.smalldatetime.usec}> vs <0>"
|
|
477
480
|
obj.save!
|
|
478
|
-
_(obj.smalldatetime).must_equal
|
|
481
|
+
_(obj.smalldatetime).must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
|
|
479
482
|
obj.reload
|
|
480
|
-
_(obj.smalldatetime).must_equal
|
|
483
|
+
_(obj.smalldatetime).must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
|
|
481
484
|
end
|
|
482
485
|
|
|
483
|
-
it
|
|
484
|
-
skip
|
|
485
|
-
col = column(
|
|
486
|
-
_(col.sql_type).must_equal
|
|
486
|
+
it "time(7)" do
|
|
487
|
+
skip "time() not supported in this protocol version" unless connection_dblib_73?
|
|
488
|
+
col = column("time_7")
|
|
489
|
+
_(col.sql_type).must_equal "time(7)"
|
|
487
490
|
_(col.type).must_equal :time
|
|
488
491
|
_(col.null).must_equal true
|
|
489
492
|
_(col.default).must_equal Time.utc(1900, 01, 01, 04, 20, 00, Rational(288321500, 1000)), "Nanoseconds were <#{col.default.nsec}> vs <288321500>"
|
|
490
493
|
_(col.default_function).must_be_nil
|
|
491
494
|
type = connection.lookup_cast_type_from_column(col)
|
|
492
|
-
_(type).must_be_instance_of
|
|
495
|
+
_(type).must_be_instance_of Type::Time
|
|
493
496
|
_(type.limit).must_be_nil
|
|
494
|
-
_(type.precision).must_equal
|
|
497
|
+
_(type.precision).must_equal 7
|
|
495
498
|
_(type.scale).must_be_nil
|
|
496
499
|
# Time's #usec precision (low micro)
|
|
497
500
|
obj.time_7 = Time.utc(2000, 01, 01, 15, 45, 00, 300)
|
|
498
501
|
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_7.usec}> vs <0>"
|
|
499
502
|
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_7.nsec}> vs <300>"
|
|
500
|
-
obj.save
|
|
503
|
+
obj.save!; obj.reload
|
|
501
504
|
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_7.usec}> vs <0>"
|
|
502
505
|
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_7.nsec}> vs <300>"
|
|
503
506
|
# Time's #usec precision (high micro)
|
|
504
507
|
obj.time_7 = Time.utc(2000, 01, 01, 15, 45, 00, 234567)
|
|
505
|
-
_(obj.time_7).must_equal
|
|
506
|
-
obj.save
|
|
507
|
-
_(obj.time_7).must_equal
|
|
508
|
+
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_7.usec}> vs <234567>"
|
|
509
|
+
obj.save!; obj.reload
|
|
510
|
+
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_7.usec}> vs <234567>"
|
|
508
511
|
# Time's #usec precision (high nano rounded)
|
|
509
512
|
obj.time_7 = Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321545, 1000))
|
|
510
|
-
_(obj.time_7).must_equal
|
|
511
|
-
obj.save
|
|
512
|
-
_(obj.time_7).must_equal
|
|
513
|
+
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_7.nsec}> vs <288321500>"
|
|
514
|
+
obj.save!; obj.reload
|
|
515
|
+
_(obj.time_7).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_7.nsec}> vs <288321500>"
|
|
513
516
|
end
|
|
514
517
|
|
|
515
|
-
it
|
|
516
|
-
skip
|
|
517
|
-
col = column(
|
|
518
|
-
_(col.sql_type).must_equal
|
|
518
|
+
it "time(2)" do
|
|
519
|
+
skip "time() not supported in this protocol version" unless connection_dblib_73?
|
|
520
|
+
col = column("time_2")
|
|
521
|
+
_(col.sql_type).must_equal "time(2)"
|
|
519
522
|
_(col.type).must_equal :time
|
|
520
523
|
_(col.null).must_equal true
|
|
521
524
|
_(col.default).must_be_nil
|
|
522
525
|
_(col.default_function).must_be_nil
|
|
523
526
|
type = connection.lookup_cast_type_from_column(col)
|
|
524
|
-
_(type).must_be_instance_of
|
|
527
|
+
_(type).must_be_instance_of Type::Time
|
|
525
528
|
_(type.limit).must_be_nil
|
|
526
|
-
_(type.precision).must_equal
|
|
529
|
+
_(type.precision).must_equal 2
|
|
527
530
|
_(type.scale).must_be_nil
|
|
528
531
|
# Always uses TinyTDS/Windows 2000-01-01 convention too.
|
|
529
532
|
obj.time_2 = Time.utc(2015, 01, 10, 15, 45, 00, 0)
|
|
530
|
-
_(obj.time_2).must_equal
|
|
531
|
-
obj.save
|
|
532
|
-
_(obj.time_2).must_equal
|
|
533
|
+
_(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0)
|
|
534
|
+
obj.save!; obj.reload
|
|
535
|
+
_(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0)
|
|
533
536
|
# Time's #usec precision (barely in 2 precision equal to 0.03 seconds)
|
|
534
537
|
obj.time_2 = Time.utc(2000, 01, 01, 15, 45, 00, 30000)
|
|
535
|
-
_(obj.time_2).must_equal
|
|
536
|
-
obj.save
|
|
537
|
-
_(obj.time_2).must_equal
|
|
538
|
+
_(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 30000), "Microseconds were <#{obj.time_2.usec}> vs <30000>"
|
|
539
|
+
obj.save!; obj.reload
|
|
540
|
+
_(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 30000), "Microseconds were <#{obj.time_2.usec}> vs <30000>"
|
|
538
541
|
# Time's #usec precision (below 2 precision)
|
|
539
542
|
obj.time_2 = Time.utc(2000, 01, 01, 15, 45, 00, 4000)
|
|
540
|
-
_(obj.time_2).must_equal
|
|
541
|
-
obj.save
|
|
542
|
-
_(obj.time_2).must_equal
|
|
543
|
+
_(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0), "Microseconds were <#{obj.time_2.usec}> vs <0>"
|
|
544
|
+
obj.save!; obj.reload
|
|
545
|
+
_(obj.time_2).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0), "Microseconds were <#{obj.time_2.usec}> vs <0>"
|
|
543
546
|
end
|
|
544
547
|
|
|
545
|
-
it
|
|
546
|
-
skip
|
|
547
|
-
col = column(
|
|
548
|
-
_(col.sql_type).must_equal
|
|
548
|
+
it "time using default precision" do
|
|
549
|
+
skip "time() not supported in this protocol version" unless connection_dblib_73?
|
|
550
|
+
col = column("time_default")
|
|
551
|
+
_(col.sql_type).must_equal "time(7)"
|
|
549
552
|
_(col.type).must_equal :time
|
|
550
553
|
_(col.null).must_equal true
|
|
551
554
|
_(col.default).must_equal Time.utc(1900, 01, 01, 15, 03, 42, Rational(62197800, 1000)), "Nanoseconds were <#{col.default.nsec}> vs <62197800>"
|
|
552
555
|
_(col.default_function).must_be_nil
|
|
553
556
|
type = connection.lookup_cast_type_from_column(col)
|
|
554
|
-
_(type).must_be_instance_of
|
|
557
|
+
_(type).must_be_instance_of Type::Time
|
|
555
558
|
_(type.limit).must_be_nil
|
|
556
|
-
_(type.precision).must_equal
|
|
559
|
+
_(type.precision).must_equal 7
|
|
557
560
|
_(type.scale).must_be_nil
|
|
558
561
|
# Time's #usec precision (low micro)
|
|
559
562
|
obj.time_default = Time.utc(2000, 01, 01, 15, 45, 00, 300)
|
|
560
563
|
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_default.usec}> vs <0>"
|
|
561
564
|
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_default.nsec}> vs <300>"
|
|
562
|
-
obj.save
|
|
565
|
+
obj.save!; obj.reload
|
|
563
566
|
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_default.usec}> vs <0>"
|
|
564
567
|
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Nanoseconds were <#{obj.time_default.nsec}> vs <300>"
|
|
565
568
|
# Time's #usec precision (high micro)
|
|
566
569
|
obj.time_default = Time.utc(2000, 01, 01, 15, 45, 00, 234567)
|
|
567
|
-
_(obj.time_default).must_equal
|
|
568
|
-
obj.save
|
|
569
|
-
_(obj.time_default).must_equal
|
|
570
|
+
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_default.usec}> vs <234567>"
|
|
571
|
+
obj.save!; obj.reload
|
|
572
|
+
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, 234567), "Microseconds were <#{obj.time_default.usec}> vs <234567>"
|
|
570
573
|
# Time's #usec precision (high nano rounded)
|
|
571
574
|
obj.time_default = Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321545, 1000))
|
|
572
|
-
_(obj.time_default).must_equal
|
|
573
|
-
obj.save
|
|
574
|
-
_(obj.time_default).must_equal
|
|
575
|
+
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_default.nsec}> vs <288321500>"
|
|
576
|
+
obj.save!; obj.reload
|
|
577
|
+
_(obj.time_default).must_equal Time.utc(2000, 01, 01, 15, 45, 00, Rational(288321500, 1000)), "Nanoseconds were <#{obj.time_default.nsec}> vs <288321500>"
|
|
575
578
|
end
|
|
576
579
|
|
|
577
580
|
# Character Strings
|
|
578
581
|
|
|
579
|
-
it
|
|
580
|
-
col = column(
|
|
581
|
-
_(col.sql_type).must_equal
|
|
582
|
+
it "char(10)" do
|
|
583
|
+
col = column("char_10")
|
|
584
|
+
_(col.sql_type).must_equal "char(10)"
|
|
582
585
|
_(col.type).must_equal :char
|
|
583
586
|
_(col.null).must_equal true
|
|
584
|
-
_(col.default).must_equal
|
|
585
|
-
_(obj.char_10).must_equal
|
|
587
|
+
_(col.default).must_equal "1234567890"
|
|
588
|
+
_(obj.char_10).must_equal "1234567890"
|
|
586
589
|
_(col.default_function).must_be_nil
|
|
587
590
|
type = connection.lookup_cast_type_from_column(col)
|
|
588
591
|
_(type).must_be_instance_of Type::Char
|
|
@@ -590,19 +593,19 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
590
593
|
_(type.precision).must_be_nil
|
|
591
594
|
_(type.scale).must_be_nil
|
|
592
595
|
# Basic set and save.
|
|
593
|
-
obj.char_10 =
|
|
594
|
-
_(obj.char_10.strip).must_equal
|
|
596
|
+
obj.char_10 = "012345"
|
|
597
|
+
_(obj.char_10.strip).must_equal "012345"
|
|
595
598
|
obj.save!
|
|
596
|
-
_(obj.reload.char_10.strip).must_equal
|
|
599
|
+
_(obj.reload.char_10.strip).must_equal "012345"
|
|
597
600
|
end
|
|
598
601
|
|
|
599
|
-
it
|
|
600
|
-
col = column(
|
|
601
|
-
_(col.sql_type).must_equal
|
|
602
|
+
it "varchar(50)" do
|
|
603
|
+
col = column("varchar_50")
|
|
604
|
+
_(col.sql_type).must_equal "varchar(50)"
|
|
602
605
|
_(col.type).must_equal :varchar
|
|
603
606
|
_(col.null).must_equal true
|
|
604
|
-
_(col.default).must_equal
|
|
605
|
-
_(obj.varchar_50).must_equal
|
|
607
|
+
_(col.default).must_equal "test varchar_50"
|
|
608
|
+
_(obj.varchar_50).must_equal "test varchar_50"
|
|
606
609
|
_(col.default_function).must_be_nil
|
|
607
610
|
type = connection.lookup_cast_type_from_column(col)
|
|
608
611
|
_(type).must_be_instance_of Type::Varchar
|
|
@@ -610,16 +613,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
610
613
|
_(type.precision).must_be_nil
|
|
611
614
|
_(type.scale).must_be_nil
|
|
612
615
|
# Basic set and save.
|
|
613
|
-
assert_obj_set_and_save :varchar_50,
|
|
616
|
+
assert_obj_set_and_save :varchar_50, "Hello World"
|
|
614
617
|
end
|
|
615
618
|
|
|
616
|
-
it
|
|
617
|
-
col = column(
|
|
618
|
-
_(col.sql_type).must_equal
|
|
619
|
+
it "varchar(max)" do
|
|
620
|
+
col = column("varchar_max")
|
|
621
|
+
_(col.sql_type).must_equal "varchar(max)"
|
|
619
622
|
_(col.type).must_equal :varchar_max
|
|
620
623
|
_(col.null).must_equal true
|
|
621
|
-
_(col.default).must_equal
|
|
622
|
-
_(obj.varchar_max).must_equal
|
|
624
|
+
_(col.default).must_equal "test varchar_max"
|
|
625
|
+
_(obj.varchar_max).must_equal "test varchar_max"
|
|
623
626
|
_(col.default_function).must_be_nil
|
|
624
627
|
type = connection.lookup_cast_type_from_column(col)
|
|
625
628
|
_(type).must_be_instance_of Type::VarcharMax
|
|
@@ -627,16 +630,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
627
630
|
_(type.precision).must_be_nil
|
|
628
631
|
_(type.scale).must_be_nil
|
|
629
632
|
# Basic set and save.
|
|
630
|
-
assert_obj_set_and_save :varchar_max,
|
|
633
|
+
assert_obj_set_and_save :varchar_max, "Hello World"
|
|
631
634
|
end
|
|
632
635
|
|
|
633
|
-
it
|
|
634
|
-
col = column(
|
|
635
|
-
_(col.sql_type).must_equal
|
|
636
|
+
it "text" do
|
|
637
|
+
col = column("text")
|
|
638
|
+
_(col.sql_type).must_equal "text"
|
|
636
639
|
_(col.type).must_equal :text_basic
|
|
637
640
|
_(col.null).must_equal true
|
|
638
|
-
_(col.default).must_equal
|
|
639
|
-
_(obj.text).must_equal
|
|
641
|
+
_(col.default).must_equal "test text"
|
|
642
|
+
_(obj.text).must_equal "test text"
|
|
640
643
|
_(col.default_function).must_be_nil
|
|
641
644
|
type = connection.lookup_cast_type_from_column(col)
|
|
642
645
|
_(type).must_be_instance_of Type::Text
|
|
@@ -644,18 +647,18 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
644
647
|
_(type.precision).must_be_nil
|
|
645
648
|
_(type.scale).must_be_nil
|
|
646
649
|
# Basic set and save.
|
|
647
|
-
assert_obj_set_and_save :text,
|
|
650
|
+
assert_obj_set_and_save :text, "Hello World"
|
|
648
651
|
end
|
|
649
652
|
|
|
650
653
|
# Unicode Character Strings
|
|
651
654
|
|
|
652
|
-
it
|
|
653
|
-
col = column(
|
|
654
|
-
_(col.sql_type).must_equal
|
|
655
|
+
it "nchar(10)" do
|
|
656
|
+
col = column("nchar_10")
|
|
657
|
+
_(col.sql_type).must_equal "nchar(10)"
|
|
655
658
|
_(col.type).must_equal :nchar
|
|
656
659
|
_(col.null).must_equal true
|
|
657
|
-
_(col.default).must_equal
|
|
658
|
-
_(obj.nchar_10).must_equal
|
|
660
|
+
_(col.default).must_equal "12345678åå"
|
|
661
|
+
_(obj.nchar_10).must_equal "12345678åå"
|
|
659
662
|
_(col.default_function).must_be_nil
|
|
660
663
|
type = connection.lookup_cast_type_from_column(col)
|
|
661
664
|
_(type).must_be_instance_of Type::UnicodeChar
|
|
@@ -664,18 +667,18 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
664
667
|
_(type.scale).must_be_nil
|
|
665
668
|
# Basic set and save.
|
|
666
669
|
obj.nchar_10 = "五六"
|
|
667
|
-
_(obj.nchar_10.strip).must_equal
|
|
670
|
+
_(obj.nchar_10.strip).must_equal "五六"
|
|
668
671
|
obj.save!
|
|
669
|
-
_(obj.reload.nchar_10.strip).must_equal
|
|
672
|
+
_(obj.reload.nchar_10.strip).must_equal "五六"
|
|
670
673
|
end
|
|
671
674
|
|
|
672
|
-
it
|
|
673
|
-
col = column(
|
|
674
|
-
_(col.sql_type).must_equal
|
|
675
|
+
it "nvarchar(50)" do
|
|
676
|
+
col = column("nvarchar_50")
|
|
677
|
+
_(col.sql_type).must_equal "nvarchar(50)"
|
|
675
678
|
_(col.type).must_equal :string
|
|
676
679
|
_(col.null).must_equal true
|
|
677
|
-
_(col.default).must_equal
|
|
678
|
-
_(obj.nvarchar_50).must_equal
|
|
680
|
+
_(col.default).must_equal "test nvarchar_50 åå"
|
|
681
|
+
_(obj.nvarchar_50).must_equal "test nvarchar_50 åå"
|
|
679
682
|
_(col.default_function).must_be_nil
|
|
680
683
|
type = connection.lookup_cast_type_from_column(col)
|
|
681
684
|
_(type).must_be_instance_of Type::UnicodeVarchar
|
|
@@ -686,13 +689,13 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
686
689
|
assert_obj_set_and_save :nvarchar_50, "一二34五六"
|
|
687
690
|
end
|
|
688
691
|
|
|
689
|
-
it
|
|
690
|
-
col = column(
|
|
691
|
-
_(col.sql_type).must_equal
|
|
692
|
+
it "nvarchar(max)" do
|
|
693
|
+
col = column("nvarchar_max")
|
|
694
|
+
_(col.sql_type).must_equal "nvarchar(max)"
|
|
692
695
|
_(col.type).must_equal :text
|
|
693
696
|
_(col.null).must_equal true
|
|
694
|
-
_(col.default).must_equal
|
|
695
|
-
_(obj.nvarchar_max).must_equal
|
|
697
|
+
_(col.default).must_equal "test nvarchar_max åå"
|
|
698
|
+
_(obj.nvarchar_max).must_equal "test nvarchar_max åå"
|
|
696
699
|
_(col.default_function).must_be_nil
|
|
697
700
|
type = connection.lookup_cast_type_from_column(col)
|
|
698
701
|
_(type).must_be_instance_of Type::UnicodeVarcharMax
|
|
@@ -703,13 +706,13 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
703
706
|
assert_obj_set_and_save :nvarchar_max, "一二34五六"
|
|
704
707
|
end
|
|
705
708
|
|
|
706
|
-
it
|
|
707
|
-
col = column(
|
|
708
|
-
_(col.sql_type).must_equal
|
|
709
|
+
it "ntext" do
|
|
710
|
+
col = column("ntext")
|
|
711
|
+
_(col.sql_type).must_equal "ntext"
|
|
709
712
|
_(col.type).must_equal :ntext
|
|
710
713
|
_(col.null).must_equal true
|
|
711
|
-
_(col.default).must_equal
|
|
712
|
-
_(obj.ntext).must_equal
|
|
714
|
+
_(col.default).must_equal "test ntext åå"
|
|
715
|
+
_(obj.ntext).must_equal "test ntext åå"
|
|
713
716
|
_(col.default_function).must_be_nil
|
|
714
717
|
type = connection.lookup_cast_type_from_column(col)
|
|
715
718
|
_(type).must_be_instance_of Type::UnicodeText
|
|
@@ -722,12 +725,12 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
722
725
|
|
|
723
726
|
# Binary Strings
|
|
724
727
|
|
|
725
|
-
let(:binary_file) { File.join ARTest::SQLServer.test_root_sqlserver,
|
|
726
|
-
let(:binary_data) { File.open(binary_file,
|
|
728
|
+
let(:binary_file) { File.join ARTest::SQLServer.test_root_sqlserver, "fixtures", "1px.gif" }
|
|
729
|
+
let(:binary_data) { File.open(binary_file, "rb") { |f| f.read } }
|
|
727
730
|
|
|
728
|
-
it
|
|
729
|
-
col = column(
|
|
730
|
-
_(col.sql_type).must_equal
|
|
731
|
+
it "binary(49)" do
|
|
732
|
+
col = column("binary_49")
|
|
733
|
+
_(col.sql_type).must_equal "binary(49)"
|
|
731
734
|
_(col.type).must_equal :binary_basic
|
|
732
735
|
_(col.null).must_equal true
|
|
733
736
|
_(col.default).must_be_nil
|
|
@@ -746,9 +749,9 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
746
749
|
_(obj.reload.binary_49).must_equal binary_data
|
|
747
750
|
end
|
|
748
751
|
|
|
749
|
-
it
|
|
750
|
-
col = column(
|
|
751
|
-
_(col.sql_type).must_equal
|
|
752
|
+
it "varbinary(49)" do
|
|
753
|
+
col = column("varbinary_49")
|
|
754
|
+
_(col.sql_type).must_equal "varbinary(49)"
|
|
752
755
|
_(col.type).must_equal :varbinary
|
|
753
756
|
_(col.null).must_equal true
|
|
754
757
|
_(col.default).must_be_nil
|
|
@@ -759,17 +762,17 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
759
762
|
_(type.precision).must_be_nil
|
|
760
763
|
_(type.scale).must_be_nil
|
|
761
764
|
# Basic set and save.
|
|
762
|
-
|
|
763
|
-
_(
|
|
764
|
-
obj.varbinary_49 =
|
|
765
|
-
_(obj.varbinary_49).must_equal
|
|
765
|
+
binary_data20 = binary_data.to(20)
|
|
766
|
+
_(binary_data20.encoding).must_equal Encoding::BINARY
|
|
767
|
+
obj.varbinary_49 = binary_data20
|
|
768
|
+
_(obj.varbinary_49).must_equal binary_data20
|
|
766
769
|
obj.save!
|
|
767
|
-
_(obj.reload.varbinary_49).must_equal
|
|
770
|
+
_(obj.reload.varbinary_49).must_equal binary_data20
|
|
768
771
|
end
|
|
769
772
|
|
|
770
|
-
it
|
|
771
|
-
col = column(
|
|
772
|
-
_(col.sql_type).must_equal
|
|
773
|
+
it "varbinary(max)" do
|
|
774
|
+
col = column("varbinary_max")
|
|
775
|
+
_(col.sql_type).must_equal "varbinary(max)"
|
|
773
776
|
_(col.type).must_equal :binary
|
|
774
777
|
_(col.null).must_equal true
|
|
775
778
|
_(col.default).must_be_nil
|
|
@@ -786,57 +789,55 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
|
|
|
786
789
|
|
|
787
790
|
# Other Data Types
|
|
788
791
|
|
|
789
|
-
it
|
|
790
|
-
col = column(
|
|
791
|
-
_(col.sql_type).must_equal
|
|
792
|
+
it "uniqueidentifier" do
|
|
793
|
+
col = column("uniqueidentifier")
|
|
794
|
+
_(col.sql_type).must_equal "uniqueidentifier"
|
|
792
795
|
_(col.type).must_equal :uuid
|
|
793
796
|
_(col.null).must_equal true
|
|
794
797
|
_(col.default).must_be_nil
|
|
795
|
-
_(col.default_function).must_equal
|
|
798
|
+
_(col.default_function).must_equal "newid()"
|
|
796
799
|
type = connection.lookup_cast_type_from_column(col)
|
|
797
|
-
_(type).must_be_instance_of
|
|
800
|
+
_(type).must_be_instance_of Type::Uuid
|
|
798
801
|
_(type.limit).must_be_nil
|
|
799
802
|
_(type.precision).must_be_nil
|
|
800
803
|
_(type.scale).must_be_nil
|
|
801
804
|
# Basic set and save.
|
|
802
805
|
obj.uniqueidentifier = "this will not qualify as valid"
|
|
803
806
|
_(obj.uniqueidentifier).must_be_nil
|
|
804
|
-
obj.save
|
|
805
|
-
_(obj.uniqueidentifier).must_match
|
|
807
|
+
obj.save!; obj.reload
|
|
808
|
+
_(obj.uniqueidentifier).must_match Type::Uuid::ACCEPTABLE_UUID
|
|
806
809
|
obj.uniqueidentifier = "6F9619FF-8B86-D011-B42D-00C04FC964FF"
|
|
807
|
-
_(obj.uniqueidentifier).must_equal
|
|
808
|
-
obj.save
|
|
809
|
-
_(obj.uniqueidentifier).must_equal
|
|
810
|
+
_(obj.uniqueidentifier).must_equal "6F9619FF-8B86-D011-B42D-00C04FC964FF"
|
|
811
|
+
obj.save!; obj.reload
|
|
812
|
+
_(obj.uniqueidentifier).must_equal "6F9619FF-8B86-D011-B42D-00C04FC964FF"
|
|
810
813
|
end
|
|
811
814
|
|
|
812
|
-
it
|
|
813
|
-
col = column(
|
|
814
|
-
_(col.sql_type).must_equal
|
|
815
|
+
it "timestamp" do
|
|
816
|
+
col = column("timestamp")
|
|
817
|
+
_(col.sql_type).must_equal "timestamp"
|
|
815
818
|
_(col.type).must_equal :ss_timestamp
|
|
816
819
|
_(col.null).must_equal true
|
|
817
820
|
_(col.default).must_be_nil
|
|
818
821
|
_(col.default_function).must_be_nil
|
|
819
822
|
type = connection.lookup_cast_type_from_column(col)
|
|
820
|
-
_(type).must_be_instance_of
|
|
823
|
+
_(type).must_be_instance_of Type::Timestamp
|
|
821
824
|
_(type.limit).must_be_nil
|
|
822
825
|
_(type.precision).must_be_nil
|
|
823
826
|
_(type.scale).must_be_nil
|
|
824
827
|
# Basic read.
|
|
825
828
|
_(obj.timestamp).must_be_nil
|
|
826
|
-
obj.save
|
|
827
|
-
_(obj.timestamp).must_match
|
|
829
|
+
obj.save!; obj.reload
|
|
830
|
+
_(obj.timestamp).must_match %r|\000|
|
|
828
831
|
obj.timestamp
|
|
829
832
|
# Can set another attribute
|
|
830
833
|
obj.uniqueidentifier = "6F9619FF-8B86-D011-B42D-00C04FC964FF"
|
|
831
834
|
obj.save!
|
|
832
835
|
end
|
|
833
836
|
|
|
834
|
-
it
|
|
837
|
+
it "does not mark object as changed after save" do
|
|
835
838
|
obj.save!
|
|
836
839
|
obj.attributes
|
|
837
840
|
_(obj.changed?).must_equal false
|
|
838
841
|
end
|
|
839
|
-
|
|
840
842
|
end
|
|
841
|
-
|
|
842
843
|
end
|