activerecord-sqlserver-adapter 5.2.1 → 7.0.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 (164) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/issue_template.md +23 -0
  4. data/.github/workflows/ci.yml +29 -0
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +29 -0
  7. data/CHANGELOG.md +17 -27
  8. data/{Dockerfile → Dockerfile.ci} +1 -1
  9. data/Gemfile +49 -41
  10. data/Guardfile +9 -8
  11. data/MIT-LICENSE +1 -1
  12. data/README.md +65 -42
  13. data/RUNNING_UNIT_TESTS.md +3 -0
  14. data/Rakefile +14 -16
  15. data/VERSION +1 -1
  16. data/activerecord-sqlserver-adapter.gemspec +25 -14
  17. data/appveyor.yml +22 -17
  18. data/docker-compose.ci.yml +7 -5
  19. data/guides/RELEASING.md +11 -0
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +5 -4
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +10 -14
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +12 -5
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +10 -7
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +30 -0
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -4
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +117 -52
  29. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +9 -12
  30. data/lib/active_record/connection_adapters/sqlserver/errors.rb +2 -3
  31. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +51 -14
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +40 -6
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +18 -10
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +235 -167
  35. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_table.rb +4 -2
  36. data/lib/active_record/connection_adapters/sqlserver/showplan/printer_xml.rb +3 -1
  37. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +8 -8
  38. data/lib/active_record/connection_adapters/sqlserver/sql_type_metadata.rb +36 -7
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -45
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +8 -10
  41. data/lib/active_record/connection_adapters/sqlserver/type/big_integer.rb +3 -3
  42. data/lib/active_record/connection_adapters/sqlserver/type/binary.rb +5 -4
  43. data/lib/active_record/connection_adapters/sqlserver/type/boolean.rb +3 -3
  44. data/lib/active_record/connection_adapters/sqlserver/type/char.rb +7 -4
  45. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +5 -3
  46. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +7 -5
  47. data/lib/active_record/connection_adapters/sqlserver/type/datetime.rb +8 -8
  48. data/lib/active_record/connection_adapters/sqlserver/type/datetime2.rb +2 -2
  49. data/lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb +2 -2
  50. data/lib/active_record/connection_adapters/sqlserver/type/decimal.rb +5 -4
  51. data/lib/active_record/connection_adapters/sqlserver/type/decimal_without_scale.rb +22 -0
  52. data/lib/active_record/connection_adapters/sqlserver/type/float.rb +3 -3
  53. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  54. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  55. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  56. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  57. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  58. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  59. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  60. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  61. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  62. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  63. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  64. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  70. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  71. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  72. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  73. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  74. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  75. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  76. data/lib/active_record/connection_adapters/sqlserver/type.rb +38 -35
  77. data/lib/active_record/connection_adapters/sqlserver/utils.rb +26 -12
  78. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  79. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +271 -180
  80. data/lib/active_record/connection_adapters/sqlserver_column.rb +76 -16
  81. data/lib/active_record/sqlserver_base.rb +11 -9
  82. data/lib/active_record/tasks/sqlserver_database_tasks.rb +38 -39
  83. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  84. data/lib/arel/visitors/sqlserver.rb +177 -56
  85. data/lib/arel_sqlserver.rb +4 -2
  86. data/test/appveyor/dbsetup.ps1 +4 -4
  87. data/test/cases/active_schema_test_sqlserver.rb +55 -0
  88. data/test/cases/adapter_test_sqlserver.rb +258 -173
  89. data/test/cases/change_column_collation_test_sqlserver.rb +33 -0
  90. data/test/cases/change_column_null_test_sqlserver.rb +14 -12
  91. data/test/cases/coerced_tests.rb +1421 -397
  92. data/test/cases/column_test_sqlserver.rb +321 -315
  93. data/test/cases/connection_test_sqlserver.rb +17 -20
  94. data/test/cases/disconnected_test_sqlserver.rb +39 -0
  95. data/test/cases/eager_load_too_many_ids_test_sqlserver.rb +18 -0
  96. data/test/cases/execute_procedure_test_sqlserver.rb +28 -19
  97. data/test/cases/fetch_test_sqlserver.rb +33 -21
  98. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  99. data/test/cases/helper_sqlserver.rb +15 -15
  100. data/test/cases/in_clause_test_sqlserver.rb +63 -0
  101. data/test/cases/index_test_sqlserver.rb +15 -15
  102. data/test/cases/json_test_sqlserver.rb +25 -25
  103. data/test/cases/lateral_test_sqlserver.rb +35 -0
  104. data/test/cases/migration_test_sqlserver.rb +74 -27
  105. data/test/cases/optimizer_hints_test_sqlserver.rb +72 -0
  106. data/test/cases/order_test_sqlserver.rb +59 -53
  107. data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
  108. data/test/cases/primary_keys_test_sqlserver.rb +103 -0
  109. data/test/cases/rake_test_sqlserver.rb +70 -45
  110. data/test/cases/schema_dumper_test_sqlserver.rb +124 -109
  111. data/test/cases/schema_test_sqlserver.rb +20 -26
  112. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  113. data/test/cases/showplan_test_sqlserver.rb +28 -35
  114. data/test/cases/specific_schema_test_sqlserver.rb +68 -65
  115. data/test/cases/transaction_test_sqlserver.rb +18 -20
  116. data/test/cases/trigger_test_sqlserver.rb +14 -13
  117. data/test/cases/utils_test_sqlserver.rb +70 -70
  118. data/test/cases/uuid_test_sqlserver.rb +13 -14
  119. data/test/debug.rb +8 -6
  120. data/test/migrations/create_clients_and_change_column_collation.rb +19 -0
  121. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  122. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  123. data/test/models/sqlserver/booking.rb +3 -1
  124. data/test/models/sqlserver/composite_pk.rb +9 -0
  125. data/test/models/sqlserver/customers_view.rb +3 -1
  126. data/test/models/sqlserver/datatype.rb +2 -0
  127. data/test/models/sqlserver/datatype_migration.rb +2 -0
  128. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  129. data/test/models/sqlserver/edge_schema.rb +3 -3
  130. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  131. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  132. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  133. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  134. data/test/models/sqlserver/no_pk_data.rb +3 -1
  135. data/test/models/sqlserver/object_default.rb +3 -1
  136. data/test/models/sqlserver/quoted_table.rb +4 -2
  137. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  138. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  139. data/test/models/sqlserver/sst_memory.rb +3 -1
  140. data/test/models/sqlserver/sst_string_collation.rb +3 -0
  141. data/test/models/sqlserver/string_default.rb +3 -1
  142. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  143. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  144. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  145. data/test/models/sqlserver/trigger.rb +4 -2
  146. data/test/models/sqlserver/trigger_history.rb +3 -1
  147. data/test/models/sqlserver/upper.rb +3 -1
  148. data/test/models/sqlserver/uppered.rb +3 -1
  149. data/test/models/sqlserver/uuid.rb +3 -1
  150. data/test/schema/sqlserver_specific_schema.rb +56 -21
  151. data/test/support/coerceable_test_sqlserver.rb +19 -13
  152. data/test/support/connection_reflection.rb +3 -2
  153. data/test/support/core_ext/query_cache.rb +4 -1
  154. data/test/support/load_schema_sqlserver.rb +5 -5
  155. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic.dump +0 -0
  156. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
  157. data/test/support/minitest_sqlserver.rb +3 -1
  158. data/test/support/paths_sqlserver.rb +11 -11
  159. data/test/support/rake_helpers.rb +15 -10
  160. data/test/support/sql_counter_sqlserver.rb +16 -15
  161. data/test/support/test_in_memory_oltp.rb +9 -7
  162. metadata +47 -13
  163. data/.travis.yml +0 -25
  164. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +0 -26
