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,15 +1,16 @@
|
|
|
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 SmallDateTime < DateTime
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:smalldatetime
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"smalldatetime"
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
private
|
|
@@ -21,7 +22,6 @@ module ActiveRecord
|
|
|
21
22
|
def apply_seconds_precision(value)
|
|
22
23
|
value.change usec: 0 if value
|
|
23
24
|
end
|
|
24
|
-
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
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 String < ActiveRecord::Type::String
|
|
6
|
-
|
|
7
8
|
def changed_in_place?(raw_old_value, new_value)
|
|
8
9
|
if raw_old_value.is_a?(Data)
|
|
9
10
|
raw_old_value.value != new_value
|
|
@@ -11,7 +12,6 @@ module ActiveRecord
|
|
|
11
12
|
super
|
|
12
13
|
end
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
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 Text < VarcharMax
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:text_basic
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"text"
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,18 +1,18 @@
|
|
|
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 Time < ActiveRecord::Type::Time
|
|
6
|
-
|
|
7
8
|
include TimeValueFractional2
|
|
8
9
|
|
|
9
10
|
def serialize(value)
|
|
10
11
|
value = super
|
|
11
12
|
return value unless value.acts_like?(:time)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
13
|
+
|
|
14
|
+
time = "#{value.to_s(:_sqlserver_time)}.#{quote_fractional(value)}"
|
|
15
|
+
|
|
16
16
|
Data.new time, self
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -37,6 +37,7 @@ module ActiveRecord
|
|
|
37
37
|
def cast_value(value)
|
|
38
38
|
value = super
|
|
39
39
|
return if value.blank?
|
|
40
|
+
|
|
40
41
|
value = value.change year: 2000, month: 01, day: 01
|
|
41
42
|
apply_seconds_precision(value)
|
|
42
43
|
end
|
|
@@ -44,7 +45,6 @@ module ActiveRecord
|
|
|
44
45
|
def fractional_scale
|
|
45
46
|
precision
|
|
46
47
|
end
|
|
47
|
-
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
end
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord
|
|
2
4
|
module ConnectionAdapters
|
|
3
5
|
module SQLServer
|
|
4
6
|
module Type
|
|
5
|
-
|
|
6
7
|
module TimeValueFractional
|
|
7
|
-
|
|
8
8
|
private
|
|
9
9
|
|
|
10
10
|
def apply_seconds_precision(value)
|
|
11
11
|
return value if !value.respond_to?(fractional_property) || value.send(fractional_property).zero?
|
|
12
|
+
|
|
12
13
|
value.change fractional_property => seconds_precision(value)
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def seconds_precision(value)
|
|
16
17
|
return 0 if fractional_scale == 0
|
|
18
|
+
|
|
17
19
|
seconds = value.send(fractional_property).to_f / fractional_operator.to_f
|
|
18
20
|
seconds = ((seconds * (1 / fractional_precision)).round / (1 / fractional_precision)).round(fractional_scale)
|
|
19
21
|
(seconds * fractional_operator).round(0).to_i
|
|
@@ -21,9 +23,10 @@ module ActiveRecord
|
|
|
21
23
|
|
|
22
24
|
def quote_fractional(value)
|
|
23
25
|
return 0 if fractional_scale == 0
|
|
26
|
+
|
|
24
27
|
frac_seconds = seconds_precision(value)
|
|
25
28
|
seconds = (frac_seconds.to_f / fractional_operator.to_f).round(fractional_scale)
|
|
26
|
-
seconds.to_d.to_s.split(
|
|
29
|
+
seconds.to_d.to_s.split(".").last.to(fractional_scale - 1)
|
|
27
30
|
end
|
|
28
31
|
|
|
29
32
|
def fractional_property
|
|
@@ -35,7 +38,7 @@ module ActiveRecord
|
|
|
35
38
|
end
|
|
36
39
|
|
|
37
40
|
def fractional_operator
|
|
38
|
-
10
|
|
41
|
+
10**fractional_digits
|
|
39
42
|
end
|
|
40
43
|
|
|
41
44
|
def fractional_precision
|
|
@@ -45,11 +48,9 @@ module ActiveRecord
|
|
|
45
48
|
def fractional_scale
|
|
46
49
|
3
|
|
47
50
|
end
|
|
48
|
-
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
module TimeValueFractional2
|
|
52
|
-
|
|
53
54
|
include TimeValueFractional
|
|
54
55
|
|
|
55
56
|
private
|
|
@@ -80,11 +81,9 @@ module ActiveRecord
|
|
|
80
81
|
end
|
|
81
82
|
|
|
82
83
|
def fractional_scale_max
|
|
83
|
-
(
|
|
84
|
+
("9" * fractional_scale) + ("0" * (fractional_digits - fractional_scale))
|
|
84
85
|
end
|
|
85
|
-
|
|
86
86
|
end
|
|
87
|
-
|
|
88
87
|
end
|
|
89
88
|
end
|
|
90
89
|
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 Timestamp < Binary
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:ss_timestamp
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"timestamp"
|
|
13
14
|
end
|
|
14
|
-
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,11 +1,12 @@
|
|
|
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 TinyInteger < Integer
|
|
6
|
-
|
|
7
8
|
def sqlserver_type
|
|
8
|
-
|
|
9
|
+
"tinyint"
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
private
|
|
@@ -17,7 +18,6 @@ module ActiveRecord
|
|
|
17
18
|
def min_value
|
|
18
19
|
0
|
|
19
20
|
end
|
|
20
|
-
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
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 UnicodeChar < UnicodeString
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:nchar
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
-
type
|
|
13
|
+
"nchar".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,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 UnicodeText < UnicodeVarcharMax
|
|
6
|
-
|
|
7
8
|
def type
|
|
8
9
|
:ntext
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def sqlserver_type
|
|
12
|
-
|
|
13
|
+
"ntext"
|
|
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 UnicodeVarchar < UnicodeChar
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@limit = 4000 if @limit.to_i == 0
|
|
10
11
|
end
|
|
@@ -14,11 +15,11 @@ module ActiveRecord
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def sqlserver_type
|
|
17
|
-
|
|
18
|
-
type
|
|
18
|
+
"nvarchar".yield_self do |type|
|
|
19
|
+
type += "(#{limit})" if limit
|
|
20
|
+
type
|
|
19
21
|
end
|
|
20
22
|
end
|
|
21
|
-
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
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 UnicodeVarcharMax < UnicodeVarchar
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@limit = 2_147_483_647
|
|
10
11
|
end
|
|
@@ -14,9 +15,8 @@ module ActiveRecord
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def sqlserver_type
|
|
17
|
-
|
|
18
|
+
"nvarchar(max)"
|
|
18
19
|
end
|
|
19
|
-
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
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 Uuid < String
|
|
6
|
-
|
|
7
8
|
ACCEPTABLE_UUID = %r{\A\{?([a-fA-F0-9]{4}-?){8}\}?\z}x
|
|
8
9
|
|
|
9
10
|
alias_method :serialize, :deserialize
|
|
@@ -13,11 +14,12 @@ module ActiveRecord
|
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def sqlserver_type
|
|
16
|
-
|
|
17
|
+
"uniqueidentifier"
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def serialize(value)
|
|
20
21
|
return unless value
|
|
22
|
+
|
|
21
23
|
Data.new super, self
|
|
22
24
|
end
|
|
23
25
|
|
|
@@ -28,7 +30,6 @@ module ActiveRecord
|
|
|
28
30
|
def quoted(value)
|
|
29
31
|
Utils.quote_string_single(value) if value
|
|
30
32
|
end
|
|
31
|
-
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
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 Varbinary < Binary
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@limit = 8000 if @limit.to_i == 0
|
|
10
11
|
end
|
|
@@ -14,11 +15,11 @@ module ActiveRecord
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def sqlserver_type
|
|
17
|
-
|
|
18
|
-
type
|
|
18
|
+
"varbinary".yield_self do |type|
|
|
19
|
+
type += "(#{limit})" if limit
|
|
20
|
+
type
|
|
19
21
|
end
|
|
20
22
|
end
|
|
21
|
-
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
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 VarbinaryMax < Varbinary
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@limit = 2_147_483_647
|
|
10
11
|
end
|
|
@@ -14,9 +15,8 @@ module ActiveRecord
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def sqlserver_type
|
|
17
|
-
|
|
18
|
+
"varbinary(max)"
|
|
18
19
|
end
|
|
19
|
-
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
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 Varchar < Char
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@limit = 8000 if @limit.to_i == 0
|
|
10
11
|
end
|
|
@@ -14,11 +15,11 @@ module ActiveRecord
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def sqlserver_type
|
|
17
|
-
|
|
18
|
-
type
|
|
18
|
+
"varchar".yield_self do |type|
|
|
19
|
+
type += "(#{limit})" if limit
|
|
20
|
+
type
|
|
19
21
|
end
|
|
20
22
|
end
|
|
21
|
-
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
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 VarcharMax < Varchar
|
|
6
|
-
|
|
7
|
-
def initialize(*args)
|
|
8
|
+
def initialize(**args)
|
|
8
9
|
super
|
|
9
10
|
@limit = 2_147_483_647
|
|
10
11
|
end
|
|
@@ -14,9 +15,8 @@ module ActiveRecord
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def sqlserver_type
|
|
17
|
-
|
|
18
|
+
"varchar(max)"
|
|
18
19
|
end
|
|
19
|
-
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
|
@@ -1,46 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_record/type"
|
|
2
4
|
# Behaviors
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
+
require "active_record/connection_adapters/sqlserver/type/data"
|
|
6
|
+
require "active_record/connection_adapters/sqlserver/type/time_value_fractional"
|
|
5
7
|
# Exact Numerics
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require
|
|
9
|
-
require
|
|
10
|
-
require
|
|
11
|
-
require
|
|
12
|
-
require
|
|
13
|
-
require
|
|
8
|
+
require "active_record/connection_adapters/sqlserver/type/integer"
|
|
9
|
+
require "active_record/connection_adapters/sqlserver/type/big_integer"
|
|
10
|
+
require "active_record/connection_adapters/sqlserver/type/small_integer"
|
|
11
|
+
require "active_record/connection_adapters/sqlserver/type/tiny_integer"
|
|
12
|
+
require "active_record/connection_adapters/sqlserver/type/boolean"
|
|
13
|
+
require "active_record/connection_adapters/sqlserver/type/decimal"
|
|
14
|
+
require "active_record/connection_adapters/sqlserver/type/money"
|
|
15
|
+
require "active_record/connection_adapters/sqlserver/type/small_money"
|
|
14
16
|
# Approximate Numerics
|
|
15
|
-
require
|
|
16
|
-
require
|
|
17
|
+
require "active_record/connection_adapters/sqlserver/type/float"
|
|
18
|
+
require "active_record/connection_adapters/sqlserver/type/real"
|
|
17
19
|
# Date and Time
|
|
18
|
-
require
|
|
19
|
-
require
|
|
20
|
-
require
|
|
21
|
-
require
|
|
22
|
-
require
|
|
23
|
-
require
|
|
20
|
+
require "active_record/connection_adapters/sqlserver/type/date"
|
|
21
|
+
require "active_record/connection_adapters/sqlserver/type/datetime"
|
|
22
|
+
require "active_record/connection_adapters/sqlserver/type/datetime2"
|
|
23
|
+
require "active_record/connection_adapters/sqlserver/type/datetimeoffset"
|
|
24
|
+
require "active_record/connection_adapters/sqlserver/type/smalldatetime"
|
|
25
|
+
require "active_record/connection_adapters/sqlserver/type/time"
|
|
24
26
|
# Character Strings
|
|
25
|
-
require
|
|
26
|
-
require
|
|
27
|
-
require
|
|
28
|
-
require
|
|
29
|
-
require
|
|
27
|
+
require "active_record/connection_adapters/sqlserver/type/string"
|
|
28
|
+
require "active_record/connection_adapters/sqlserver/type/char"
|
|
29
|
+
require "active_record/connection_adapters/sqlserver/type/varchar"
|
|
30
|
+
require "active_record/connection_adapters/sqlserver/type/varchar_max"
|
|
31
|
+
require "active_record/connection_adapters/sqlserver/type/text"
|
|
30
32
|
# Unicode Character Strings
|
|
31
|
-
require
|
|
32
|
-
require
|
|
33
|
-
require
|
|
34
|
-
require
|
|
35
|
-
require
|
|
33
|
+
require "active_record/connection_adapters/sqlserver/type/unicode_string"
|
|
34
|
+
require "active_record/connection_adapters/sqlserver/type/unicode_char"
|
|
35
|
+
require "active_record/connection_adapters/sqlserver/type/unicode_varchar"
|
|
36
|
+
require "active_record/connection_adapters/sqlserver/type/unicode_varchar_max"
|
|
37
|
+
require "active_record/connection_adapters/sqlserver/type/unicode_text"
|
|
36
38
|
# Binary Strings
|
|
37
|
-
require
|
|
38
|
-
require
|
|
39
|
-
require
|
|
39
|
+
require "active_record/connection_adapters/sqlserver/type/binary"
|
|
40
|
+
require "active_record/connection_adapters/sqlserver/type/varbinary"
|
|
41
|
+
require "active_record/connection_adapters/sqlserver/type/varbinary_max"
|
|
40
42
|
# Other Data Types
|
|
41
|
-
require
|
|
42
|
-
require
|
|
43
|
-
require
|
|
43
|
+
require "active_record/connection_adapters/sqlserver/type/uuid"
|
|
44
|
+
require "active_record/connection_adapters/sqlserver/type/timestamp"
|
|
45
|
+
require "active_record/connection_adapters/sqlserver/type/json"
|
|
44
46
|
|
|
45
47
|
module ActiveRecord
|
|
46
48
|
module Type
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "strscan"
|
|
2
4
|
|
|
3
5
|
module ActiveRecord
|
|
4
6
|
module ConnectionAdapters
|
|
5
7
|
module SQLServer
|
|
6
8
|
module Utils
|
|
7
|
-
|
|
8
|
-
QUOTED_STRING_PREFIX = 'N'
|
|
9
|
+
QUOTED_STRING_PREFIX = "N"
|
|
9
10
|
|
|
10
11
|
# Value object to return identifiers from SQL Server names http://bit.ly/1CZ3EiL
|
|
11
12
|
# Inspiried from Rails PostgreSQL::Name adapter object in their own Utils.
|
|
12
13
|
#
|
|
13
14
|
class Name
|
|
14
|
-
|
|
15
15
|
SEPARATOR = "."
|
|
16
16
|
UNQUOTED_SCANNER = /\]?\./
|
|
17
17
|
QUOTED_SCANNER = /\A\[.*?\]\./
|
|
@@ -54,15 +54,15 @@ module ActiveRecord
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def quoted
|
|
57
|
-
parts.map{ |p| quote(p) if p }.join SEPARATOR
|
|
57
|
+
parts.map { |p| quote(p) if p }.join SEPARATOR
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def quoted_raw
|
|
61
61
|
quote @raw_name
|
|
62
62
|
end
|
|
63
63
|
|
|
64
|
-
def ==(
|
|
65
|
-
|
|
64
|
+
def ==(other)
|
|
65
|
+
other.class == self.class && other.parts == parts
|
|
66
66
|
end
|
|
67
67
|
alias_method :eql?, :==
|
|
68
68
|
|
|
@@ -75,6 +75,7 @@ module ActiveRecord
|
|
|
75
75
|
def parse_raw_name
|
|
76
76
|
@parts = []
|
|
77
77
|
return if raw_name.blank?
|
|
78
|
+
|
|
78
79
|
scanner = StringScanner.new(raw_name)
|
|
79
80
|
matched = scanner.exist?(QUOTED_CHECKER) ? scanner.scan_until(QUOTED_SCANNER) : scanner.scan_until(UNQUOTED_SCANNER)
|
|
80
81
|
while matched
|
|
@@ -91,7 +92,7 @@ module ActiveRecord
|
|
|
91
92
|
@schema = @parts.first
|
|
92
93
|
end
|
|
93
94
|
rest = scanner.rest
|
|
94
|
-
rest = rest.starts_with?(
|
|
95
|
+
rest = rest.starts_with?(".") ? rest[1..-1] : rest[0..-1]
|
|
95
96
|
@object = unquote(rest)
|
|
96
97
|
@parts << @object
|
|
97
98
|
end
|
|
@@ -101,7 +102,7 @@ module ActiveRecord
|
|
|
101
102
|
end
|
|
102
103
|
|
|
103
104
|
def unquote(part)
|
|
104
|
-
if part && part.start_with?(
|
|
105
|
+
if part && part.start_with?("[")
|
|
105
106
|
part[1..-2]
|
|
106
107
|
else
|
|
107
108
|
part
|
|
@@ -111,7 +112,6 @@ module ActiveRecord
|
|
|
111
112
|
def parts
|
|
112
113
|
@parts
|
|
113
114
|
end
|
|
114
|
-
|
|
115
115
|
end
|
|
116
116
|
|
|
117
117
|
extend self
|
|
@@ -139,7 +139,6 @@ module ActiveRecord
|
|
|
139
139
|
def extract_identifiers(name)
|
|
140
140
|
SQLServer::Utils::Name.new(name)
|
|
141
141
|
end
|
|
142
|
-
|
|
143
142
|
end
|
|
144
143
|
end
|
|
145
144
|
end
|