From f4bd04bb67c5da67b4fc35aa4da4ac47cff4cd66 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
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 7f1e288fab9..726ae39324f 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 181c46416b7..7a46961222c 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 c7b227cd715..85d0346b65e 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 0da1568069e..a68d546d425 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);
-- 
GitLab