Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Bug Fix -- clean up connection after stored procedure [#3151 state:re…

…solved]
  • Loading branch information...
commit 7ce1539934b67e536446f7323c7848fdd6ba68e3 1 parent 137e4e7
@Jeff-Lawson Jeff-Lawson authored tenderlove committed
View
2  activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
@@ -275,6 +275,7 @@ def select_rows(sql, name = nil)
rows = []
result.each { |row| rows << row }
result.free
+ @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
rows
end
@@ -617,6 +618,7 @@ def select(sql, name = nil)
result = execute(sql, name)
rows = []
result.each_hash { |row| rows << row }
+ @connection.more_results && @connection.next_result # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
result.free
rows
end
View
1  activerecord/test/cases/adapters/mysql/connection_test.rb
@@ -48,6 +48,7 @@ def test_successful_reconnection_after_timeout_with_verify
def test_multi_results
rows = ActiveRecord::Base.connection.select_rows('CALL ten();')
assert_equal 10, rows[0][0].to_i, "ten() did not return 10 as expected: #{rows.inspect}"
+ assert @connection.active?, "Bad connection use by 'MysqlAdapter.select_rows'"
end
end
View
15 activerecord/test/cases/adapters/mysql/sp_test.rb
@@ -0,0 +1,15 @@
+require "cases/helper"
+require 'models/topic'
+
+class StoredProcedureTest < ActiveRecord::TestCase
+ fixtures :topics
+
+ # Test that MySQL allows multiple results for stored procedures
+ if Mysql.const_defined?(:CLIENT_MULTI_RESULTS)
+ def test_multi_results_from_find_by_sql
+ topics = Topic.find_by_sql 'CALL topics();'
+ assert_equal 1, topics.size
+ assert ActiveRecord::Base.connection.active?, "Bad connection use by 'MysqlAdapter.select'"
+ end
+ end
+end
View
11 activerecord/test/schema/mysql_specific_schema.rb
@@ -21,4 +21,15 @@
END
SQL
+ ActiveRecord::Base.connection.execute <<-SQL
+DROP PROCEDURE IF EXISTS topics;
+SQL
+
+ ActiveRecord::Base.connection.execute <<-SQL
+CREATE PROCEDURE topics() SQL SECURITY INVOKER
+BEGIN
+ select * from topics limit 1;
+END
+SQL
+
end
Please sign in to comment.
Something went wrong with that request. Please try again.