activerecord-sqlserver-adapter 4.2.18 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -223
  3. data/Gemfile +18 -17
  4. data/RAILS5-TODO.md +36 -0
  5. data/README.md +27 -8
  6. data/RUNNING_UNIT_TESTS.md +0 -17
  7. data/Rakefile +2 -7
  8. data/VERSION +1 -1
  9. data/activerecord-sqlserver-adapter.gemspec +1 -1
  10. data/appveyor.yml +0 -2
  11. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +15 -8
  12. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +45 -97
  13. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +1 -2
  14. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +31 -10
  15. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +0 -18
  16. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -0
  17. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +101 -58
  18. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +7 -7
  19. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +20 -0
  20. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +56 -32
  21. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +1 -1
  22. data/lib/active_record/connection_adapters/sqlserver/type.rb +34 -32
  23. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +4 -0
  24. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +6 -0
  25. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -0
  26. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +9 -20
  27. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +30 -0
  28. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +28 -4
  29. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +28 -14
  30. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  31. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +4 -16
  32. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +9 -0
  33. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +4 -0
  34. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -0
  35. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +5 -1
  36. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +4 -0
  37. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -1
  38. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +5 -1
  39. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +8 -1
  40. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +4 -0
  41. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +20 -8
  42. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +25 -10
  43. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +4 -0
  44. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -0
  45. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +6 -0
  46. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +4 -0
  47. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +7 -1
  48. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +5 -1
  49. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +15 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +7 -1
  51. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +5 -1
  52. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +7 -1
  53. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +5 -1
  54. data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -0
  55. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +71 -57
  56. data/lib/active_record/connection_adapters/sqlserver_column.rb +5 -30
  57. data/lib/active_record/sqlserver_base.rb +1 -5
  58. data/lib/arel/visitors/sqlserver.rb +11 -20
  59. data/test/bin/setup.sh +4 -6
  60. data/test/cases/adapter_test_sqlserver.rb +11 -20
  61. data/test/cases/coerced_tests.rb +233 -138
  62. data/test/cases/column_test_sqlserver.rb +244 -227
  63. data/test/cases/connection_test_sqlserver.rb +5 -76
  64. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +7 -7
  65. data/test/cases/helper_sqlserver.rb +4 -15
  66. data/test/cases/pessimistic_locking_test_sqlserver.rb +1 -1
  67. data/test/cases/rake_test_sqlserver.rb +20 -14
  68. data/test/cases/schema_dumper_test_sqlserver.rb +94 -63
  69. data/test/cases/schema_test_sqlserver.rb +2 -2
  70. data/test/cases/showplan_test_sqlserver.rb +1 -1
  71. data/test/cases/specific_schema_test_sqlserver.rb +7 -14
  72. data/test/cases/transaction_test_sqlserver.rb +1 -1
  73. data/test/cases/uuid_test_sqlserver.rb +0 -1
  74. data/test/config.yml +0 -10
  75. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +1 -1
  76. data/test/schema/sqlserver_specific_schema.rb +0 -16
  77. data/test/support/coerceable_test_sqlserver.rb +6 -2
  78. data/test/support/connection_reflection.rb +0 -4
  79. data/test/support/sql_counter_sqlserver.rb +17 -21
  80. metadata +9 -7
  81. data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +0 -34
  82. data/lib/active_record/connection_adapters/sqlserver/schema_cache.rb +0 -114
@@ -36,14 +36,13 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
36
36
  it 'bigint(8)' do
37
37
  col = column('bigint')
38
38
  col.sql_type.must_equal 'bigint(8)'
39
+ col.type.must_equal :bigint
39
40
  col.null.must_equal true
40
41
  col.default.must_equal 42
41
42
  obj.bigint.must_equal 42
42
- col.default_function.must_equal nil
43
- type = col.cast_type
43
+ col.default_function.must_be_nil
44
+ type = connection.lookup_cast_type_from_column(col)
44
45
  type.must_be_instance_of Type::BigInteger
45
- type.type.must_equal :bigint
46
- type.must_be :number?
47
46
  type.limit.must_equal 8
48
47
  assert_obj_set_and_save :bigint, -9_223_372_036_854_775_808
49
48
  assert_obj_set_and_save :bigint, 9_223_372_036_854_775_807
@@ -52,14 +51,13 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
52
51
  it 'int(4)' do
53
52
  col = column('int')
54
53
  col.sql_type.must_equal 'int(4)'
54
+ col.type.must_equal :integer
55
55
  col.null.must_equal true
56
56
  col.default.must_equal 42
57
57
  obj.int.must_equal 42
58
- col.default_function.must_equal nil
59
- type = col.cast_type
58
+ col.default_function.must_be_nil
59
+ type = connection.lookup_cast_type_from_column(col)
60
60
  type.must_be_instance_of Type::Integer
61
- type.type.must_equal :integer
62
- type.must_be :number?
63
61
  type.limit.must_equal 4
64
62
  assert_obj_set_and_save :int, -2_147_483_648
65
63
  assert_obj_set_and_save :int, 2_147_483_647
@@ -68,14 +66,13 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
68
66
  it 'smallint(2)' do
69
67
  col = column('smallint')
70
68
  col.sql_type.must_equal 'smallint(2)'
69
+ col.type.must_equal :integer
71
70
  col.null.must_equal true
72
71
  col.default.must_equal 42
73
72
  obj.smallint.must_equal 42
74
- col.default_function.must_equal nil
75
- type = col.cast_type
73
+ col.default_function.must_be_nil
74
+ type = connection.lookup_cast_type_from_column(col)
76
75
  type.must_be_instance_of Type::SmallInteger
77
- type.type.must_equal :integer
78
- type.must_be :number?
79
76
  type.limit.must_equal 2
80
77
  assert_obj_set_and_save :smallint, -32_768
81
78
  assert_obj_set_and_save :smallint, 32_767
