Skip to content

Commit fd49d6a

Browse files
authored
Merge pull request rails#55180 from skipkayhil/hm-fix-sqlite-affected-rows-again
Fix affected_rows for SQLite adapter (again)
2 parents 0c7f173 + 38be63e commit fd49d6a

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

activerecord/lib/active_record/connection_adapters/sqlite3/database_statements.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,23 @@ def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notif
103103
end
104104
result = if stmt.column_count.zero? # No return
105105
stmt.step
106-
affected_rows = raw_connection.total_changes - total_changes_before_query
106+
107+
affected_rows = if (raw_connection.total_changes - total_changes_before_query) > 0
108+
raw_connection.changes
109+
else
110+
0
111+
end
112+
107113
ActiveRecord::Result.empty(affected_rows: affected_rows)
108114
else
109115
rows = stmt.to_a
110-
affected_rows = raw_connection.total_changes - total_changes_before_query
116+
117+
affected_rows = if (raw_connection.total_changes - total_changes_before_query) > 0
118+
raw_connection.changes
119+
else
120+
0
121+
end
122+
111123
ActiveRecord::Result.new(stmt.columns, rows, stmt.types.map { |t| type_map.lookup(t) }, affected_rows: affected_rows)
112124
end
113125
ensure

activerecord/test/cases/instrumentation_test.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
require "models/author"
55
require "models/book"
66
require "models/clothing_item"
7+
require "models/lesson"
8+
require "models/student"
79

810
module ActiveRecord
911
class InstrumentationTest < ActiveRecord::TestCase
@@ -181,6 +183,27 @@ def test_payload_affected_rows
181183
assert_equal 0, affected_row_values.fifth
182184
end
183185

186+
def test_payload_affected_rows_cascade
187+
affected_row_values = []
188+
189+
ActiveSupport::Notifications.subscribed(
190+
-> (event) do
191+
unless event.payload[:name].in? ["SCHEMA", "TRANSACTION"]
192+
affected_row_values << event.payload[:affected_rows]
193+
end
194+
end,
195+
"sql.active_record",
196+
) do
197+
l = Lesson.create!(name: "Algebra")
198+
l.students.create!(name: "Jim")
199+
200+
Student.delete_all
201+
end
202+
203+
assert_equal 4, affected_row_values.length
204+
assert_equal 1, affected_row_values.fourth
205+
end
206+
184207
def test_no_instantiation_notification_when_no_records
185208
author = Author.create!(id: 100, name: "David")
186209

activerecord/test/cases/relation/delete_all_test.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
require "cases/helper"
44
require "models/author"
5+
require "models/lesson"
56
require "models/post"
67
require "models/pet"
8+
require "models/student"
79
require "models/toy"
810
require "models/comment"
911
require "models/cpk"
@@ -31,10 +33,19 @@ def test_destroy_all
3133
def test_delete_all
3234
davids = Author.where(name: "David")
3335

34-
assert_difference("Author.count", -1) { davids.delete_all }
36+
assert_difference("Author.count", -1) do
37+
assert_equal 1, davids.delete_all
38+
end
3539
assert_not_predicate davids, :loaded?
3640
end
3741

42+
def test_delete_all_return_value_ignores_cascades
43+
student = Student.create(name: "Ruy Rocha")
44+
lesson = Lesson.create(name: "Anything Possible")
45+
student.lessons << lesson
46+
assert_equal 1, Student.delete_all
47+
end
48+
3849
def test_delete_all_with_index_hint
3950
davids = Author.where(name: "David").from("#{Author.quoted_table_name} /*! USE INDEX (PRIMARY) */")
4051

0 commit comments

Comments
 (0)