data/test/debug.rb CHANGED
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # require 'rails/all'
2
- require 'tiny_tds'
4
+ require "tiny_tds"
3
5
 
4
6
  c = TinyTds::Client.new(
5
- host: ENV['CI_AZURE_HOST'],
6
- username: 'rails',
7
- password: ENV['CI_AZURE_PASS'],
8
- database: 'activerecord_unittest',
7
+ host: ENV["CI_AZURE_HOST"],
8
+ username: "rails",
9
+ password: ENV["CI_AZURE_PASS"],
10
+ database: "activerecord_unittest",
9
11
  azure: true,
10
- tds_version: '7.3'
12
+ tds_version: "7.3"
11
13
  )
12
14
 
13
15
  puts c.execute("SELECT 1 AS [one]").each
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateClientsAndChangeColumnCollation < ActiveRecord::Migration[5.2]
4
+ def up
5
+ create_table :clients do |t|
6
+ t.string :name
7
+ t.string :code, collation: :SQL_Latin1_General_CP1_CS_AS
8
+
9
+ t.timestamps
10
+ end
11
+
12
+ change_column :clients, :name, :string, collation: 'SQL_Latin1_General_CP1_CS_AS'
13
+ change_column :clients, :code, :string, collation: 'SQL_Latin1_General_CP1_CI_AS'
14
+ end
15
+
16
+ def down
17
+ drop_table :clients
18
+ end
19
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CreateClientsAndChangeColumnNull < ActiveRecord::Migration[5.2]
2
4
  def up
