]> granicus.if.org Git - postgresql/commitdiff
|The patch that is applied at the end of the email makes sure that these
authorMarc G. Fournier <scrappy@hub.org>
Mon, 26 Aug 1996 20:27:46 +0000 (20:27 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Mon, 26 Aug 1996 20:27:46 +0000 (20:27 +0000)
|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>

src/backend/utils/adt/varchar.c

index f33295d27db6f00cf72fdf5eadcdca6190ea493f..8abbef999a3a8e46fe639e8bf31835b8a3ebd26d 100644 (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);
 }
 
 /*****************************************************************************