@@ -84,14 +81,13 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
84
81
  it 'tinyint(1)' do
85
82
  col = column('tinyint')
86
83
  col.sql_type.must_equal 'tinyint(1)'
84
+ col.type.must_equal :integer
87
85
  col.null.must_equal true
88
86
  col.default.must_equal 42
89
87
  obj.tinyint.must_equal 42
90
- col.default_function.must_equal nil
91
- type = col.cast_type
88
+ col.default_function.must_be_nil
89
+ type = connection.lookup_cast_type_from_column(col)
92
90
  type.must_be_instance_of Type::TinyInteger
93
- type.type.must_equal :integer
94
- type.must_be :number?
95
91
  type.limit.must_equal 1
96
92
  assert_obj_set_and_save :tinyint, 0
97
93
  assert_obj_set_and_save :tinyint, 255
@@ -100,15 +96,14 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
100
96
  it 'bit' do
101
97
  col = column('bit')
102
98
  col.sql_type.must_equal 'bit'
99
+ col.type.must_equal :boolean
103
100
  col.null.must_equal true
104
101
  col.default.must_equal true
105
102
  obj.bit.must_equal true
106
- col.default_function.must_equal nil
107
- type = col.cast_type
103
+ col.default_function.must_be_nil
104
+ type = connection.lookup_cast_type_from_column(col)
108
105
  type.must_be_instance_of Type::Boolean
109
- type.type.must_equal :boolean
110
- type.wont_be :number?
111
- type.limit.must_equal nil
106
+ type.limit.must_be_nil
112
107
  obj.bit = 0
113
108
  obj.bit.must_equal false
114
109
  obj.save!
@@ -122,15 +117,14 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
122
117
  it 'decimal(9,2)' do
123
118
  col = column('decimal_9_2')
124
119
  col.sql_type.must_equal 'decimal(9,2)'
120
+ col.type.must_equal :decimal
125
121
  col.null.must_equal true
126
122
  col.default.must_equal BigDecimal('12345.01')
127
123
  obj.decimal_9_2.must_equal BigDecimal('12345.01')
128
- col.default_function.must_equal nil
129
- type = col.cast_type
124
+ col.default_function.must_be_nil
125
+ type = connection.lookup_cast_type_from_column(col)
130
126
  type.must_be_instance_of Type::Decimal
131
- type.type.must_equal :decimal
132
- type.must_be :number?
133
- type.limit.must_equal nil
127
+ type.limit.must_be_nil
134
128
  type.precision.must_equal 9
135
129
  type.scale.must_equal 2
136
130
  obj.decimal_9_2 = '1234567.8901'
@@ -144,8 +138,8 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
144
138
  col.sql_type.must_equal 'decimal(16,4)'
145
139
  col.default.must_equal BigDecimal('1234567.89')
146
140
  obj.decimal_16_4.must_equal BigDecimal('1234567.89')
147
- col.default_function.must_equal nil
148
- type = col.cast_type
141
+ col.default_function.must_be_nil
142
+ type = connection.lookup_cast_type_from_column(col)
149
143
  type.precision.must_equal 16
150
144
  type.scale.must_equal 4
151
145
  obj.decimal_16_4 = '1234567.8901001'
@@ -157,15 +151,14 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
157
151
  it 'numeric(18,0)' do
158
152
  col = column('numeric_18_0')
159
153
  col.sql_type.must_equal 'numeric(18,0)'
154
+ col.type.must_equal :decimal
160
155
  col.null.must_equal true
161
156
  col.default.must_equal BigDecimal('191')
162
157
  obj.numeric_18_0.must_equal BigDecimal('191')
163
- col.default_function.must_equal nil
164
- type = col.cast_type
158
+ col.default_function.must_be_nil
159
+ type = connection.lookup_cast_type_from_column(col)
165
160
  type.must_be_instance_of Type::Decimal
166
- type.type.must_equal :decimal
167
- type.must_be :number?
168
- type.limit.must_equal nil
161
+ type.limit.must_be_nil
169
162
  type.precision.must_equal 18
170
163
  type.scale.must_equal 0
171
164
  obj.numeric_18_0 = '192.1'
@@ -177,15 +170,14 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
177
170
  it 'numeric(36,2)' do
178
171
  col = column('numeric_36_2')
179
172
  col.sql_type.must_equal 'numeric(36,2)'
173
+ col.type.must_equal :decimal
180
174
  col.null.must_equal true
181
175
  col.default.must_equal BigDecimal('12345678901234567890.01')
182
176
  obj.numeric_36_2.must_equal BigDecimal('12345678901234567890.01')
183
- col.default_function.must_equal nil
184
- type = col.cast_type
177
+ col.default_function.must_be_nil
178
+ type = connection.lookup_cast_type_from_column(col)
185
179
  type.must_be_instance_of Type::Decimal
186
- type.type.must_equal :decimal
187
- type.must_be :number?
188
- type.limit.must_equal nil
180
+ type.limit.must_be_nil
189
181
  type.precision.must_equal 36
190
182
  type.scale.must_equal 2
191
183
  obj.numeric_36_2 = '192.123'
@@ -197,15 +189,14 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
197
189
  it 'money' do
198
190
  col = column('money')
199
191
  col.sql_type.must_equal 'money'
192
+ col.type.must_equal :money
200
193
  col.null.must_equal true
201
194
  col.default.must_equal BigDecimal('4.20')
202
195
  obj.money.must_equal BigDecimal('4.20')
203
- col.default_function.must_equal nil
204
- type = col.cast_type
196
+ col.default_function.must_be_nil
197
+ type = connection.lookup_cast_type_from_column(col)
205
198
  type.must_be_instance_of Type::Money
206
- type.type.must_equal :money
207
- type.must_be :number?
208
- type.limit.must_equal nil
199
+ type.limit.must_be_nil
209
200
  type.precision.must_equal 19
