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.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/.github/issue_template.md +23 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +29 -0
  6. data/.travis.yml +6 -8
  7. data/CHANGELOG.md +38 -24
  8. data/{Dockerfile → Dockerfile.ci} +1 -1
  9. data/Gemfile +48 -41
  10. data/Guardfile +9 -8
  11. data/README.md +9 -30
  12. data/RUNNING_UNIT_TESTS.md +3 -0
  13. data/Rakefile +14 -16
  14. data/VERSION +1 -1
  15. data/activerecord-sqlserver-adapter.gemspec +25 -14
  16. data/appveyor.yml +24 -17
  17. data/docker-compose.ci.yml +7 -5
  18. data/guides/RELEASING.md +11 -0
  19. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +2 -4
  20. data/lib/active_record/connection_adapters/sqlserver/core_ext/attribute_methods.rb +3 -4
  21. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +5 -4
  22. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +3 -3
  23. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain_subscriber.rb +2 -0
  24. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +8 -7
  25. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +36 -0
  26. data/lib/active_record/connection_adapters/sqlserver/core_ext/query_methods.rb +6 -4
  27. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +9 -0
  28. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +88 -44
  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 +46 -8
  32. data/lib/active_record/connection_adapters/sqlserver/schema_creation.rb +16 -5
  33. data/lib/active_record/connection_adapters/sqlserver/schema_dumper.rb +9 -7
  34. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +190 -164
  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 +2 -2
  39. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +43 -44
  40. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +7 -9
  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 +2 -2
  46. data/lib/active_record/connection_adapters/sqlserver/type/date.rb +4 -3
  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/float.rb +3 -3
  52. data/lib/active_record/connection_adapters/sqlserver/type/integer.rb +3 -3
  53. data/lib/active_record/connection_adapters/sqlserver/type/json.rb +2 -1
  54. data/lib/active_record/connection_adapters/sqlserver/type/money.rb +4 -4
  55. data/lib/active_record/connection_adapters/sqlserver/type/real.rb +3 -3
  56. data/lib/active_record/connection_adapters/sqlserver/type/small_integer.rb +3 -3
  57. data/lib/active_record/connection_adapters/sqlserver/type/small_money.rb +4 -4
  58. data/lib/active_record/connection_adapters/sqlserver/type/smalldatetime.rb +3 -3
  59. data/lib/active_record/connection_adapters/sqlserver/type/string.rb +2 -2
  60. data/lib/active_record/connection_adapters/sqlserver/type/text.rb +3 -3
  61. data/lib/active_record/connection_adapters/sqlserver/type/time.rb +6 -6
  62. data/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +8 -9
  63. data/lib/active_record/connection_adapters/sqlserver/type/timestamp.rb +3 -3
  64. data/lib/active_record/connection_adapters/sqlserver/type/tiny_integer.rb +3 -3
  65. data/lib/active_record/connection_adapters/sqlserver/type/unicode_char.rb +5 -4
  66. data/lib/active_record/connection_adapters/sqlserver/type/unicode_string.rb +2 -2
  67. data/lib/active_record/connection_adapters/sqlserver/type/unicode_text.rb +3 -3
  68. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar.rb +6 -5
  69. data/lib/active_record/connection_adapters/sqlserver/type/unicode_varchar_max.rb +4 -4
  70. data/lib/active_record/connection_adapters/sqlserver/type/uuid.rb +4 -3
  71. data/lib/active_record/connection_adapters/sqlserver/type/varbinary.rb +6 -5
  72. data/lib/active_record/connection_adapters/sqlserver/type/varbinary_max.rb +4 -4
  73. data/lib/active_record/connection_adapters/sqlserver/type/varchar.rb +6 -5
  74. data/lib/active_record/connection_adapters/sqlserver/type/varchar_max.rb +4 -4
  75. data/lib/active_record/connection_adapters/sqlserver/type.rb +37 -35
  76. data/lib/active_record/connection_adapters/sqlserver/utils.rb +10 -11
  77. data/lib/active_record/connection_adapters/sqlserver/version.rb +2 -2
  78. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +128 -92
  79. data/lib/active_record/connection_adapters/sqlserver_column.rb +9 -5
  80. data/lib/active_record/sqlserver_base.rb +9 -1
  81. data/lib/active_record/tasks/sqlserver_database_tasks.rb +28 -32
  82. data/lib/activerecord-sqlserver-adapter.rb +3 -1
  83. data/lib/arel/visitors/sqlserver.rb +58 -24
  84. data/lib/arel_sqlserver.rb +4 -2
  85. data/test/appveyor/dbsetup.ps1 +4 -4
  86. data/test/cases/adapter_test_sqlserver.rb +214 -171
  87. data/test/cases/change_column_null_test_sqlserver.rb +14 -12
  88. data/test/cases/coerced_tests.rb +631 -356
  89. data/test/cases/column_test_sqlserver.rb +283 -284
  90. data/test/cases/connection_test_sqlserver.rb +17 -20
  91. data/test/cases/execute_procedure_test_sqlserver.rb +20 -20
  92. data/test/cases/fetch_test_sqlserver.rb +16 -22
  93. data/test/cases/fully_qualified_identifier_test_sqlserver.rb +15 -19
  94. data/test/cases/helper_sqlserver.rb +15 -15
  95. data/test/cases/in_clause_test_sqlserver.rb +36 -0
  96. data/test/cases/index_test_sqlserver.rb +15 -15
  97. data/test/cases/json_test_sqlserver.rb +25 -25
  98. data/test/cases/migration_test_sqlserver.rb +25 -29
  99. data/test/cases/order_test_sqlserver.rb +53 -54
  100. data/test/cases/pessimistic_locking_test_sqlserver.rb +27 -33
  101. data/test/cases/rake_test_sqlserver.rb +33 -45
  102. data/test/cases/schema_dumper_test_sqlserver.rb +107 -109
  103. data/test/cases/schema_test_sqlserver.rb +20 -26
  104. data/test/cases/scratchpad_test_sqlserver.rb +4 -4
  105. data/test/cases/showplan_test_sqlserver.rb +28 -35
  106. data/test/cases/specific_schema_test_sqlserver.rb +68 -65
  107. data/test/cases/transaction_test_sqlserver.rb +18 -20
  108. data/test/cases/trigger_test_sqlserver.rb +14 -13
  109. data/test/cases/utils_test_sqlserver.rb +70 -70
  110. data/test/cases/uuid_test_sqlserver.rb +13 -14
  111. data/test/debug.rb +8 -6
  112. data/test/migrations/create_clients_and_change_column_null.rb +3 -1
  113. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +4 -4
  114. data/test/models/sqlserver/booking.rb +3 -1
  115. data/test/models/sqlserver/customers_view.rb +3 -1
  116. data/test/models/sqlserver/datatype.rb +2 -0
  117. data/test/models/sqlserver/datatype_migration.rb +2 -0
  118. data/test/models/sqlserver/dollar_table_name.rb +3 -1
  119. data/test/models/sqlserver/edge_schema.rb +3 -3
  120. data/test/models/sqlserver/fk_has_fk.rb +3 -1
  121. data/test/models/sqlserver/fk_has_pk.rb +3 -1
  122. data/test/models/sqlserver/natural_pk_data.rb +4 -2
  123. data/test/models/sqlserver/natural_pk_int_data.rb +3 -1
  124. data/test/models/sqlserver/no_pk_data.rb +3 -1
  125. data/test/models/sqlserver/object_default.rb +3 -1
  126. data/test/models/sqlserver/quoted_table.rb +4 -2
  127. data/test/models/sqlserver/quoted_view_1.rb +3 -1
  128. data/test/models/sqlserver/quoted_view_2.rb +3 -1
  129. data/test/models/sqlserver/sst_memory.rb +3 -1
  130. data/test/models/sqlserver/string_default.rb +3 -1
  131. data/test/models/sqlserver/string_defaults_big_view.rb +3 -1
  132. data/test/models/sqlserver/string_defaults_view.rb +3 -1
  133. data/test/models/sqlserver/tinyint_pk.rb +3 -1
  134. data/test/models/sqlserver/trigger.rb +4 -2
  135. data/test/models/sqlserver/trigger_history.rb +3 -1
  136. data/test/models/sqlserver/upper.rb +3 -1
  137. data/test/models/sqlserver/uppered.rb +3 -1
  138. data/test/models/sqlserver/uuid.rb +3 -1
  139. data/test/schema/sqlserver_specific_schema.rb +22 -22
  140. data/test/support/coerceable_test_sqlserver.rb +15 -9
  141. data/test/support/connection_reflection.rb +3 -2
  142. data/test/support/core_ext/query_cache.rb +4 -1
  143. data/test/support/load_schema_sqlserver.rb +5 -5
  144. data/test/support/minitest_sqlserver.rb +3 -1
  145. data/test/support/paths_sqlserver.rb +11 -11
  146. data/test/support/rake_helpers.rb +13 -10
  147. data/test/support/sql_counter_sqlserver.rb +3 -4
  148. data/test/support/test_in_memory_oltp.rb +9 -7
  149. metadata +17 -7
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
@@ -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
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
@@ -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
@@ -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,27 @@ 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
 
