From: Marc G. Fournier Date: Mon, 26 Aug 1996 20:27:46 +0000 (+0000) Subject: |The patch that is applied at the end of the email makes sure that these X-Git-Tag: PG95-1_08~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=17c542fb43e171eb7690c7e609fbc64c456d4d07;p=thirdparty%2Fpostgresql.git |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 --- diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index f33295d27db..8abbef999a3 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); } /*****************************************************************************