210
201
  type.scale.must_equal 4
211
202
  obj.money = '922337203685477.58061'
@@ -217,15 +208,14 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
217
208
  it 'smallmoney' do
218
209
  col = column('smallmoney')
219
210
  col.sql_type.must_equal 'smallmoney'
211
+ col.type.must_equal :smallmoney
220
212
  col.null.must_equal true
221
213
  col.default.must_equal BigDecimal('4.20')
222
214
  obj.smallmoney.must_equal BigDecimal('4.20')
223
- col.default_function.must_equal nil
224
- type = col.cast_type
215
+ col.default_function.must_be_nil
216
+ type = connection.lookup_cast_type_from_column(col)
225
217
  type.must_be_instance_of Type::SmallMoney
226
- type.type.must_equal :smallmoney
227
- type.must_be :number?
228
- type.limit.must_equal nil
218
+ type.limit.must_be_nil
229
219
  type.precision.must_equal 10
230
220
  type.scale.must_equal 4
231
221
  obj.smallmoney = '214748.36461'
@@ -241,17 +231,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
241
231
  it 'float' do
242
232
  col = column('float')
243
233
  col.sql_type.must_equal 'float'
234
+ col.type.must_equal :float
244
235
  col.null.must_equal true
245
236
  col.default.must_equal 123.00000001
246
237
  obj.float.must_equal 123.00000001
247
- col.default_function.must_equal nil
248
- type = col.cast_type
238
+ col.default_function.must_be_nil
239
+ type = connection.lookup_cast_type_from_column(col)
249
240
  type.must_be_instance_of Type::Float
250
- type.type.must_equal :float
251
- type.must_be :number?
252
- type.limit.must_equal nil
253
- type.precision.must_equal nil
254
- type.scale.must_equal nil
241
+ type.limit.must_be_nil
242
+ type.precision.must_be_nil
243
+ type.scale.must_be_nil
255
244
  obj.float = '214748.36461'
256
245
  obj.float.must_equal 214748.36461
257
246
  obj.save!
@@ -261,17 +250,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
261
250
  it 'real' do
262
251
  col = column('real')
263
252
  col.sql_type.must_equal 'real'
253
+ col.type.must_equal :real
264
254
  col.null.must_equal true
265
255
  col.default.must_be_close_to 123.45, 0.01
266
256
  obj.real.must_be_close_to 123.45, 0.01
267
- col.default_function.must_equal nil
268
- type = col.cast_type
257
+ col.default_function.must_be_nil
258
+ type = connection.lookup_cast_type_from_column(col)
269
259
  type.must_be_instance_of Type::Real
270
- type.type.must_equal :real
271
- type.must_be :number?
272
- type.limit.must_equal nil
273
- type.precision.must_equal nil
274
- type.scale.must_equal nil
260
+ type.limit.must_be_nil
261
+ type.precision.must_be_nil
262
+ type.scale.must_be_nil
275
263
  obj.real = '214748.36461'
276
264
  obj.real.must_be_close_to 214748.36461, 0.01
277
265
  obj.save!
@@ -283,22 +271,30 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
283
271
  it 'date' do
284
272
  col = column('date')
285
273
  col.sql_type.must_equal 'date'
274
+ col.type.must_equal :date
286
275
  col.null.must_equal true
287
276
  col.default.must_equal connection_dblib_73? ? Date.civil(0001, 1, 1) : '0001-01-01'
288
277
  obj.date.must_equal Date.civil(0001, 1, 1)
289
- col.default_function.must_equal nil
290
- type = col.cast_type
278
+ col.default_function.must_be_nil
279
+ type = connection.lookup_cast_type_from_column(col)
291
280
  type.must_be_instance_of Type::Date
292
- type.type.must_equal :date
293
- type.wont_be :number?
294
- type.limit.must_equal nil
295
- type.precision.must_equal nil
296
- type.scale.must_equal nil
297
- # Can cast strings.
298
- obj.date = '0001-01-01'
299
- obj.date.must_equal Date.civil(0001, 1, 1)
281
+ type.limit.must_be_nil
282
+ type.precision.must_be_nil
283
+ type.scale.must_be_nil
284
+ # Can cast strings. SQL Server format.
285
+ obj.date = '04-01-0001'
286
+ obj.date.must_equal Date.civil(0001, 4, 1)
287
+ obj.save!
288
+ obj.date.must_equal Date.civil(0001, 4, 1)
289
+ obj.reload
290
+ obj.date.must_equal Date.civil(0001, 4, 1)
291
+ # Can cast strings. ISO format.
292
+ obj.date = '0001-04-01'
293
+ obj.date.must_equal Date.civil(0001, 4, 1)
300
294
  obj.save!
301
- obj.reload.date.must_equal Date.civil(0001, 1, 1)
295
+ obj.date.must_equal Date.civil(0001, 4, 1)
296
+ obj.reload
297
+ obj.date.must_equal Date.civil(0001, 4, 1)
302
298
  # Can keep and return assigned date.
303
299
  assert_obj_set_and_save :date, Date.civil(1972, 04, 14)
304
300
  # Can accept and cast time objects.
@@ -311,109 +307,144 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
311
307
  it 'datetime' do
312
308
  col = column('datetime')
313
309
  col.sql_type.must_equal 'datetime'
310
+ col.type.must_equal :datetime
314
311
  col.null.must_equal true
315
- col.default.must_equal Time.utc(1753, 01, 01, 00, 00, 00, 123000), "Microseconds were <#{col.default.usec}> vs <123000>"
316
- obj.datetime.must_equal Time.utc(1753, 01, 01, 00, 00, 00, 123000), "Microseconds were <#{obj.datetime.usec}> vs <123000>"
317
- col.default_function.must_equal nil
318
- type = col.cast_type
312
+ time = Time.utc 1753, 01, 01, 00, 00, 00, 123000
313
+ col.default.must_equal time, "Microseconds were <#{col.default.usec}> vs <123000>"
314
+ obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <123000>"
315
+ col.default_function.must_be_nil
316
+ type = connection.lookup_cast_type_from_column(col)
319
317
  type.must_be_instance_of Type::DateTime
