activerecord-sqlserver-adapter 6.0.0.rc1 → 6.1.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +26 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +29 -0
- data/CHANGELOG.md +18 -23
- data/Gemfile +11 -5
- data/Guardfile +9 -8
- data/README.md +32 -3
- data/RUNNING_UNIT_TESTS.md +1 -1
- data/Rakefile +12 -16
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +4 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +0 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +1 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +3 -13
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +8 -5
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +0 -4
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +58 -43
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +7 -12
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +0 -3
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +15 -15
- data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +22 -3
- data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -10
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +131 -105
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +6 -8
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +1 -1
- data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +25 -7
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +1 -5
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +6 -10
- data/lib/active_record/connection_adapters/sqlserver/type.rb +36 -35
- data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/char.rb +2 -2
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/date.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
- data/lib/active_record/connection_adapters/sqlserver/type/float.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/json.rb +0 -1
- data/lib/active_record/connection_adapters/sqlserver/type/money.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/real.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/string.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/text.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/time.rb +2 -3
- data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +6 -9
- data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +1 -3
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +1 -2
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +1 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +1 -3
- data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver/utils.rb +8 -11
- data/lib/active_record/connection_adapters/sqlserver/version.rb +0 -2
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +170 -136
- data/lib/active_record/connection_adapters/sqlserver_column.rb +16 -1
- data/lib/active_record/sqlserver_base.rb +9 -15
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +36 -39
- data/lib/activerecord-sqlserver-adapter.rb +1 -1
- data/lib/arel/visitors/sqlserver.rb +126 -50
- data/lib/arel_sqlserver.rb +2 -2
- data/test/cases/adapter_test_sqlserver.rb +203 -190
- data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
- data/test/cases/change_column_null_test_sqlserver.rb +12 -12
- data/test/cases/coerced_tests.rb +656 -318
- data/test/cases/column_test_sqlserver.rb +285 -284
- data/test/cases/connection_test_sqlserver.rb +15 -20
- data/test/cases/disconnected_test_sqlserver.rb +39 -0
- data/test/cases/execute_procedure_test_sqlserver.rb +26 -19
- data/test/cases/fetch_test_sqlserver.rb +14 -22
- data/test/cases/fully_qualified_identifier_test_sqlserver.rb +12 -18
- data/test/cases/helper_sqlserver.rb +13 -15
- data/test/cases/in_clause_test_sqlserver.rb +36 -9
- data/test/cases/index_test_sqlserver.rb +13 -15
- data/test/cases/json_test_sqlserver.rb +23 -25
- data/test/cases/lateral_test_sqlserver.rb +35 -0
- data/test/cases/migration_test_sqlserver.rb +71 -26
- data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
- data/test/cases/order_test_sqlserver.rb +57 -53
- data/test/cases/pessimistic_locking_test_sqlserver.rb +25 -33
- data/test/cases/primary_keys_test_sqlserver.rb +103 -0
- data/test/cases/rake_test_sqlserver.rb +33 -46
- data/test/cases/schema_dumper_test_sqlserver.rb +121 -108
- data/test/cases/schema_test_sqlserver.rb +18 -26
- data/test/cases/scratchpad_test_sqlserver.rb +2 -4
- data/test/cases/showplan_test_sqlserver.rb +24 -33
- data/test/cases/specific_schema_test_sqlserver.rb +66 -65
- data/test/cases/transaction_test_sqlserver.rb +16 -19
- data/test/cases/trigger_test_sqlserver.rb +12 -12
- data/test/cases/utils_test_sqlserver.rb +68 -70
- data/test/cases/uuid_test_sqlserver.rb +11 -13
- data/test/debug.rb +6 -6
- data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
- data/test/migrations/create_clients_and_change_column_null.rb +1 -1
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +2 -4
- data/test/models/sqlserver/booking.rb +1 -1
- data/test/models/sqlserver/customers_view.rb +1 -1
- data/test/models/sqlserver/dollar_table_name.rb +1 -1
- data/test/models/sqlserver/edge_schema.rb +1 -3
- data/test/models/sqlserver/fk_has_fk.rb +1 -1
- data/test/models/sqlserver/fk_has_pk.rb +1 -1
- data/test/models/sqlserver/natural_pk_data.rb +2 -2
- data/test/models/sqlserver/natural_pk_int_data.rb +1 -1
- data/test/models/sqlserver/no_pk_data.rb +1 -1
- data/test/models/sqlserver/object_default.rb +1 -1
- data/test/models/sqlserver/quoted_table.rb +2 -2
- data/test/models/sqlserver/quoted_view_1.rb +1 -1
- data/test/models/sqlserver/quoted_view_2.rb +1 -1
- data/test/models/sqlserver/sst_memory.rb +1 -1
- data/test/models/sqlserver/sst_string_collation.rb +3 -0
- data/test/models/sqlserver/string_default.rb +1 -1
- data/test/models/sqlserver/string_defaults_big_view.rb +1 -1
- data/test/models/sqlserver/string_defaults_view.rb +1 -1
- data/test/models/sqlserver/tinyint_pk.rb +1 -1
- data/test/models/sqlserver/trigger.rb +2 -2
- data/test/models/sqlserver/trigger_history.rb +1 -1
- data/test/models/sqlserver/upper.rb +1 -1
- data/test/models/sqlserver/uppered.rb +1 -1
- data/test/models/sqlserver/uuid.rb +1 -1
- data/test/schema/sqlserver_specific_schema.rb +36 -21
- data/test/support/coerceable_test_sqlserver.rb +1 -4
- data/test/support/connection_reflection.rb +1 -2
- data/test/support/core_ext/query_cache.rb +1 -1
- data/test/support/load_schema_sqlserver.rb +3 -5
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_0_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_0_topic_associations.dump +0 -0
- data/test/support/minitest_sqlserver.rb +1 -1
- data/test/support/paths_sqlserver.rb +9 -11
- data/test/support/rake_helpers.rb +12 -10
- data/test/support/sql_counter_sqlserver.rb +14 -16
- data/test/support/test_in_memory_oltp.rb +7 -7
- metadata +31 -11
- data/.travis.yml +0 -23
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module ActiveRecord
|
|
4
|
+
module ConnectionAdapters
|
|
5
|
+
module SQLServer
|
|
6
|
+
module Type
|
|
7
|
+
class DecimalWithoutScale < ActiveRecord::Type::DecimalWithoutScale
|
|
8
|
+
def sqlserver_type
|
|
9
|
+
"decimal".yield_self do |type|
|
|
10
|
+
type += "(#{precision.to_i},0)" if precision
|
|
11
|
+
type
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def type_cast_for_schema(value)
|
|
16
|
+
value.is_a?(BigDecimal) ? value.to_s : value.inspect
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -5,7 +5,6 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class SmallDateTime < DateTime
|
|
8
|
-
|
|
9
8
|
def type
|
|
10
9
|
:smalldatetime
|
|
11
10
|
end
|
|
@@ -23,7 +22,6 @@ module ActiveRecord
|
|
|
23
22
|
def apply_seconds_precision(value)
|
|
24
23
|
value.change usec: 0 if value
|
|
25
24
|
end
|
|
26
|
-
|
|
27
25
|
end
|
|
28
26
|
end
|
|
29
27
|
end
|
|
@@ -5,7 +5,6 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class String < ActiveRecord::Type::String
|
|
8
|
-
|
|
9
8
|
def changed_in_place?(raw_old_value, new_value)
|
|
10
9
|
if raw_old_value.is_a?(Data)
|
|
11
10
|
raw_old_value.value != new_value
|
|
@@ -13,7 +12,6 @@ module ActiveRecord
|
|
|
13
12
|
super
|
|
14
13
|
end
|
|
15
14
|
end
|
|
16
|
-
|
|
17
15
|
end
|
|
18
16
|
end
|
|
19
17
|
end
|
|
@@ -5,7 +5,6 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class Time < ActiveRecord::Type::Time
|
|
8
|
-
|
|
9
8
|
include TimeValueFractional2
|
|
10
9
|
|
|
11
10
|
def serialize(value)
|
|
@@ -13,7 +12,7 @@ module ActiveRecord
|
|
|
13
12
|
return value unless value.acts_like?(:time)
|
|
14
13
|
|
|
15
14
|
time = "#{value.to_s(:_sqlserver_time)}.#{quote_fractional(value)}"
|
|
16
|
-
|
|
15
|
+
|
|
17
16
|
Data.new time, self
|
|
18
17
|
end
|
|
19
18
|
|
|
@@ -38,6 +37,7 @@ module ActiveRecord
|
|
|
38
37
|
def cast_value(value)
|
|
39
38
|
value = super
|
|
40
39
|
return if value.blank?
|
|
40
|
+
|
|
41
41
|
value = value.change year: 2000, month: 01, day: 01
|
|
42
42
|
apply_seconds_precision(value)
|
|
43
43
|
end
|
|
@@ -45,7 +45,6 @@ module ActiveRecord
|
|
|
45
45
|
def fractional_scale
|
|
46
46
|
precision
|
|
47
47
|
end
|
|
48
|
-
|
|
49
48
|
end
|
|
50
49
|
end
|
|
51
50
|
end
|
|
@@ -4,18 +4,18 @@ module ActiveRecord
|
|
|
4
4
|
module ConnectionAdapters
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
|
-
|
|
8
7
|
module TimeValueFractional
|
|
9
|
-
|
|
10
8
|
private
|
|
11
9
|
|
|
12
10
|
def apply_seconds_precision(value)
|
|
13
11
|
return value if !value.respond_to?(fractional_property) || value.send(fractional_property).zero?
|
|
12
|
+
|
|
14
13
|
value.change fractional_property => seconds_precision(value)
|
|
15
14
|
end
|
|
16
15
|
|
|
17
16
|
def seconds_precision(value)
|
|
18
17
|
return 0 if fractional_scale == 0
|
|
18
|
+
|
|
19
19
|
seconds = value.send(fractional_property).to_f / fractional_operator.to_f
|
|
20
20
|
seconds = ((seconds * (1 / fractional_precision)).round / (1 / fractional_precision)).round(fractional_scale)
|
|
21
21
|
(seconds * fractional_operator).round(0).to_i
|
|
@@ -23,9 +23,10 @@ module ActiveRecord
|
|
|
23
23
|
|
|
24
24
|
def quote_fractional(value)
|
|
25
25
|
return 0 if fractional_scale == 0
|
|
26
|
+
|
|
26
27
|
frac_seconds = seconds_precision(value)
|
|
27
28
|
seconds = (frac_seconds.to_f / fractional_operator.to_f).round(fractional_scale)
|
|
28
|
-
seconds.to_d.to_s.split(
|
|
29
|
+
seconds.to_d.to_s.split(".").last.to(fractional_scale - 1)
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
def fractional_property
|
|
@@ -37,7 +38,7 @@ module ActiveRecord
|
|
|
37
38
|
end
|
|
38
39
|
|
|
39
40
|
def fractional_operator
|
|
40
|
-
10
|
|
41
|
+
10**fractional_digits
|
|
41
42
|
end
|
|
42
43
|
|
|
43
44
|
def fractional_precision
|
|
@@ -47,11 +48,9 @@ module ActiveRecord
|
|
|
47
48
|
def fractional_scale
|
|
48
49
|
3
|
|
49
50
|
end
|
|
50
|
-
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
module TimeValueFractional2
|
|
54
|
-
|
|
55
54
|
include TimeValueFractional
|
|
56
55
|
|
|
57
56
|
private
|
|
@@ -82,11 +81,9 @@ module ActiveRecord
|
|
|
82
81
|
end
|
|
83
82
|
|
|
84
83
|
def fractional_scale_max
|
|
85
|
-
(
|
|
84
|
+
("9" * fractional_scale) + ("0" * (fractional_digits - fractional_scale))
|
|
86
85
|
end
|
|
87
|
-
|
|
88
86
|
end
|
|
89
|
-
|
|
90
87
|
end
|
|
91
88
|
end
|
|
92
89
|
end
|
|
@@ -5,18 +5,16 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class UnicodeChar < UnicodeString
|
|
8
|
-
|
|
9
8
|
def type
|
|
10
9
|
:nchar
|
|
11
10
|
end
|
|
12
11
|
|
|
13
12
|
def sqlserver_type
|
|
14
|
-
|
|
13
|
+
"nchar".yield_self do |type|
|
|
15
14
|
type += "(#{limit})" if limit
|
|
16
15
|
type
|
|
17
16
|
end
|
|
18
17
|
end
|
|
19
|
-
|
|
20
18
|
end
|
|
21
19
|
end
|
|
22
20
|
end
|
|
@@ -5,7 +5,6 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class UnicodeVarcharMax < UnicodeVarchar
|
|
8
|
-
|
|
9
8
|
def initialize(**args)
|
|
10
9
|
super
|
|
11
10
|
@limit = 2_147_483_647
|
|
@@ -18,7 +17,6 @@ module ActiveRecord
|
|
|
18
17
|
def sqlserver_type
|
|
19
18
|
"nvarchar(max)"
|
|
20
19
|
end
|
|
21
|
-
|
|
22
20
|
end
|
|
23
21
|
end
|
|
24
22
|
end
|
|
@@ -5,7 +5,6 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class Uuid < String
|
|
8
|
-
|
|
9
8
|
ACCEPTABLE_UUID = %r{\A\{?([a-fA-F0-9]{4}-?){8}\}?\z}x
|
|
10
9
|
|
|
11
10
|
alias_method :serialize, :deserialize
|
|
@@ -20,6 +19,7 @@ module ActiveRecord
|
|
|
20
19
|
|
|
21
20
|
def serialize(value)
|
|
22
21
|
return unless value
|
|
22
|
+
|
|
23
23
|
Data.new super, self
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -30,7 +30,6 @@ module ActiveRecord
|
|
|
30
30
|
def quoted(value)
|
|
31
31
|
Utils.quote_string_single(value) if value
|
|
32
32
|
end
|
|
33
|
-
|
|
34
33
|
end
|
|
35
34
|
end
|
|
36
35
|
end
|
|
@@ -5,7 +5,6 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class Varbinary < Binary
|
|
8
|
-
|
|
9
8
|
def initialize(**args)
|
|
10
9
|
super
|
|
11
10
|
@limit = 8000 if @limit.to_i == 0
|
|
@@ -16,12 +15,11 @@ module ActiveRecord
|
|
|
16
15
|
end
|
|
17
16
|
|
|
18
17
|
def sqlserver_type
|
|
19
|
-
|
|
18
|
+
"varbinary".yield_self do |type|
|
|
20
19
|
type += "(#{limit})" if limit
|
|
21
20
|
type
|
|
22
21
|
end
|
|
23
22
|
end
|
|
24
|
-
|
|
25
23
|
end
|
|
26
24
|
end
|
|
27
25
|
end
|
|
@@ -5,7 +5,6 @@ module ActiveRecord
|
|
|
5
5
|
module SQLServer
|
|
6
6
|
module Type
|
|
7
7
|
class VarbinaryMax < Varbinary
|
|
8
|
-
|
|
9
8
|
def initialize(**args)
|
|
10
9
|
super
|
|
11
10
|
@limit = 2_147_483_647
|
|
@@ -18,7 +17,6 @@ module ActiveRecord
|
|
|
18
17
|
def sqlserver_type
|
|
19
18
|
"varbinary(max)"
|
|
20
19
|
end
|
|
21
|
-
|
|
22
20
|
end
|
|
23
21
|
end
|
|
24
22
|
end
|