activerecord-sqlserver-adapter 5.2.1 → 7.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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"