320
- type.type.must_equal :datetime
321
- type.wont_be :number?
322
- type.limit.must_equal nil
323
- type.precision.must_equal nil
324
- type.scale.must_equal nil
318
+ type.limit.must_be_nil
319
+ type.precision.must_be_nil
320
+ type.scale.must_be_nil
321
+ obj.save!
322
+ obj.must_equal obj.class.where(datetime: time).first
325
323
  # Can save to proper accuracy and return again.
326
- obj.datetime = Time.utc(2010, 01, 01, 12, 34, 56, 3000)
327
- obj.datetime.must_equal Time.utc(2010, 01, 01, 12, 34, 56, 3000), "Microseconds were <#{obj.datetime.usec}> vs <3000>"
324
+ time = Time.utc 2010, 04, 01, 12, 34, 56, 3000
325
+ obj.datetime = time
326
+ obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
328
327
  obj.save!
329
- obj.reload.datetime.must_equal Time.utc(2010, 01, 01, 12, 34, 56, 3000), "Microseconds were <#{obj.reload.datetime.usec}> vs <3000>"
328
+ obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
329
+ obj.reload
330
+ obj.datetime.must_equal time, "Microseconds were <#{obj.datetime.usec}> vs <3000>"
331
+ obj.must_equal obj.class.where(datetime: time).first
330
332
  # Will cast to true DB value on attribute write, save and return again.
331
- obj.datetime = Time.utc(2010, 01, 01, 12, 34, 56, 234567)
332
- obj.datetime.must_equal Time.utc(2010, 01, 01, 12, 34, 56, 233000), "Microseconds were <#{obj.datetime.usec}> vs <233000>"
333
+ time = Time.utc 2010, 04, 01, 12, 34, 56, 234567
334
+ time2 = Time.utc 2010, 04, 01, 12, 34, 56, 233000
335
+ obj.datetime = time
336
+ obj.datetime.must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
337
+ obj.save!
338
+ obj.datetime.must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
339
+ obj.reload
340
+ obj.datetime.must_equal time2, "Microseconds were <#{obj.datetime.usec}> vs <233000>"
341
+ obj.must_equal obj.class.where(datetime: time).first
342
+ obj.must_equal obj.class.where(datetime: time2).first
343
+ # Set and find nil.
344
+ obj.datetime = nil
345
+ obj.datetime.must_be_nil
333
346
  obj.save!
334
- obj.reload.datetime.must_equal Time.utc(2010, 01, 01, 12, 34, 56, 233000), "Microseconds were <#{obj.reload.datetime.usec}> vs <233000>"
347
+ obj.datetime.must_be_nil
348
+ obj.must_equal obj.class.where(datetime: nil).first
335
349
  end
336
350
 
337
351
  it 'datetime2' do
338
352
  skip 'datetime2 not supported in this protocal version' unless connection_dblib_73?
339
353
  col = column('datetime2_7')
340
354
  col.sql_type.must_equal 'datetime2(7)'
355
+ col.type.must_equal :datetime
341
356
  col.null.must_equal true
342
- col.default.must_equal Time.utc(9999, 12, 31, 23, 59, 59, Rational(999999900, 1000)), "Nanoseconds were <#{col.default.nsec}> vs <999999900>"
343
- obj.datetime2_7.must_equal Time.utc(9999, 12, 31, 23, 59, 59, Rational(999999900, 1000)), "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <999999900>"
344
- col.default_function.must_equal nil
345
- type = col.cast_type
357
+ time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(999999900, 1000)
358
+ col.default.must_equal time, "Nanoseconds were <#{col.default.nsec}> vs <999999900>"
359
+ obj.datetime2_7.must_equal time, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <999999900>"
360
+ col.default_function.must_be_nil
361
+ type = connection.lookup_cast_type_from_column(col)
346
362
  type.must_be_instance_of Type::DateTime2
347
- type.type.must_equal :datetime2
348
- type.wont_be :number?
349
- type.limit.must_equal nil
363
+ type.limit.must_be_nil
350
364
  type.precision.must_equal 7
351
- type.scale.must_equal nil
365
+ type.scale.must_be_nil
366
+ obj.save!
367
+ obj.must_equal obj.class.where(datetime2_7: time).first
352
368
  # Can save 100 nanosecond precisoins and return again.
353
- obj.datetime2_7 = Time.utc(9999, 12, 31, 23, 59, 59, Rational(123456755, 1000))
354
- obj.datetime2_7.must_equal Time.utc(9999, 12, 31, 23, 59, 59, Rational(123456800, 1000)), "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
369
+ time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456755, 1000)
370
+ time2 = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456800, 1000)
371
+ obj.datetime2_7 = time
372
+ obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
355
373
  obj.save!
356
- obj.reload.datetime2_7.must_equal Time.utc(9999, 12, 31, 23, 59, 59, Rational(123456800, 1000)), "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
374
+ obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
375
+ obj.reload
376
+ obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <123456800>"
377
+ obj.must_equal obj.class.where(datetime2_7: time).first
378
+ obj.must_equal obj.class.where(datetime2_7: time2).first
357
379
  # Can save small fraction nanosecond precisoins and return again.
358
- obj.datetime2_7 = Time.utc(2008, 6, 21, 13, 30, 0, Rational(15020, 1000))
359
- obj.datetime2_7.must_equal Time.utc(2008, 6, 21, 13, 30, 0, Rational(15000, 1000)), "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
380
+ time = Time.utc 2008, 6, 21, 13, 30, 0, Rational(15020, 1000)
381
+ time2 = Time.utc 2008, 6, 21, 13, 30, 0, Rational(15000, 1000)
382
+ obj.datetime2_7 = time
383
+ obj.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
360
384
  obj.save!
