activerecord-sqlserver-adapter 5.2.1 → 6.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/.editorconfig +9 -0
- data/.github/issue_template.md +23 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/.travis.yml +6 -8
- data/CHANGELOG.md +38 -24
- data/{Dockerfile → Dockerfile.ci} +1 -1
- data/Gemfile +48 -41
- data/Guardfile +9 -8
- data/README.md +9 -30
- data/RUNNING_UNIT_TESTS.md +3 -0
- data/Rakefile +14 -16
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +25 -14
- data/appveyor.yml +24 -17
- data/docker-compose.ci.yml +7 -5
- data/guides/RELEASING.md +11 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +8 -7
- data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +6 -4
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +9 -12
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +46 -8
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +190 -164
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/type.rb +37 -35
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
- data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +128 -92
- data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
- data/lib/active_record/sqlserver_base.rb +9 -1
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
- data/lib/activerecord-sqlserver-adapter.rb +3 -1
- data/lib/arel/visitors/sqlserver.rb +58 -24
- data/lib/arel_sqlserver.rb +4 -2
- data/test/appveyor/dbsetup.ps1 +4 -4
- data/test/cases/adapter_test_sqlserver.rb +214 -171
- data/test/cases/change_column_null_test_sqlserver.rb +14 -12
- data/test/cases/coerced_tests.rb +631 -356
- data/test/cases/column_test_sqlserver.rb +283 -284
- data/test/cases/connection_test_sqlserver.rb +17 -20
- data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
- data/test/cases/fetch_test_sqlserver.rb +16 -22
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
- data/test/cases/helper_sqlserver.rb +15 -15
- data/test/cases/in_clause_test_sqlserver.rb +36 -0
- data/test/cases/index_test_sqlserver.rb +15 -15
- data/test/cases/json_test_sqlserver.rb +25 -25
- data/test/cases/migration_test_sqlserver.rb +25 -29
- data/test/cases/order_test_sqlserver.rb +53 -54
- data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
- data/test/cases/rake_test_sqlserver.rb +33 -45
- data/test/cases/schema_dumper_test_sqlserver.rb +107 -109
- data/test/cases/schema_test_sqlserver.rb +20 -26
- data/test/cases/scratchpad_test_sqlserver.rb +4 -4
- data/test/cases/showplan_test_sqlserver.rb +28 -35
- data/test/cases/specific_schema_test_sqlserver.rb +68 -65
- data/test/cases/transaction_test_sqlserver.rb +18 -20
- data/test/cases/trigger_test_sqlserver.rb +14 -13
- data/test/cases/utils_test_sqlserver.rb +70 -70
- data/test/cases/uuid_test_sqlserver.rb +13 -14
- data/test/debug.rb +8 -6
- data/test/migrations/create_clients_and_change_column_null.rb +3 -1
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
- data/test/models/sqlserver/booking.rb +3 -1
- data/test/models/sqlserver/customers_view.rb +3 -1
- data/test/models/sqlserver/datatype.rb +2 -0
- data/test/models/sqlserver/datatype_migration.rb +2 -0
- data/test/models/sqlserver/dollar_table_name.rb +3 -1
- data/test/models/sqlserver/edge_schema.rb +3 -3
- data/test/models/sqlserver/fk_has_fk.rb +3 -1
- data/test/models/sqlserver/fk_has_pk.rb +3 -1
- data/test/models/sqlserver/natural_pk_data.rb +4 -2
- data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
- data/test/models/sqlserver/no_pk_data.rb +3 -1
- data/test/models/sqlserver/object_default.rb +3 -1
- data/test/models/sqlserver/quoted_table.rb +4 -2
- data/test/models/sqlserver/quoted_view_1.rb +3 -1
- data/test/models/sqlserver/quoted_view_2.rb +3 -1
- data/test/models/sqlserver/sst_memory.rb +3 -1
- data/test/models/sqlserver/string_default.rb +3 -1
- data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
- data/test/models/sqlserver/string_defaults_view.rb +3 -1
- data/test/models/sqlserver/tinyint_pk.rb +3 -1
- data/test/models/sqlserver/trigger.rb +4 -2
- data/test/models/sqlserver/trigger_history.rb +3 -1
- data/test/models/sqlserver/upper.rb +3 -1
- data/test/models/sqlserver/uppered.rb +3 -1
- data/test/models/sqlserver/uuid.rb +3 -1
- data/test/schema/sqlserver_specific_schema.rb +22 -22
- data/test/support/coerceable_test_sqlserver.rb +15 -9
- data/test/support/connection_reflection.rb +3 -2
- data/test/support/core_ext/query_cache.rb +4 -1
- data/test/support/load_schema_sqlserver.rb +5 -5
- data/test/support/minitest_sqlserver.rb +3 -1
- data/test/support/paths_sqlserver.rb +11 -11
- data/test/support/rake_helpers.rb +13 -10
- data/test/support/sql_counter_sqlserver.rb +3 -4
- data/test/support/test_in_memory_oltp.rb +9 -7
- metadata +17 -7
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_record/connection_adapters/sqlserver/showplan/printer_table"
|
|
4
|
+
require "active_record/connection_adapters/sqlserver/showplan/printer_xml"
|
|
3
5
|
|
|
4
6
|
module ActiveRecord
|
|
5
7
|
module ConnectionAdapters
|
|
6
8
|
module SQLServer
|
|
7
9
|
module Showplan
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
OPTION_XML = 'SHOWPLAN_XML'
|
|
10
|
+
OPTION_ALL = "SHOWPLAN_ALL"
|
|
11
|
+
OPTION_TEXT = "SHOWPLAN_TEXT"
|
|
12
|
+
OPTION_XML = "SHOWPLAN_XML"
|
|
12
13
|
OPTIONS = [OPTION_ALL, OPTION_TEXT, OPTION_XML]
|
|
13
14
|
|
|
14
15
|
def explain(arel, binds = [])
|
|
15
16
|
sql = to_sql(arel)
|
|
16
|
-
result = with_showplan_on { sp_executesql(sql,
|
|
17
|
+
result = with_showplan_on { sp_executesql(sql, "EXPLAIN", binds) }
|
|
17
18
|
printer = showplan_printer.new(result)
|
|
18
19
|
printer.pp
|
|
19
20
|
end
|
|
@@ -59,7 +60,6 @@ module ActiveRecord
|
|
|
59
60
|
else PrinterTable
|
|
60
61
|
end
|
|
61
62
|
end
|
|
62
|
-
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
class SqlTypeMetadata < ActiveRecord::ConnectionAdapters::SqlTypeMetadata
|
|
5
|
-
|
|
6
7
|
def initialize(**kwargs)
|
|
7
8
|
@sqlserver_options = kwargs.extract!(:sqlserver_options)
|
|
8
9
|
super(**kwargs)
|
|
@@ -13,7 +14,6 @@ module ActiveRecord
|
|
|
13
14
|
def attributes_for_hash
|
|
14
15
|
super + [@sqlserver_options]
|
|
15
16
|
end
|
|
16
|
-
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
end
|
|
@@ -1,101 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
|
-
|
|
5
6
|
module ColumnMethods
|
|
6
|
-
|
|
7
7
|
def primary_key(name, type = :primary_key, **options)
|
|
8
8
|
if [:integer, :bigint].include?(type)
|
|
9
9
|
options[:is_identity] = true unless options.key?(:default)
|
|
10
10
|
elsif type == :uuid
|
|
11
|
-
options[:default] = options.fetch(:default,
|
|
11
|
+
options[:default] = options.fetch(:default, "NEWID()")
|
|
12
12
|
options[:primary_key] = true
|
|
13
13
|
end
|
|
14
14
|
super
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def primary_key_nonclustered(*
|
|
18
|
-
|
|
17
|
+
def primary_key_nonclustered(*names, **options)
|
|
18
|
+
names.each { |name| column(name, :primary_key_nonclustered, **options) }
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def real(*
|
|
22
|
-
|
|
21
|
+
def real(*names, **options)
|
|
22
|
+
names.each { |name| column(name, :real, **options) }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def money(*
|
|
26
|
-
|
|
25
|
+
def money(*names, **options)
|
|
26
|
+
names.each { |name| column(name, :money, **options) }
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
def smalldatetime(*
|
|
30
|
-
|
|
29
|
+
def smalldatetime(*names, **options)
|
|
30
|
+
names.each { |name| column(name, :smalldatetime, **options) }
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
def datetime(*
|
|
34
|
-
|
|
33
|
+
def datetime(*names, **options)
|
|
34
|
+
names.each do |name|
|
|
35
35
|
if options[:precision]
|
|
36
|
-
datetime2(name, options)
|
|
36
|
+
datetime2(name, **options)
|
|
37
37
|
else
|
|
38
|
-
column(name, :datetime, options)
|
|
38
|
+
column(name, :datetime, **options)
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
def datetime2(*
|
|
44
|
-
|
|
43
|
+
def datetime2(*names, **options)
|
|
44
|
+
names.each { |name| column(name, :datetime2, **options) }
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
def datetimeoffset(*
|
|
48
|
-
|
|
47
|
+
def datetimeoffset(*names, **options)
|
|
48
|
+
names.each { |name| column(name, :datetimeoffset, **options) }
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
def smallmoney(*
|
|
52
|
-
|
|
51
|
+
def smallmoney(*names, **options)
|
|
52
|
+
names.each { |name| column(name, :smallmoney, **options) }
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
def char(*
|
|
56
|
-
|
|
55
|
+
def char(*names, **options)
|
|
56
|
+
names.each { |name| column(name, :char, **options) }
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
def varchar(*
|
|
60
|
-
|
|
59
|
+
def varchar(*names, **options)
|
|
60
|
+
names.each { |name| column(name, :varchar, **options) }
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
-
def varchar_max(*
|
|
64
|
-
|
|
63
|
+
def varchar_max(*names, **options)
|
|
64
|
+
names.each { |name| column(name, :varchar_max, **options) }
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
def text_basic(*
|
|
68
|
-
|
|
67
|
+
def text_basic(*names, **options)
|
|
68
|
+
names.each { |name| column(name, :text_basic, **options) }
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
def nchar(*
|
|
72
|
-
|
|
71
|
+
def nchar(*names, **options)
|
|
72
|
+
names.each { |name| column(name, :nchar, **options) }
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
def ntext(*
|
|
76
|
-
|
|
75
|
+
def ntext(*names, **options)
|
|
76
|
+
names.each { |name| column(name, :ntext, **options) }
|
|
77
77
|
end
|
|
78
78
|
|
|
79
|
-
def binary_basic(*
|
|
80
|
-
|
|
79
|
+
def binary_basic(*names, **options)
|
|
80
|
+
names.each { |name| column(name, :binary_basic, **options) }
|
|
81
81
|
end
|
|
82
82
|
|
|
83
|
-
def varbinary(*
|
|
84
|
-
|
|
83
|
+
def varbinary(*names, **options)
|
|
84
|
+
names.each { |name| column(name, :varbinary, **options) }
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
-
def uuid(*
|
|
88
|
-
|
|
87
|
+
def uuid(*names, **options)
|
|
88
|
+
names.each { |name| column(name, :uniqueidentifier, **options) }
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
def ss_timestamp(*
|
|
92
|
-
|
|
91
|
+
def ss_timestamp(*names, **options)
|
|
92
|
+
names.each { |name| column(name, :ss_timestamp, **options) }
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
def json(*
|
|
96
|
-
|
|
95
|
+
def json(*names, **options)
|
|
96
|
+
names.each { |name| column(name, :text, **options) }
|
|
97
97
|
end
|
|
98
|
-
|
|
99
98
|
end
|
|
100
99
|
|
|
101
100
|
class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_record/connection_adapters/abstract/transaction"
|
|
2
4
|
|
|
3
5
|
module ActiveRecord
|
|
4
6
|
module ConnectionAdapters
|
|
5
|
-
|
|
6
7
|
module SQLServerTransaction
|
|
7
|
-
|
|
8
8
|
private
|
|
9
9
|
|
|
10
10
|
def sqlserver?
|
|
@@ -13,26 +13,25 @@ module ActiveRecord
|
|
|
13
13
|
|
|
14
14
|
def current_isolation_level
|
|
15
15
|
return unless sqlserver?
|
|
16
|
+
|
|
16
17
|
level = connection.user_options_isolation_level
|
|
17
18
|
# When READ_COMMITTED_SNAPSHOT is set to ON,
|
|
18
19
|
# user_options_isolation_level will be equal to 'read committed
|
|
19
20
|
# snapshot' which is not a valid isolation level
|
|
20
|
-
if level.blank? || level ==
|
|
21
|
-
|
|
21
|
+
if level.blank? || level == "read committed snapshot"
|
|
22
|
+
"READ COMMITTED"
|
|
22
23
|
else
|
|
23
24
|
level.upcase
|
|
24
25
|
end
|
|
25
26
|
end
|
|
26
|
-
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
Transaction.send :prepend, SQLServerTransaction
|
|
30
30
|
|
|
31
31
|
module SQLServerRealTransaction
|
|
32
|
-
|
|
33
32
|
attr_reader :starting_isolation_level
|
|
34
33
|
|
|
35
|
-
def initialize(connection, options,
|
|
34
|
+
def initialize(connection, options, **args)
|
|
36
35
|
@connection = connection
|
|
37
36
|
@starting_isolation_level = current_isolation_level if options[:isolation]
|
|
38
37
|
super
|
|
@@ -55,7 +54,6 @@ module ActiveRecord
|
|
|
55
54
|
connection.set_transaction_isolation_level(starting_isolation_level)
|
|
56
55
|
end
|
|
57
56
|
end
|
|
58
|
-
|
|
59
57
|
end
|
|
60
58
|
|
|
61
59
|
RealTransaction.send :prepend, SQLServerRealTransaction
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Binary < ActiveRecord::Type::Binary
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:binary_basic
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
-
type
|
|
13
|
+
"binary".yield_self do |type|
|
|
14
|
+
type += "(#{limit})" if limit
|
|
15
|
+
type
|
|
14
16
|
end
|
|
15
17
|
end
|
|
16
|
-
|
|
17
18
|
end
|
|
18
19
|
end
|
|
19
20
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Char < String
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:char
|
|
9
10
|
end
|
|
@@ -11,20 +12,22 @@ module ActiveRecord
|
|
|
11
12
|
def serialize(value)
|
|
12
13
|
return if value.nil?
|
|
13
14
|
return value if value.is_a?(Data)
|
|
15
|
+
|
|
14
16
|
Data.new super, self
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
def sqlserver_type
|
|
18
|
-
|
|
19
|
-
type
|
|
20
|
+
"char".yield_self do |type|
|
|
21
|
+
type += "(#{limit})" if limit
|
|
22
|
+
type
|
|
20
23
|
end
|
|
21
24
|
end
|
|
22
25
|
|
|
23
26
|
def quoted(value)
|
|
24
27
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
|
28
|
+
|
|
25
29
|
Utils.quote_string_single(value)
|
|
26
30
|
end
|
|
27
|
-
|
|
28
31
|
end
|
|
29
32
|
end
|
|
30
33
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Data
|
|
6
|
-
|
|
7
8
|
attr_reader :value, :type
|
|
8
9
|
|
|
9
10
|
def initialize(value, type)
|
|
@@ -27,7 +28,6 @@ module ActiveRecord
|
|
|
27
28
|
self.class == other.class && self.value == other.value
|
|
28
29
|
end
|
|
29
30
|
alias :== :eql?
|
|
30
|
-
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
end
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Date < ActiveRecord::Type::Date
|
|
6
|
-
|
|
7
8
|
def sqlserver_type
|
|
8
|
-
|
|
9
|
+
"date"
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def serialize(value)
|
|
12
13
|
return unless value.present?
|
|
14
|
+
|
|
13
15
|
date = super(value).to_s(:_sqlserver_dateformat)
|
|
14
16
|
Data.new date, self
|
|
15
17
|
end
|
|
@@ -37,7 +39,6 @@ module ActiveRecord
|
|
|
37
39
|
def fast_string_to_date_format
|
|
38
40
|
::Date::DATE_FORMATS[:_sqlserver_dateformat]
|
|
39
41
|
end
|
|
40
|
-
|
|
41
42
|
end
|
|
42
43
|
end
|
|
43
44
|
end
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class DateTime < ActiveRecord::Type::DateTime
|
|
6
|
-
|
|
7
8
|
include TimeValueFractional
|
|
8
9
|
|
|
9
10
|
def sqlserver_type
|
|
10
|
-
|
|
11
|
+
"datetime"
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
def serialize(value)
|
|
14
15
|
value = super
|
|
15
16
|
return value unless value.acts_like?(:time)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
end
|
|
17
|
+
|
|
18
|
+
datetime = "#{value.to_s(:_sqlserver_datetime)}.#{quote_fractional(value)}"
|
|
19
|
+
|
|
20
20
|
Data.new datetime, self
|
|
21
21
|
end
|
|
22
22
|
|
|
@@ -35,7 +35,7 @@ module ActiveRecord
|
|
|
35
35
|
private
|
|
36
36
|
|
|
37
37
|
def fast_string_to_time(string)
|
|
38
|
-
time = ActiveSupport::TimeZone[
|
|
38
|
+
time = ActiveSupport::TimeZone["UTC"].strptime(string, fast_string_to_time_format)
|
|
39
39
|
new_time(time.year, time.month, time.day, time.hour,
|
|
40
40
|
time.min, time.sec, Rational(time.nsec, 1_000))
|
|
41
41
|
rescue ArgumentError
|
|
@@ -43,7 +43,7 @@ module ActiveRecord
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def fast_string_to_time_format
|
|
46
|
-
"#{::Time::DATE_FORMATS[:_sqlserver_datetime]}.%N"
|
|
46
|
+
"#{::Time::DATE_FORMATS[:_sqlserver_datetime]}.%N"
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
end
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class DateTime2 < DateTime
|
|
6
|
-
|
|
7
8
|
include TimeValueFractional2
|
|
8
9
|
|
|
9
10
|
def sqlserver_type
|
|
10
11
|
"datetime2(#{precision.to_i})"
|
|
11
12
|
end
|
|
12
|
-
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
end
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class DateTimeOffset < DateTime2
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:datetimeoffset
|
|
9
10
|
end
|
|
@@ -15,7 +16,6 @@ module ActiveRecord
|
|
|
15
16
|
def quoted(value)
|
|
16
17
|
Utils.quote_string_single(value)
|
|
17
18
|
end
|
|
18
|
-
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
end
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Decimal < ActiveRecord::Type::Decimal
|
|
6
|
-
|
|
7
8
|
def sqlserver_type
|
|
8
|
-
|
|
9
|
-
type
|
|
9
|
+
"decimal".yield_self do |type|
|
|
10
|
+
type += "(#{precision.to_i},#{scale.to_i})" if precision || scale
|
|
11
|
+
type
|
|
10
12
|
end
|
|
11
13
|
end
|
|
12
14
|
|
|
13
15
|
def type_cast_for_schema(value)
|
|
14
16
|
value.is_a?(BigDecimal) ? value.to_s : value.inspect
|
|
15
17
|
end
|
|
16
|
-
|
|
17
18
|
end
|
|
18
19
|
end
|
|
19
20
|
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Float < ActiveRecord::Type::Float
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:float
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"float"
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Money < Decimal
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@precision = 19
|
|
10
11
|
@scale = 4
|
|
@@ -15,9 +16,8 @@ module ActiveRecord
|
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def sqlserver_type
|
|
18
|
-
|
|
19
|
+
"money"
|
|
19
20
|
end
|
|
20
|
-
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class Real < Float
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:real
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"real"
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
7
|
class SmallMoney < Money
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@precision = 10
|
|
10
11
|
@scale = 4
|
|
@@ -15,9 +16,8 @@ module ActiveRecord
|
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
def sqlserver_type
|
|
18
|
-
|
|
19
|
+
"smallmoney"
|
|
19
20
|
end
|
|
20
|
-
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|