activerecord-sqlserver-adapter 8.0.5 → 8.0.7
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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +1 -1
- data/CHANGELOG.md +14 -0
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +9 -7
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +1 -1
- data/test/cases/insert_all_test_sqlserver.rb +45 -0
- data/test/cases/schema_test_sqlserver.rb +4 -0
- data/test/cases/view_test_sqlserver.rb +9 -3
- data/test/fixtures/sst_customers_view.yml +6 -0
- data/test/models/sqlserver/recurring_task.rb +3 -0
- data/test/schema/sqlserver_specific_schema.rb +8 -0
- metadata +11 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55b3eb63b017029ece8397fb34c2eaf883b62e0ac96966e3655b384abd67f2f8
|
4
|
+
data.tar.gz: 235155e68ee4bc3843406f7ed776889c252abd2c95c684dbab5ed4d964fb1648
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2cc2806e29ffe9b3fc35f4ec0689f62b8c37927fb2733ca3b84ac0caaa3c7e7508bf7171d7d44b9e40c3634187b1850f5cc3471d6b332c69f4b39b550547181
|
7
|
+
data.tar.gz: 2bbcf53461556e7cb28462a37cf903d064cf9528129fb025a4c072dd95dca0dcbcbccf6b5f9bfc538bd032abf97fee942019060d4b738646f2c90bbffc9b17dd
|
data/.github/workflows/ci.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## v8.0.7
|
2
|
+
|
3
|
+
#### Fixed
|
4
|
+
|
5
|
+
- [#1334](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1334) Enable identity insert on view's base table for fixtures.
|
6
|
+
- [#1339](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1339) Fix `insert_all`/`upsert_all` for table names containing numbers.
|
7
|
+
|
8
|
+
## v8.0.6
|
9
|
+
|
10
|
+
#### Fixed
|
11
|
+
|
12
|
+
- [#1318](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1318) Reverse order of values when upserting
|
13
|
+
- [#1321](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/pull/1321) Fix SQL statement to calculate `updated_at` when upserting
|
14
|
+
|
1
15
|
## v8.0.5
|
2
16
|
|
3
17
|
#### Added
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
8.0.
|
1
|
+
8.0.7
|
@@ -15,9 +15,6 @@ module ActiveRecord
|
|
15
15
|
|
16
16
|
def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notification_payload:, batch:)
|
17
17
|
result = if id_insert_table_name = query_requires_identity_insert?(sql)
|
18
|
-
# If the table name is a view, we need to get the base table name for enabling identity insert.
|
19
|
-
id_insert_table_name = view_table_name(id_insert_table_name) if view_exists?(id_insert_table_name)
|
20
|
-
|
21
18
|
with_identity_insert_enabled(id_insert_table_name, raw_connection) do
|
22
19
|
internal_exec_sql_query(sql, raw_connection)
|
23
20
|
end
|
@@ -159,6 +156,8 @@ module ActiveRecord
|
|
159
156
|
|
160
157
|
|
161
158
|
def build_sql_for_merge_insert(insert:, insert_all:, columns_with_uniqueness_constraints:) # :nodoc:
|
159
|
+
insert_all.inserts.reverse! if insert.update_duplicates?
|
160
|
+
|
162
161
|
sql = <<~SQL
|
163
162
|
MERGE INTO #{insert.model.quoted_table_name} WITH (UPDLOCK, HOLDLOCK) AS target
|
164
163
|
USING (
|
@@ -223,11 +222,14 @@ module ActiveRecord
|
|
223
222
|
end
|
224
223
|
|
225
224
|
def with_identity_insert_enabled(table_name, conn)
|
226
|
-
|
227
|
-
|
225
|
+
# If the table name is a view, we need to get the base table name for enabling identity insert.
|
226
|
+
table_name = view_table_name(table_name) if view_exists?(table_name)
|
227
|
+
quoted_table_name = quote_table_name(table_name)
|
228
|
+
|
229
|
+
set_identity_insert(quoted_table_name, conn, true)
|
228
230
|
yield
|
229
231
|
ensure
|
230
|
-
set_identity_insert(
|
232
|
+
set_identity_insert(quoted_table_name, conn, false)
|
231
233
|
end
|
232
234
|
|
233
235
|
def use_database(database = nil)
|
@@ -583,7 +585,7 @@ module ActiveRecord
|
|
583
585
|
def build_sql_for_recording_timestamps_when_updating(insert:)
|
584
586
|
insert.model.timestamp_attributes_for_update_in_model.filter_map do |column_name|
|
585
587
|
if insert.send(:touch_timestamp_attribute?, column_name)
|
586
|
-
"target.#{quote_column_name(column_name)}=CASE WHEN (#{insert.updatable_columns.map { |column| "(
|
588
|
+
"target.#{quote_column_name(column_name)}=CASE WHEN (#{insert.updatable_columns.map { |column| "(source.#{quote_column_name(column)} = target.#{quote_column_name(column)} OR (source.#{quote_column_name(column)} IS NULL AND target.#{quote_column_name(column)} IS NULL))" }.join(" AND ")}) THEN target.#{quote_column_name(column_name)} ELSE #{high_precision_current_timestamp} END,"
|
587
589
|
end
|
588
590
|
end.join
|
589
591
|
end
|
@@ -721,7 +721,7 @@ module ActiveRecord
|
|
721
721
|
elsif s.match?(/^\s*UPDATE\s+.*/i)
|
722
722
|
s.match(/UPDATE\s+([^\(\s]+)\s*/i)[1]
|
723
723
|
elsif s.match?(/^\s*MERGE INTO.*/i)
|
724
|
-
s.match(/^\s*MERGE\s+INTO\s+(\[?[a-
|
724
|
+
s.match(/^\s*MERGE\s+INTO\s+(\[?[a-z0-9_ -]+\]?\.?\[?[a-z0-9_ -]+\]?)\s+(AS|WITH|USING)/i)[1]
|
725
725
|
else
|
726
726
|
s.match(/FROM[\s|\(]+((\[[^\(\]]+\])|[^\(\s]+)\s*/i)[1]
|
727
727
|
end.strip
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "cases/helper_sqlserver"
|
4
|
+
require "models/book"
|
5
|
+
require "models/sqlserver/recurring_task"
|
6
|
+
|
7
|
+
class InsertAllTestSQLServer < ActiveRecord::TestCase
|
8
|
+
# Test ported from the Rails `main` branch that is not on the `8-0-stable` branch.
|
9
|
+
def test_insert_all_only_applies_last_value_when_given_duplicate_identifiers
|
10
|
+
skip unless supports_insert_on_duplicate_skip?
|
11
|
+
|
12
|
+
Book.insert_all [
|
13
|
+
{ id: 111, name: "expected_new_name" },
|
14
|
+
{ id: 111, name: "unexpected_new_name" }
|
15
|
+
]
|
16
|
+
assert_equal "expected_new_name", Book.find(111).name
|
17
|
+
end
|
18
|
+
|
19
|
+
# Test ported from the Rails `main` branch that is not on the `8-0-stable` branch.
|
20
|
+
def test_upsert_all_only_applies_last_value_when_given_duplicate_identifiers
|
21
|
+
skip unless supports_insert_on_duplicate_update? && !current_adapter?(:PostgreSQLAdapter)
|
22
|
+
|
23
|
+
Book.create!(id: 112, name: "original_name")
|
24
|
+
|
25
|
+
Book.upsert_all [
|
26
|
+
{ id: 112, name: "unexpected_new_name" },
|
27
|
+
{ id: 112, name: "expected_new_name" }
|
28
|
+
]
|
29
|
+
assert_equal "expected_new_name", Book.find(112).name
|
30
|
+
end
|
31
|
+
|
32
|
+
test "upsert_all recording of timestamps works with mixed datatypes" do
|
33
|
+
task = RecurringTask.create!(
|
34
|
+
key: "abcdef",
|
35
|
+
priority: 5
|
36
|
+
)
|
37
|
+
|
38
|
+
RecurringTask.upsert_all([{
|
39
|
+
id: task.id,
|
40
|
+
priority: nil
|
41
|
+
}])
|
42
|
+
|
43
|
+
assert_not_equal task.updated_at, RecurringTask.find(task.id).updated_at
|
44
|
+
end
|
45
|
+
end
|
@@ -118,6 +118,10 @@ class SchemaTestSQLServer < ActiveRecord::TestCase
|
|
118
118
|
it do
|
119
119
|
assert_equal "[with].[select notation]", connection.send(:get_raw_table_name, "MERGE INTO [with].[select notation] AS target")
|
120
120
|
end
|
121
|
+
|
122
|
+
it do
|
123
|
+
assert_equal "[with_numbers_1234]", connection.send(:get_raw_table_name, "MERGE INTO [with_numbers_1234] AS target")
|
124
|
+
end
|
121
125
|
end
|
122
126
|
|
123
127
|
describe 'CREATE VIEW statements' do
|
@@ -48,11 +48,17 @@ class ViewTestSQLServer < ActiveRecord::TestCase
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
describe
|
52
|
-
it "
|
53
|
-
assert_difference("SSTestCustomersView.count",
|
51
|
+
describe "identity insert" do
|
52
|
+
it "creates table record through a view" do
|
53
|
+
assert_difference("SSTestCustomersView.count", 2) do
|
54
54
|
SSTestCustomersView.create!(id: 5, name: "Bob")
|
55
|
+
SSTestCustomersView.create!(id: 6, name: "Tim")
|
55
56
|
end
|
56
57
|
end
|
58
|
+
|
59
|
+
it "creates table records through a view using fixtures" do
|
60
|
+
ActiveRecord::FixtureSet.create_fixtures(File.join(ARTest::SQLServer.test_root_sqlserver, "fixtures"), ["sst_customers_view"])
|
61
|
+
assert_equal SSTestCustomersView.all.count, 2
|
62
|
+
end
|
57
63
|
end
|
58
64
|
end
|
@@ -360,4 +360,12 @@ ActiveRecord::Schema.define do
|
|
360
360
|
name varchar(255)
|
361
361
|
)
|
362
362
|
TABLE_IN_OTHER_SCHEMA_USED_BY_MODEL
|
363
|
+
|
364
|
+
create_table "recurring_tasks", force: true do |t|
|
365
|
+
t.string :key
|
366
|
+
t.integer :priority, default: 0
|
367
|
+
|
368
|
+
t.datetime2 :created_at
|
369
|
+
t.datetime2 :updated_at
|
370
|
+
end
|
363
371
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-sqlserver-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.0.
|
4
|
+
version: 8.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ken Collins
|
@@ -12,10 +12,9 @@ authors:
|
|
12
12
|
- Joe Rafaniello
|
13
13
|
- Tom Ward
|
14
14
|
- Aidan Haran
|
15
|
-
autorequire:
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
|
-
date:
|
17
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
19
18
|
dependencies:
|
20
19
|
- !ruby/object:Gem::Dependency
|
21
20
|
name: activerecord
|
@@ -164,6 +163,7 @@ files:
|
|
164
163
|
- test/cases/helper_sqlserver.rb
|
165
164
|
- test/cases/in_clause_test_sqlserver.rb
|
166
165
|
- test/cases/index_test_sqlserver.rb
|
166
|
+
- test/cases/insert_all_test_sqlserver.rb
|
167
167
|
- test/cases/json_test_sqlserver.rb
|
168
168
|
- test/cases/lateral_test_sqlserver.rb
|
169
169
|
- test/cases/migration_test_sqlserver.rb
|
@@ -185,6 +185,7 @@ files:
|
|
185
185
|
- test/config.yml
|
186
186
|
- test/debug.rb
|
187
187
|
- test/fixtures/1px.gif
|
188
|
+
- test/fixtures/sst_customers_view.yml
|
188
189
|
- test/migrations/create_clients_and_change_column_collation.rb
|
189
190
|
- test/migrations/create_clients_and_change_column_null.rb
|
190
191
|
- test/migrations/transaction_table/1_table_will_never_be_created.rb
|
@@ -205,6 +206,7 @@ files:
|
|
205
206
|
- test/models/sqlserver/quoted_table.rb
|
206
207
|
- test/models/sqlserver/quoted_view_1.rb
|
207
208
|
- test/models/sqlserver/quoted_view_2.rb
|
209
|
+
- test/models/sqlserver/recurring_task.rb
|
208
210
|
- test/models/sqlserver/sst_memory.rb
|
209
211
|
- test/models/sqlserver/sst_string_collation.rb
|
210
212
|
- test/models/sqlserver/string_default.rb
|
@@ -239,9 +241,8 @@ licenses:
|
|
239
241
|
- MIT
|
240
242
|
metadata:
|
241
243
|
bug_tracker_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/issues
|
242
|
-
changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v8.0.
|
243
|
-
source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v8.0.
|
244
|
-
post_install_message:
|
244
|
+
changelog_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/blob/v8.0.7/CHANGELOG.md
|
245
|
+
source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v8.0.7
|
245
246
|
rdoc_options: []
|
246
247
|
require_paths:
|
247
248
|
- lib
|
@@ -256,8 +257,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
256
257
|
- !ruby/object:Gem::Version
|
257
258
|
version: '0'
|
258
259
|
requirements: []
|
259
|
-
rubygems_version: 3.
|
260
|
-
signing_key:
|
260
|
+
rubygems_version: 3.6.7
|
261
261
|
specification_version: 4
|
262
262
|
summary: ActiveRecord SQL Server Adapter.
|
263
263
|
test_files:
|
@@ -283,6 +283,7 @@ test_files:
|
|
283
283
|
- test/cases/helper_sqlserver.rb
|
284
284
|
- test/cases/in_clause_test_sqlserver.rb
|
285
285
|
- test/cases/index_test_sqlserver.rb
|
286
|
+
- test/cases/insert_all_test_sqlserver.rb
|
286
287
|
- test/cases/json_test_sqlserver.rb
|
287
288
|
- test/cases/lateral_test_sqlserver.rb
|
288
289
|
- test/cases/migration_test_sqlserver.rb
|
@@ -304,6 +305,7 @@ test_files:
|
|
304
305
|
- test/config.yml
|
305
306
|
- test/debug.rb
|
306
307
|
- test/fixtures/1px.gif
|
308
|
+
- test/fixtures/sst_customers_view.yml
|
307
309
|
- test/migrations/create_clients_and_change_column_collation.rb
|
308
310
|
- test/migrations/create_clients_and_change_column_null.rb
|
309
311
|
- test/migrations/transaction_table/1_table_will_never_be_created.rb
|
@@ -324,6 +326,7 @@ test_files:
|
|
324
326
|
- test/models/sqlserver/quoted_table.rb
|
325
327
|
- test/models/sqlserver/quoted_view_1.rb
|
326
328
|
- test/models/sqlserver/quoted_view_2.rb
|
329
|
+
- test/models/sqlserver/recurring_task.rb
|
327
330
|
- test/models/sqlserver/sst_memory.rb
|
328
331
|
- test/models/sqlserver/sst_string_collation.rb
|
329
332
|
- test/models/sqlserver/string_default.rb
|