361
- obj.reload.datetime2_7.must_equal Time.utc(2008, 6, 21, 13, 30, 0, Rational(15000, 1000)), "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
362
- # With other precisions.
385
+ obj.reload.datetime2_7.must_equal time2, "Nanoseconds were <#{obj.datetime2_7.nsec}> vs <15000>"
386
+ obj.must_equal obj.class.where(datetime2_7: time).first
387
+ obj.must_equal obj.class.where(datetime2_7: time2).first
388
+ # datetime2_3
363
389
  time = Time.utc 9999, 12, 31, 23, 59, 59, Rational(123456789, 1000)
364
390
  col = column('datetime2_3')
365
- col.cast_type.precision.must_equal 3
391
+ connection.lookup_cast_type_from_column(col).precision.must_equal 3
366
392
  obj.datetime2_3 = time
367
393
  obj.datetime2_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
368
394
  obj.save! ; obj.reload
369
395
  obj.datetime2_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetime2_3.nsec}> vs <123000000>"
396
+ obj.must_equal obj.class.where(datetime2_3: time).first
397
+ # datetime2_1
370
398
  col = column('datetime2_1')
371
- col.cast_type.precision.must_equal 1
399
+ connection.lookup_cast_type_from_column(col).precision.must_equal 1
372
400
  obj.datetime2_1 = time
373
401
  obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
374
402
  obj.save! ; obj.reload
375
403
  obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
404
+ obj.must_equal obj.class.where(datetime2_1: time).first
405
+ # datetime2_0
376
406
  col = column('datetime2_0')
377
- col.cast_type.precision.must_equal 0
407
+ connection.lookup_cast_type_from_column(col).precision.must_equal 0
378
408
  time = Time.utc 2016, 4, 19, 16, 45, 40, 771036
379
409
  obj.datetime2_0 = time
380
410
  obj.datetime2_0.must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
381
411
  obj.save! ; obj.reload
382
412
  obj.datetime2_0.must_equal time.change(nsec: 0), "Nanoseconds were <#{obj.datetime2_0.nsec}> vs <0>"
413
+ obj.must_equal obj.class.where(datetime2_0: time).first
383
414
  end
384
415
 
385
416
  it 'datetimeoffset' do
386
417
  skip 'datetimeoffset not supported in this protocal version' unless connection_dblib_73?
387
418
  col = column('datetimeoffset_7')
388
419
  col.sql_type.must_equal 'datetimeoffset(7)'
420
+ col.type.must_equal :datetime
389
421
  col.null.must_equal true
390
422
  col.default.must_equal Time.new(1984, 01, 24, 04, 20, 00, -28800).change(nsec: 123456700), "Nanoseconds <#{col.default.nsec}> vs <123456700>"
391
423
  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>"
392
- col.default_function.must_equal nil
393
- type = col.cast_type
424
+ col.default_function.must_be_nil
425
+ type = connection.lookup_cast_type_from_column(col)
394
426
  type.must_be_instance_of Type::DateTimeOffset
395
- type.type.must_equal :datetimeoffset
396
- type.wont_be :number?
397
- type.limit.must_equal nil
427
+ type.limit.must_be_nil
398
428
  type.precision.must_equal 7
399
- type.scale.must_equal nil
429
+ type.scale.must_be_nil
400
430
  # Can save 100 nanosecond precisoins and return again.
401
- obj.datetimeoffset_7 = Time.new(2010, 01, 01, 12, 34, 56, +18000).change(nsec: 123456755)
402
- obj.datetimeoffset_7.must_equal Time.new(2010, 01, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
403
- obj.save! ; obj.reload
404
- obj.datetimeoffset_7.must_equal Time.new(2010, 01, 01, 12, 34, 56, +18000).change(nsec: 123456800), "Nanoseconds were <#{obj.datetimeoffset_7.nsec}> vs <123456800>"
431
+ obj.datetimeoffset_7 = Time.new(2010, 04, 01, 12, 34, 56, +18000).change(nsec: 123456755)
432
+ 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>"
433
+ obj.save!
434
+ 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>"
435
+ obj.reload
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>"
405
437
  # With other precisions.
406
438
  time = ActiveSupport::TimeZone['America/Los_Angeles'].local 2010, 12, 31, 23, 59, 59, Rational(123456755, 1000)
407
439
  col = column('datetimeoffset_3')
408
- col.cast_type.precision.must_equal 3
440
+ connection.lookup_cast_type_from_column(col).precision.must_equal 3
409
441
  obj.datetimeoffset_3 = time
410
442
  obj.datetimeoffset_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
411
443
  # TODO: FreeTDS date bug fixed: https://github.com/FreeTDS/freetds/issues/44
412
- return
413
444
  obj.save! ; obj.reload
414
445
  obj.datetimeoffset_3.must_equal time.change(nsec: 123000000), "Nanoseconds were <#{obj.datetimeoffset_3.nsec}> vs <123000000>"
415
446
  col = column('datetime2_1')
416
- col.cast_type.precision.must_equal 1
447
+ connection.lookup_cast_type_from_column(col).precision.must_equal 1
417
448
  obj.datetime2_1 = time
418
449
  obj.datetime2_1.must_equal time.change(nsec: 100000000), "Nanoseconds were <#{obj.datetime2_1.nsec}> vs <100000000>"
419
450
  obj.save! ; obj.reload
@@ -423,38 +454,38 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
423
454
  it 'smalldatetime' do
424
455
  col = column('smalldatetime')
425
456
  col.sql_type.must_equal 'smalldatetime'
457
+ col.type.must_equal :smalldatetime
426
458
  col.null.must_equal true
427
459
  col.default.must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
428
460
  obj.smalldatetime.must_equal Time.utc(1901, 01, 01, 15, 45, 00, 000)
429
- col.default_function.must_equal nil
430
- type = col.cast_type
461
+ col.default_function.must_be_nil
462
+ type = connection.lookup_cast_type_from_column(col)
431
463
  type.must_be_instance_of Type::SmallDateTime
432
- type.type.must_equal :smalldatetime
433
- type.wont_be :number?
434
- type.limit.must_equal nil
435
- type.precision.must_equal nil
436
- type.scale.must_equal nil
464
+ type.limit.must_be_nil
465
+ type.precision.must_be_nil
466
+ type.scale.must_be_nil
437
467
  # Will remove fractional seconds and return again.
438
468
  obj.smalldatetime = Time.utc(2078, 06, 05, 4, 20, 00, 3000)
439
- obj.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.smalldatetime.usec}> vs <0>"
469
+ obj.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.smalldatetime.usec}> vs <0>"
440
470
  obj.save!
