activerecord-sqlserver-adapter 4.2.18 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -223
- data/Gemfile +18 -17
- data/RAILS5-TODO.md +36 -0
- data/README.md +27 -8
- data/RUNNING_UNIT_TESTS.md +0 -17
- data/Rakefile +2 -7
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +1 -1
- data/appveyor.yml +0 -2
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +15 -8
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +45 -97
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +1 -2
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +31 -10
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +0 -18
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +101 -58
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +7 -7
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +56 -32
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +1 -1
- data/lib/active_record/connection_adapters/sqlserver/type.rb +34 -32
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +6 -0
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -0
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +9 -20
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +30 -0
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +28 -4
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +28 -14
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +4 -16
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +9 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -0
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -1
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +8 -1
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +20 -8
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +25 -10
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +6 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +4 -0
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +7 -1
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +15 -2
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +7 -1
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +7 -1
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +5 -1
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +71 -57
- data/lib/active_record/connection_adapters/sqlserver_column.rb +5 -30
- data/lib/active_record/sqlserver_base.rb +1 -5
- data/lib/arel/visitors/sqlserver.rb +11 -20
- data/test/bin/setup.sh +4 -6
- data/test/cases/adapter_test_sqlserver.rb +11 -20
- data/test/cases/coerced_tests.rb +233 -138
- data/test/cases/column_test_sqlserver.rb +244 -227
- data/test/cases/connection_test_sqlserver.rb +5 -76
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +7 -7
- data/test/cases/helper_sqlserver.rb +4 -15
- data/test/cases/pessimistic_locking_test_sqlserver.rb +1 -1
- data/test/cases/rake_test_sqlserver.rb +20 -14
- data/test/cases/schema_dumper_test_sqlserver.rb +94 -63
- data/test/cases/schema_test_sqlserver.rb +2 -2
- data/test/cases/showplan_test_sqlserver.rb +1 -1
- data/test/cases/specific_schema_test_sqlserver.rb +7 -14
- data/test/cases/transaction_test_sqlserver.rb +1 -1
- data/test/cases/uuid_test_sqlserver.rb +0 -1
- data/test/config.yml +0 -10
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +1 -1
- data/test/schema/sqlserver_specific_schema.rb +0 -16
- data/test/support/coerceable_test_sqlserver.rb +6 -2
- data/test/support/connection_reflection.rb +0 -4
- data/test/support/sql_counter_sqlserver.rb +17 -21
- metadata +9 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +0 -34
- data/lib/active_record/connection_adapters/sqlserver/schema_cache.rb +0 -114
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
5.0.0
|
@@ -16,5 +16,5 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ['lib']
|
19
|
-
spec.add_dependency 'activerecord', '~>
|
19
|
+
spec.add_dependency 'activerecord', '~> 5.0.0'
|
20
20
|
end
|
data/appveyor.yml
CHANGED
@@ -4,11 +4,14 @@ module ActiveRecord
|
|
4
4
|
module CoreExt
|
5
5
|
module Explain
|
6
6
|
|
7
|
-
SQLSERVER_STATEMENT_PREFIX = 'EXEC sp_executesql '
|
8
|
-
SQLSERVER_PARAM_MATCHER = /@\d+
|
7
|
+
SQLSERVER_STATEMENT_PREFIX = 'EXEC sp_executesql '.freeze
|
8
|
+
SQLSERVER_PARAM_MATCHER = /@\d+ = (.*)/
|
9
|
+
SQLSERVER_NATIONAL_STRING_MATCHER = /N'(.*)'/m
|
9
10
|
|
10
11
|
def exec_explain(queries)
|
11
|
-
unprepared_queries = queries.map
|
12
|
+
unprepared_queries = queries.map do |(sql, binds)|
|
13
|
+
[unprepare_sqlserver_statement(sql), binds]
|
14
|
+
end
|
12
15
|
super(unprepared_queries)
|
13
16
|
end
|
14
17
|
|
@@ -20,11 +23,15 @@ module ActiveRecord
|
|
20
23
|
def unprepare_sqlserver_statement(sql)
|
21
24
|
if sql.starts_with?(SQLSERVER_STATEMENT_PREFIX)
|
22
25
|
executesql = sql.from(SQLSERVER_STATEMENT_PREFIX.length)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
args = executesql.split(', ')
|
27
|
+
unprepared_sql = args.shift.strip.match(SQLSERVER_NATIONAL_STRING_MATCHER)[1]
|
28
|
+
unprepared_sql = Utils.unquote_string(unprepared_sql)
|
29
|
+
args = args.from(args.length / 2)
|
30
|
+
args.each_with_index do |arg, index|
|
31
|
+
value = arg.match(SQLSERVER_PARAM_MATCHER)[1]
|
32
|
+
unprepared_sql.sub! "@#{index}", value
|
33
|
+
end
|
34
|
+
unprepared_sql
|
28
35
|
else
|
29
36
|
sql
|
30
37
|
end
|
@@ -15,15 +15,13 @@ module ActiveRecord
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def exec_query(sql, name = 'SQL', binds = [],
|
19
|
-
sp_executesql(sql, name, binds)
|
18
|
+
def exec_query(sql, name = 'SQL', binds = [], prepare: false)
|
19
|
+
sp_executesql(sql, name, binds, prepare: prepare)
|
20
20
|
end
|
21
21
|
|
22
|
-
def exec_insert(sql, name, binds,
|
23
|
-
|
24
|
-
|
25
|
-
if id_insert && id_table
|
26
|
-
with_identity_insert_enabled(id_table) { exec_query(sql, name, binds) }
|
22
|
+
def exec_insert(sql, name, binds, pk = nil, _sequence_name = nil)
|
23
|
+
if pk && id_insert_table_name = query_requires_identity_insert?(sql)
|
24
|
+
with_identity_insert_enabled(id_insert_table_name) { exec_query(sql, name, binds) }
|
27
25
|
else
|
28
26
|
exec_query(sql, name, binds)
|
29
27
|
end
|
@@ -81,26 +79,18 @@ module ActiveRecord
|
|
81
79
|
def release_savepoint(name = current_savepoint_name)
|
82
80
|
end
|
83
81
|
|
84
|
-
def case_sensitive_modifier(node, table_attribute)
|
85
|
-
node = Arel::Nodes.build_quoted node, table_attribute
|
86
|
-
Arel::Nodes::Bin.new(node)
|
87
|
-
end
|
88
|
-
|
89
82
|
def case_sensitive_comparison(table, attribute, column, value)
|
90
|
-
if
|
91
|
-
table[attribute].eq(
|
83
|
+
if value && value.acts_like?(:string)
|
84
|
+
table[attribute].eq(Arel::Nodes::Bin.new(Arel::Nodes::BindParam.new))
|
92
85
|
else
|
93
86
|
super
|
94
87
|
end
|
95
88
|
end
|
96
89
|
|
97
|
-
def
|
98
|
-
|
99
|
-
super
|
100
|
-
else
|
101
|
-
table[attribute].eq(value)
|
102
|
-
end
|
90
|
+
def can_perform_case_insensitive_comparison_for?(column)
|
91
|
+
column.type == :string
|
103
92
|
end
|
93
|
+
private :can_perform_case_insensitive_comparison_for?
|
104
94
|
|
105
95
|
# === SQLServer Specific ======================================== #
|
106
96
|
|
@@ -122,24 +112,12 @@ module ActiveRecord
|
|
122
112
|
yield(r) if block_given?
|
123
113
|
end
|
124
114
|
result.each.map { |row| row.is_a?(Hash) ? row.with_indifferent_access : row }
|
125
|
-
when :odbc
|
126
|
-
results = []
|
127
|
-
raw_connection_run(sql) do |handle|
|
128
|
-
get_rows = lambda do
|
129
|
-
rows = handle_to_names_and_values handle, fetch: :all
|
130
|
-
rows.each_with_index { |r, i| rows[i] = r.with_indifferent_access }
|
131
|
-
results << rows
|
132
|
-
end
|
133
|
-
get_rows.call
|
134
|
-
get_rows.call while handle_more_results?(handle)
|
135
|
-
end
|
136
|
-
results.many? ? results : results.first
|
137
115
|
end
|
138
116
|
end
|
139
117
|
end
|
140
118
|
|
141
119
|
def with_identity_insert_enabled(table_name)
|
142
|
-
table_name = quote_table_name(
|
120
|
+
table_name = quote_table_name(table_name)
|
143
121
|
set_identity_insert(table_name, true)
|
144
122
|
yield
|
145
123
|
ensure
|
@@ -154,9 +132,7 @@ module ActiveRecord
|
|
154
132
|
|
155
133
|
def user_options
|
156
134
|
return {} if sqlserver_azure?
|
157
|
-
|
158
|
-
rows = rows.first if rows.size == 2 && rows.last.empty?
|
159
|
-
rows.reduce(HashWithIndifferentAccess.new) do |values, row|
|
135
|
+
select_rows('dbcc useroptions', 'SCHEMA').reduce(HashWithIndifferentAccess.new) do |values, row|
|
160
136
|
if row.instance_of? Hash
|
161
137
|
set_option = row.values[0].gsub(/\s+/, '_')
|
162
138
|
user_value = row.values[1]
|
@@ -213,36 +189,22 @@ module ActiveRecord
|
|
213
189
|
|
214
190
|
protected
|
215
191
|
|
216
|
-
def select(sql, name = nil, binds = [])
|
217
|
-
exec_query(sql, name, binds)
|
218
|
-
end
|
219
|
-
|
220
192
|
def sql_for_insert(sql, pk, id_value, sequence_name, binds)
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
else
|
225
|
-
"#{sql}; SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident"
|
193
|
+
if pk.nil?
|
194
|
+
table_name = query_requires_identity_insert?(sql)
|
195
|
+
pk = primary_key(table_name)
|
226
196
|
end
|
197
|
+
sql = if pk && self.class.use_output_inserted && !database_prefix_remote_server?
|
198
|
+
quoted_pk = SQLServer::Utils.extract_identifiers(pk).quoted
|
199
|
+
sql.insert sql.index(/ (DEFAULT )?VALUES/), " OUTPUT INSERTED.#{quoted_pk}"
|
200
|
+
else
|
201
|
+
"#{sql}; SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident"
|
202
|
+
end
|
227
203
|
super
|
228
204
|
end
|
229
205
|
|
230
206
|
# === SQLServer Specific ======================================== #
|
231
207
|
|
232
|
-
def binds_have_identity_column?(binds)
|
233
|
-
binds.any? do |column_value|
|
234
|
-
column, value = column_value
|
235
|
-
SQLServerColumn === column && column.is_identity?
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
def table_name_from_binds(binds)
|
240
|
-
binds.detect { |column_value|
|
241
|
-
column, value = column_value
|
242
|
-
SQLServerColumn === column
|
243
|
-
}.try(:first).try(:table_name)
|
244
|
-
end
|
245
|
-
|
246
208
|
def set_identity_insert(table_name, enable = true)
|
247
209
|
do_execute "SET IDENTITY_INSERT #{table_name} #{enable ? 'ON' : 'OFF'}"
|
248
210
|
rescue Exception
|
@@ -257,27 +219,39 @@ module ActiveRecord
|
|
257
219
|
|
258
220
|
def sp_executesql(sql, name, binds, options = {})
|
259
221
|
options[:ar_result] = true if options[:fetch] != :rows
|
260
|
-
|
261
|
-
|
222
|
+
unless without_prepared_statement?(binds)
|
223
|
+
types, params = sp_executesql_types_and_parameters(binds)
|
224
|
+
sql = sp_executesql_sql(sql, types, params, name)
|
225
|
+
end
|
262
226
|
raw_select sql, name, binds, options
|
263
227
|
end
|
264
228
|
|
265
229
|
def sp_executesql_types_and_parameters(binds)
|
266
230
|
types, params = [], []
|
267
|
-
binds.each_with_index do |
|
268
|
-
types << "@#{index} #{sp_executesql_sql_type(
|
269
|
-
params <<
|
231
|
+
binds.each_with_index do |attr, index|
|
232
|
+
types << "@#{index} #{sp_executesql_sql_type(attr)}"
|
233
|
+
params << sp_executesql_sql_param(attr)
|
270
234
|
end
|
271
235
|
[types, params]
|
272
236
|
end
|
273
237
|
|
274
|
-
def sp_executesql_sql_type(
|
275
|
-
return
|
276
|
-
|
277
|
-
|
278
|
-
|
238
|
+
def sp_executesql_sql_type(attr)
|
239
|
+
return attr.type.sqlserver_type if attr.type.respond_to?(:sqlserver_type)
|
240
|
+
case value = attr.value_for_database
|
241
|
+
when Numeric
|
242
|
+
'int'.freeze
|
243
|
+
else
|
244
|
+
'nvarchar(max)'.freeze
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def sp_executesql_sql_param(attr)
|
249
|
+
case attr.value_for_database
|
250
|
+
when Type::Binary::Data,
|
251
|
+
ActiveRecord::Type::SQLServer::Data
|
252
|
+
quote(attr.value_for_database)
|
279
253
|
else
|
280
|
-
|
254
|
+
quote(type_cast(attr.value_for_database))
|
281
255
|
end
|
282
256
|
end
|
283
257
|
|
@@ -285,7 +259,7 @@ module ActiveRecord
|
|
285
259
|
if name == 'EXPLAIN'
|
286
260
|
params.each.with_index do |param, index|
|
287
261
|
substitute_at_finder = /(@#{index})(?=(?:[^']|'[^']*')*$)/ # Finds unquoted @n values.
|
288
|
-
sql.sub! substitute_at_finder, param
|
262
|
+
sql.sub! substitute_at_finder, param.to_s
|
289
263
|
end
|
290
264
|
else
|
291
265
|
types = quote(types.join(', '))
|
@@ -300,8 +274,6 @@ module ActiveRecord
|
|
300
274
|
case @connection_options[:mode]
|
301
275
|
when :dblib
|
302
276
|
@connection.execute(sql).do
|
303
|
-
when :odbc
|
304
|
-
@connection.do(sql)
|
305
277
|
end
|
306
278
|
ensure
|
307
279
|
@update_sql = false
|
@@ -324,16 +296,12 @@ module ActiveRecord
|
|
324
296
|
case @connection_options[:mode]
|
325
297
|
when :dblib
|
326
298
|
@connection.execute(sql)
|
327
|
-
when :odbc
|
328
|
-
block_given? ? @connection.run_block(sql) { |handle| yield(handle) } : @connection.run(sql)
|
329
299
|
end
|
330
300
|
end
|
331
301
|
|
332
302
|
def handle_more_results?(handle)
|
333
303
|
case @connection_options[:mode]
|
334
304
|
when :dblib
|
335
|
-
when :odbc
|
336
|
-
handle.more_results
|
337
305
|
end
|
338
306
|
end
|
339
307
|
|
@@ -341,8 +309,6 @@ module ActiveRecord
|
|
341
309
|
case @connection_options[:mode]
|
342
310
|
when :dblib
|
343
311
|
handle_to_names_and_values_dblib(handle, options)
|
344
|
-
when :odbc
|
345
|
-
handle_to_names_and_values_odbc(handle, options)
|
346
312
|
end
|
347
313
|
end
|
348
314
|
|
@@ -356,28 +322,10 @@ module ActiveRecord
|
|
356
322
|
options[:ar_result] ? ActiveRecord::Result.new(columns, results) : results
|
357
323
|
end
|
358
324
|
|
359
|
-
def handle_to_names_and_values_odbc(handle, options = {})
|
360
|
-
@connection.use_utc = ActiveRecord::Base.default_timezone == :utc
|
361
|
-
if options[:ar_result]
|
362
|
-
columns = lowercase_schema_reflection ? handle.columns(true).map { |c| c.name.downcase } : handle.columns(true).map { |c| c.name }
|
363
|
-
rows = handle.fetch_all || []
|
364
|
-
ActiveRecord::Result.new(columns, rows)
|
365
|
-
else
|
366
|
-
case options[:fetch]
|
367
|
-
when :all
|
368
|
-
handle.each_hash || []
|
369
|
-
when :rows
|
370
|
-
handle.fetch_all || []
|
371
|
-
end
|
372
|
-
end
|
373
|
-
end
|
374
|
-
|
375
325
|
def finish_statement_handle(handle)
|
376
326
|
case @connection_options[:mode]
|
377
327
|
when :dblib
|
378
328
|
handle.cancel if handle
|
379
|
-
when :odbc
|
380
|
-
handle.drop if handle && handle.respond_to?(:drop) && !handle.finished?
|
381
329
|
end
|
382
330
|
handle
|
383
331
|
end
|
@@ -24,10 +24,9 @@ module ActiveRecord
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def collation
|
27
|
-
select_value "SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')"
|
27
|
+
@collation ||= select_value "SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation')"
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
30
|
private
|
32
31
|
|
33
32
|
def create_database_options(options={})
|
@@ -3,23 +3,44 @@ module ActiveRecord
|
|
3
3
|
module SQLServer
|
4
4
|
module Quoting
|
5
5
|
|
6
|
-
QUOTED_TRUE = '1'
|
7
|
-
QUOTED_FALSE = '0'
|
8
|
-
QUOTED_STRING_PREFIX = 'N'
|
6
|
+
QUOTED_TRUE = '1'.freeze
|
7
|
+
QUOTED_FALSE = '0'.freeze
|
8
|
+
QUOTED_STRING_PREFIX = 'N'.freeze
|
9
|
+
|
10
|
+
def fetch_type_metadata(sql_type, sqlserver_options = {})
|
11
|
+
cast_type = lookup_cast_type(sql_type)
|
12
|
+
SQLServer::SqlTypeMetadata.new(
|
13
|
+
sql_type: sql_type,
|
14
|
+
type: cast_type.type,
|
15
|
+
limit: cast_type.limit,
|
16
|
+
precision: cast_type.precision,
|
17
|
+
scale: cast_type.scale,
|
18
|
+
sqlserver_options: sqlserver_options
|
19
|
+
)
|
20
|
+
end
|
9
21
|
|
10
22
|
def quote_string(s)
|
11
23
|
SQLServer::Utils.quote_string(s)
|
12
24
|
end
|
13
25
|
|
26
|
+
def quote_string_single(s)
|
27
|
+
SQLServer::Utils.quote_string_single(s)
|
28
|
+
end
|
29
|
+
|
30
|
+
def quote_string_single_national(s)
|
31
|
+
SQLServer::Utils.quote_string_single_national(s)
|
32
|
+
end
|
33
|
+
|
14
34
|
def quote_column_name(name)
|
15
35
|
SQLServer::Utils.extract_identifiers(name).quoted
|
16
36
|
end
|
17
37
|
|
18
|
-
def
|
19
|
-
|
38
|
+
def quote_default_expression(value, column)
|
39
|
+
cast_type = lookup_cast_type(column.sql_type)
|
40
|
+
if cast_type.type == :uuid && value =~ /\(\)/
|
20
41
|
value
|
21
42
|
else
|
22
|
-
|
43
|
+
super
|
23
44
|
end
|
24
45
|
end
|
25
46
|
|
@@ -41,9 +62,9 @@ module ActiveRecord
|
|
41
62
|
|
42
63
|
def quoted_date(value)
|
43
64
|
if value.acts_like?(:date)
|
44
|
-
Type::Date.new.
|
65
|
+
Type::Date.new.serialize(value)
|
45
66
|
else value.acts_like?(:time)
|
46
|
-
Type::DateTime.new.
|
67
|
+
Type::DateTime.new.serialize(value)
|
47
68
|
end
|
48
69
|
end
|
49
70
|
|
@@ -54,7 +75,7 @@ module ActiveRecord
|
|
54
75
|
case value
|
55
76
|
when Type::Binary::Data
|
56
77
|
"0x#{value.hex}"
|
57
|
-
when ActiveRecord::Type::SQLServer::
|
78
|
+
when ActiveRecord::Type::SQLServer::Data
|
58
79
|
value.quoted
|
59
80
|
when String, ActiveSupport::Multibyte::Chars
|
60
81
|
"#{QUOTED_STRING_PREFIX}#{super}"
|
@@ -65,7 +86,7 @@ module ActiveRecord
|
|
65
86
|
|
66
87
|
def _type_cast(value)
|
67
88
|
case value
|
68
|
-
when ActiveRecord::Type::SQLServer::
|
89
|
+
when ActiveRecord::Type::SQLServer::Data
|
69
90
|
value.to_s
|
70
91
|
else
|
71
92
|
super
|
@@ -5,15 +5,6 @@ module ActiveRecord
|
|
5
5
|
|
6
6
|
private
|
7
7
|
|
8
|
-
def visit_ColumnDefinition(o)
|
9
|
-
sql = super
|
10
|
-
if o.primary_key? && o.type == :uuid
|
11
|
-
sql << ' PRIMARY KEY '
|
12
|
-
add_column_options!(sql, column_options(o))
|
13
|
-
end
|
14
|
-
sql
|
15
|
-
end
|
16
|
-
|
17
8
|
def visit_TableDefinition(o)
|
18
9
|
if o.as
|
19
10
|
table_name = quote_table_name(o.temporary ? "##{o.name}" : o.name)
|
@@ -25,15 +16,6 @@ module ActiveRecord
|
|
25
16
|
end
|
26
17
|
end
|
27
18
|
|
28
|
-
def add_column_options!(sql, options)
|
29
|
-
column = options.fetch(:column) { return super }
|
30
|
-
if (column.type == :uuid || column.type == :uniqueidentifier) && options[:default] =~ /\(\)/
|
31
|
-
sql << " DEFAULT #{options.delete(:default)}"
|
32
|
-
else
|
33
|
-
super
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
19
|
def action_sql(action, dependency)
|
38
20
|
case dependency
|
39
21
|
when :restrict
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module SQLServer
|
4
|
+
module SchemaDumper
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def schema_collation(column)
|
9
|
+
return unless column.collation
|
10
|
+
column.collation if column.collation != collation
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|