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

Reply via email to