Subject: | select* methods output misleading error messages on InnoDB lock timeout |
This bug was originally reported by Frederic Briere at
http://bugs.mysql.com/bug.php?id=64475
Description:
The various select* methods (such as selectrow_hashref or
selectcol_arrayref) output misleading error messages when a timeout
occurs while waiting for an InnoDB lock. (For example,
selectrow_hashref outputs "fetch() without execute()", and
selectcol_arrayref outputs "Statement has no result columns to bind".)
From the look of it, the methods appear to not notice that execute() has
failed, and proceed to call fetch() nonetheless. The resulting error
message thus reflects the failure from wrongly calling fetch(), instead
of the original timeout error (which is found to be accurately reported
by the MySQL server with DBI_TRACE).
How to repeat:
Create an InnoDB table:
Show quoted text
mysql> use test
mysql> create table t(i int primary key) engine = innodb;
Acquire a row lock on this table:
Show quoted textmysql> begin;
mysql> insert into t values (1);
From a console, run a query via select* that tries to acquire the same lock:
$ perl -MDBI -e '$dbh = DBI->connect("DBI:mysql:database=test", "...",
"...", {RaiseError=>1}); $dbh->begin_work;
$dbh->selectrow_hashref("SELECT i FROM t FOR UPDATE")'