From 17c542fb43e171eb7690c7e609fbc64c456d4d07 Mon Sep 17 00:00:00 2001 From: "Marc G. Fournier" Date: Mon, 26 Aug 1996 20:27:46 +0000 Subject: [PATCH] |The patch that is applied at the end of the email makes sure that these |conditions are always met. The patch can be applied to any version |of Postgres95 from 1.02 to 1.05. After applying the patch, queries |using indices on bpchar and varchar fields should (hopefully ;-) ) |always return the same tuple set regardless to the fact whether |indices are used or not. | Submitted by: Gerhard Reithofer --- src/backend/utils/adt/varchar.c | 46 +++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index f33295d27d..8abbef999a 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.2 1996/07/15 19:11:23 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.2.2.1 1996/08/26 20:27:46 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -245,13 +245,18 @@ int32 bpcharle(char *arg1, char *arg2) { int len1, len2; + int cmp; if (arg1 == NULL || arg2 == NULL) return((int32) 0); len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - return(strncmp(arg1+4, arg2+4, Min(len1,len2)) <= 0); + cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); + if (0 == cmp) + return (int32)(len1 <= len2 ? 1 : 0); + else + return (int32)(cmp <= 0); } int32 @@ -276,24 +281,34 @@ int32 bpcharge(char *arg1, char *arg2) { int len1, len2; + int cmp; if (arg1 == NULL || arg2 == NULL) return((int32) 0); len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - return(strncmp(arg1+4, arg2+4, Min(len1,len2)) >= 0); + cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); + if (0 == cmp) + return (int32)(len1 >= len2 ? 1 : 0); + else + return (int32)(cmp >= 0); } int32 bpcharcmp(char *arg1, char *arg2) { int len1, len2; + int cmp; len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - return(strncmp(arg1+4, arg2+4, Min(len1,len2))); + cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); + if ((0 == cmp) && (len1 != len2)) + return (int32)(len1 < len2 ? -1 : 1); + else + return cmp; } /***************************************************************************** @@ -369,13 +384,18 @@ int32 varcharle(char *arg1, char *arg2) { int len1, len2; + int cmp; if (arg1 == NULL || arg2 == NULL) return((int32) 0); len1 = vcTruelen(arg1); len2 = vcTruelen(arg2); - return(strncmp(arg1+4, arg2+4, Min(len1,len2)) <= 0); + cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); + if (0 == cmp) + return (int32)( len1 <= len2 ? 1 : 0); + else + return (int32)(cmp <= 0); } int32 @@ -400,24 +420,34 @@ int32 varcharge(char *arg1, char *arg2) { int len1, len2; + int cmp; if (arg1 == NULL || arg2 == NULL) return((int32) 0); len1 = vcTruelen(arg1); len2 = vcTruelen(arg2); - return(strncmp(arg1+4, arg2+4, Min(len1,len2)) >= 0); + cmp = strncmp(arg1+4, arg2+4, Min(len1,len2)); + if (0 == cmp) + return (int32)(len1 >= len2 ? 1 : 0); + else + return (int32)(cmp >= 0); + } int32 varcharcmp(char *arg1, char *arg2) { int len1, len2; + int cmp; len1 = vcTruelen(arg1); len2 = vcTruelen(arg2); - - return(strncmp(arg1+4, arg2+4, Min(len1,len2))); + cmp = (strncmp(arg1+4, arg2+4, Min(len1,len2))); + if ((0 == cmp) && (len1 != len2)) + return (int32)(len1 < len2 ? -1 : 1); + else + return (int32)(cmp); } /***************************************************************************** -- 2.50.0