97
98
  create_table :sst_edge_schemas, force: true do |t|
98
99
  t.string :description
99
- t.column 'crazy]]quote', :string
100
- t.column 'with spaces', :string
100
+ t.column "crazy]]quote", :string
101
+ t.column "with spaces", :string
101
102
  end
102
103
 
103
104
  execute "IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sst_natural_pk_data') DROP TABLE sst_natural_pk_data"
@@ -130,7 +131,7 @@ ActiveRecord::Schema.define do
130
131
 
131
132
  execute "DROP DEFAULT [sst_getdateobject];" rescue nil
132
133
  execute "CREATE DEFAULT [sst_getdateobject] AS getdate();" rescue nil
133
- create_table 'sst_defaultobjects', force: true do |t|
134
+ create_table "sst_defaultobjects", force: true do |t|
134
135
  t.string :name
135
136
  t.date :date
136
137
  end
@@ -149,7 +150,7 @@ ActiveRecord::Schema.define do
149
150
  t.column(:fk_id2, :bigint)
150
151
  end
151
152
 
152
- create_table(:sst_has_pks, force: true) { }
153
+ create_table(:sst_has_pks, force: true) {}
153
154
  execute <<-ADDFKSQL
154
155
  ALTER TABLE sst_has_fks
155
156
  ADD CONSTRAINT FK__sst_has_fks_id
