From e04fa58dcdf59e480db4a65be3d731d45a99fa3d Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 1 Mar 2008 03:26:35 +0000
Subject: [PATCH] Fix unportable usages of tolower().  On signed-char machines,
 it is necessary to explicitly cast the output back to char before comparing
 it to a char value, else we get the wrong result for high-bit-set characters.
  Found by Rolf Jentsch.  Also, fix several places where <ctype.h> functions
 were being called without casting the argument to unsigned char; this is
 likewise unportable, but we keep making that mistake :-(.  These found by
 buildfarm member salamander, which I will desperately miss if it ever goes
 belly-up.

---
 src/backend/utils/adt/like_match.c    |  4 ++--
 src/interfaces/ecpg/ecpglib/execute.c | 10 ++++++----
 src/interfaces/ecpg/preproc/preproc.y |  4 ++--
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/backend/utils/adt/like_match.c b/src/backend/utils/adt/like_match.c
index 915b9bd0d7e..4a8f96c7d40 100644
--- a/src/backend/utils/adt/like_match.c
+++ b/src/backend/utils/adt/like_match.c
@@ -19,7 +19,7 @@
  * Copyright (c) 1996-2008, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *	$PostgreSQL: pgsql/src/backend/utils/adt/like_match.c,v 1.20 2008/01/01 19:45:52 momjian Exp $
+ *	$PostgreSQL: pgsql/src/backend/utils/adt/like_match.c,v 1.21 2008/03/01 03:26:34 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -71,7 +71,7 @@
  */
 
 #ifdef MATCH_LOWER
-#define TCHAR(t) tolower((t))
+#define TCHAR(t) ((char) tolower((unsigned char) (t)))
 #else
 #define TCHAR(t) (t)
 #endif
diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c
index 20231c62a7d..f7bfd9dca7f 100644
--- a/src/interfaces/ecpg/ecpglib/execute.c
+++ b/src/interfaces/ecpg/ecpglib/execute.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.76 2008/02/07 11:09:12 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.77 2008/03/01 03:26:34 tgl Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -122,13 +122,15 @@ next_insert(char *text, int pos, bool questionmarks)
 			string = string ? false : true;
 		else if (!string)
 		{
-			if (text[p] == '$' && isdigit(text[p + 1]))
+			if (text[p] == '$' && isdigit((unsigned char) text[p + 1]))
 			{
 				/* this can be either a dollar quote or a variable */
 				int			i;
 
-				for (i = p + 1; isdigit(text[i]); i++);
-				if (!isalpha(text[i]) && isascii(text[i]) && text[i] != '_')
+				for (i = p + 1; isdigit((unsigned char) text[i]); i++)
+					/* empty loop body */ ;
+				if (!isalpha((unsigned char) text[i]) &&
+					isascii((unsigned char) text[i]) && text[i] != '_')
 					/* not dollar delimited quote */
 					return p;
 			}
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 43efc431dba..0cc168b9064 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.361 2008/02/15 22:17:06 tgl Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.362 2008/03/01 03:26:35 tgl Exp $ */
 
 /* Copyright comment */
 %{
@@ -5847,7 +5847,7 @@ prepared_name: name	 	{
 						int i;
 
 						for (i = 0; i< strlen($1); i++)
-							$1[i] = tolower($1[i]);
+							$1[i] = tolower((unsigned char) $1[i]);
 
 						$$ = make3_str(make_str("\""), $1, make_str("\""));
 					}
-- 
GitLab