nonblocking PQsendQuery will fail for querysize > 8k

From: Andreas Pflug <Andreas(dot)Pflug(at)web(dot)de>
To: pgsql-interfaces(at)postgresql(dot)org
Subject: nonblocking PQsendQuery will fail for querysize > 8k
Date: 2003-03-31 23:24:18
Message-ID: 3E88CE22.8010503@web.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-interfaces

Repost from pgadmin-hackers
This happens with 7.3.2 windows libpq.

Regards,

Andreas

> -----Original Message-----
> From: Andreas Pflug [mailto:Andreas(dot)Pflug(at)web(dot)de]
> Sent: 31 March 2003 17:57
> To: pgadmin-hackers(at)postgresql(dot)org
> Subject: Re: [pgadmin-hackers] Maximum PQsendQuery size?
>
>
> Andreas Pflug wrote:
>
> > I'm having trouble with PQsendQuery if sending medium sized
> queries.
> > Everything's fine with queries up to 8190 bytes (0x1fffe), but one
> > byte more will not work. In this case, PQsendQuery and
> PQconsumeInput
> > will return ok, but PQisBusy stays busy. How can I get around this?
> >
> > Regards,
> >
> > Andreas
> >
> >
> I already found a solution in pgsql/src/interfaces/libpq/fe-misc.c.
>
> conn->outBuffer initially has 8k size. For a successful 8190 byte
> execute, this contains a 'Q', the query and the terminating
> zero byte.
> If pqPutBytes() finds avail to be too small, it will first try to
> pqSendSome(), but this will not be good if the connection is
> nonblocking.
>
> As a fix, the outbuffer is realloced to be big enough, before
> processing
> continues:
>
> avail = Max(conn->outBufSize - conn->outCount, 0);
> >>>>>
> if (nbytes > avail && pqIsnonblocking(conn))
> {
> char *newbuf;
> conn->outBufSize = conn->outBufSize - avail + nbytes;
> newbuf = realloc(conn->outBuffer, conn->outBufSize);
> conn->outBuffer = newbuf;
> avail = conn->outBufSize - conn->outCount;
> }
> <<<<<
> remaining = Min(avail, nbytes);
>
>

Responses

Browse pgsql-interfaces by date

  From Date Subject
Next Message Rudy Lippan 2003-03-31 23:49:02 Re: Release of DBD-pg 1.22
Previous Message Tom Lane 2003-03-31 23:06:46 Re: Oracle Porting, Compiere