441
- obj.reload.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
471
+ obj.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
472
+ obj.reload
473
+ obj.smalldatetime.must_equal Time.utc(2078, 06, 05, 4, 20, 00, 0), "Microseconds were <#{obj.reload.smalldatetime.usec}> vs <0>"
442
474
  end
443
475
 
444
476
  it 'time(7)' do
445
477
  skip 'time() not supported in this protocal version' unless connection_dblib_73?
446
478
  col = column('time_7')
447
479
  col.sql_type.must_equal 'time(7)'
480
+ col.type.must_equal :time
448
481
  col.null.must_equal true
449
482
  col.default.must_equal Time.utc(1900, 01, 01, 04, 20, 00, Rational(288321500, 1000)), "Nanoseconds were <#{col.default.nsec}> vs <288321500>"
450
- col.default_function.must_equal nil
451
- type = col.cast_type
483
+ col.default_function.must_be_nil
484
+ type = connection.lookup_cast_type_from_column(col)
452
485
  type.must_be_instance_of Type::Time
453
- type.type.must_equal :time
454
- type.wont_be :number?
455
- type.limit.must_equal nil
486
+ type.limit.must_be_nil
456
487
  type.precision.must_equal 7
457
- type.scale.must_equal nil
488
+ type.scale.must_be_nil
458
489
  # Time's #usec precision (low micro)
459
490
  obj.time_7 = Time.utc(2000, 01, 01, 15, 45, 00, 300)
460
491
  obj.time_7.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 300), "Microseconds were <#{obj.time_7.usec}> vs <0>"
@@ -478,16 +509,15 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
478
509
  skip 'time() not supported in this protocal version' unless connection_dblib_73?
479
510
  col = column('time_2')
480
511
  col.sql_type.must_equal 'time(2)'
512
+ col.type.must_equal :time
481
513
  col.null.must_equal true
482
- col.default.must_equal nil
483
- col.default_function.must_equal nil
484
- type = col.cast_type
514
+ col.default.must_be_nil
515
+ col.default_function.must_be_nil
516
+ type = connection.lookup_cast_type_from_column(col)
485
517
  type.must_be_instance_of Type::Time
486
- type.type.must_equal :time
487
- type.wont_be :number?
488
- type.limit.must_equal nil
518
+ type.limit.must_be_nil
489
519
  type.precision.must_equal 2
490
- type.scale.must_equal nil
520
+ type.scale.must_be_nil
491
521
  # Always uses TinyTDS/Windows 2000-01-01 convention too.
492
522
  obj.time_2 = Time.utc(2015, 01, 10, 15, 45, 00, 0)
493
523
  obj.time_2.must_equal Time.utc(2000, 01, 01, 15, 45, 00, 0)
@@ -510,17 +540,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
510
540
  it 'char(10)' do
511
541
  col = column('char_10')
512
542
  col.sql_type.must_equal 'char(10)'
543
+ col.type.must_equal :char
513
544
  col.null.must_equal true
514
545
  col.default.must_equal '1234567890'
515
546
  obj.char_10.must_equal '1234567890'
516
- col.default_function.must_equal nil
517
- type = col.cast_type
547
+ col.default_function.must_be_nil
548
+ type = connection.lookup_cast_type_from_column(col)
518
549
  type.must_be_instance_of Type::Char
519
- type.type.must_equal :char
520
- type.wont_be :number?
521
550
  type.limit.must_equal 10
522
- type.precision.must_equal nil
523
- type.scale.must_equal nil
551
+ type.precision.must_be_nil
552
+ type.scale.must_be_nil
524
553
  # Basic set and save.
525
554
  obj.char_10 = '012345'
526
555
  obj.char_10.strip.must_equal '012345'
@@ -531,17 +560,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
531
560
  it 'varchar(50)' do
532
561
  col = column('varchar_50')
533
562
  col.sql_type.must_equal 'varchar(50)'
563
+ col.type.must_equal :varchar
534
564
  col.null.must_equal true
535
565
  col.default.must_equal 'test varchar_50'
536
566
  obj.varchar_50.must_equal 'test varchar_50'
537
- col.default_function.must_equal nil
538
- type = col.cast_type
567
+ col.default_function.must_be_nil
568
+ type = connection.lookup_cast_type_from_column(col)
539
569
  type.must_be_instance_of Type::Varchar
540
- type.type.must_equal :varchar
541
- type.wont_be :number?
542
570
  type.limit.must_equal 50
543
- type.precision.must_equal nil
544
- type.scale.must_equal nil
571
+ type.precision.must_be_nil
572
+ type.scale.must_be_nil
545
573
  # Basic set and save.
546
574
  assert_obj_set_and_save :varchar_50, 'Hello World'
547
575
  end
@@ -549,17 +577,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
549
577
  it 'varchar(max)' do
550
578
  col = column('varchar_max')
551
579
  col.sql_type.must_equal 'varchar(max)'