3
5
  create_table :clients do |t|
@@ -9,7 +11,7 @@ class CreateClientsAndChangeColumnNull < ActiveRecord::Migration[5.2]
9
11
  end
10
12
 
11
13
  change_column :clients, :name, :string, limit: 15
12
- change_column :clients, :code, :string, default: 'n/a'
14
+ change_column :clients, :code, :string, default: "n/a"
13
15
  change_column :clients, :value, :decimal, precision: 32, scale: 8
14
16
 
15
17
  change_column_null :clients, :name, false
@@ -1,11 +1,11 @@
1
- class TableWillNeverBeCreated < ActiveRecord::Migration
1
+ # frozen_string_literal: true
2
2
 
3
+ class TableWillNeverBeCreated < ActiveRecord::Migration[5.2]
3
4
  def self.up
4
- create_table(:sqlserver_trans_table1) { }
5
- create_table(:sqlserver_trans_table2) { raise('HELL') }
5
+ create_table(:sqlserver_trans_table1) {}
6
+ create_table(:sqlserver_trans_table2) { raise("HELL") }
6
7
  end
7
8
 
8
9
  def self.down
9
10
  end
10
-
11
11
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestBooking < ActiveRecord::Base
2
- self.table_name = 'sst_bookings'
4
+ self.table_name = "sst_bookings"
3
5
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SSCompositePkWithoutIdentity < ActiveRecord::Base
4
+ self.table_name = :sst_composite_without_identity
5
+ end
6
+
7
+ class SSCompositePkWithIdentity < ActiveRecord::Base
8
+ self.table_name = :sst_composite_with_identity
9
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestCustomersView < ActiveRecord::Base
2
- self.table_name = 'sst_customers_view'
4
+ self.table_name = "sst_customers_view"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestDatatype < ActiveRecord::Base
2
4
  self.table_name = :sst_datatypes
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestDatatypeMigration < ActiveRecord::Base
2
4
  self.table_name = :sst_datatypes_migration
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestDollarTableName < ActiveRecord::Base
2
- self.table_name = 'sst_my$strange_table'
4
+ self.table_name = "sst_my$strange_table"
3
5
  end
@@ -1,6 +1,7 @@
1
- class SSTestEdgeSchema < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
2
 
3
- self.table_name = 'sst_edge_schemas'
3
+ class SSTestEdgeSchema < ActiveRecord::Base
4
+ self.table_name = "sst_edge_schemas"
4
5
 
5
6
  def with_spaces
6
7
  read_attribute :'with spaces'
@@ -9,5 +10,4 @@ class SSTestEdgeSchema < ActiveRecord::Base
9
10
  def with_spaces=(value)
10
11
  write_attribute :'with spaces', value
11
12
  end
