summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1996-08-26 20:27:46 +0000
committerMarc G. Fournier <scrappy@hub.org>1996-08-26 20:27:46 +0000
commit17c542fb43e171eb7690c7e609fbc64c456d4d07 (patch)
treefb3a8d0520aff7da8ef4eec197a0390385eb73aa
parentaeb6656433e13f4d0dc382d18aa93373ed744c8a (diff)
downloadpostgresql-17c542fb43e171eb7690c7e609fbc64c456d4d07.tar.gz
|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>
-rw-r--r--src/backend/utils/adt/varchar.c46
1 files 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);
}
/*****************************************************************************