580
+ col.type.must_equal :varchar_max
552
581
  col.null.must_equal true
553
582
  col.default.must_equal 'test varchar_max'
554
583
  obj.varchar_max.must_equal 'test varchar_max'
555
- col.default_function.must_equal nil
556
- type = col.cast_type
584
+ col.default_function.must_be_nil
585
+ type = connection.lookup_cast_type_from_column(col)
557
586
  type.must_be_instance_of Type::VarcharMax
558
- type.type.must_equal :varchar_max
559
- type.wont_be :number?
560
587
  type.limit.must_equal 2_147_483_647
561
- type.precision.must_equal nil
562
- type.scale.must_equal nil
588
+ type.precision.must_be_nil
589
+ type.scale.must_be_nil
563
590
  # Basic set and save.
564
591
  assert_obj_set_and_save :varchar_max, 'Hello World'
565
592
  end
@@ -567,17 +594,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
567
594
  it 'text' do
568
595
  col = column('text')
569
596
  col.sql_type.must_equal 'text'
597
+ col.type.must_equal :text_basic
570
598
  col.null.must_equal true
571
599
  col.default.must_equal 'test text'
572
600
  obj.text.must_equal 'test text'
573
- col.default_function.must_equal nil
574
- type = col.cast_type
601
+ col.default_function.must_be_nil
602
+ type = connection.lookup_cast_type_from_column(col)
575
603
  type.must_be_instance_of Type::Text
576
- type.type.must_equal :text_basic
577
- type.wont_be :number?
578
604
  type.limit.must_equal 2_147_483_647
579
- type.precision.must_equal nil
580
- type.scale.must_equal nil
605
+ type.precision.must_be_nil
606
+ type.scale.must_be_nil
581
607
  # Basic set and save.
582
608
  assert_obj_set_and_save :text, 'Hello World'
583
609
  end
@@ -587,17 +613,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
587
613
  it 'nchar(10)' do
588
614
  col = column('nchar_10')
589
615
  col.sql_type.must_equal 'nchar(10)'
616
+ col.type.must_equal :nchar
590
617
  col.null.must_equal true
591
618
  col.default.must_equal '12345678åå'
592
619
  obj.nchar_10.must_equal '12345678åå'
593
- col.default_function.must_equal nil
594
- type = col.cast_type
620
+ col.default_function.must_be_nil
621
+ type = connection.lookup_cast_type_from_column(col)
595
622
  type.must_be_instance_of Type::UnicodeChar
596
- type.type.must_equal :nchar
597
- type.wont_be :number?
598
623
  type.limit.must_equal 10
599
- type.precision.must_equal nil
600
- type.scale.must_equal nil
624
+ type.precision.must_be_nil
625
+ type.scale.must_be_nil
601
626
  # Basic set and save.
602
627
  obj.nchar_10 = "五六"
603
628
  obj.nchar_10.strip.must_equal "五六"
@@ -608,17 +633,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
608
633
  it 'nvarchar(50)' do
609
634
  col = column('nvarchar_50')
610
635
  col.sql_type.must_equal 'nvarchar(50)'
636
+ col.type.must_equal :string
611
637
  col.null.must_equal true
612
638
  col.default.must_equal 'test nvarchar_50 åå'
613
639
  obj.nvarchar_50.must_equal 'test nvarchar_50 åå'
614
- col.default_function.must_equal nil
615
- type = col.cast_type
640
+ col.default_function.must_be_nil
641
+ type = connection.lookup_cast_type_from_column(col)
616
642
  type.must_be_instance_of Type::UnicodeVarchar
617
- type.type.must_equal :string
618
- type.wont_be :number?
619
643
  type.limit.must_equal 50
620
- type.precision.must_equal nil
621
- type.scale.must_equal nil
644
+ type.precision.must_be_nil
645
+ type.scale.must_be_nil
622
646
  # Basic set and save.
623
647
  assert_obj_set_and_save :nvarchar_50, "一二34五六"
624
648
  end
@@ -626,17 +650,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
626
650
  it 'nvarchar(max)' do
627
651
  col = column('nvarchar_max')
628
652
  col.sql_type.must_equal 'nvarchar(max)'
653
+ col.type.must_equal :text
629
654
  col.null.must_equal true
630
655
  col.default.must_equal 'test nvarchar_max åå'
631
656
  obj.nvarchar_max.must_equal 'test nvarchar_max åå'
632
- col.default_function.must_equal nil
633
- type = col.cast_type
657
+ col.default_function.must_be_nil
658
+ type = connection.lookup_cast_type_from_column(col)
634
659
  type.must_be_instance_of Type::UnicodeVarcharMax
635
- type.type.must_equal :text
636
- type.wont_be :number?
637
660
  type.limit.must_equal 2_147_483_647
638
- type.precision.must_equal nil
639
- type.scale.must_equal nil
661
+ type.precision.must_be_nil
662
+ type.scale.must_be_nil
640
663
  # Basic set and save.
641
664
  assert_obj_set_and_save :nvarchar_max, "一二34五六"
642
665
  end
@@ -644,17 +667,16 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
644
667
  it 'ntext' do
645
668
  col = column('ntext')
646
669
  col.sql_type.must_equal 'ntext'
670
+ col.type.must_equal :ntext
647
671
  col.null.must_equal true
648
672
  col.default.must_equal 'test ntext åå'
649
673
  obj.ntext.must_equal 'test ntext åå'
650
- col.default_function.must_equal nil
651
- type = col.cast_type
674
+ col.default_function.must_be_nil
675
+ type = connection.lookup_cast_type_from_column(col)
652
676
  type.must_be_instance_of Type::UnicodeText
653
- type.type.must_equal :ntext
654
- type.wont_be :number?
655
677
  type.limit.must_equal 2_147_483_647