12
-
13
13
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestHasFk < ActiveRecord::Base
2
- self.table_name = 'sst_has_fks'
4
+ self.table_name = "sst_has_fks"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestHasPk < ActiveRecord::Base
2
- self.table_name = 'sst_has_pks'
4
+ self.table_name = "sst_has_pks"
3
5
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestNaturalPkData < ActiveRecord::Base
2
- self.table_name = 'sst_natural_pk_data'
3
- self.primary_key = 'legacy_id'
4
+ self.table_name = "sst_natural_pk_data"
5
+ self.primary_key = "legacy_id"
4
6
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestNaturalPkIntData < ActiveRecord::Base
2
- self.table_name = 'sst_natural_pk_int_data'
4
+ self.table_name = "sst_natural_pk_int_data"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestNoPkData < ActiveRecord::Base
2
- self.table_name = 'sst_no_pk_data'
4
+ self.table_name = "sst_no_pk_data"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestObjectDefault < ActiveRecord::Base
2
- self.table_name = 'sst_defaultobjects'
4
+ self.table_name = "sst_defaultobjects"
3
5
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestQuotedTable < ActiveRecord::Base
2
- self.table_name = '[sst_quoted-table]'
4
+ self.table_name = "[sst_quoted-table]"
3
5
  end
4
6
 
5
7
  class SSTestQuotedTableUser < ActiveRecord::Base
6
- self.table_name = '[dbo].[sst_quoted-table]'
8
+ self.table_name = "[dbo].[sst_quoted-table]"
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestQuotedView1 < ActiveRecord::Base
2
- self.table_name = 'sst_quoted-view1'
4
+ self.table_name = "sst_quoted-view1"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestQuotedView2 < ActiveRecord::Base
2
- self.table_name = 'sst_quoted-view2'
4
+ self.table_name = "sst_quoted-view2"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTMemory < ActiveRecord::Base
2
- self.table_name = 'sst_memory'
4
+ self.table_name = "sst_memory"
3
5
  end
@@ -0,0 +1,3 @@
1
+ class SstStringCollation < ActiveRecord::Base
2
+ self.table_name = "sst_string_collation"
3
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestStringDefault < ActiveRecord::Base
2
- self.table_name = 'sst_string_defaults'
4
+ self.table_name = "sst_string_defaults"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestStringDefaultsBigView < ActiveRecord::Base
2
- self.table_name = 'sst_string_defaults_big_view'
4
+ self.table_name = "sst_string_defaults_big_view"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestStringDefaultsView < ActiveRecord::Base
2
- self.table_name = 'sst_string_defaults_view'
4
+ self.table_name = "sst_string_defaults_view"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestTinyintPk < ActiveRecord::Base
2
- self.table_name = 'sst_tinyint_pk'
4
+ self.table_name = "sst_tinyint_pk"
3
5
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestTrigger < ActiveRecord::Base
2
- self.table_name = 'sst_table_with_trigger'
4
+ self.table_name = "sst_table_with_trigger"
3
5
  end
4
6
 
5
7
  class SSTestTriggerUuid < ActiveRecord::Base
6
- self.table_name = 'sst_table_with_uuid_trigger'
8
+ self.table_name = "sst_table_with_uuid_trigger"
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestTriggerHistory < ActiveRecord::Base
2
- self.table_name = 'sst_table_with_trigger_history'
4
+ self.table_name = "sst_table_with_trigger_history"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestUpper < ActiveRecord::Base
2
- self.table_name = 'sst_upper_tests'
4
+ self.table_name = "sst_upper_tests"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestUppered < ActiveRecord::Base
2
- self.table_name = 'SST_UPPER_TESTS'
4
+ self.table_name = "SST_UPPER_TESTS"
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SSTestUuid < ActiveRecord::Base
2
- self.table_name = 'sst_uuids'
4
+ self.table_name = "sst_uuids"
3
5
  end
@@ -1,5 +1,6 @@
1
- ActiveRecord::Schema.define do
1
+ # frozen_string_literal: true
2
2
 
3
+ ActiveRecord::Schema.define do
3
4
  # Exhaustive Data Types
4
5
 
5
6
  execute File.read(ARTest::SQLServer.schema_datatypes_2012_file)
@@ -43,28 +44,28 @@ ActiveRecord::Schema.define do
43
44
 
44
45
  # Edge Cases
45
46
 
46
- if ENV['IN_MEMORY_OLTP'] && supports_in_memory_oltp?
47
- create_table 'sst_memory', force: true, id: false,
48
- options: 'WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)' do |t|
47
+ if ENV["IN_MEMORY_OLTP"] && supports_in_memory_oltp?
48
+ create_table "sst_memory", force: true, id: false,
49
+ options: "WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)" do |t|
49
50
  t.primary_key_nonclustered :id
