From fc343d26ffec073c7df64a8a4c2508104f78e9d4 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 28 Apr 2011 09:48:16 -0700 Subject: clearing statement from cache on exception in order to support older versions of mysql --- .../active_record/connection_adapters/mysql_adapter.rb | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb index 2c05ff21f9..1136dbc45e 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb @@ -413,9 +413,19 @@ module ActiveRecord stmt = cache[:stmt] end - stmt.execute(*binds.map { |col, val| - type_cast(val, col) - }) + + begin + stmt.execute(*binds.map { |col, val| type_cast(val, col) }) + rescue Mysql::Error => e + # Older versions of MySQL leave the prepared statement in a bad + # place when an error occurs. To support older mysql versions, we + # need to close the statement and delete the statement from the + # cache. + stmt.close + @statements.delete sql + raise e + end + if metadata = stmt.result_metadata cols = cache[:cols] ||= metadata.fetch_fields.map { |field| field.name -- cgit v1.2.3