656
- type.precision.must_equal nil
657
- type.scale.must_equal nil
678
+ type.precision.must_be_nil
679
+ type.scale.must_be_nil
658
680
  # Basic set and save.
659
681
  assert_obj_set_and_save :ntext, "一二34五六"
660
682
  end
@@ -667,16 +689,15 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
667
689
  it 'binary(49)' do
668
690
  col = column('binary_49')
669
691
  col.sql_type.must_equal 'binary(49)'
692
+ col.type.must_equal :binary_basic
670
693
  col.null.must_equal true
671
- col.default.must_equal nil
672
- col.default_function.must_equal nil
673
- type = col.cast_type
694
+ col.default.must_be_nil
695
+ col.default_function.must_be_nil
696
+ type = connection.lookup_cast_type_from_column(col)
674
697
  type.must_be_instance_of Type::Binary
675
- type.type.must_equal :binary_basic
676
- type.wont_be :number?
677
698
  type.limit.must_equal 49
678
- type.precision.must_equal nil
679
- type.scale.must_equal nil
699
+ type.precision.must_be_nil
700
+ type.scale.must_be_nil
680
701
  # Basic set and save.
681
702
  binary_data.encoding.must_equal Encoding::BINARY
682
703
  binary_data.length.must_equal 49
@@ -689,16 +710,15 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
689
710
  it 'varbinary(49)' do
690
711
  col = column('varbinary_49')
691
712
  col.sql_type.must_equal 'varbinary(49)'
713
+ col.type.must_equal :varbinary
692
714
  col.null.must_equal true
693
- col.default.must_equal nil
694
- col.default_function.must_equal nil
695
- type = col.cast_type
715
+ col.default.must_be_nil
716
+ col.default_function.must_be_nil
717
+ type = connection.lookup_cast_type_from_column(col)
696
718
  type.must_be_instance_of Type::Varbinary
697
- type.type.must_equal :varbinary
698
- type.wont_be :number?
699
719
  type.limit.must_equal 49
700
- type.precision.must_equal nil
701
- type.scale.must_equal nil
720
+ type.precision.must_be_nil
721
+ type.scale.must_be_nil
702
722
  # Basic set and save.
703
723
  binary_data_20 = binary_data.to(20)
704
724
  binary_data_20.encoding.must_equal Encoding::BINARY
@@ -711,16 +731,15 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
711
731
  it 'varbinary(max)' do
712
732
  col = column('varbinary_max')
713
733
  col.sql_type.must_equal 'varbinary(max)'
734
+ col.type.must_equal :binary
714
735
  col.null.must_equal true
715
- col.default.must_equal nil
716
- col.default_function.must_equal nil
717
- type = col.cast_type
736
+ col.default.must_be_nil
737
+ col.default_function.must_be_nil
738
+ type = connection.lookup_cast_type_from_column(col)
718
739
  type.must_be_instance_of Type::VarbinaryMax
719
- type.type.must_equal :binary
720
- type.wont_be :number?
721
740
  type.limit.must_equal 2_147_483_647
722
- type.precision.must_equal nil
723
- type.scale.must_equal nil
741
+ type.precision.must_be_nil
742
+ type.scale.must_be_nil
724
743
  # Basic set and save.
725
744
  binary_data.encoding.must_equal Encoding::BINARY
726
745
  assert_obj_set_and_save :varbinary_max, binary_data
@@ -731,19 +750,18 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
731
750
  it 'uniqueidentifier' do
732
751
  col = column('uniqueidentifier')
733
752
  col.sql_type.must_equal 'uniqueidentifier'
753
+ col.type.must_equal :uuid
734
754
  col.null.must_equal true
735
- col.default.must_equal nil
755
+ col.default.must_be_nil
736
756
  col.default_function.must_equal 'newid()'
737
- type = col.cast_type
757
+ type = connection.lookup_cast_type_from_column(col)
738
758
  type.must_be_instance_of Type::Uuid
739
- type.type.must_equal :uuid
740
- type.wont_be :number?
741
- type.limit.must_equal nil
742
- type.precision.must_equal nil
743
- type.scale.must_equal nil
759
+ type.limit.must_be_nil
760
+ type.precision.must_be_nil
761
+ type.scale.must_be_nil
744
762
  # Basic set and save.
745
763
  obj.uniqueidentifier = "this will not qualify as valid"
746
- obj.uniqueidentifier.must_equal nil
764
+ obj.uniqueidentifier.must_be_nil
747
765
  obj.save! ; obj.reload
748
766
  obj.uniqueidentifier.must_match Type::Uuid::ACCEPTABLE_UUID
749
767
  obj.uniqueidentifier = "6F9619FF-8B86-D011-B42D-00C04FC964FF"
@@ -755,18 +773,17 @@ class ColumnTestSQLServer < ActiveRecord::TestCase
755
773
  it 'timestamp' do
756
774
  col = column('timestamp')
757
775
  col.sql_type.must_equal 'timestamp'
776
+ col.type.must_equal :ss_timestamp
758
777
  col.null.must_equal true
759
- col.default.must_equal nil
760
- col.default_function.must_equal nil
761
- type = col.cast_type
778
+ col.default.must_be_nil
779
+ col.default_function.must_be_nil
780
+ type = connection.lookup_cast_type_from_column(col)
762
781
  type.must_be_instance_of Type::Timestamp
763
- type.type.must_equal :ss_timestamp
764
- type.wont_be :number?
765
- type.limit.must_equal nil
766
- type.precision.must_equal nil
767
- type.scale.must_equal nil
782
+ type.limit.must_be_nil
783
+ type.precision.must_be_nil
784
+ type.scale.must_be_nil
768
785
  # Basic read.
769
- obj.timestamp.must_equal nil
786
+ obj.timestamp.must_be_nil
770
787
  obj.save! ; obj.reload
771
788
  obj.timestamp.must_match %r|\000|
772
789
  obj.timestamp