Yuriy Kaminskiy wrote:
> Hello!
> I noticed strange problem on error path handling.
>
> Not sure if this sqlite error, DBD::SQLite error, or some misunderstanding on
> my
> part.
>
> Verified on DBD::SQLite-1.33 and 1.34_1 (with bundled sqlite.c) and DBI-1.616.
>
> my $sth=$dbh->prepare("SELECT * FROM t");
> $sth->execute; # success - 0E0
> my $row1 = $sth->fetch; # returns [1]
> $sth->finish;
> sleep 5;
> # ^^ here another instance issued BEGIN EXCLUSIVE ...
> $sth->execute; # ... so this returns "database is locked";
> # it's legitimate/expected behavior
> #
> $sth->finish; # just in case (clears error)
> #
> sleep 5;
> # ^^ here another instance already COMMIT'ed, DB is not locked anymore
> #
> $sth->execute; # success - 0E0
> my $row2 = $sth->fetch; # returns undef
> #
> # WTF?
> #
> # If I prepare another statement (cloned from first!),
> # it returns row as expected:
> #
> my $sth2 = $dbh->prepare($sth->{Statement});
> $sth2->execute; # success
> my $row3 = $sth2->fetch; # returns [1]
With attached patch it works as expected. Seems passes regression test, even
under valgrind (but maybe regression test should be improved, so that it won't
pass it *before* this patch).
This bug was introduced (or, maybe, "incompletely fixed") by svn revision 5944
(author: adamk/subject: "Changed finalize to reset per RT #32100 et al"/date:
2009-04-04 07:01:40), that replaced sqlite3_finalize with sqlite3_reset, but
have not removed stmt NULLification.
--- DBD-SQLite-1.34_01/dbdimp.c.orig 2011-09-21 20:19:06.000000000 +0400
+++ DBD-SQLite-1.34_01/dbdimp.c 2011-10-05 06:36:25.000000000 +0400
@@ -560,6 +560,7 @@
if (rc != SQLITE_OK) {
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
}
+ imp_sth->stmt = NULL;
}
return FALSE; /* -> undef in lib/DBD/SQLite.pm */
}
@@ -802,7 +803,12 @@
if (sqlite3_reset(imp_sth->stmt) != SQLITE_OK) {
sqlite_error(sth, imp_sth->retval, sqlite3_errmsg(imp_dbh->db));
}
+#if 0
+ /*
+ * This is either very wrong, or memory leak
+ */
imp_sth->stmt = NULL;
+#endif
return -6; /* -> undef in SQLite.xsi */
}
}
@@ -969,6 +975,7 @@
if (rc != SQLITE_OK) {
sqlite_error(sth, rc, sqlite3_errmsg(imp_dbh->db));
}
+ imp_sth->stmt = NULL;
}
}
SvREFCNT_dec((SV*)imp_sth->params);
_______________________________________________
DBD-SQLite mailing list
[email protected]
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbd-sqlite