50
51
  t.string :name
51
52
  t.timestamps
52
53
  end
53
54
  end
54
55
 
55
- create_table 'sst_bookings', force: true do |t|
56
+ create_table "sst_bookings", force: true do |t|
56
57
  t.string :name
57
58
  t.datetime2 :created_at, null: false
58
59
  t.datetime2 :updated_at, null: false
59
60
  end
60
61
 
61
- create_table 'sst_uuids', force: true, id: :uuid do |t|
62
+ create_table "sst_uuids", force: true, id: :uuid do |t|
62
63
  t.string :name
63
- t.uuid :other_uuid, default: 'NEWID()'
64
+ t.uuid :other_uuid, default: "NEWID()"
64
65
  t.uuid :uuid_nil_default, default: nil
65
66
  end
66
67
 
67
- create_table 'sst_my$strange_table', force: true do |t|
68
+ create_table "sst_my$strange_table", force: true do |t|
68
69
  t.string :name
69
70
  end
70
71
 
@@ -77,27 +78,34 @@ ActiveRecord::Schema.define do
77
78
  t.string :name
78
79
  end
79
80
 
80
- create_table 'sst_quoted-table', force: true do |t|
81
+ create_table "sst_quoted-table", force: true do |t|
81
82
  end
82
83
  execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_quoted-view1') DROP VIEW [sst_quoted-view1]"
83
84
  execute "CREATE VIEW [sst_quoted-view1] AS SELECT * FROM [sst_quoted-table]"
84
85
  execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'sst_quoted-view2') DROP VIEW [sst_quoted-view2]"
85
- execute "CREATE VIEW [sst_quoted-view2] AS \n /*#{'x'*4000}}*/ \n SELECT * FROM [sst_quoted-table]"
86
+ execute "CREATE VIEW [sst_quoted-view2] AS \n /*#{'x' * 4000}}*/ \n SELECT * FROM [sst_quoted-table]"
86
87
 
87
88
  create_table :sst_string_defaults, force: true do |t|
88
89
  t.column :string_with_null_default, :string, default: nil
89
- t.column :string_with_pretend_null_one, :string, default: 'null'
90
- t.column :string_with_pretend_null_two, :string, default: '(null)'
91
- t.column :string_with_pretend_null_three, :string, default: 'NULL'
92
- t.column :string_with_pretend_null_four, :string, default: '(NULL)'
93
- t.column :string_with_pretend_paren_three, :string, default: '(3)'
90
+ t.column :string_with_pretend_null_one, :string, default: "null"
91
+ t.column :string_with_pretend_null_two, :string, default: "(null)"
92
+ t.column :string_with_pretend_null_three, :string, default: "NULL"
93
+ t.column :string_with_pretend_null_four, :string, default: "(NULL)"
94
+ t.column :string_with_pretend_paren_three, :string, default: "(3)"
94
95
  t.column :string_with_multiline_default, :string, default: "Some long default with a\nnew line."
95
96
  end
96
97
 
98
+ create_table :sst_string_collation, collation: :SQL_Latin1_General_CP1_CI_AS, force: true do |t|
99
+ t.string :string_without_collation
100
+ t.varchar :string_default_collation, collation: :SQL_Latin1_General_CP1_CI_AS
101
+ t.varchar :string_with_collation, collation: :SQL_Latin1_General_CP1_CS_AS
102
+ t.varchar :varchar_with_collation, collation: :SQL_Latin1_General_CP1_CS_AS
103
+ end
104
+
97
105
  create_table :sst_edge_schemas, force: true do |t|
98
106
  t.string :description
99
- t.column 'crazy]]quote', :string
100
- t.column 'with spaces', :string
107
+ t.column "crazy]]quote", :string
108
+ t.column "with spaces", :string
101
109
  end
102
110
 
103
111
  execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_natural_pk_data') DROP TABLE sst_natural_pk_data"
@@ -130,7 +138,7 @@ ActiveRecord::Schema.define do
130
138
 
131
139
  execute "DROP DEFAULT [sst_getdateobject];" rescue nil
132
140
  execute "CREATE DEFAULT [sst_getdateobject] AS getdate();" rescue nil
