Skip to content
Snippets Groups Projects
Commit 491b9b89 authored by Marc G. Fournier's avatar Marc G. Fournier
Browse files

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>
parent e78fe652
No related branches found
No related tags found
No related merge requests found
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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 ...@@ -245,13 +245,18 @@ int32
bpcharle(char *arg1, char *arg2) bpcharle(char *arg1, char *arg2)
{ {
int len1, len2; int len1, len2;
int cmp;
if (arg1 == NULL || arg2 == NULL) if (arg1 == NULL || arg2 == NULL)
return((int32) 0); return((int32) 0);
len1 = bcTruelen(arg1); len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2); 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 int32
...@@ -276,24 +281,34 @@ int32 ...@@ -276,24 +281,34 @@ int32
bpcharge(char *arg1, char *arg2) bpcharge(char *arg1, char *arg2)
{ {
int len1, len2; int len1, len2;
int cmp;
if (arg1 == NULL || arg2 == NULL) if (arg1 == NULL || arg2 == NULL)
return((int32) 0); return((int32) 0);
len1 = bcTruelen(arg1); len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2); 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 int32
bpcharcmp(char *arg1, char *arg2) bpcharcmp(char *arg1, char *arg2)
{ {
int len1, len2; int len1, len2;
int cmp;
len1 = bcTruelen(arg1); len1 = bcTruelen(arg1);
len2 = bcTruelen(arg2); 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 ...@@ -369,13 +384,18 @@ int32
varcharle(char *arg1, char *arg2) varcharle(char *arg1, char *arg2)
{ {
int len1, len2; int len1, len2;
int cmp;
if (arg1 == NULL || arg2 == NULL) if (arg1 == NULL || arg2 == NULL)
return((int32) 0); return((int32) 0);
len1 = vcTruelen(arg1); len1 = vcTruelen(arg1);
len2 = vcTruelen(arg2); 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 int32
...@@ -400,24 +420,34 @@ int32 ...@@ -400,24 +420,34 @@ int32
varcharge(char *arg1, char *arg2) varcharge(char *arg1, char *arg2)
{ {
int len1, len2; int len1, len2;
int cmp;
if (arg1 == NULL || arg2 == NULL) if (arg1 == NULL || arg2 == NULL)
return((int32) 0); return((int32) 0);
len1 = vcTruelen(arg1); len1 = vcTruelen(arg1);
len2 = vcTruelen(arg2); 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 int32
varcharcmp(char *arg1, char *arg2) varcharcmp(char *arg1, char *arg2)
{ {
int len1, len2; int len1, len2;
int cmp;
len1 = vcTruelen(arg1); len1 = vcTruelen(arg1);
len2 = vcTruelen(arg2); len2 = vcTruelen(arg2);
cmp = (strncmp(arg1+4, arg2+4, Min(len1,len2)));
return(strncmp(arg1+4, arg2+4, Min(len1,len2))); if ((0 == cmp) && (len1 != len2))
return (int32)(len1 < len2 ? -1 : 1);
else
return (int32)(cmp);
} }
/***************************************************************************** /*****************************************************************************
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment