|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>
This commit is contained in:
Marc G. Fournier 1996-08-26 20:27:46 +00:00
parent aeb6656433
commit 17c542fb43
1 changed files with 38 additions and 8 deletions

View File

@ -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);
}
/*****************************************************************************