activerecord-jdbcsqlserver-adapter 50.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.
Files changed (148) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +27 -0
  4. data/CHANGELOG.md +124 -0
  5. data/CODE_OF_CONDUCT.md +31 -0
  6. data/Dockerfile +20 -0
  7. data/Gemfile +77 -0
  8. data/Guardfile +29 -0
  9. data/MIT-LICENSE +20 -0
  10. data/RAILS5-TODO.md +5 -0
  11. data/README.md +93 -0
  12. data/RUNNING_UNIT_TESTS.md +96 -0
  13. data/Rakefile +46 -0
  14. data/VERSION +1 -0
  15. data/activerecord-jdbcsqlserver-adapter.gemspec +21 -0
  16. data/appveyor.yml +39 -0
  17. data/docker-compose.ci.yml +11 -0
  18. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +27 -0
  19. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +25 -0
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/date_time.rb +58 -0
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +47 -0
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +4 -0
  23. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
  24. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +362 -0
  25. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +67 -0
  26. data/lib/active_record/connection_adapters/sqlserver/errors.rb +7 -0
  27. data/lib/active_record/connection_adapters/sqlserver/jdbc_overrides.rb +192 -0
  28. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +99 -0
  29. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +34 -0
  30. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +16 -0
  31. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +517 -0
  32. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +66 -0
  33. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +66 -0
  34. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +22 -0
  35. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +20 -0
  36. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +112 -0
  37. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +64 -0
  38. data/lib/active_record/connection_adapters/sqlserver/type.rb +49 -0
  39. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +19 -0
  40. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +21 -0
  41. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +15 -0
  42. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +32 -0
  43. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +30 -0
  44. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +61 -0
  45. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +71 -0
  46. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +17 -0
  47. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +23 -0
  48. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +21 -0
  49. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +19 -0
  50. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +15 -0
  51. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +11 -0
  52. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +25 -0
  53. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +19 -0
  54. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +15 -0
  55. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +25 -0
  56. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +29 -0
  57. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +12 -0
  58. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +19 -0
  59. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +68 -0
  60. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +93 -0
  61. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +19 -0
  62. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +25 -0
  63. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +21 -0
  64. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +12 -0
  65. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +19 -0
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +26 -0
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +24 -0
  68. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +36 -0
  69. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +26 -0
  70. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +24 -0
  71. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +26 -0
  72. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +24 -0
  73. data/lib/active_record/connection_adapters/sqlserver/utils.rb +146 -0
  74. data/lib/active_record/connection_adapters/sqlserver/version.rb +11 -0
  75. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +445 -0
  76. data/lib/active_record/connection_adapters/sqlserver_column.rb +28 -0
  77. data/lib/active_record/jdbc_sqlserver_connection_methods.rb +31 -0
  78. data/lib/active_record/sqlserver_base.rb +16 -0
  79. data/lib/active_record/tasks/sqlserver_database_tasks.rb +131 -0
  80. data/lib/activerecord-jdbcsqlserver-adapter.rb +24 -0
  81. data/lib/activerecord-sqlserver-adapter.rb +1 -0
  82. data/lib/arel/visitors/sqlserver.rb +205 -0
  83. data/lib/arel_sqlserver.rb +3 -0
  84. data/test/appveyor/dbsetup.ps1 +27 -0
  85. data/test/appveyor/dbsetup.sql +11 -0
  86. data/test/bin/wait-for.sh +79 -0
  87. data/test/cases/adapter_test_sqlserver.rb +430 -0
  88. data/test/cases/coerced_tests.rb +845 -0
  89. data/test/cases/column_test_sqlserver.rb +812 -0
  90. data/test/cases/connection_test_sqlserver.rb +71 -0
  91. data/test/cases/execute_procedure_test_sqlserver.rb +45 -0
  92. data/test/cases/fetch_test_sqlserver.rb +57 -0
  93. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +76 -0
  94. data/test/cases/helper_sqlserver.rb +44 -0
  95. data/test/cases/index_test_sqlserver.rb +47 -0
  96. data/test/cases/json_test_sqlserver.rb +32 -0
  97. data/test/cases/migration_test_sqlserver.rb +61 -0
  98. data/test/cases/order_test_sqlserver.rb +147 -0
  99. data/test/cases/pessimistic_locking_test_sqlserver.rb +94 -0
  100. data/test/cases/rake_test_sqlserver.rb +169 -0
  101. data/test/cases/schema_dumper_test_sqlserver.rb +234 -0
  102. data/test/cases/schema_test_sqlserver.rb +54 -0
  103. data/test/cases/scratchpad_test_sqlserver.rb +8 -0
  104. data/test/cases/showplan_test_sqlserver.rb +65 -0
  105. data/test/cases/specific_schema_test_sqlserver.rb +180 -0
  106. data/test/cases/transaction_test_sqlserver.rb +91 -0
  107. data/test/cases/utils_test_sqlserver.rb +129 -0
  108. data/test/cases/uuid_test_sqlserver.rb +49 -0
  109. data/test/config.yml +38 -0
  110. data/test/debug.rb +14 -0
  111. data/test/fixtures/1px.gif +0 -0
  112. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +11 -0
  113. data/test/models/sqlserver/booking.rb +3 -0
  114. data/test/models/sqlserver/customers_view.rb +3 -0
  115. data/test/models/sqlserver/datatype.rb +3 -0
  116. data/test/models/sqlserver/datatype_migration.rb +8 -0
  117. data/test/models/sqlserver/dollar_table_name.rb +3 -0
  118. data/test/models/sqlserver/dot_table_name.rb +3 -0
  119. data/test/models/sqlserver/edge_schema.rb +13 -0
  120. data/test/models/sqlserver/fk_has_fk.rb +3 -0
  121. data/test/models/sqlserver/fk_has_pk.rb +3 -0
  122. data/test/models/sqlserver/natural_pk_data.rb +4 -0
  123. data/test/models/sqlserver/natural_pk_int_data.rb +3 -0
  124. data/test/models/sqlserver/no_pk_data.rb +3 -0
  125. data/test/models/sqlserver/object_default.rb +3 -0
  126. data/test/models/sqlserver/quoted_table.rb +7 -0
  127. data/test/models/sqlserver/quoted_view_1.rb +3 -0
  128. data/test/models/sqlserver/quoted_view_2.rb +3 -0
  129. data/test/models/sqlserver/sst_memory.rb +3 -0
  130. data/test/models/sqlserver/string_default.rb +3 -0
  131. data/test/models/sqlserver/string_defaults_big_view.rb +3 -0
  132. data/test/models/sqlserver/string_defaults_view.rb +3 -0
  133. data/test/models/sqlserver/tinyint_pk.rb +3 -0
  134. data/test/models/sqlserver/upper.rb +3 -0
  135. data/test/models/sqlserver/uppered.rb +3 -0
  136. data/test/models/sqlserver/uuid.rb +3 -0
  137. data/test/schema/datatypes/2012.sql +55 -0
  138. data/test/schema/enable-in-memory-oltp.sql +81 -0
  139. data/test/schema/sqlserver_specific_schema.rb +238 -0
  140. data/test/support/coerceable_test_sqlserver.rb +49 -0
  141. data/test/support/connection_reflection.rb +34 -0
  142. data/test/support/load_schema_sqlserver.rb +29 -0
  143. data/test/support/minitest_sqlserver.rb +1 -0
  144. data/test/support/paths_sqlserver.rb +50 -0
  145. data/test/support/rake_helpers.rb +41 -0
  146. data/test/support/sql_counter_sqlserver.rb +28 -0
  147. data/test/support/test_in_memory_oltp.rb +15 -0
  148. metadata +310 -0
@@ -0,0 +1,15 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Boolean < ActiveRecord::Type::Boolean
6
+
7
+ def sqlserver_type
8
+ 'bit'.freeze
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Char < String
6
+
7
+ def type
8
+ :char
9
+ end
10
+
11
+ def serialize(value)
12
+ return if value.nil?
13
+ return value if value.is_a?(Data)
14
+ Data.new super, self
15
+ end
16
+
17
+ def sqlserver_type
18
+ 'char'.tap do |type|
19
+ type << "(#{limit})" if limit
20
+ end
21
+ end
22
+
23
+ def quoted(value)
24
+ return value.quoted_id if value.respond_to?(:quoted_id)
25
+ Utils.quote_string_single(value)
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,30 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Data
6
+
7
+ attr_reader :value, :type
8
+
9
+ def initialize(value, type)
10
+ @value, @type = value, type
11
+ end
12
+
13
+ def quoted
14
+ type.quoted(@value)
15
+ end
16
+
17
+ def to_s
18
+ @value
19
+ end
20
+ alias_method :to_str, :to_s
21
+
22
+ def inspect
23
+ @value.inspect
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,61 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Date < ActiveRecord::Type::Date
6
+
7
+ def sqlserver_type
8
+ 'date'.freeze
9
+ end
10
+
11
+ def serialize(value)
12
+ return unless value.present?
13
+ date = super(value).to_s(:_sqlserver_dateformat)
14
+ Data.new date, self
15
+ end
16
+
17
+ if defined? JRUBY_VERSION
18
+
19
+ # Currently only called by our custom DateTime type for formatting
20
+ def _formatted(value)
21
+ value.to_s(:_sqlserver_dateformat)
22
+ end
23
+
24
+ # @Override
25
+ # We do not want the DateTime object to be turned into a string
26
+ def serialize(value)
27
+ value = super
28
+ value.present? ? CoreExt::DateTime._jd_with_sql_type(value, self) : value
29
+ end
30
+
31
+ end
32
+
33
+ def deserialize(value)
34
+ value.is_a?(Data) ? super(value.value) : super
35
+ end
36
+
37
+ def type_cast_for_schema(value)
38
+ serialize(value).quoted
39
+ end
40
+
41
+ def quoted(value)
42
+ Utils.quote_string_single(value)
43
+ end
44
+
45
+ private
46
+
47
+ def fast_string_to_date(string)
48
+ ::Date.strptime(string, fast_string_to_date_format)
49
+ rescue ArgumentError
50
+ super
51
+ end
52
+
53
+ def fast_string_to_date_format
54
+ ::Date::DATE_FORMATS[:_sqlserver_dateformat]
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,71 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class DateTime < ActiveRecord::Type::DateTime
6
+
7
+ include TimeValueFractional
8
+
9
+ def sqlserver_type
10
+ 'datetime'.freeze
11
+ end
12
+
13
+ def serialize(value)
14
+ value = super
15
+ return value unless value.acts_like?(:time)
16
+ datetime = value.to_s(:_sqlserver_datetime).tap do |v|
17
+ fraction = quote_fractional(value)
18
+ v << ".#{fraction}"
19
+ end
20
+ Data.new datetime, self
21
+ end
22
+
23
+ if defined? JRUBY_VERSION
24
+
25
+ # Currently only called by our custom Time type for formatting
26
+ def _formatted(value)
27
+ "#{value.to_s(:_sqlserver_datetime)}.#{quote_fractional(value)}"
28
+ end
29
+
30
+ # @Override
31
+ # We do not want the Time object to be turned into a string
32
+ def serialize(value)
33
+ value = super
34
+ value.acts_like?(:time) ? CoreExt::Time._at_with_sql_type(value, self) : value
35
+ end
36
+
37
+ end
38
+
39
+ def deserialize(value)
40
+ value.is_a?(Data) ? super(value.value) : super
41
+ end
42
+
43
+ def type_cast_for_schema(value)
44
+ serialize(value).quoted
45
+ end
46
+
47
+ def quoted(value)
48
+ Utils.quote_string_single(value)
49
+ end
50
+
51
+ private
52
+
53
+ def fast_string_to_time(string)
54
+ fast_string_to_time_zone.strptime(string, fast_string_to_time_format).time
55
+ rescue ArgumentError
56
+ super
57
+ end
58
+
59
+ def fast_string_to_time_format
60
+ "#{::Time::DATE_FORMATS[:_sqlserver_datetime]}.%N".freeze
61
+ end
62
+
63
+ def fast_string_to_time_zone
64
+ ::Time.zone || ActiveSupport::TimeZone['UTC']
65
+ end
66
+
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class DateTime2 < DateTime
6
+
7
+ include TimeValueFractional2
8
+
9
+ def sqlserver_type
10
+ "datetime2(#{precision.to_i})"
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class DateTimeOffset < DateTime2
6
+
7
+ def type
8
+ :datetimeoffset
9
+ end
10
+
11
+ def sqlserver_type
12
+ "datetimeoffset(#{precision.to_i})"
13
+ end
14
+
15
+ def quoted(value)
16
+ Utils.quote_string_single(value)
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Decimal < ActiveRecord::Type::Decimal
6
+
7
+ def sqlserver_type
8
+ 'decimal'.tap do |type|
9
+ type << "(#{precision.to_i},#{scale.to_i})" if precision || scale
10
+ end
11
+ end
12
+
13
+ def type_cast_for_schema(value)
14
+ value.is_a?(BigDecimal) ? value.to_s : value.inspect
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Float < ActiveRecord::Type::Float
6
+
7
+ def type
8
+ :float
9
+ end
10
+
11
+ def sqlserver_type
12
+ 'float'.freeze
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Integer < ActiveRecord::Type::Integer
6
+
7
+ def sqlserver_type
8
+ 'int'.freeze
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Json < ActiveRecord::Type::Internal::AbstractJson
6
+
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Money < Decimal
6
+
7
+ def initialize(*args)
8
+ super
9
+ @precision = 19
10
+ @scale = 4
11
+ end
12
+
13
+ def type
14
+ :money
15
+ end
16
+
17
+ def sqlserver_type
18
+ 'money'.freeze
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class Real < Float
6
+
7
+ def type
8
+ :real
9
+ end
10
+
11
+ def sqlserver_type
12
+ 'real'.freeze
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class SmallInteger < Integer
6
+
7
+ def sqlserver_type
8
+ 'smallint'.freeze
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class SmallMoney < Money
6
+
7
+ def initialize(*args)
8
+ super
9
+ @precision = 10
10
+ @scale = 4
11
+ end
12
+
13
+ def type
14
+ :smallmoney
15
+ end
16
+
17
+ def sqlserver_type
18
+ 'smallmoney'.freeze
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module SQLServer
4
+ module Type
5
+ class SmallDateTime < DateTime
6
+
7
+ def type
8
+ :smalldatetime
9
+ end
10
+
11
+ def sqlserver_type
12
+ 'smalldatetime'.freeze
13
+ end
14
+
15
+ private
16
+
17
+ def fast_string_to_time_format
18
+ ::Time::DATE_FORMATS[:_sqlserver_datetime]
19
+ end
20
+
21
+ def apply_seconds_precision(value)
22
+ value.change usec: 0 if value
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end