I've committed a change (r14444) that'll issue a warning instead of an assertion failure. Can you try:
svn co http://svn.perl.org/modules/dbi/trunk/ dbi-trunk cd dbi-trunk perl Makefile.PL make && make test && make install Tim. On Thu, Sep 23, 2010 at 10:23:49AM +0200, Mara wrote: > On Wed, Sep 22, 2010 at 11:02 PM, Tim Bunce <tim.bu...@pobox.com> wrote: > > On Wed, Sep 22, 2010 at 04:56:31PM +0200, Mara wrote: > >> Hi Tim, > >> > >> On Wed, Sep 22, 2010 at 11:24 AM, Tim Bunce <tim.bu...@pobox.com> wrote: > >> > On Tue, Sep 21, 2010 at 06:01:20AM -0700, Mara wrote: > >> >> > >> > I agree. It should be an error not an assertion. > >> > > >> > The relevant code is: > >> > > >> > if (DBIc_TRACE_LEVEL(imp_sth) >= 10) > >> > PerlIO_printf(DBILOGFP," FETCH $h->{%s} from $h->{NAME} > >> > with $h->{NUM_OF_FIELDS} = %d" > >> > " and %ld entries in $h->{NAME}\n", > >> > neatsvpv(keysv,0), i, AvFILL(name_av)+1); > >> > assert((i == -1 && 0 == AvFILL(name_av)+1) || (i == > >> > AvFILL(name_av)+1)); > >> > >> Ok. Essentially I did > >> > >> $sth->trace( 10, 'dbi_trace.log' ); > >> $sth->execute() or die DBI::errstr; > >> my $hash_ref = $sth->fetchrow_hashref("NAME_lc"); > >> > >> Then trace file reads > >> --- snip --- > >> <- execute= ( 1 ) [1 items] at test_dbi.pl line 91 > >> -> fetchrow_hashref in DBD::_::st for DBD::Oracle::st > >> (DBI::st=HASH(0x19e8300)~0xcec630 'NAME_lc') thr#8ab010 > >> >> FETCH DISPATCH (DBI::st=HASH(0xcec630) rc2/1 @2 g2 ima404 > >> pid#14833) at test_dbi.pl line 94 > >> 1 -> FETCH for DBD::Oracle::st (DBI::st=HASH(0xcec630)~INNER 'NAME_lc') > >> thr#8ab010 > >> >> FETCH DISPATCH (DBI::st=HASH(0xcec630) rc3/1 @2 g2 ima404 > >> pid#14833) at test_dbi.pl line 94 > >> 2 -> FETCH for DBD::Oracle::st (DBI::st=HASH(0xcec630)~INNER 'NAME') > >> thr#8ab010 > >> 2 <- FETCH= ( [ ] ) [1 items] at test_dbi.pl line 94 > >> --- snip --- > > > > I don't see the message I'm looking for. > > Did the assertion fail that time? > > Yes, it did fail. > > > If so, perhaps it didn't get flushed. Try using $sth->trace(10); to > > write the log to stderr. > > Tried that, but the output is still the same. I also tried a higher > trace level, but to no avail. Complete output is: > > --- snip --- > ~> /usr/bin/env perl "test_dbi.pl" 20090110518 A0000000000 > DBI::st=HASH(0xcec7c8) trace level set to 0x0/11 (DBI @ 0x0/0) in > DBI 1.609-ithread (pid 19121) > -> execute for DBD::Oracle::st (DBI::st=HASH(0x19d0448)~0xcec7c8) > thr#8ab010 > dbd_st_execute UPDATE (out0, lob0)... > Statement Execute Mode is 32 (COMMIT_ON_SUCCESS) > in ':a' [0,0]: len 11, ind 0, value='A0000...' > in ':b' [0,0]: len 11, ind 0, value='20090...' > > OCIStmtExecute(1b28538,1b35538,1b28618,1,0,0,0,mode=COMMIT_ON_SUCCESS,32)=SUCCESS > > OCIAttrGet(1b35538,OCI_HTYPE_STMT,7ffff25fb3d8,0,OCI_ATTR_ROW_COUNT,1b28618)=SUCCESS > > OCIAttrGet(1b35538,OCI_HTYPE_STMT,7ffff25fb3de,0,OCI_ATTR_SQLFNCODE,1b28618)=SUCCESS > dbd_st_execute UPDATE returned (SUCCESS, rpc1, fn5, out0) > <- execute= ( 1 ) [1 items] at test_dbi.pl line 97 > -> fetchrow_hashref in DBD::_::st for DBD::Oracle::st > (DBI::st=HASH(0x19d0448)~0xcec7c8 'NAME_lc') thr#8ab010 > >> FETCH DISPATCH (DBI::st=HASH(0xcec7c8) rc2/1 @2 g2 ima404 > pid#19121) at test_dbi.pl line 100 > 1 -> FETCH for DBD::Oracle::st (DBI::st=HASH(0xcec7c8)~INNER > 'NAME_lc') thr#8ab010 > >> FETCH DISPATCH (DBI::st=HASH(0xcec7c8) rc3/1 @2 g2 ima404 > pid#19121) at test_dbi.pl line 100 > 2 -> FETCH for DBD::Oracle::st (DBI::st=HASH(0xcec7c8)~INNER 'NAME') > thr#8ab010 > 2 <- FETCH= ( [ ] ) [1 items] at test_dbi.pl line 100 > perl: DBI.xs:2001: dbih_get_attr_k: Assertion `i == (((((const SV *) > (name_av))->sv_flags & 0x00800000)) ? Perl_mg_size(my_perl, ((SV *)({ > void *_p = (name_av); _p; }))) : ((XPVAV*) > (name_av)->sv_any)->xav_fill)+1' failed. > --- snap --- > > Sadly I know nothing about Perl's assertions. Would it help to eval{} > the fetchrow to get a better error message? > > Mara