133
- create_table 'sst_defaultobjects', force: true do |t|
141
+ create_table "sst_defaultobjects", force: true do |t|
134
142
  t.string :name
135
143
  t.date :date
136
144
  end
@@ -149,7 +157,7 @@ ActiveRecord::Schema.define do
149
157
  t.column(:fk_id2, :bigint)
150
158
  end
151
159
 
152
- create_table(:sst_has_pks, force: true) { }
160
+ create_table(:sst_has_pks, force: true) {}
153
161
  execute <<-ADDFKSQL
154
162
  ALTER TABLE sst_has_fks
155
163
  ADD CONSTRAINT FK__sst_has_fks_id
@@ -181,7 +189,7 @@ ActiveRecord::Schema.define do
181
189
  execute <<-STRINGDEFAULTSBIGVIEW
182
190
  CREATE VIEW sst_string_defaults_big_view AS
183
191
  SELECT id, string_with_pretend_null_one as pretend_null
184
- /*#{'x'*4000}}*/
192
+ /*#{'x' * 4000}}*/
185
193
  FROM sst_string_defaults
186
194
  STRINGDEFAULTSBIGVIEW
187
195
 
@@ -226,7 +234,7 @@ ActiveRecord::Schema.define do
226
234
  # Another schema.
227
235
 
228
236
  create_table :sst_schema_columns, force: true do |t|
229
- t.column :field1 , :integer
237
+ t.column :field1, :integer
230
238
  end
231
239
 
232
240
  execute "IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'test') EXEC sp_executesql N'CREATE SCHEMA test'"
@@ -277,4 +285,31 @@ ActiveRecord::Schema.define do
277
285
  )
278
286
  SCHEMATESTMULTIPLESCHEMA
279
287
 
288
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'unique_key_dumped_table') DROP TABLE unique_key_dumped_table"
289
+ execute <<-SQLSERVERUNIQUEKEYS
290
+ CREATE TABLE unique_key_dumped_table (
291
+ id int IDENTITY(1,1) NOT NULL,
292
+ unique_field int DEFAULT 0 NOT NULL,
293
+ CONSTRAINT IX_UNIQUE_KEY UNIQUE (unique_field),
294
+ CONSTRAINT PK_UNIQUE_KEY PRIMARY KEY (id)
295
+ );
296
+ SQLSERVERUNIQUEKEYS
297
+
298
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_composite_without_identity') DROP TABLE sst_composite_without_identity"
299
+ execute <<-COMPOSITE_WITHOUT_IDENTITY
300
+ CREATE TABLE sst_composite_without_identity (
301
+ pk_col_one int NOT NULL,
302
+ pk_col_two int NOT NULL,
303
+ CONSTRAINT PK_sst_composite_without_identity PRIMARY KEY (pk_col_one, pk_col_two)
304
+ );
305
+ COMPOSITE_WITHOUT_IDENTITY
306
+
307
+ execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_composite_with_identity') DROP TABLE sst_composite_with_identity"
308
+ execute <<-COMPOSITE_WITH_IDENTITY
309
+ CREATE TABLE sst_composite_with_identity (
310
+ pk_col_one int IDENTITY NOT NULL,
311
+ pk_col_two int NOT NULL,
312
+ CONSTRAINT PK_sst_composite_with_identity PRIMARY KEY (pk_col_one, pk_col_two)
313
+ );
314
+ COMPOSITE_WITH_IDENTITY
280
315
  end
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ARTest
2
4
  module SQLServer
3
5
  module CoerceableTest
4
-
5
6
  extend ActiveSupport::Concern
6
7
 
7
8
  included do
@@ -10,40 +11,45 @@ module ARTest
10
11
  end
11
12
 
12
13
  module ClassMethods
13
-
14
14
  def coerce_tests!(*methods)
15
15
  methods.each do |method|
16
- self.coerced_tests.push(method)
16
+ coerced_tests.push(method)
17
17
  coerced_test_warning(method)
18
18
  end
19
19
  end
20
20
 
21
21
  def coerce_all_tests!
22
- once = false
23
22
  instance_methods(false).each do |method|
24
23
  next unless method.to_s =~ /\Atest/
24
+
25
25
  undef_method(method)
