From 7ce1539934b67e536446f7323c7848fdd6ba68e3 Mon Sep 17 00:00:00 2001 From: Jeff Lawson Date: Sun, 1 Aug 2010 11:41:03 +0100 Subject: Bug Fix -- clean up connection after stored procedure [#3151 state:resolved] --- .../active_record/connection_adapters/mysql_adapter.rb | 2 ++ activerecord/test/cases/adapters/mysql/connection_test.rb | 1 + activerecord/test/cases/adapters/mysql/sp_test.rb | 15 +++++++++++++++ activerecord/test/schema/mysql_specific_schema.rb | 11 +++++++++++ 4 files changed, 29 insertions(+) create mode 100644 activerecord/test/cases/adapters/mysql/sp_test.rb (limited to 'activerecord') diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb index 802921e181..dca0ea67e6 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb @@ -275,6 +275,7 @@ module ActiveRecord 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 @@ module ActiveRecord 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 diff --git a/activerecord/test/cases/adapters/mysql/connection_test.rb b/activerecord/test/cases/adapters/mysql/connection_test.rb index 782aad72d6..f76a23a8ad 100644 --- a/activerecord/test/cases/adapters/mysql/connection_test.rb +++ b/activerecord/test/cases/adapters/mysql/connection_test.rb @@ -48,6 +48,7 @@ class MysqlConnectionTest < ActiveRecord::TestCase 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 diff --git a/activerecord/test/cases/adapters/mysql/sp_test.rb b/activerecord/test/cases/adapters/mysql/sp_test.rb new file mode 100644 index 0000000000..3ca2917ca4 --- /dev/null +++ b/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 diff --git a/activerecord/test/schema/mysql_specific_schema.rb b/activerecord/test/schema/mysql_specific_schema.rb index c78d99f4af..30e1c5a167 100644 --- a/activerecord/test/schema/mysql_specific_schema.rb +++ b/activerecord/test/schema/mysql_specific_schema.rb @@ -19,6 +19,17 @@ CREATE PROCEDURE ten() SQL SECURITY INVOKER BEGIN select 10; 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 -- cgit v1.2.3