@@ -181,7 +182,7 @@ ActiveRecord::Schema.define do
181
182
  execute <<-STRINGDEFAULTSBIGVIEW
182
183
  CREATE VIEW sst_string_defaults_big_view AS
183
184
  SELECT id, string_with_pretend_null_one as pretend_null
184
- /*#{'x'*4000}}*/
185
+ /*#{'x' * 4000}}*/
185
186
  FROM sst_string_defaults
186
187
  STRINGDEFAULTSBIGVIEW
187
188
 
@@ -226,7 +227,7 @@ ActiveRecord::Schema.define do
226
227
  # Another schema.
227
228
 
228
229
  create_table :sst_schema_columns, force: true do |t|
229
- t.column :field1 , :integer
230
+ t.column :field1, :integer
230
231
  end
231
232
 
232
233
  execute "IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'test') EXEC sp_executesql N'CREATE SCHEMA test'"
@@ -276,5 +277,4 @@ ActiveRecord::Schema.define do
276
277
  field_2 int NOT NULL PRIMARY KEY,
277
278
  )
278
279
  SCHEMATESTMULTIPLESCHEMA
279
-
280
280
  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,7 +11,6 @@ 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
16
  self.coerced_tests.push(method)
@@ -19,21 +19,29 @@ module ARTest
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
27
  STDOUT.puts "🙉 🙈 🙊 Undefined all tests: #{self.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
46
  STDOUT.puts "🐳 Unfound coerced test: #{self.name}##{m}"
39
47
  else
@@ -41,9 +49,7 @@ module ARTest
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"
@@ -1,30 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ARTest
2
4
  module SQLServer
3
-
4
5
  extend self
5
6
 
6
7
  def root_sqlserver
7
- File.expand_path File.join(File.dirname(__FILE__), '..', '..')
8
+ File.expand_path File.join(File.dirname(__FILE__), "..", "..")
8
9
  end
9
10
 
10
11
  def test_root_sqlserver
11
- File.join root_sqlserver, 'test'
12
+ File.join root_sqlserver, "test"
12
13
  end
13
14
 
14
15
  def root_activerecord
15
- File.join Gem.loaded_specs['rails'].full_gem_path, 'activerecord'
16
+ File.join Gem.loaded_specs["rails"].full_gem_path, "activerecord"
16
17
  end
17
18
 
