Re: '_' < '5' -- different answer on 7.2 and 7.3

From: Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com>
To: David Blasby <dblasby(at)refractions(dot)net>
Cc: <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: '_' < '5' -- different answer on 7.2 and 7.3
Date: 2003-07-04 23:34:31
Message-ID: 20030704162603.I26906-100000@megazone23.bigpanda.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


On Fri, 4 Jul 2003, David Blasby wrote:

> > My first guess would be that you're not running in "C" locale
> > on the 7.3 system. I get false on my 7.3.1 system in C locale,
> > but if I compare the two strings in C using en_US for example I
> > seem to get results like the above ('_'<'5' is true).
>
> It turns out our 7.3 database was somehow initd with local "en_US".

> But in MS vc++:
>
> TRACE("locale set to 'en_US'\n");
> setlocale( LC_ALL, "English_United States" );
> if (strcoll("_5","5") <0 )
> TRACE("strcoll('_5','5') -- <0 \n");
> else
> TRACE( "strcoll('_5','5') -- >=0\n");
>
> returns:
> locale set to 'en_US'
> strcoll('_5','5') -- <0
>
>
> Which is to say postgresql thinks "_5" > "5", but
> (a bit strangely) "_" < "5" (the '>' and '<' are reversed).
>
> vc++ thinks "_5" < "5" and "_" < "5".
>

> So, which one is correct and why does the other disagree?

Probably different definitions of the locale.

What type of system is the server on?
Under Redhat 9, en_US, doing a small C program

#include <stdio.h>
#include <locale.h>
#include <string.h>

int main() {
setlocale( LC_ALL, "en_US" );
printf("%d\n", strcoll("_5", "5"));
printf("%d\n", strcoll("_", "5"));
}

I get
1
-1

Which would appear to match what you're seeing from PostgreSQL.

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Dan Langille 2003-07-05 00:58:17 Re: Are we backwards on the sign of timezones?
Previous Message David Blasby 2003-07-04 23:00:40 Re: '_' < '5' -- different answer on 7.2 and 7.3