From f4bd04bb67c5da67b4fc35aa4da4ac47cff4cd66 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 4 Dec 2001 19:40:17 +0000 Subject: [PATCH] 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... --- src/backend/commands/copy.c | 16 +++++----------- src/backend/libpq/pqcomm.c | 5 +++-- src/backend/tcop/postgres.c | 21 ++++++++++----------- src/include/libpq/libpq.h | 3 ++- 4 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 7f1e288fab..726ae39324 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -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 */ } diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 181c46416b..7a46961222 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -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) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index c7b227cd71..85d0346b65 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -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"); } /* diff --git a/src/include/libpq/libpq.h b/src/include/libpq/libpq.h index 0da1568069..a68d546d42 100644 --- a/src/include/libpq/libpq.h +++ b/src/include/libpq/libpq.h @@ -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); -- 2.11.0