18
19
  def root_activerecord_lib
19
- File.join root_activerecord, 'lib'
20
+ File.join root_activerecord, "lib"
20
21
  end
21
22
 
22
23
  def root_activerecord_test
23
- File.join root_activerecord, 'test'
24
+ File.join root_activerecord, "test"
24
25
  end
25
26
 
26
27
  def test_load_paths
27
- ['lib', 'test', root_activerecord_lib, root_activerecord_test]
28
+ ["lib", "test", root_activerecord_lib, root_activerecord_test]
28
29
  end
29
30
 
30
31
  def add_to_load_paths!
@@ -32,17 +33,16 @@ module ARTest
32
33
  end
33
34
 
34
35
  def migrations_root
35
- File.join test_root_sqlserver, 'migrations'
36
+ File.join test_root_sqlserver, "migrations"
36
37
  end
37
38
 
38
39
  def arconfig_file
39
- File.join test_root_sqlserver, 'config.yml'
40
+ File.join test_root_sqlserver, "config.yml"
40
41
  end
41
42
 
42
43
  def arconfig_file_env!
43
- ENV['ARCONFIG'] = arconfig_file
44
+ ENV["ARCONFIG"] = arconfig_file
44
45
  end
45
-
46
46
  end
47
47
  end
48
48
 
@@ -1,28 +1,31 @@
1
+ # frozen_string_literal: true
1
2
 
2
- SQLSERVER_HELPER = 'test/cases/helper_sqlserver.rb'
3
- SQLSERVER_COERCED = 'test/cases/coerced_tests.rb'
3
+ SQLSERVER_HELPER = "test/cases/helper_sqlserver.rb"
4
+ SQLSERVER_COERCED = "test/cases/coerced_tests.rb"
4
5
 
5
6
  def env_ar_test_files
6
- return unless ENV['TEST_FILES_AR'] && !ENV['TEST_FILES_AR'].empty?
7
+ return unless ENV["TEST_FILES_AR"] && !ENV["TEST_FILES_AR"].empty?
8
+
7
9
  @env_ar_test_files ||= begin
8
- ENV['TEST_FILES_AR'].split(',').map { |file|
10
+ ENV["TEST_FILES_AR"].split(",").map { |file|
9
11
  File.join ARTest::SQLServer.root_activerecord, file.strip
10
12
  }.sort
11
13
  end
12
14
  end
13
15
 
14
16
  def env_test_files
15
- return unless ENV['TEST_FILES'] && !ENV['TEST_FILES'].empty?
16
- @env_test_files ||= ENV['TEST_FILES'].split(',').map(&:strip)
17
+ return unless ENV["TEST_FILES"] && !ENV["TEST_FILES"].empty?
18
+
19
+ @env_test_files ||= ENV["TEST_FILES"].split(",").map(&:strip)
17
20
  end
18
21
 
19
22
  def sqlserver_cases
20
- @sqlserver_cases ||= Dir.glob('test/cases/*_test_sqlserver.rb')
23
+ @sqlserver_cases ||= Dir.glob("test/cases/*_test_sqlserver.rb")
21
24
  end
22
25
 
23
26
  def ar_cases
24
27
  @ar_cases ||= begin
25
- Dir.glob("#{ARTest::SQLServer.root_activerecord}/test/cases/**/*_test.rb").reject{ |x| x =~ /\/adapters\// }.sort
28
+ Dir.glob("#{ARTest::SQLServer.root_activerecord}/test/cases/**/*_test.rb").reject { |x| x =~ /\/adapters\// }.sort
26
29
  end
27
30
  end
28
31
 
@@ -31,9 +34,9 @@ def test_files
31
34
  [SQLSERVER_HELPER] + env_ar_test_files
32
35
  elsif env_test_files
33
36
  env_test_files
34
- elsif ENV['ONLY_SQLSERVER']
37
+ elsif ENV["ONLY_SQLSERVER"]
35
38
  sqlserver_cases
36
- elsif ENV['ONLY_ACTIVERECORD']
39
+ elsif ENV["ONLY_ACTIVERECORD"]
37
40
  [SQLSERVER_HELPER] + (ar_cases + [SQLSERVER_COERCED])
38
41
  else
39
42
  [SQLSERVER_HELPER] + (ar_cases + [SQLSERVER_COERCED] + sqlserver_cases)