On 17/08/10 13:38, Peter Gordon wrote: > 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 >
I'm not sure an attachment of that size will get through this mailing list. If you cannot put it up on publicly accessible HTTP/FTP server mail it to me and I'll take a look at it. If you are happy to make it public let me know and I can put it somewhere public for you so other list members can see it. Martin > > 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 > > -- Martin J. Evans Easysoft Limited http://www.easysoft.com