diff options
author | Marc G. Fournier <scrappy@hub.org> | 1996-08-26 20:38:52 +0000 |
---|---|---|
committer | Marc G. Fournier <scrappy@hub.org> | 1996-08-26 20:38:52 +0000 |
commit | 491b9b89c42ceab56cf2daec11a61adedd9f7180 (patch) | |
tree | 0bdc6e3a19b42e51454e8c5bb94793bb9516f4c1 /src | |
parent | e78fe652f48f9dbb67a21f616741e7b446204cbe (diff) | |
download | postgresql-491b9b89c42ceab56cf2daec11a61adedd9f7180.tar.gz postgresql-491b9b89c42ceab56cf2daec11a61adedd9f7180.zip |
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 <tbr_laa@AON.AT>
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/adt/varchar.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index f33295d27db..025c5a57565 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.3 1996/08/26 20:38:52 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); } /***************************************************************************** |