Обсуждение: partial PGresult in pgsql v8.2rc1

Поиск
Список
Период
Сортировка

partial PGresult in pgsql v8.2rc1

От
Igor Shevchenko
Дата:
Hi All,

I've been using partial PGresult-s since pgsql v7.4, and one of "signs" that
it's there (after a "read" event on a non-blocking tcp connection to pgsql +
a call to PQconsumeInput) is a check: "pgconn->result != NULL", where pgconn
is a pointer to a PGconn object. Looks like in v8.2rc1, the "result" can have
wrong pointers - my test app dies with the following trace:

#0  0x00e065a8 in PQntuples (res=0x11f) at fe-exec.c:2063
#1  0x080a1a75 in pg::db::can_read (this=0xa3b2f78) at pgdb.cpp:197

where: pgdb.cpp:

197:    if ( conn->result != NULL && PQntuples ( conn->result ) ) {

fe-exec.c:2063:

int
PQntuples(const PGresult *res)
{
        if (!res)
                return 0;
2063:        return res->ntups;
}


Looks like the "result" has an invalid pointer ? Address=0x11f is unlikely.

--
Best Regards,
Igor Shevchenko

Re: partial PGresult in pgsql v8.2rc1

От
Tom Lane
Дата:
Igor Shevchenko <igor@carcass.ath.cx> writes:
> I've been using partial PGresult-s since pgsql v7.4, and one of "signs" that
> it's there (after a "read" event on a non-blocking tcp connection to pgsql +
> a call to PQconsumeInput) is a check: "pgconn->result != NULL", where pgconn
> is a pointer to a PGconn object.

PGconn is not an exported struct, and so what you are doing is unsupported,
but I'll bet your app was compiled against the wrong version of libpq-int.h.

            regards, tom lane

Re: partial PGresult in pgsql v8.2rc1

От
Igor Shevchenko
Дата:
On Friday 01 December 2006 19:52, you wrote:
> Igor Shevchenko <igor@carcass.ath.cx> writes:
> > I've been using partial PGresult-s since pgsql v7.4, and one of "signs"
> > that it's there (after a "read" event on a non-blocking tcp connection to
> > pgsql + a call to PQconsumeInput) is a check: "pgconn->result != NULL",
> > where pgconn is a pointer to a PGconn object.
>
> PGconn is not an exported struct, and so what you are doing is unsupported,
> but I'll bet your app was compiled against the wrong version of
> libpq-int.h.

Thanks Tom, that was it. An old libpq-int.h was compiled into a precompiled
header.

The reason I'm using libpq-int.h is that I can use SELECT-ed data from
not-yet-complete queries, and this is very useful for long searches which
yeld data from time to time. The only other approach I can think of, cursor
open / fetch, causes bidirectional network traffic and it's not very
efficient when there are many immediate results. OFC I understand that using
internal libpq stuff means I'm on my own, so I was thinking will you accept a
patch which would allow libpq provide data from incomplete queries ? I've
asked about this before, your statement was that this breaks the consistency,
but sometimes it doesn't really matter, e.g. with searches.

--
Best Regards,
Igor Shevchenko