Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 491b9b8

Browse files
committed
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>
1 parent e78fe65 commit 491b9b8

File tree

1 file changed

+38
-8
lines changed

1 file changed

+38
-8
lines changed

src/backend/utils/adt/varchar.c

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.2 1996/07/15 19:11:23 scrappy Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.3 1996/08/26 20:38:52 scrappy Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -245,13 +245,18 @@ int32
245245
bpcharle(char *arg1, char *arg2)
246246
{
247247
int len1, len2;
248+
int cmp;
248249

249250
if (arg1 == NULL || arg2 == NULL)
250251
return((int32) 0);
251252
len1 = bcTruelen(arg1);
252253
len2 = bcTruelen(arg2);
253254

254-
return(strncmp(arg1+4, arg2+4, Min(len1,len2)) <= 0);
255+
cmp = strncmp(arg1+4, arg2+4, Min(len1,len2));
256+
if (0 == cmp)
257+
return (int32)(len1 <= len2 ? 1 : 0);
258+
else
259+
return (int32)(cmp <= 0);
255260
}
256261

257262
int32
@@ -276,24 +281,34 @@ int32
276281
bpcharge(char *arg1, char *arg2)
277282
{
278283
int len1, len2;
284+
int cmp;
279285

280286
if (arg1 == NULL || arg2 == NULL)
281287
return((int32) 0);
282288
len1 = bcTruelen(arg1);
283289
len2 = bcTruelen(arg2);
284290

285-
return(strncmp(arg1+4, arg2+4, Min(len1,len2)) >= 0);
291+
cmp = strncmp(arg1+4, arg2+4, Min(len1,len2));
292+
if (0 == cmp)
293+
return (int32)(len1 >= len2 ? 1 : 0);
294+
else
295+
return (int32)(cmp >= 0);
286296
}
287297

288298
int32
289299
bpcharcmp(char *arg1, char *arg2)
290300
{
291301
int len1, len2;
302+
int cmp;
292303

293304
len1 = bcTruelen(arg1);
294305
len2 = bcTruelen(arg2);
295306

296-
return(strncmp(arg1+4, arg2+4, Min(len1,len2)));
307+
cmp = strncmp(arg1+4, arg2+4, Min(len1,len2));
308+
if ((0 == cmp) && (len1 != len2))
309+
return (int32)(len1 < len2 ? -1 : 1);
310+
else
311+
return cmp;
297312
}
298313

299314
/*****************************************************************************
@@ -369,13 +384,18 @@ int32
369384
varcharle(char *arg1, char *arg2)
370385
{
371386
int len1, len2;
387+
int cmp;
372388

373389
if (arg1 == NULL || arg2 == NULL)
374390
return((int32) 0);
375391
len1 = vcTruelen(arg1);
376392
len2 = vcTruelen(arg2);
377393

378-
return(strncmp(arg1+4, arg2+4, Min(len1,len2)) <= 0);
394+
cmp = strncmp(arg1+4, arg2+4, Min(len1,len2));
395+
if (0 == cmp)
396+
return (int32)( len1 <= len2 ? 1 : 0);
397+
else
398+
return (int32)(cmp <= 0);
379399
}
380400

381401
int32
@@ -400,24 +420,34 @@ int32
400420
varcharge(char *arg1, char *arg2)
401421
{
402422
int len1, len2;
423+
int cmp;
403424

404425
if (arg1 == NULL || arg2 == NULL)
405426
return((int32) 0);
406427
len1 = vcTruelen(arg1);
407428
len2 = vcTruelen(arg2);
408429

409-
return(strncmp(arg1+4, arg2+4, Min(len1,len2)) >= 0);
430+
cmp = strncmp(arg1+4, arg2+4, Min(len1,len2));
431+
if (0 == cmp)
432+
return (int32)(len1 >= len2 ? 1 : 0);
433+
else
434+
return (int32)(cmp >= 0);
435+
410436
}
411437

412438
int32
413439
varcharcmp(char *arg1, char *arg2)
414440
{
415441
int len1, len2;
442+
int cmp;
416443

417444
len1 = vcTruelen(arg1);
418445
len2 = vcTruelen(arg2);
419-
420-
return(strncmp(arg1+4, arg2+4, Min(len1,len2)));
446+
cmp = (strncmp(arg1+4, arg2+4, Min(len1,len2)));
447+
if ((0 == cmp) && (len1 != len2))
448+
return (int32)(len1 < len2 ? -1 : 1);
449+
else
450+
return (int32)(cmp);
421451
}
422452

423453
/*****************************************************************************

0 commit comments

Comments
 (0)