GrandFather has asked for the wisdom of the Perl Monks concerning the following question:

I am writing a test suite for some code I'm currently working on and found a nasty interaction between DBI and Test::More. The following sample test:

use strict; use warnings; use Test::More qw(no_plan); use DBI; print "Test::More::VERSION: $Test::More::VERSION\n"; print "DBI::VERSION: $DBI::VERSION\n"; print "Perl version: ", join ('.', unpack('C3', $^V)), "\n"; my $dbh = DBI->connect ("dbi:SQLite:delme.SQLite", '', ''); $dbh->do ("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY NOT + NULL, name VARCHAR(20))"); my $stmt = "SELECT ALL * FROM test"; my $sth = $dbh->prepare ($stmt); $sth->execute (); my $result = $sth->fetchall_hashref ('id'); ok (1, 'after fetchall_hashref'); $sth = 0; $dbh->disconnect ();

under AS Perl on XP prints:

Test::More::VERSION: 0.47 DBI::VERSION: 1.52 Perl version: 5.8.4 Attempt to free unreferenced scalar: SV 0x219387c at C:/Perl/lib/Test/ +Builder.pm line 313. ok 1 - after fetchall_hashref 1..1

(The "Attempt ..." line is sent to stderr btw.) Is this something I am doing wrong or is it showing up a bug in either DBI or Test::More? If a bug, is there a work around for it?

Update: updating to AS Perl 5.8.8 fixes it:

Test::More::VERSION: 0.62 DBI::VERSION: 1.52 Perl version: 5.8.8 ok 1 - after fetchall_hashref 1..1

DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re: Nastyness between DBI and Test::More
by varian (Chaplain) on Apr 21, 2007 at 06:10 UTC
    Grandfather, you may have hit a bug. I copied your code and ran it without errors (Linux machine), this certainly looks as if to depend on the environment/versions:
    Test::More::VERSION: 0.47 DBI::VERSION: 1.40 Perl version: 5.8.5 ok 1 - after fetchall_hashref 1..1

    The error Attempt to free unreferenced scalar suggests that Perl tries to decrement the reference count of a scalar to find the unpleasant surprise that it has already reached 0 and in fact the variable should have been released before. Without some XS code such an error is tough to get!

Re: Nastyness between DBI and Test::More
by bobf (Monsignor) on Apr 21, 2007 at 05:57 UTC

    Your example works fine for me:

    Test::More::VERSION: 0.62 DBI::VERSION: 1.52 Perl version: 5.8.8 ok 1 - after fetchall_hashref 1..1

Re: Nastyness between DBI and Test::More
by wfsp (Abbot) on Apr 21, 2007 at 06:30 UTC
    fwi, AS Perl on XP.
    Test::More::VERSION: 0.7 DBI::VERSION: 1.52 Perl version: 5.8.8 ok 1 - after fetchall_hashref 1..1
Re: Nastyness between DBI and Test::More
by jZed (Prior) on Apr 21, 2007 at 15:45 UTC
    Is this what you meant to test?
    my $stmt = "SELECT ALL * FROM test";
    update Actually it's valid SQL just doubly redundant - once because ALL is implied and twice because if ALL * is different from DISTINCT *, your table is hosed :-).

      What I mean to test is the bug that (as it turned out) was due to an older version of Perl. The test code is a much trimmed down version of some "real" code and as such may carry some baggage from the original context.

      Although I'm pretty new to SQL, my reading of the MySQL and SQLite documentation indicates that the ALL is implied and optional, but that the * or some other select expression is required. In the original code there was a WHERE clause so the ALL was a nod to improved understanding by a neophyte (me). The ALL didn't affect the test nor cause undue visual clutter or confusion so it didn't get taken out.


      DWIM is Perl's answer to Gödel
        Sure, there's nothing wrong with using ALL to make clearer what you are doing - selecting all rows (ALL) and all columns (*). It just struck me as funny.
Re: Nastyness between DBI and Test::More
by naikonta (Curate) on Apr 21, 2007 at 13:47 UTC
    Hi GrandFather, the test is just fine here. Please use the following info for your perusal.
    $ uname -srv Linux 2.6.15-1.2054_FC5 #1 Tue Mar 14 15:48:33 EST 2006 $ perl test-dbi-GF.pl Test::More::VERSION: 0.64 DBI::VERSION: 1.50 Perl version: 5.8.8 ok 1 - after fetchall_hashref 1..1

    Open source softwares? Share and enjoy. Make profit from them if you can. Yet, share and enjoy!