FAQ
Hi!

I am not susbcribed to this list - I wanted to add information to a previous
issue reported by Wouter de Geus (e.g. in http://code.activestate.com/lists/perl-dbi-users/36031/)

I ran into what is probably exactly the same problem as him and debugged
it a bit further. I now believe this is simply a bug in the prepared
statement implementation of DBD::mysql.

I've directly cc'ed Patrick Galbraith, as it seems rt.cpan.org is a
blackhole for DBD::mysql bug reports nowadays, and this bug effectively
renders prepared statements useless. (Patrick, if DBD::mysql is no longer
maintained by you, do you happen to know by whom it is maintaiend these
days, if anybody?)

Here is a typical trace of a repeated invocation, which matches the trace
provided by Wouter. This works:

     -> fetchrow_arrayref for DBD::mysql::st (DBI::st=HASH(0x1f8aa20)~0x1f52d38)
         -> dbd_st_fetch
         --> dbd_describe
                 dbd_describe() num_fields 1
                 i 0 col_type 253 fbh->length 0
                 fields[i].length 255 fields[i].max_length 41 fields[i].type 253 fields[i].charsetnr 63
                 mysql_to_perl_type returned 253
         <- dbd_describe
                 dbd_st_fetch for 01f8aa80, chopblanks 0
                 dbd_st_fetch calling mysql_fetch

And this fails, due to the MYSQL_DATA_TRUNCATED result:
fetchrow_arrayref DISPATCH (DBI::st=HASH(0x1f8aa20) rc1/1 @1 g2 ima0 pid#3097) at Schback/Slave.pm line 395 via at ./schbackd line 81
     -> fetchrow_arrayref for DBD::mysql::st (DBI::st=HASH(0x1f8aa20)~0x1f52d38)
         -> dbd_st_fetch
                 dbd_st_fetch for 01f8aa80, chopblanks 0
                 dbd_st_fetch calling mysql_fetch
                 dbd_st_fetch data truncated

I found that this happens when I reuse the same statement handle and the
second invocation returns a longer result for a field than the first.

I verified using ltrace -e memcpy that the buffer_length allocated in the
failure case is the 41 from the previous execute, which is too small for
the next one, causing the failure.

Lo and behold, an obvious testcase reproduces the bug:

    $dbh = DBI->connect ("dbi:mysql:test;mysql_read_default_group=client;mysql_server_prepare=1", "", "");

    # DBI->trace (2);

    $st = $dbh->prepare ("select ?");
    $st->execute ("1234");
    warn $st->fetchrow_arrayref;

    $st->execute ("123456789");
    warn $st->fetchrow_arrayref; # fails due to MYSQL_DATA_TRUNCATED

The first execute works, and fetchrow_arrayref returns the result row. The
second execute works as well, but fetchrow_arrayref returns undef. When
enabling tracing, it shows that the second fetch fails because of
MYSQL_DATA_TRUNCATED status.

Clearly, something in DBD::mysql caches maximum buffer sizes between
executes when it shouldn't.

--
                 The choice of a Deliantra, the free code+content MORPG
       -----==- _GNU_ http://www.deliantra.net
       ----==-- _ generation
       ---==---(_)__ __ ____ __ Marc Lehmann
       --==---/ / _ \/ // /\ \/ / schmorp@schmorp.de
       -=====/_/_//_/\_,_/ /_/\_\

Search Discussions

Discussion Posts

Follow ups

Related Discussions

Discussion Navigation
viewthread | post
posts ‹ prev | 1 of 2 | next ›
Discussion Overview
groupdbi-users @
categoriesperl
postedAug 11, '14 at 3:28a
activeSep 30, '14 at 11:52a
posts2
users2
websitedbi.perl.org

People

Translate

site design / logo © 2021 Grokbase