Commit f4bd04bb authored by Tom Lane's avatar Tom Lane

Replace pq_getbytes(&ch, 1) calls with pq_getbyte(), which is easier

to use and significantly faster.  This tweak saves 25% (!) of the runtime
of COPY IN in a test with 8000-character lines.  I wouldn't normally
commit a performance improvement this late in the cycle, but 25% got
my attention...
parent dae887ab
......@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.142 2001/10/25 05:49:24 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.143 2001/12/04 19:40:16 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -157,13 +157,10 @@ CopyGetChar(FILE *fp)
{
if (!fp)
{
unsigned char ch;
int ch = pq_getbyte();
if (pq_getbytes((char *) &ch, 1))
{
if (ch == EOF)
fe_eof = true;
return EOF;
}
return ch;
}
else
......@@ -209,12 +206,9 @@ CopyDonePeek(FILE *fp, int c, int pickup)
if (pickup)
{
/*
* We want to pick it up - just receive again into dummy
* buffer
* We want to pick it up
*/
char c;
pq_getbytes(&c, 1);
(void) pq_getbyte();
}
/* If we didn't want to pick it up, just leave it where it sits */
}
......
......@@ -29,7 +29,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: pqcomm.c,v 1.124 2001/11/12 04:54:08 tgl Exp $
* $Id: pqcomm.c,v 1.125 2001/12/04 19:40:17 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -47,6 +47,7 @@
* low-level I/O:
* pq_getbytes - get a known number of bytes from connection
* pq_getstring - get a null terminated string from connection
* pq_getbyte - get next byte from connection
* pq_peekbyte - peek at next byte from connection
* pq_putbytes - send bytes to connection (not flushed until pq_flush)
* pq_flush - flush pending output
......@@ -527,7 +528,7 @@ pq_recvbuf(void)
* pq_getbyte - get a single byte from connection, or return EOF
* --------------------------------
*/
static int
int
pq_getbyte(void)
{
while (PqRecvPointer >= PqRecvLength)
......
......@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.242 2001/11/10 23:51:14 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.243 2001/12/04 19:40:17 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
......@@ -242,25 +242,25 @@ InteractiveBackend(StringInfo inBuf)
static int
SocketBackend(StringInfo inBuf)
{
char qtype;
char result = '\0';
int qtype;
/*
* get input from the frontend
*/
qtype = '?';
if (pq_getbytes(&qtype, 1) == EOF)
return EOF;
qtype = pq_getbyte();
switch (qtype)
{
case EOF:
/* frontend disconnected */
break;
/*
* 'Q': user entered a query
*/
case 'Q':
if (pq_getstr(inBuf))
return EOF;
result = 'Q';
break;
/*
......@@ -269,14 +269,12 @@ SocketBackend(StringInfo inBuf)
case 'F':
if (pq_getstr(inBuf))
return EOF; /* ignore "string" at start of F message */
result = 'F';
break;
/*
* 'X': frontend is exiting
*/
case 'X':
result = 'X';
break;
/*
......@@ -289,7 +287,8 @@ SocketBackend(StringInfo inBuf)
elog(FATAL, "Socket command type %c unknown", qtype);
break;
}
return result;
return qtype;
}
/* ----------------
......@@ -1627,7 +1626,7 @@ PostgresMain(int argc, char *argv[], const char *username)
if (!IsUnderPostmaster)
{
puts("\nPOSTGRES backend interactive interface ");
puts("$Revision: 1.242 $ $Date: 2001/11/10 23:51:14 $\n");
puts("$Revision: 1.243 $ $Date: 2001/12/04 19:40:17 $\n");
}
/*
......
......@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: libpq.h,v 1.48 2001/11/05 17:46:33 momjian Exp $
* $Id: libpq.h,v 1.49 2001/12/04 19:40:17 tgl Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -62,6 +62,7 @@ extern void StreamClose(int sock);
extern void pq_init(void);
extern int pq_getbytes(char *s, size_t len);
extern int pq_getstring(StringInfo s);
extern int pq_getbyte(void);
extern int pq_peekbyte(void);
extern int pq_putbytes(const char *s, size_t len);
extern int pq_flush(void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment