From 77875206dbc5d2d0d5a6dd6fdcf03959b3acb197 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 20 Jan 2025 15:50:21 -0800 Subject: [PATCH] Make mysql2 adapter handle invalid statement handles when closing prepared statements While here, fix a verbose warning in the previous commit. --- CHANGELOG | 2 ++ lib/sequel/adapters/mysql2.rb | 9 ++++++++- spec/integration/plugin_test.rb | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c7d4f6970..baa434972 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ === master +* Make mysql2 adapter handle invalid statement handles when closing prepared statements (jeremyevans) + * Add query_blocker extension, for blocking queries inside a block (jeremyevans) * Support alter_table add_primary_key/add_unique_constraint :using_index option on PostgreSQL 9.1+ (jeremyevans) diff --git a/lib/sequel/adapters/mysql2.rb b/lib/sequel/adapters/mysql2.rb index be2c59fc7..42139c930 100644 --- a/lib/sequel/adapters/mysql2.rb +++ b/lib/sequel/adapters/mysql2.rb @@ -97,7 +97,14 @@ def execute_prepared_statement(ps_name, opts, &block) synchronize(opts[:server]) do |conn| stmt, ps_sql = conn.prepared_statements[ps_name] unless ps_sql == sql - stmt.close if stmt + if stmt + begin + stmt.close + rescue ::Mysql2::Error + # probably Invalid statement handle, can happen from dropping + # related table, ignore as we won't be using it again. + end + end stmt = log_connection_yield("Preparing #{ps_name}: #{sql}", conn){conn.prepare(sql)} conn.prepared_statements[ps_name] = [stmt, sql] end diff --git a/spec/integration/plugin_test.rb b/spec/integration/plugin_test.rb index 0425d3487..1d899598e 100644 --- a/spec/integration/plugin_test.rb +++ b/spec/integration/plugin_test.rb @@ -3239,7 +3239,7 @@ def set(k, v, ttl) self[k] = v end @db.drop_table?(:query_blocker_test) end - types = { + { "SELECT" => proc{@ds.all}, "INSERT" => proc{@ds.insert(1)}, "UPDATE" => proc{@ds.update(:i => 1)},