Thread

  1. PGexec dumps core at pqResultAlloc

    ryan p bobko <ryan@ostrich-emulators.com> — 2003-11-11T15:12:50Z

    Hi All,
    I'm trying to write a Postgres database plugin in an application of mine.
    The rest of the app is written in C++, but I'm NOT interested in using
    libpqxx at this time. This plugin will be dynamically loaded, and other
    plugins I've written seem to work just fine. 
    
    The problem appears to be in my second call to the connection pointer. The
    first select statement I made works just fine (though no rows are returned),
    but the second time I try to run a select statement, I get a core. Running
    multiple queries in psql work perfectly. Here's the stacktrace form my dump:
    
    #0  0x408cf47e in malloc_consolidate () from /lib/libc.so.6
    #1  0x408ced83 in _int_malloc () from /lib/libc.so.6
    #2  0x408cdf1a in malloc () from /lib/libc.so.6
    #3  0x40c834cd in pqResultAlloc (res=0x4098a9a0, nBytes=1083746720,
    isBinary=1 '\001') at fe-exec.c:496
    #4  0x40c83e18 in getRowDescriptions (conn=0x80699b8) at fe-exec.c:1129 
    #5  0x40c83d5f in parseInput (conn= x80699b8) at fe-exec.c:1023 
    #6  0x40c8437b in PQgetResult (conn=0x80699b8) at fe-exec.c:1349 
    #7  0x40c84489 in PQexec (conn=0x80699b8, query=0x8070398 "select * from
    accounts where ID!=0") at fe-exec.c:1461
    
    The code is pretty basic, in my opinion. The following is the snippet that's
    failling. By the time execution gets to this point, the connection is open,
    and the first line always prints 0 1 0
    ---
    	cout<<conn<<": "<<PQstatus( conn )<<" "<<CONNECTION_BAD<<"
    "<<CONNECTION_OK<<endl;
    	
    	PGresult * result=PQexec( conn, "BEGIN" );
    	cout<<"here a"<<endl;
    	PQclear( result );
    
    	cout<<"here a.1"<<endl;
    	result=PQexec( conn, stmt );
    	cout<<"here a.2"<<endl;
    --
    
    Platform: Slackware Linux 9.1, x86, gcc-3.2.3 
    
    I would appreciate any help I can get at this point. It looks like someone
    had a similar issue back in 1998, but I can't imagine this is the same
    error. Thanks for your help,
    
    ry
    
    
    
  2. Re: PGexec dumps core at pqResultAlloc

    ljb <ljb220@mindspring.com> — 2003-11-13T01:10:40Z

    ryan@ostrich-emulators.com wrote:
    >...
    > #0  0x408cf47e in malloc_consolidate () from /lib/libc.so.6
    > #1  0x408ced83 in _int_malloc () from /lib/libc.so.6
    > #2  0x408cdf1a in malloc () from /lib/libc.so.6
    > #3  0x40c834cd in pqResultAlloc (res=0x4098a9a0, nBytes=1083746720,
    > isBinary=1 '\001') at fe-exec.c:496
    > #4  0x40c83e18 in getRowDescriptions (conn=0x80699b8) at fe-exec.c:1129 
    > #5  0x40c83d5f in parseInput (conn= x80699b8) at fe-exec.c:1023 
    > #6  0x40c8437b in PQgetResult (conn=0x80699b8) at fe-exec.c:1349 
    > #7  0x40c84489 in PQexec (conn=0x80699b8, query=0x8070398 "select * from
    > accounts where ID!=0") at fe-exec.c:1461
    >
    > The code is pretty basic, in my opinion. The following is the snippet that's
    > failling. By the time execution gets to this point, the connection is open,
    > and the first line always prints 0 1 0
    > ---
    > 	cout<<conn<<": "<<PQstatus( conn )<<" "<<CONNECTION_BAD<<"
    > "<<CONNECTION_OK<<endl;
    > 	
    > 	PGresult * result=PQexec( conn, "BEGIN" );
    > 	cout<<"here a"<<endl;
    > 	PQclear( result );
    >
    > 	cout<<"here a.1"<<endl;
    > 	result=PQexec( conn, stmt );
    > 	cout<<"here a.2"<<endl;
    > --
    >
    > Platform: Slackware Linux 9.1, x86, gcc-3.2.3 
    
    If you aren't getting answers it's not because nobody looked at this. I
    did, and I can't figure it out. You are apparently running 7.3.x based on
    the code line numbers. The only way pqResultAlloc could be asked to
    allocate 1,083,746,720 bytes there would be if you had a table with
    67,734,170 columns which is impossible - the protocol simply doesn't allow
    it. Sorry this doesn't help, but either your PostgreSQL server is returning
    garbage for the RowDescription message, or something else is badly awry in
    your program.
    
    
  3. Re: PGexec dumps core at pqResultAlloc

    Shridhar Daithankar <shridhar_daithankar@persistent.co.in> — 2003-11-13T06:12:32Z

    ljb wrote:
    
    >ryan@ostrich-emulators.com wrote:
    >  
    >
    >>...
    >>#0  0x408cf47e in malloc_consolidate () from /lib/libc.so.6
    >>#1  0x408ced83 in _int_malloc () from /lib/libc.so.6
    >>#2  0x408cdf1a in malloc () from /lib/libc.so.6
    >>#3  0x40c834cd in pqResultAlloc (res=0x4098a9a0, nBytes=1083746720,
    >>isBinary=1 '\001') at fe-exec.c:496
    >>#4  0x40c83e18 in getRowDescriptions (conn=0x80699b8) at fe-exec.c:1129 
    >>#5  0x40c83d5f in parseInput (conn= x80699b8) at fe-exec.c:1023 
    >>#6  0x40c8437b in PQgetResult (conn=0x80699b8) at fe-exec.c:1349 
    >>#7  0x40c84489 in PQexec (conn=0x80699b8, query=0x8070398 "select * from
    >>accounts where ID!=0") at fe-exec.c:1461
    >>
    >>The code is pretty basic, in my opinion. The following is the snippet that's
    >>failling. By the time execution gets to this point, the connection is open,
    >>and the first line always prints 0 1 0
    >>---
    >>	cout<<conn<<": "<<PQstatus( conn )<<" "<<CONNECTION_BAD<<"
    >>"<<CONNECTION_OK<<endl;
    >>	
    >>	PGresult * result=PQexec( conn, "BEGIN" );
    >>	cout<<"here a"<<endl;
    >>	PQclear( result );
    >>
    >>	cout<<"here a.1"<<endl;
    >>	result=PQexec( conn, stmt );
    >>	cout<<"here a.2"<<endl;
    >>--
    >>
    >>Platform: Slackware Linux 9.1, x86, gcc-3.2.3 
    >>    
    >>
    >
    >If you aren't getting answers it's not because nobody looked at this. I
    >did, and I can't figure it out. You are apparently running 7.3.x based on
    >  
    >
    Same here..:-)
    
     I had a thought  yesterday but didn't put it because was not sure how 
    helpful it is... anyways..
    
    Are your postgresql include headers are within a extern "C" block? In 
    C++, that can cause quite a grief. Check it out..
    
     Shridhar