activerecord-sqlserver-adapter 7.0.5.0 → 7.1.0.beta1

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +3 -3
  3. data/.gitignore +3 -1
  4. data/CHANGELOG.md +2 -76
  5. data/Gemfile +3 -0
  6. data/README.md +16 -11
  7. data/Rakefile +2 -6
  8. data/VERSION +1 -1
  9. data/activerecord-sqlserver-adapter.gemspec +1 -1
  10. data/lib/active_record/connection_adapters/sqlserver/core_ext/abstract_adapter.rb +20 -0
  11. data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +29 -6
  12. data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +4 -4
  13. data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +10 -2
  14. data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +15 -3
  15. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +0 -31
  16. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +87 -131
  17. data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +5 -5
  18. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +3 -2
  19. data/lib/active_record/connection_adapters/sqlserver/savepoints.rb +24 -0
  20. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +68 -29
  21. data/lib/active_record/connection_adapters/sqlserver/showplan.rb +3 -3
  22. data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +6 -0
  23. data/lib/active_record/connection_adapters/sqlserver/transaction.rb +4 -6
  24. data/lib/active_record/connection_adapters/sqlserver/type/data.rb +10 -0
  25. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +81 -114
  26. data/lib/active_record/connection_adapters/sqlserver_column.rb +1 -0
  27. data/lib/active_record/sqlserver_base.rb +1 -10
  28. data/lib/active_record/tasks/sqlserver_database_tasks.rb +5 -2
  29. data/lib/arel/visitors/sqlserver.rb +0 -33
  30. data/test/cases/adapter_test_sqlserver.rb +8 -7
  31. data/test/cases/coerced_tests.rb +573 -208
  32. data/test/cases/column_test_sqlserver.rb +6 -6
  33. data/test/cases/connection_test_sqlserver.rb +3 -6
  34. data/test/cases/disconnected_test_sqlserver.rb +5 -8
  35. data/test/cases/execute_procedure_test_sqlserver.rb +1 -1
  36. data/test/cases/rake_test_sqlserver.rb +1 -1
  37. data/test/cases/schema_dumper_test_sqlserver.rb +2 -2
  38. data/test/config.yml +1 -2
  39. data/test/support/connection_reflection.rb +2 -8
  40. data/test/support/core_ext/query_cache.rb +7 -1
  41. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
  42. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic.dump +0 -0
  43. data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic_associations.dump +0 -0
  44. metadata +13 -7
@@ -10,8 +10,7 @@ module ActiveRecord
10
10
  class SQLServerDatabaseTasks
11
11
  DEFAULT_COLLATION = "SQL_Latin1_General_CP1_CI_AS"
12
12
 
13
- delegate :connection, :establish_connection, :clear_active_connections!,
14
- to: ActiveRecord::Base
13
+ delegate :connection, :establish_connection, to: ActiveRecord::Base
15
14
 
16
15
  def self.using_database_configurations?
17
16
  true
@@ -53,6 +52,10 @@ module ActiveRecord
53
52
  create true
54
53
  end
55
54
 
55
+ def clear_active_connections!
56
+ ActiveRecord::Base.connection_handler.clear_active_connections!
57
+ end
58
+
56
59
  def structure_dump(filename, extra_flags)
57
60
  server_arg = "-S #{Shellwords.escape(configuration_hash[:host])}"
58
61
  server_arg += ":#{Shellwords.escape(configuration_hash[:port])}" if configuration_hash[:port]
@@ -64,39 +64,6 @@ module Arel
64
64
  super
65
65
  end
66
66
 
67
- def visit_Arel_Nodes_HomogeneousIn(o, collector)
68
- collector.preparable = false
69
-
70
- collector << quote_table_name(o.table_name) << "." << quote_column_name(o.column_name)
71
-
72
- if o.type == :in
73
- collector << " IN ("
74
- else
75
- collector << " NOT IN ("
76
- end
77
-
78
- values = o.casted_values
79
-
80
- if values.empty?
81
- collector << @connection.quote(nil)
82
- elsif @connection.prepared_statements
83
- # Monkey-patch start. Add query attribute bindings rather than just values.
84
- column_name = o.column_name
85
- column_type = o.attribute.relation.type_for_attribute(o.column_name)
86
- # Use cast_type on encrypted attributes. Don't encrypt them again
87
- column_type = column_type.cast_type if column_type.is_a?(ActiveRecord::Encryption::EncryptedAttributeType)
88
- attrs = values.map { |value| ActiveRecord::Relation::QueryAttribute.new(column_name, value, column_type) }
89
-
90
- collector.add_binds(attrs, &bind_block)
91
- # Monkey-patch end.
92
- else
93
- collector.add_binds(values, &bind_block)
94
- end
95
-
96
- collector << ")"
97
- collector
98
- end
99
-
100
67
  def visit_Arel_Nodes_SelectStatement(o, collector)
101
68
  @select_statement = o
102
69
  distinct_One_As_One_Is_So_Not_Fetch o
@@ -19,7 +19,6 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
19
19
  string = connection.inspect
20
20
  _(string).must_match %r{ActiveRecord::ConnectionAdapters::SQLServerAdapter}
21
21
  _(string).must_match %r{version\: \d.\d}
22
- _(string).must_match %r{mode: dblib}
23
22
  _(string).must_match %r{azure: (true|false)}
24
23
  _(string).wont_match %r{host}
25
24
  _(string).wont_match %r{password}
@@ -102,16 +101,18 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
102
101
  it "test bad connection" do
103
102
  assert_raise ActiveRecord::NoDatabaseError do
104
103
  db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
105
- configuration = db_config.configuration_hash.merge(database: "inexistent_activerecord_unittest")
106
- ActiveRecord::Base.sqlserver_connection configuration
104
+ configuration = db_config.configuration_hash.merge(database: "nonexistent_activerecord_unittest")
105
+
106
+ connection = ActiveRecord::Base.sqlserver_connection configuration
107
+ connection.exec_query("SELECT 1")
107
108
  end
108
109
  end
109
110
 
110
111
  it "test database exists returns false if database does not exist" do
111
112
  db_config = ActiveRecord::Base.configurations.configs_for(env_name: "arunit", name: "primary")
112
- configuration = db_config.configuration_hash.merge(database: "inexistent_activerecord_unittest")
113
+ configuration = db_config.configuration_hash.merge(database: "nonexistent_activerecord_unittest")
113
114
  assert_not ActiveRecord::ConnectionAdapters::SQLServerAdapter.database_exists?(configuration),
114
- "expected database to not exist"
115
+ "expected database #{configuration[:database]} to not exist"
115
116
  end
116
117
 
117
118
  it "test database exists returns true when the database exists" do
@@ -306,7 +307,7 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
306
307
  end
307
308
 
308
309
  describe "database statements" do
309
- it "run the database consistency checker useroptions command" do
310
+ it "run the database consistency checker 'user_options' command" do
310
311
  skip "on azure" if connection_sqlserver_azure?
311
312
  keys = [:textsize, :language, :isolation_level, :dateformat]
312
313
  user_options = connection.user_options
@@ -345,7 +346,7 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
345
346
  assert_equal "tinyint", connection.type_to_sql(:integer, limit: 1)
346
347
  end
347
348
 
348
- it "create bigints when limit is greateer than 4" do
349
+ it "create bigints when limit is greater than 4" do
349
350
  assert_equal "bigint", connection.type_to_sql(:integer, limit: 5)
350
351
  assert_equal "bigint", connection.type_to_sql(:integer, limit: 6)
351
352
  assert_equal "bigint", connection.type_to_sql(:integer, limit: 7)