activerecord-sqlserver-adapter 7.0.5.1 → 7.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +3 -3
- data/.gitignore +3 -1
- data/CHANGELOG.md +38 -83
- data/Gemfile +3 -0
- data/README.md +16 -11
- data/RUNNING_UNIT_TESTS.md +24 -10
- data/Rakefile +2 -6
- data/VERSION +1 -1
- data/activerecord-sqlserver-adapter.gemspec +1 -1
- data/lib/active_record/connection_adapters/sqlserver/core_ext/abstract_adapter.rb +20 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/calculations.rb +29 -6
- data/lib/active_record/connection_adapters/sqlserver/core_ext/explain.rb +4 -4
- data/lib/active_record/connection_adapters/sqlserver/core_ext/finder_methods.rb +10 -2
- data/lib/active_record/connection_adapters/sqlserver/core_ext/preloader.rb +15 -3
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +0 -31
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +86 -133
- data/lib/active_record/connection_adapters/sqlserver/database_tasks.rb +5 -5
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +3 -2
- data/lib/active_record/connection_adapters/sqlserver/savepoints.rb +24 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +68 -29
- data/lib/active_record/connection_adapters/sqlserver/showplan.rb +3 -3
- data/lib/active_record/connection_adapters/sqlserver/table_definition.rb +6 -0
- data/lib/active_record/connection_adapters/sqlserver/transaction.rb +4 -6
- data/lib/active_record/connection_adapters/sqlserver/type/data.rb +10 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +81 -114
- data/lib/active_record/connection_adapters/sqlserver_column.rb +1 -0
- data/lib/active_record/sqlserver_base.rb +1 -10
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +5 -2
- data/lib/arel/visitors/sqlserver.rb +0 -33
- data/test/cases/adapter_test_sqlserver.rb +8 -7
- data/test/cases/coerced_tests.rb +526 -235
- data/test/cases/column_test_sqlserver.rb +6 -6
- data/test/cases/connection_test_sqlserver.rb +3 -6
- data/test/cases/disconnected_test_sqlserver.rb +5 -8
- data/test/cases/execute_procedure_test_sqlserver.rb +1 -1
- data/test/cases/rake_test_sqlserver.rb +1 -1
- data/test/cases/schema_dumper_test_sqlserver.rb +2 -2
- data/test/cases/transaction_test_sqlserver.rb +13 -8
- data/test/config.yml +1 -2
- data/test/support/connection_reflection.rb +2 -8
- data/test/support/core_ext/query_cache.rb +7 -1
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_6_1_topic_associations.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic.dump +0 -0
- data/test/support/marshal_compatibility_fixtures/SQLServer/rails_7_1_topic_associations.dump +0 -0
- data/test/support/sql_counter_sqlserver.rb +0 -15
- metadata +14 -8
@@ -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, :
|
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: "
|
106
|
-
|
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: "
|
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
|
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
|
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)
|