Skip to content

Commit eabb9ee

Browse files
byrootjoelhawksley
authored andcommitted
AbstractAdapter#cast_result should return a result with columns even if empty
There is a suble difference between a query that doesn't return a result at all, and a query that returns an empty result set. The former doesn't have any column name, the later do.
1 parent 95e317d commit eabb9ee

File tree

4 files changed

+17
-3
lines changed

4 files changed

+17
-3
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notif
8787
end
8888

8989
def cast_result(result)
90-
if result.nil? || result.size.zero?
90+
if result.nil? || result.fields.empty?
9191
ActiveRecord::Result.empty
9292
else
9393
ActiveRecord::Result.new(result.fields, result.to_a)

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,11 @@ def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notif
169169
end
170170

171171
def cast_result(result)
172+
if result.fields.empty?
173+
result.clear
174+
return ActiveRecord::Result.empty
175+
end
176+
172177
types = {}
173178
fields = result.fields
174179
fields.each_with_index do |fname, i|

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def perform_query(raw_connection, sql, binds, type_casted_binds, prepare:, notif
3030
end
3131

3232
def cast_result(result)
33-
if result.count.zero?
33+
if result.fields.empty?
3434
ActiveRecord::Result.empty
3535
else
3636
ActiveRecord::Result.new(result.fields, result.rows)

activerecord/test/cases/adapter_test.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,18 @@ def test_current_database
126126
end
127127
end
128128

129-
def test_exec_query_returns_an_empty_result
129+
test "#exec_query queries with no result set return an empty ActiveRecord::Result" do
130130
result = @connection.exec_query "INSERT INTO subscribers(nick) VALUES('me')"
131131
assert_instance_of(ActiveRecord::Result, result)
132+
assert_empty result.rows
133+
assert_empty result.columns
134+
end
135+
136+
test "#exec_query queries with an empty result set still return the columns" do
137+
result = @connection.exec_query "SELECT * FROM subscribers WHERE 1=0"
138+
assert_instance_of(ActiveRecord::Result, result)
139+
assert_empty result.rows
140+
assert_not_empty result.columns
132141
end
133142

134143
if current_adapter?(:Mysql2Adapter, :TrilogyAdapter)

0 commit comments

Comments
 (0)