nonblocking PQsendQuery will fail for querysize > 8k
От | Andreas Pflug |
---|---|
Тема | nonblocking PQsendQuery will fail for querysize > 8k |
Дата | |
Msg-id | 3E88CE22.8010503@web.de обсуждение исходный текст |
Ответы |
Re: nonblocking PQsendQuery will fail for querysize > 8k
|
Список | pgsql-interfaces |
Repost from pgadmin-hackers This happens with 7.3.2 windows libpq. Regards, Andreas > -----Original Message----- > From: Andreas Pflug [mailto:Andreas.Pflug@web.de] > Sent: 31 March 2003 17:57 > To: pgadmin-hackers@postgresql.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); > >
В списке pgsql-interfaces по дате отправления: