|
Re: bug in DBD::MySQL on Ubuntu / Sarge: msg#00047db.mysql.perl
Hi, The problem does indeed look like a Perl problem. I have done a number of experiments, most notably adding Perl_sv_dump() into the loop around the param array in parse_params. This indicated that the FLAGS in the SV structure change between successive calls. I can demonstrate this without even using DBD::MySQL: #! /usr/bin/perl5 -w use strict; use Devel::Peek; my $v = '4000930012345671'; print "=" x 20, "Call 1", "=" x 20, "\n"; cancel( $v ); # pPOK flag is set print "=" x 20, "Call 2", "=" x 20, "\n"; cancel( $v ); # bug - pPOK flag is not set sub cancel { my ( $dcref ) = @_; Dump( substr( $dcref, -11 ) ); } On perl 5.8.4: we get: ====================Call 1==================== SV = PVLV(0x81635e0) at 0x816addc REFCNT = 1 FLAGS = (PADMY,GMG,SMG,pPOK) IV = 0 NV = 0 PV = 0x8165ae8 "30012345671"\0 CUR = 11 LEN = 12 MAGIC = 0x8165e40 MG_VIRTUAL = &PL_vtbl_substr MG_TYPE = PERL_MAGIC_substr(x) TYPE = x TARGOFF = 5 TARGLEN = 11 TARG = 0x816ad88 SV = PV(0x814cf38) at 0x816ad88 REFCNT = 2 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x816bb50 "4000930012345671"\0 CUR = 16 LEN = 17 ====================Call 2==================== SV = PVLV(0x81635e0) at 0x816addc REFCNT = 1 FLAGS = (PADMY,GMG,SMG) IV = 0 NV = 0 PV = 0x8165ae8 "30012345671"\0 CUR = 11 LEN = 12 MAGIC = 0x8165e40 MG_VIRTUAL = &PL_vtbl_substr MG_TYPE = PERL_MAGIC_substr(x) TYPE = x TARGOFF = 5 TARGLEN = 11 TARG = 0x814cbb8 SV = PV(0x814d0f4) at 0x814cbb8 REFCNT = 2 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x8165d50 "4000930012345671"\0 CUR = 16 LEN = 17 In Call 1, FLAGS includes pPOK, but in call 2, this is missing. In dbdimp.c, parse_params traverses the param list, and if SvOK(ph->value) is not set, then the parameter is set to NULL. I'm assuming that SvOK() returns true for Call 1 and false for Call 2. In Perl 5.6.1, the flags for Call 1 are (PADMY,GMG,SMG,pPOK), and for Call 2 are (PADMY,GMG,SMG,POK,pPOK). I don't know why they differ between the calls, but I don't caer because SvOK() returns true for both, and so DBD::MySQL works as expected. I'll go away now and pester a Perl Internals list somewhere. Do you have any suggestions how I should proceed ? I wouldn't even know what to call this problem. regards, Martin Martin Waite wrote: > Hi Patrick, > > I have compiled up v 3.0004 on Woody (Perl 5.6.1), and the script > works properly. > > The problem seems to be tied to the version of Perl that is used. > > regards, > Martin > > Martin Waite wrote: > >> Hi Patrick, >> >> I have changed the cancel subroutine to print out the substr expression: >> >> sub cancel { >> my ( $dcref ) = @_; >> print "DCREF: $dcref\n"; >> print "update update_bug set status = 5 where k = ? ", substr( >> $dcref, -11 ), "\n"; >> $dbh->do( "update update_bug set status = 5 where k = ?", undef, >> substr( $dcref, -11 ) ); >> } >> >> >> The output from the program now is: >> >> martin@chadwick:~$ perl -w ~/ed/adhoc/update-bug >> DCREF: 4000930012345671 >> update update_bug set status = 5 where k = ? 30012345671 >> DCREF: 4000930012345671 >> update update_bug set status = 5 where k = ? 30012345671 >> DCREF: 4000930012345671 >> update update_bug set status = 5 where k = ? 30012345671 >> DCREF: 4000930012345671 >> update update_bug set status = 5 where k = ? 30012345671 >> >> >> Which is what I'd expect, however the query log still shows: >> >> 4655 Query SET AUTOCOMMIT=1 >> 4655 Query drop table if exists update_bug >> 4655 Query create table update_bug( k int not >> null primary key, status int not null ) >> 4655 Query update update_bug set status = 5 >> where k = '30012345671' >> 4655 Query update update_bug set status = 5 >> where k = '30012345671' >> 4655 Query update update_bug set status = 5 >> where k = '30012345671' >> 4655 Query update update_bug set status = 5 >> where k = NULL >> 4655 Query update update_bug set status = 5 >> where k = NULL >> 4655 Query update update_bug set status = 5 >> where k = NULL >> 4655 Quit >> >> >> I have raised this issue through the MySQL Network, and they have >> raised a bug. They tried the script on Suse, and the same problem >> appears. >> >> I have downloaded the latest DBD (3.0004) and the problem still >> applies (this linked against the 5.0.20a client libraries). Poking >> around in dbdimp.c, I noticed that a whole lot of debug switches on >> if you set dbis->debug to 2, so in mysql_st_internal_execute, I set >> dbis->debug to 2, but then the problem goes away. Very >> frustrating. (By the way, what is the proper way to set debugging on ?) >> >> My plan of action is to attempt to compile the woody DBD (v1.22 !) on >> sarge/perl 5.8.4 and see if that works - but the version might be too >> old to work with the new Perl. Probably easier to compile the >> newest DBD on woody against Perl 5.6 and see if the problem follows >> with it. >> >> I notice in the release email for DBD 3.0004 that you say threading >> must be switched off on Solaris. The version of Perl on sarge / >> ubuntu has threading switched on. I don't know how much of this is >> relevant, but below I include the output of Perl -V for the two hosts >> the script fails on (Sarge and Ubuntu), and the one it works on (Woody). >> >> regards, >> Martin >> >> >> sarge: perl -V >> Summary of my perl5 (revision 5 version 8 subversion 4) configuration: >> Platform: >> osname=linux, osvers=2.6.15, archname=i386-linux-thread-multi >> uname='linux ninsei 2.6.15 #1 smp preempt sat jan 7 12:47:52 pst >> 2006 i686 gnulinux ' >> config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN >> -Dcccdlflags=-fPIC -Darchname=i386-linux -Dprefix=/usr >> -Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 >> -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 >> -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local >> -Dsitelib=/usr/local/share/perl/5.8.4 >> -Dsitearch=/usr/local/lib/perl/5.8.4 -Dman1dir=/usr/share/man/man1 >> -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 >> -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl >> -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm >> -Duseshrplib -Dlibperl=libperl.so.5.8.4 -Dd_dosuid -des' >> hint=recommended, useposix=true, d_sigaction=define >> usethreads=define use5005threads=undef useithreads=define >> usemultiplicity=define >> useperlio=define d_sfio=undef uselargefiles=define usesocks=undef >> use64bitint=undef use64bitall=undef uselongdouble=undef >> usemymalloc=n, bincompat5005=undef >> Compiler: >> cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS >> -DDEBIAN -fno-strict-aliasing -I/usr/local/include >> -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', >> optimize='-O2', >> cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN >> -fno-strict-aliasing -I/usr/local/include' >> ccversion='', gccversion='3.3.5 (Debian 1:3.3.5-13)', gccosandvers='' >> intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 >> d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 >> ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', >> lseeksize=8 >> alignbytes=4, prototype=define >> Linker and Libraries: >> ld='cc', ldflags =' -L/usr/local/lib' >> libpth=/usr/local/lib /lib /usr/lib >> libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt >> perllibs=-ldl -lm -lpthread -lc -lcrypt >> libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, >> libperl=libperl.so.5.8.4 >> gnulibc_version='2.3.2' >> Dynamic Linking: >> dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' >> cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib' >> >> >> Characteristics of this binary (from libperl): >> Compile-time options: MULTIPLICITY USE_ITHREADS USE_LARGE_FILES >> PERL_IMPLICIT_CONTEXT >> Built under linux >> Compiled at Jan 12 2006 14:54:46 >> @INC: >> /etc/perl >> /usr/local/lib/perl/5.8.4 >> /usr/local/share/perl/5.8.4 >> /usr/lib/perl5 >> /usr/share/perl5 >> /usr/lib/perl/5.8 >> /usr/share/perl/5.8 >> /usr/local/lib/site_perl >> . >> >> >> Ubuntu: perl -V >> >> Summary of my perl5 (revision 5 version 8 subversion 4) configuration: >> Platform: >> osname=linux, osvers=2.6.8.1, archname=i386-linux-thread-multi >> uname='linux terranova 2.6.8.1 #1 smp sat feb 26 13:03:40 utc 2005 >> i686 gnulinux ' >> config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN >> -Dcccdlflags=-fPIC -Darchname=i386-linux -Dprefix=/usr >> -Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 >> -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 >> -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local >> -Dsitelib=/usr/local/share/perl/5.8.4 >> -Dsitearch=/usr/local/lib/perl/5.8.4 -Dman1dir=/usr/share/man/man1 >> -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 >> -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl >> -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm >> -Duseshrplib -Dlibperl=libperl.so.5.8.4 -Dd_dosuid -des' >> hint=recommended, useposix=true, d_sigaction=define >> usethreads=define use5005threads=undef useithreads=define >> usemultiplicity=define >> useperlio=define d_sfio=undef uselargefiles=define usesocks=undef >> use64bitint=undef use64bitall=undef uselongdouble=undef >> usemymalloc=n, bincompat5005=undef >> Compiler: >> cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS >> -DDEBIAN -fno-strict-aliasing -I/usr/local/include >> -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', >> optimize='-O2', >> cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN >> -fno-strict-aliasing -I/usr/local/include' >> ccversion='', gccversion='3.3.4 (Debian 1:3.3.4-9ubuntu5)', >> gccosandvers='' >> intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 >> d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 >> ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', >> lseeksize=8 >> alignbytes=4, prototype=define >> Linker and Libraries: >> ld='cc', ldflags =' -L/usr/local/lib' >> libpth=/usr/local/lib /lib /usr/lib >> libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt >> perllibs=-ldl -lm -lpthread -lc -lcrypt >> libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, >> libperl=libperl.so.5.8.4 >> gnulibc_version='2.3.2' >> Dynamic Linking: >> dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E' >> cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib' >> >> >> Characteristics of this binary (from libperl): >> Compile-time options: MULTIPLICITY USE_ITHREADS USE_LARGE_FILES >> PERL_IMPLICIT_CONTEXT >> Built under linux >> Compiled at Mar 9 2005 11:10:00 >> @INC: >> /etc/perl >> /usr/local/lib/perl/5.8.4 >> /usr/local/share/perl/5.8.4 >> /usr/lib/perl5 >> /usr/share/perl5 >> /usr/lib/perl/5.8 >> /usr/share/perl/5.8 >> /usr/local/lib/site_perl >> . >> >> >> Woody: perl -V >> Summary of my perl5 (revision 5.0 version 6 subversion 1) configuration: >> Platform: >> osname=linux, osvers=2.4.28-es, archname=i386-linux >> uname='linux gluck 2.4.28-es #1 smp wed jan 12 09:55:22 est 2005 >> i686 unknown ' >> config_args='-Dccflags=-DDEBIAN -Dcccdlflags=-fPIC >> -Darchname=i386-linux -Dprefix=/usr -Dprivlib=/usr/share/perl/5.6.1 >> -Darchlib=/usr/lib/perl/5.6.1 -Dvendorprefix=/usr >> -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 >> -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.6.1 >> -Dsitearch=/usr/local/lib/perl/5.6.1 -Dman1dir=/usr/share/man/man1 >> -Dman3dir=/usr/share/man/man3 -Dman1ext=1 -Dman3ext=3perl >> -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Duseshrplib >> -Dlibperl=libperl.so.5.6.1 -Dd_dosuid -des' >> hint=recommended, useposix=true, d_sigaction=define >> usethreads=undef use5005threads=undef useithreads=undef >> usemultiplicity=undef >> useperlio=undef d_sfio=undef uselargefiles=define usesocks=undef >> use64bitint=undef use64bitall=undef uselongdouble=undef >> Compiler: >> cc='cc', ccflags ='-DDEBIAN -fno-strict-aliasing >> -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64', >> optimize='-O2', >> cppflags='-DDEBIAN -fno-strict-aliasing -I/usr/local/include' >> ccversion='', gccversion='2.95.4 20011002 (Debian prerelease)', >> gccosandvers='' >> intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234 >> d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 >> ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', >> lseeksize=8 >> alignbytes=4, usemymalloc=n, prototype=define >> Linker and Libraries: >> ld='cc', ldflags =' -L/usr/local/lib' >> libpth=/usr/local/lib /lib /usr/lib >> libs=-lgdbm -ldb -ldl -lm -lc -lcrypt >> perllibs=-ldl -lm -lc -lcrypt >> libc=/lib/libc-2.2.5.so, so=so, useshrplib=true, >> libperl=libperl.so.5.6.1 >> Dynamic Linking: >> dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic' >> cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib' >> >> >> Characteristics of this binary (from libperl): >> Compile-time options: USE_LARGE_FILES >> Built under linux >> Compiled at Mar 18 2005 16:57:39 >> @INC: >> /usr/local/lib/perl/5.6.1 >> /usr/local/share/perl/5.6.1 >> /usr/lib/perl5 >> /usr/share/perl5 >> /usr/lib/perl/5.6.1 >> /usr/share/perl/5.6.1 >> /usr/local/lib/site_perl/i386-linux >> /usr/local/lib/site_perl >> . >> >> >> >> >> Patrick Galbraith wrote: >> >>> Martin, >>> >>> It doesn't look like a DBD::mysql problem to me. It has something to >>> do with the script. What does the output of program show? Perhaps >>> print out "print substr($dcref, -11) . "\n"; prior to each call of >>> do to see that it's actually passing the value to the driver. Or, >>> try it without the substring call. Try some variation to see if the >>> problem is in the value being passed to do. >>> >>> regards, >>> >>> Patrick >>> >>> Martin Waite wrote: >>> >>>> Hi, >>>> >>>> I have come across a problem in DBD::MySQL while porting code from >>>> Woody >>>> to Sarge and Ubuntu (both hoary and breezy). >>>> >>>> The following script creates a simple test table and attempts to >>>> perform >>>> 6 updates. The first 3 updates work correctly, but in the final 3 >>>> updates, the key is erroneously taken as NULL: >>>> >>>> #! /usr/bin/perl5 -w >>>> >>>> use strict; >>>> use DBI; >>>> >>>> my $dbh = DBI->connect( "dbi:mysql:test:host=chadwick:port=3306", >>>> 'testuser', 'test', {RaiseError=>1, PrintError=>0} ); >>>> >>>> >>>> $dbh->do( "drop table if exists update_bug" ); >>>> $dbh->do( "create table update_bug( k int not null primary key, >>>> status int not null )" ); >>>> >>>> my $v = '4000930012345671'; >>>> >>>> $dbh->do( "update update_bug set status = 5 where k = ?", undef, >>>> substr( $v, -11 ) ); # OK >>>> $dbh->do( "update update_bug set status = 5 where k = ?", undef, >>>> substr( $v, -11 ) ); # OK >>>> >>>> cancel( $v ); # OK >>>> cancel( $v ); # bug - k is NULL >>>> cancel( $v ); # bug - k is NULL >>>> cancel( $v ); # bug - k is NULL >>>> >>>> sub cancel { >>>> my ( $dcref ) = @_; >>>> print "DCREF: $dcref\n"; >>>> $dbh->do( "update update_bug set status = 5 where k = ?", undef, >>>> substr( $dcref, -11 ) ); >>>> } >>>> >>>> >>>> In the Query log of the 4.1.11 database we're connecting to, we see: >>>> >>>> 060526 14:24:52 4605 Connect testuser@chadwick on test >>>> 4605 Query SET AUTOCOMMIT=1 >>>> 4605 Query drop table if exists update_bug >>>> 4605 Query create table update_bug( k int >>>> not null primary key, status int not null ) >>>> 4605 Query update update_bug set status = >>>> 5 where k = '30012345671' >>>> 4605 Query update update_bug set status = >>>> 5 where k = '30012345671' >>>> 4605 Query update update_bug set status = >>>> 5 where k = '30012345671' >>>> 4605 Query update update_bug set status = >>>> 5 where k = NULL >>>> 4605 Query update update_bug set status = >>>> 5 where k = NULL >>>> 4605 Query update update_bug set status = >>>> 5 where k = NULL >>>> 4605 Quit >>>> >>>> >>>> The problem seems to be related to the fact that a substring >>>> expression >>>> is passed as an argument to DBI::do, but only when the DBI::do is >>>> called >>>> within a subroutine. >>>> >>>> I'm stumped here. Is this a bug in Perl or DBD::MySQL, or just the >>>> versions on Sarge and Ubuntu ? >>>> >>>> regards, >>>> Martin >>>> >>>> >>>> >>>> >>>> >>> >>> >>> >>> >>> >> >> > > -- MySQL Perl Mailing List For list archives: http://lists.mysql.com/perl To unsubscribe: http://lists.mysql.com/perl?unsub=gcdmp-msql-mysql-modules@xxxxxxxxxxx |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | example dir eg/ missing from distribution?: 00047, paul lucassen |
|---|---|
| Next by Date: | Memory leak in DBD::mysql with server side prepares?: 00047, Jason |
| Previous by Thread: | Re: bug in DBD::MySQL on Ubuntu / Sargei: 00047, Martin Waite |
| Next by Thread: | example dir eg/ missing from distribution?: 00047, paul lucassen |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |