Hi,

While looking for memory leaks in our code using Devel::Leak, we
pinpointed one of them to a call to selectcol_arrayref().

The attached script tries several DBI commands on various DBD drivers
(it's easy to add one, or to add code to be tested for leakage), and
reports how much leakage Devel::Leak caught.

Just to be sure that we're not mistaking for a leak some Perl/DBI internal
structures that are initialized the first time the code is called,
we run every command twice, and only look for leakage the second time.

It is very possible that the test script takes something expected for
a memory leak, but I've tried to make it only report valid leaks. (try
removing the first eval $cmd from the test script to see the difference)

Devel::Leak is *very* verbose (even more with a Perl compiled for
debugging), so if you're only interested in the results, run:

    perl dbi_leak.t 2>&1 | grep ok

Here, with Perl 5.8.8, DBI 1.602, DBD::CSV 0.22, DBD::SQLite 1.14,
DBD::mysql 4.006, I get the following results:

    ok 1 - leak = 0 for csv     my $sanity = 1;
    not ok 2 - leak = 9 for csv     my $s = $dbh->prepare( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
    not ok 3 - leak = 1 for csv     my $s = $dbh->prepare_cached( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
    not ok 4 - leak = 2 for csv     my $c = $dbh->selectcol_arrayref( $sql, { 
Column => [1] } )
    not ok 5 - leak = 2 for csv     my @a = $dbh->selectrow_array( $sql )
    not ok 6 - leak = 2 for csv     my $a = $dbh->selectrow_arrayref( $sql )
    ok 7 - leak = 0 for mysql   my $sanity = 1;
    not ok 8 - leak = 1 for mysql   my $s = $dbh->prepare( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
    ok 9 - leak = 0 for mysql   my $s = $dbh->prepare_cached( $sql ); 
$s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
    not ok 10 - leak = 1 for mysql   my $c = $dbh->selectcol_arrayref( $sql, { 
Column => [1] } )
    not ok 11 - leak = 1 for mysql   my @a = $dbh->selectrow_array( $sql )
    not ok 12 - leak = 1 for mysql   my $a = $dbh->selectrow_arrayref( $sql )
    ok 13 - leak = 0 for sqlite  my $sanity = 1;
    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 )
    # Looks like you failed 13 tests of 18.

I've been told that it also leaks on 5.10.0.


-- 
 Philippe Bruhat (BooK)

 The truly stupid always find a way to create disaster.
                                                (Moral from Groo #10 (Image))

Reply via email to