Thread: PGexec dumps core at pqResultAlloc

PGexec dumps core at pqResultAlloc

From
"ryan p bobko"
Date:
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


Re: PGexec dumps core at pqResultAlloc

From
ljb
Date:
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.

Re: PGexec dumps core at pqResultAlloc

From
Shridhar Daithankar
Date:
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