I am using DBD::mysql. I have a trace dump at level 15 which shows the problem. The dump is 750K uncompressed or 19K compressed. How should I send it?
Peter On Tue, 2010-08-17 at 13:11 +0100, Martin J. Evans wrote: > On 17/08/10 12:14, Peter Gordon wrote: > > On Tue, 2010-08-17 at 13:55 +0300, Peter Gordon wrote: > >> Sorry about that - dsylexia is setting in. > >> > >> https://bugzilla.mozilla.org/show_bug.cgi?id=481549 > >> > >> > >> > >> On Tue, 2010-08-17 at 11:44 +0100, Martin J. Evans wrote: > >>> On 17/08/10 10:47, Peter Gordon wrote: > >>>> > >>>> I am trying to fix a problem in Bugzilla which has been open for more > >>>> than a year, > >>> > >>> Bugzilla shows VERIFIED FIXED at the moment. > >>> > >>>> and which seems to be related to DBI, and I was hoping > >>>> that you could give me some direction in trying to solve the problem. On > >>>> my site the problem is totally repeatable. I am using Perl 5.8.8, > >>>> DBI-1.613_71. > >>> > >>> What DBD and version are you using? > > > >>From the debugger: > > > > use DBI > > x $DBI::VERSION > > 0 1.614 > > > > use DBD::DBD > > x $DBI::DBD::VERSION > > 0 12.014312 > > Some confusion here, I meant which DBD are you using and which version e.g., > DBD::mysql, DBD::Pg etc. > > > > > > >>> > >>>> In short: on one line a variable is a reference to an array, and, > >>>> directly after a return statement, the value is no longer an array, but > >>>> a scalar > >>>> having a reference to DBI. So it looks like something is > >>>> changing/corrupting the Perl stack. Since Driver.xst and Perl.xsi change > >>>> the stack it seems > >>>> that that are likely to be causing the problem. > >>> > >>> Strange. > >>> > >>>> The bug in Bugzilla is: > >>>> > >>>> https://bugzilla.mozilla.org/show_bug.cgi?id=481459 > >>> > >>> This bugzilla does not seem to match your description. > >>> > >>>> > >>>> The code that seems to be causing the problem is: > >>>> > >>>> my $objects = $dbh->selectall_arrayref($sql, {Slice=>{}}, @untainted); > >>>> > >>>> For a given $sql and a given @untainted, the $objects returned is not > >>>> an array but a reference to DBI::db=HASH > >>> > >>> Have you got RaiseError set? > >>> > >>> What, if anything is in $dbh->err after the problem return? > > There is no error defined > > oh. > > > > > > >>> > >>>> When I step through the code, selectall_arrayref works correctly until > >>>> the final return statement. Before the return statement, the type is an > >>>> array, and directly afterwards, it is a DBI::db=HASH. > >>>> > >>>> The sql statement is: > >>>> > >>>> SELECT id,value,product_id FROM versions WHERE id IN > >>>> (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, > >>>> ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? > >>>> ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, > >>>> ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, > >>>> ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, > >>>> ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? > >>>> ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, > >>>> ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? > >>>> ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) > >>>> ORDER BY id > >>>> > >>>> and the @untainted array is an equivalent number of small integers. > >>>> > >>>> For a smaller or larger number of variables selectall_arrayref is > >>>> working correctly. > >>>> > >>>> I changed the calling routine so that when an error was detected, the > >>>> code was run again. On second and consecutive times the > >>>> code worked correctly. > >>>> > >>>> I am prepared to debug the problem if someone could help. > >>>> > >>>> Peter > >>>> > >>>> > >>> > >>> Can you reproduce this in a small script outside of bugzilla Perl? > >>> > > I tried and haven't succeeded yet. > > > > I did something similar using the Bugzilla infrastucture, and didn't get > > the error. > > Unless someone else has any bright ideas I think this might be difficult to > track down without some way of reproducing or some tracing output. Is it > possible to run your failing example with DBI_TRACE enabled at some high > level? > > >>> I tried mimicking what it looks like you are doing (mostly guess work) > >>> with DBD::ODBC and the latest DBI and found no problem: > >>> > >>> use DBI; > >>> use strict; > >>> > >>> my $h = DBI->connect('dbi:ODBC:baugi','sa','easysoft'); > >>> > >>> eval {$h->do(q/drop table mje/);}; > >>> > >>> $h->do(q/create table mje (id integer, value varchar(200), product_id > >>> integer)/); > >>> > >>> my $max = 1000; > >>> > >>> $h->begin_work; > >>> my $s = $h->prepare(q/insert into mje values(?,?,?)/); > >>> foreach my $loop(1..$max) { > >>> $s->execute($loop, 'fred', $loop); > >>> } > >>> $h->commit; > >>> > >>> > >>> foreach my $loop(1..($max+1)) { # last one won't match > >>> my @bound; > >>> push @bound, $_ foreach (1..$loop); > >>> > >>> my $sql = q/select id, value, product_id from mje where id in (/ . > >>> join(",", (map {'?'} @bound)) . ') order by id'; > >>> my $x = $h->selectall_arrayref($sql, {Slice=>{}}, @bound); > >>> if (ref($x) ne 'ARRAY') { > >>> print "$loop\n"; > >>> } > >>> } > >>> $h->disconnect; > >>> > >>> Martin > >> > >> > > > > > > Martin