Skip to content

Commit 6feabc2

Browse files
authoredApr 25, 2025··
Move AbstractAdapter#valid_type? to a class method (#1326)
1 parent ab5c5c1 commit 6feabc2

File tree

4 files changed

+41
-43
lines changed

4 files changed

+41
-43
lines changed
 

‎README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ See [Rubygems](https://rubygems.org/gems/activerecord-sqlserver-adapter/versions
3333

3434
#### Native Data Type Support
3535

36-
We support every data type supported by FreeTDS. All simplified Rails types in migrations will correspond to a matching SQL Server national (unicode) data type. Always check the `initialize_native_database_types` [(here)](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/master/lib/active_record/connection_adapters/sqlserver/schema_statements.rb) for an updated list.
36+
We support every data type supported by FreeTDS. All simplified Rails types in migrations will correspond to a matching SQL Server national (unicode) data type. Always check the `NATIVE_DATABASE_TYPES` [(here)](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/master/lib/active_record/connection_adapters/sqlserver_adapter.rb) for an updated list.
3737

3838
The following types (`date`, `datetime2`, `datetimeoffset`, `time`) all require TDS version `7.3` with TinyTDS. We recommend using FreeTDS 1.0 or higher which default to using `TDSVER` to `7.3`. The adapter also sets TinyTDS's `tds_version` to this as well if non is specified.
3939

‎lib/active_record/connection_adapters/sqlserver/schema_statements.rb

-40
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@ module ActiveRecord
44
module ConnectionAdapters
55
module SQLServer
66
module SchemaStatements
7-
def native_database_types
8-
@native_database_types ||= initialize_native_database_types.freeze
9-
end
10-
117
def create_table(table_name, **options)
128
res = super
139
clear_cache!
@@ -488,42 +484,6 @@ def quoted_scope(name = nil, type: nil)
488484

489485
# === SQLServer Specific ======================================== #
490486

491-
def initialize_native_database_types
492-
{
493-
primary_key: "bigint NOT NULL IDENTITY(1,1) PRIMARY KEY",
494-
primary_key_nonclustered: "bigint NOT NULL IDENTITY(1,1) PRIMARY KEY NONCLUSTERED",
495-
integer: {name: "int", limit: 4},
496-
bigint: {name: "bigint"},
497-
boolean: {name: "bit"},
498-
decimal: {name: "decimal"},
499-
money: {name: "money"},
500-
smallmoney: {name: "smallmoney"},
501-
float: {name: "float"},
502-
real: {name: "real"},
503-
date: {name: "date"},
504-
datetime: {name: "datetime"},
505-
datetime2: {name: "datetime2"},
506-
datetimeoffset: {name: "datetimeoffset"},
507-
smalldatetime: {name: "smalldatetime"},
508-
timestamp: {name: "datetime2(6)"},
509-
time: {name: "time"},
510-
char: {name: "char"},
511-
varchar: {name: "varchar", limit: 8000},
512-
varchar_max: {name: "varchar(max)"},
513-
text_basic: {name: "text"},
514-
nchar: {name: "nchar"},
515-
string: {name: "nvarchar", limit: 4000},
516-
text: {name: "nvarchar(max)"},
517-
ntext: {name: "ntext"},
518-
binary_basic: {name: "binary"},
519-
varbinary: {name: "varbinary", limit: 8000},
520-
binary: {name: "varbinary(max)"},
521-
uuid: {name: "uniqueidentifier"},
522-
ss_timestamp: {name: "timestamp"},
523-
json: {name: "nvarchar(max)"}
524-
}
525-
end
526-
527487
def column_definitions(table_name)
528488
identifier = database_prefix_identifier(table_name)
529489
database = identifier.fully_qualified_database_quoted

‎lib/active_record/connection_adapters/sqlserver_adapter.rb

+38
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,40 @@ class SQLServerAdapter < AbstractAdapter
6262
self.use_output_inserted = true
6363
self.exclude_output_inserted_table_names = Concurrent::Map.new { false }
6464

65+
NATIVE_DATABASE_TYPES = {
66+
primary_key: "bigint NOT NULL IDENTITY(1,1) PRIMARY KEY",
67+
primary_key_nonclustered: "bigint NOT NULL IDENTITY(1,1) PRIMARY KEY NONCLUSTERED",
68+
integer: {name: "int", limit: 4},
69+
bigint: {name: "bigint"},
70+
boolean: {name: "bit"},
71+
decimal: {name: "decimal"},
72+
money: {name: "money"},
73+
smallmoney: {name: "smallmoney"},
74+
float: {name: "float"},
75+
real: {name: "real"},
76+
date: {name: "date"},
77+
datetime: {name: "datetime"},
78+
datetime2: {name: "datetime2"},
79+
datetimeoffset: {name: "datetimeoffset"},
80+
smalldatetime: {name: "smalldatetime"},
81+
timestamp: {name: "datetime2(6)"},
82+
time: {name: "time"},
83+
char: {name: "char"},
84+
varchar: {name: "varchar", limit: 8000},
85+
varchar_max: {name: "varchar(max)"},
86+
text_basic: {name: "text"},
87+
nchar: {name: "nchar"},
88+
string: {name: "nvarchar", limit: 4000},
89+
text: {name: "nvarchar(max)"},
90+
ntext: {name: "ntext"},
91+
binary_basic: {name: "binary"},
92+
varbinary: {name: "varbinary", limit: 8000},
93+
binary: {name: "varbinary(max)"},
94+
uuid: {name: "uniqueidentifier"},
95+
ss_timestamp: {name: "timestamp"},
96+
json: {name: "nvarchar(max)"}
97+
}
98+
6599
class << self
66100
def dbconsole(config, options = {})
67101
sqlserver_config = config.configuration_hash
@@ -95,6 +129,10 @@ def rails_application_name
95129
rescue
96130
nil # Might not be in a Rails context so we fallback to `nil`.
97131
end
132+
133+
def native_database_types # :nodoc:
134+
NATIVE_DATABASE_TYPES
135+
end
98136
end
99137

100138
def initialize(...)

‎test/cases/coerced_tests.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -1850,13 +1850,13 @@ class TransactionIsolationTest < ActiveRecord::TestCase
18501850
# can assert the number of expected isolation level events.
18511851
undef_method :assert_begin_isolation_level_event
18521852
def assert_begin_isolation_level_event(events, isolation: "READ COMMITTED")
1853-
isolation_events = events.select { _1.match(/SET TRANSACTION ISOLATION LEVEL/) }
1853+
isolation_events = events.select { |event| event.match(/SET TRANSACTION ISOLATION LEVEL/) }
18541854

18551855
index_of_reset_starting_isolation_level_event = isolation_events.index("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
18561856
assert index_of_reset_starting_isolation_level_event.present?
18571857
isolation_events.delete_at(index_of_reset_starting_isolation_level_event)
18581858

1859-
assert_equal 1, isolation_events.select { _1.match(/SET TRANSACTION ISOLATION LEVEL #{isolation}/) }.size
1859+
assert_equal 1, isolation_events.count { |event| event.match(/SET TRANSACTION ISOLATION LEVEL #{isolation}/) }
18601860
end
18611861
end
18621862

0 commit comments

Comments
 (0)
Please sign in to comment.