summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc G. Fournier1996-08-26 20:38:52 +0000
committerMarc G. Fournier1996-08-26 20:38:52 +0000
commit491b9b89c42ceab56cf2daec11a61adedd9f7180 (patch)
tree0bdc6e3a19b42e51454e8c5bb94793bb9516f4c1
parente78fe652f48f9dbb67a21f616741e7b446204cbe (diff)
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 <[email protected]>
-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 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);
}
/*****************************************************************************