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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 488cfb3fda58b07e4bacc2db733d766492f84d4d0af50ecd6e5548f066ac34b3
4
- data.tar.gz: b64864d043dd035dde5413736d9fc9adb5d2bf1e364b25ef57ca2ea69bc386cf
3
+ metadata.gz: 55b3eb63b017029ece8397fb34c2eaf883b62e0ac96966e3655b384abd67f2f8
4
+ data.tar.gz: 235155e68ee4bc3843406f7ed776889c252abd2c95c684dbab5ed4d964fb1648
5
5
  SHA512:
6
- metadata.gz: fe2eb7bbc39edbc855bba7403792e532a43cae178d1cd8943189142f61c4203b346cb0191366626422ec287fde5d77d174240bcdef37152d177acda8d1e5dad4
7
- data.tar.gz: 88ae10b6aa5b67f2bbc6a760a2f5af7679422fea1d10086aa3bb6592aaeadc202a2657c48906e4bb8b237acd7ca87e57588de6f02590a20a32278c855777b5c8
6
+ metadata.gz: d2cc2806e29ffe9b3fc35f4ec0689f62b8c37927fb2733ca3b84ac0caaa3c7e7508bf7171d7d44b9e40c3634187b1850f5cc3471d6b332c69f4b39b550547181
7
+ data.tar.gz: 2bbcf53461556e7cb28462a37cf903d064cf9528129fb025a4c072dd95dca0dcbcbccf6b5f9bfc538bd032abf97fee942019060d4b738646f2c90bbffc9b17dd
@@ -5,7 +5,7 @@ on: [push, pull_request]
5
5
  jobs:
6
6
  test:
7
7
  name: Run test suite
8
- runs-on: ubuntu-20.04 # TODO: Change back to 'ubuntu-latest' when https://github.com/microsoft/mssql-docker/issues/899 resolved.
8
+ runs-on: ubuntu-latest
9
9
 
10
10
  env:
11
11
  COMPOSE_FILE: compose.ci.yaml
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.5
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
- table_name = quote_table_name(table_name)
227
- set_identity_insert(table_name, conn, true)
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(table_name, conn, false)
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| "(COALESCE(target.#{quote_column_name(column)}, 'NULL') = COALESCE(source.#{quote_column_name(column)}, 'NULL'))" }.join(" AND ")}) THEN target.#{quote_column_name(column_name)} ELSE #{high_precision_current_timestamp} END,"
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-z_ -]+\]?\.?\[?[a-z_ -]+\]?)\s+(AS|WITH|USING)/i)[1]
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 'identity insert' do
52
- it "identity insert works with views" do
53
- assert_difference("SSTestCustomersView.count", 1) do
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
@@ -0,0 +1,6 @@
1
+ david:
2
+ name: "David"
3
+ balance: 2,004
4
+ aidan:
5
+ name: "Aidan"
6
+ balance: 10,191
@@ -0,0 +1,3 @@
1
+ class RecurringTask < ActiveRecord::Base
2
+ self.table_name = "recurring_tasks"
3
+ 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.5
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: 2025-03-20 00:00:00.000000000 Z
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.5/CHANGELOG.md
243
- source_code_uri: https://github.com/rails-sqlserver/activerecord-sqlserver-adapter/tree/v8.0.5
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.5.21
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