26
- once = true
27
26
  end
28
- STDOUT.puts "🙉 🙈 🙊 Undefined all tests: #{self.name}"
27
+ STDOUT.puts "🙉 🙈 🙊 Undefined all tests: #{name}"
29
28
  end
30
29
 
31
30
  private
32
31
 
33
- def coerced_test_warning(method)
34
- method = instance_methods(false).select { |m| m =~ method } if method.is_a?(Regexp)
32
+ def coerced_test_warning(test_to_coerce)
33
+ if test_to_coerce.is_a?(Regexp)
34
+ method = instance_methods(false).select { |m| m =~ test_to_coerce }
35
+ else
36
+ method = test_to_coerce
37
+ end
38
+
35
39
  Array(method).each do |m|
36
- result = undef_method(m) if m && method_defined?(m)
40
+ result = if m && method_defined?(m)
41
+ alias_method("original_#{test_to_coerce.inspect.tr('/\:"', '')}", m)
42
+ undef_method(m)
43
+ end
44
+
37
45
  if result.blank?
38
- STDOUT.puts "🐳 Unfound coerced test: #{self.name}##{m}"
46
+ STDOUT.puts "🐳 Unfound coerced test: #{name}##{m}"
39
47
  else
40
- STDOUT.puts "🐵 Undefined coerced test: #{self.name}##{m}"
48
+ STDOUT.puts "🐵 Undefined coerced test: #{name}##{m}"
41
49
  end
42
50
  end
43
51
  end
44
-
45
52
  end
46
-
47
53
  end
48
54
  end
49
55
  end
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ARTest
2
4
  module SQLServer
3
5
  module ConnectionReflection
4
-
5
6
  extend ActiveSupport::Concern
6
7
 
7
8
  included { extend ConnectionReflection }
@@ -20,6 +21,7 @@ module ARTest
20
21
 
21
22
  def connection_dblib_73?
22
23
  return false unless connection_dblib?
24
+
23
25
  rc = connection.raw_connection
24
26
  rc.respond_to?(:tds_73?) && rc.tds_73?
25
27
  end
@@ -27,7 +29,6 @@ module ARTest
27
29
  def connection_sqlserver_azure?
28
30
  connection.sqlserver_azure?
29
31
  end
30
-
31
32
  end
32
33
  end
33
34
  end
@@ -1,10 +1,13 @@
1
- require 'active_record/connection_adapters/sqlserver_adapter'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/connection_adapters/sqlserver_adapter"
2
4
 
3
5
  module SqlIgnoredCache
4
6
  extend ActiveSupport::Concern
5
7
 
6
8
  IGNORED_SQL = [
7
9
  /INFORMATION_SCHEMA\.(TABLES|VIEWS|COLUMNS|KEY_COLUMN_USAGE)/im,
10
+ /sys.columns/i,
8
11
  /SELECT @@version/,
9
12
  /SELECT @@TRANCOUNT/,
10
13
  /(BEGIN|COMMIT|ROLLBACK|SAVE) TRANSACTION/,
@@ -1,18 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ARTest
2
4
  module SQLServer
3
-
4
5
  extend self
5
6
 
6
7
  def schema_root
7
- File.join ARTest::SQLServer.test_root_sqlserver, 'schema'
8
+ File.join ARTest::SQLServer.test_root_sqlserver, "schema"
8
9
  end
9
10
 
10
11
  def schema_file
11
- File.join schema_root, 'sqlserver_specific_schema.rb'
12
+ File.join schema_root, "sqlserver_specific_schema.rb"
12
13
  end
13
14
 
14
15
  def schema_datatypes_2012_file
15
- File.join schema_root, 'datatypes', '2012.sql'
16
+ File.join schema_root, "datatypes", "2012.sql"
16
17
  end
17
18
 
18
19
  def load_schema
@@ -22,7 +23,6 @@ module ARTest
22
23
  ensure
23
24
  $stdout = original_stdout
24
25
  end
25
-
26
26
  end
27
27
  end
28
28
 
@@ -1 +1,3 @@
1
- require 'minitest-spec-rails/init/active_support'
1
+ # frozen_string_literal: true
2
+
3
+ require "minitest-spec-rails/init/active_support"