I'm sorry for the delay replying.

On Thu, Apr 10, 2008 at 05:00:57PM +0200, Philippe Bruhat (BooK) wrote:
> On Thu, Apr 10, 2008 at 03:40:55PM +0100, Tim Bunce wrote:
> > I trust the script is destroying the results and, where appropriate,
> > the $sth before calling Devel::Leak::CheckSV.
> 
> Yes.
> 
> The command is run in a block, with lexicals (except the $dbh).
> To avoid counting information that is retained by the DBI, the command
> is run twice, and the leak count is done on the second run only.

> Here it is:

My results for DBI 1.604 with perl v5.8.6 built for darwin-thread-multi-2level
using Text::CSV_XS 0.45 and DBD::SQLite 1.13

ok 1 -          leak= 0 for csv     my $sanity = 1;
ok 2 -          leak= 0 for csv     my $s = $dbh->trace(0) 
not ok 3 -      leak= 9 for csv     my $s = $dbh->prepare($sql) 
not ok 4 -      leak= 1 for csv     my $s = $dbh->prepare($sql); $s->execute(); 
not ok 5 -      leak= 2 for csv     my $s = $dbh->prepare( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
not ok 6 -      leak= 1 for csv     my $s = $dbh->prepare_cached( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
not ok 7 -      leak= 2 for csv     my $c = $dbh->selectcol_arrayref( $sql, { 
Column => [1] } )
not ok 8 -      leak= 1 for csv     my @a = $dbh->selectrow_array( $sql )
not ok 9 -      leak= 2 for csv     my $a = $dbh->selectrow_arrayref( $sql )
ok 10 -         leak= 0 for sqlite  my $sanity = 1;
ok 11 -         leak= 0 for sqlite  my $s = $dbh->trace(0) 
not ok 12 -     leak= 1 for sqlite  my $s = $dbh->prepare($sql) 
not ok 13 -     leak= 1 for sqlite  my $s = $dbh->prepare($sql); $s->execute(); 
not ok 14 -     leak= 1 for sqlite  my $s = $dbh->prepare( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
ok 15 -         leak= 0 for sqlite  my $s = $dbh->prepare_cached( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
not ok 16 -     leak= 1 for sqlite  my $c = $dbh->selectcol_arrayref( $sql, { 
Column => [1] } )
not ok 17 -     leak= 1 for sqlite  my @a = $dbh->selectrow_array( $sql )
not ok 18 -     leak= 1 for sqlite  my $a = $dbh->selectrow_arrayref( $sql )

So using DBD::CSV appears to leak rather more than using DBD::SQLite.
(It's odd that for DBD::CSV calling just prepare leaks more than calling
prepare then execute.)

The leak in DBD::SQLite appears to relate to the prepare() method and
appears to be a scalar containing the sql statement.
It's possible that Devel::Leak is being confused by the DBI keeping a
reference (alias) to the statement in the $dbh->{Statement} attribute.

Tim.

Reply via email to