Please ignore my questions below. I have found the cause of the memory leak. Thanks.
Regards, Michael __________________ Hi, Using Perl 5.8.1 DBI 1.48 and DBD-DB2 0.78 on Linux, I'm seeing a memory leak looping through $sth->{NAME_lc}. The repro script and trace is below. Note that looping through the $dbh->prepare does not leak. Has someone else seen this before? or know where I can start looking? This looks like a leak in DBI since the DBD-DB2 does not touch the NAME_lc attribute. Any suggestion/comment/help would be greatly appreciated! Thanks Repro script: use DBI; $tracelevel=9; $trace_filename="Trace.out"; DBI->trace($tracelevel, $trace_filename); my $dbh = DBI->connect( 'dbi:DB2:sample', '', '' ) || die "Unable to connect: $DBI::errstr\n"; while( 1 ) { my $sth = $dbh->prepare("SELECT procname FROM syscat.procedures"); my $x = $sth->{NAME_lc}; print "."; } $uname -a Linux cox32.torolab.ibm.com 2.4.21-20.EL #1 Wed Aug 18 20:58:25 EDT 2004 i686 i686 i386 GNU/Linux (Perl 5.8, DBI 1.48, DBD-DB2 0.78 ) The Trace.out: DBI 1.48-ithread default trace level set to 0x0/9 (pid 30282) Note: perl is running without the recommended perl -w option -> DBI->connect(dbi:DB2:sample, , ****) -> DBI->install_driver(DB2) for linux perl=5.008 pid=30282 ruid=7839 euid=7839 install_driver: DBD::DB2 version 0.78 loaded from /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/DB2.pm New DBI::dr (for DBD::DB2::dr, parent=, id=) dbih_setup_handle(DBI::dr=HASH(0x99c8c4c)=>DBI::dr=HASH(0x9a6f8a0), DBD::DB2::dr, 0, Null!) dbih_make_com(Null!, 0, DBD::DB2::dr, 96, 0) thr#98bd008 dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), Err, Null!) SCALAR(0x9babcac) (already defined) dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), State, Null!) SCALAR(0x9a64740) (already defined) dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), Errstr, Null!) SCALAR(0x9a58e8c) (already defined) dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), TraceLevel, Null!) 0 (already defined) dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), FetchHashKeyName, Null!) 'NAME' (already defined) <- install_driver= DBI::dr=HASH(0x99c8c4c) >> connect DISPATCH (DBI::dr=HASH(0x99c8c4c) rc2/3 @5 g0 ima1 pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 598 !! warn: 0 CLEARED by call to connect method -> connect for DBD::DB2::dr (DBI::dr=HASH(0x99c8c4c)~0x9a6f8a0 'sample' '' **** HASH(0x9a707e0)) thr#98bd008 New DBI::db (for DBD::DB2::db, parent=DBI::dr=HASH(0x9a6f8a0), id=) dbih_setup_handle(DBI::db=HASH(0x9a6f864)=>DBI::db=HASH(0x9a70858), DBD::DB2::db, 99c89a0, Null!) dbih_make_com(DBI::dr=HASH(0x9a6f8a0), 9a58e00, DBD::DB2::db, 104, 0) thr#98bd008 dbih_setup_attrib(DBI::db=HASH(0x9a70858), Err, DBI::dr=HASH(0x9a6f8a0)) SCALAR(0x99ced30) (already defined) dbih_setup_attrib(DBI::db=HASH(0x9a70858), State, DBI::dr=HASH(0x9a6f8a0)) SCALAR(0x99ced90) (already defined) dbih_setup_attrib(DBI::db=HASH(0x9a70858), Errstr, DBI::dr=HASH(0x9a6f8a0)) SCALAR(0x99ced60) (already defined) dbih_setup_attrib(DBI::db=HASH(0x9a70858), TraceLevel, DBI::dr=HASH(0x9a6f8a0)) 0 (already defined) dbih_setup_attrib(DBI::db=HASH(0x9a70858), FetchHashKeyName, DBI::dr=HASH(0x9a6f8a0)) 'NAME' (already defined) dbih_setup_attrib(DBI::db=HASH(0x9a70858), HandleSetErr, DBI::dr=HASH(0x9a6f8a0)) undef (not defined) dbih_setup_attrib(DBI::db=HASH(0x9a70858), HandleError, DBI::dr=HASH(0x9a6f8a0)) undef (not defined) connect 'sample', '', '' <- connect= DBI::db=HASH(0x9a6f864) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 598 >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 645 -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER 'PrintError' 1) thr#98bd008 STORE DBI::db=HASH(0x9a70858) 'PrintError' => 1 <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0 /i386-linux-thread-multi/DBI.pm line 645 >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 645 -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER 'AutoCommit' 1) thr#98bd008 <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0 /i386-linux-thread-multi/DBI.pm line 645 >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 648 via repro.pl line 10 -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER 'Username' '') thr#98bd008 STORE DBI::db=HASH(0x9a70858) 'Username' => '' <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0 /i386-linux-thread-multi/DBI.pm line 648 via repro.pl line 10 >> FETCH DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @2 g0 ima404 pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 648 <> FETCH= '' ('Username' from cache) at /usr/lib/perl5/site_perl/5.8.0 /i386-linux-thread-multi/DBI.pm line 648 <- connect= DBI::db=HASH(0x9a6f864) >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 668 via repro.pl line 10 -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER 'dbi_connect_closure' CODE(0x9a6f7b0)) thr#98bd008 STORE DBI::db=HASH(0x9a70858) 'dbi_connect_closure' => CODE(0x9a6f7b0) <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0 /i386-linux-thread-multi/DBI.pm line 668 via repro.pl line 10 >> prepare DISPATCH (DBI::db=HASH(0x9a6f864) rc1/1 @2 g0 ima2201 pid#30282) at repro.pl line 14 -> prepare for DBD::DB2::db (DBI::db=HASH(0x9a6f864)~0x9a70858 'SELECT procname FROM syscat.procedures') thr#98bd008 New DBI::st (for DBD::DB2::st, parent=DBI::db=HASH(0x9a70858), id=) dbih_setup_handle(DBI::st=HASH(0x9a708dc)=>DBI::st=HASH(0x9a708d0), DBD::DB2::st, 9a708e8, Null!) dbih_make_com(DBI::db=HASH(0x9a70858), 9978b28, DBD::DB2::st, 160, 0) thr#98bd008 dbih_setup_attrib(DBI::st=HASH(0x9a708d0), Err, DBI::db=HASH(0x9a70858)) SCALAR(0x99ced30) (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a708d0), State, DBI::db=HASH(0x9a70858)) SCALAR(0x99ced90) (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a708d0), Errstr, DBI::db=HASH(0x9a70858)) SCALAR(0x99ced60) (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a708d0), TraceLevel, DBI::db=HASH(0x9a70858)) 0 (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a708d0), FetchHashKeyName, DBI::db=HASH(0x9a70858)) 'NAME' (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a708d0), HandleSetErr, DBI::db=HASH(0x9a70858)) undef (not defined) dbih_setup_attrib(DBI::st=HASH(0x9a708d0), HandleError, DBI::db=HASH(0x9a70858)) undef (not defined) dbd_st_prepare'd sql f65537 SELECT procname FROM syscat.procedures fbh 0: 'PROCNAME' , type 12, 128, dsize 128, p0 s4335563 out: ftype 1, indp 0, bufl 129, rlen 129 <- prepare= DBI::st=HASH(0x9a708dc) at repro.pl line 14 >> FETCH DISPATCH (DBI::st=HASH(0x9a708d0) rc2/1 @2 g0 ima404 pid#30282) at repro.pl line 15 -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a708d0)~INNER 'NAME_lc') thr#98bd008 >> FETCH DISPATCH (DBI::st=HASH(0x9a708d0) rc3/1 @2 g0 ima404 pid#30282) at repro.pl line 15 1 -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a708d0)~INNER 'NAME') thr#98bd008 1 <- FETCH= [ 'PROCNAME' ] at repro.pl line 15 .. FETCH DBI::st=HASH(0x9a708d0) 'NAME_lc' = ARRAY(0x9a70a38) (cached) <- FETCH= [ 'procname' ] at repro.pl line 15 >> DESTROY DISPATCH (DBI::st=HASH(0x9a708dc) rc1/1 @1 g0 ima4 pid#30282) at repro.pl line 16 <> DESTROY(DBI::st=HASH(0x9a708dc)) ignored for outer handle (inner DBI::st=HASH(0x9a708d0) has ref cnt 1) >> DESTROY DISPATCH (DBI::st=HASH(0x9a708d0) rc1/1 @1 g0 ima4 pid#30282) at repro.pl line 16 -> DESTROY for DBD::DB2::st (DBI::st=HASH(0x9a708d0)~INNER) thr#98bd008 <- DESTROY= undef at repro.pl line 16 DESTROY (dbih_clearcom) (sth 0x9a708dc, com 0x9a36b90, imp DBD::DB2::st): FLAGS 0x111: COMSET Warn PrintError PARENT DBI::db=HASH(0x9a70858) KIDS 0 (0 Active) IMP_DATA undef LongReadLen 32700 NUM_OF_FIELDS 1 NUM_OF_PARAMS 0 dbih_clearcom 0x9a708dc (com 0x9a36b90, type 3) done. >> prepare DISPATCH (DBI::db=HASH(0x9a6f864) rc1/1 @2 g0 ima2201 pid#30282) at repro.pl line 14 -> prepare for DBD::DB2::db (DBI::db=HASH(0x9a6f864)~0x9a70858 'SELECT procname FROM syscat.procedures') thr#98bd008 New DBI::st (for DBD::DB2::st, parent=DBI::db=HASH(0x9a70858), id=) dbih_setup_handle(DBI::st=HASH(0x9a70984)=>DBI::st=HASH(0x9a70aa4), DBD::DB2::st, 9a7099c, Null!) dbih_make_com(DBI::db=HASH(0x9a70858), 9978b28, DBD::DB2::st, 160, 0) thr#98bd008 dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), Err, DBI::db=HASH(0x9a70858)) SCALAR(0x99ced30) (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), State, DBI::db=HASH(0x9a70858)) SCALAR(0x99ced90) (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), Errstr, DBI::db=HASH(0x9a70858)) SCALAR(0x99ced60) (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), TraceLevel, DBI::db=HASH(0x9a70858)) 0 (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), FetchHashKeyName, DBI::db=HASH(0x9a70858)) 'NAME' (already defined) dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), HandleSetErr, DBI::db=HASH(0x9a70858)) undef (not defined) dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), HandleError, DBI::db=HASH(0x9a70858)) undef (not defined) dbd_st_prepare'd sql f65537 SELECT procname FROM syscat.procedures fbh 0: 'PROCNAME' , type 12, 128, dsize 128, p0 s4335563 out: ftype 1, indp 0, bufl 129, rlen 129 <- prepare= DBI::st=HASH(0x9a70984) at repro.pl line 14 >> FETCH DISPATCH (DBI::st=HASH(0x9a70aa4) rc2/1 @2 g0 ima404 pid#30282) at repro.pl line 15 -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a70aa4)~INNER 'NAME_lc') thr#98bd008 >> FETCH DISPATCH (DBI::st=HASH(0x9a70aa4) rc3/1 @2 g0 ima404 pid#30282) at repro.pl line 15 1 -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a70aa4)~INNER 'NAME') thr#98bd008 1 <- FETCH= [ 'PROCNAME' ] at repro.pl line 15 .. FETCH DBI::st=HASH(0x9a70aa4) 'NAME_lc' = ARRAY(0x9a708e8) (cached) <- FETCH= [ 'procname' ] at repro.pl line 15 >> DESTROY DISPATCH (DBI::st=HASH(0x9a70984) rc1/1 @1 g0 ima4 pid#30282) at repro.pl line 16 <> DESTROY(DBI::st=HASH(0x9a70984)) ignored for outer handle (inner DBI::st=HASH(0x9a70aa4) has ref cnt 1) >> DESTROY DISPATCH (DBI::st=HASH(0x9a70aa4) rc1/1 @1 g0 ima4 pid#30282) at repro.pl line 16 -> DESTROY for DBD::DB2::st (DBI::st=HASH(0x9a70aa4)~INNER) thr#98bd008 <- DESTROY= undef at repro.pl line 16 DESTROY (dbih_clearcom) (sth 0x9a70984, com 0x9a70490, imp DBD::DB2::st): FLAGS 0x111: COMSET Warn PrintError PARENT DBI::db=HASH(0x9a70858) KIDS 0 (0 Active) IMP_DATA undef LongReadLen 32700 NUM_OF_FIELDS 1 NUM_OF_PARAMS 0 dbih_clearcom 0x9a70984 (com 0x9a70490, type 3) done. ... then repeats back to line beginning with >> prepare Regards, Michael Tim Bunce <[EMAIL PROTECTED] com> To dbi-announce@perl.org 03/14/2005 12:24 cc PM dbi-users@perl.org Subject ANNOUNCE DBI 1.48 Please respond to dbi-users file: $CPAN/authors/id/T/TI/TIMB/DBI-1.48.tar.gz size: 378698 bytes md5: 87396e1a9c06d1190f1ca70e1da1163e =head2 Changes in DBI 1.48 (svn rev 928), 14th March 2005 Fixed DBI::DBD::Metadata generation of type_info_all thanks to Steffen Goeldner (driver authors who have used it should rerun it). Updated docs for NULL Value placeholders thanks to Brian Campbell. Added multi-keyfield nested hash fetching to fetchall_hashref() thanks to Zhuang (John) Li for polishing up my draft. Added registered driver prefixes: amzn_ for DBD::Amazon and yaswi_ for DBD::Yaswi. =cut Enjoy! Tim.