Setting locale per connection

Started by Behdad Esfahbodover 22 years ago8 messages
#1Behdad Esfahbod
behdad@bamdad.org
1 attachment(s)

Hi all,

I'm new to the list, so don't flame at the first date ;).

I usually use PostgreSQL for multiple languages, so I needed to
set locale per connection, or can change the locale on the fly.
I don't know if there is any such ability integrated in or not,
so I have wrote my 10lines function as a wrapper around
setlocale, that is attached. So what I do is just a simple
"SELECT locale('LC_COLLATE', 'fa_IR');" at connection time. Let
me know if there is any standard way already implemented.

Another silly question, isn't any way to get rid of seqscan, when
doing 'SELECT count(*) FROM tab;'?

Yours,
behdad

--
Behdad Esfahbod 11 Tir 1382, 2003 Jul 2
http://behdad.org/ [Finger for Geek Code]

If you do a job too well, you'll get stuck with it.

Attachments:

pgbe_setlocale.ctext/plain; charset=US-ASCII; name=pgbe_setlocale.cDownload
#2Alvaro Herrera
alvherre@dcc.uchile.cl
In reply to: Behdad Esfahbod (#1)
Re: Setting locale per connection

On Wed, Jul 02, 2003 at 07:22:51AM +0430, Behdad Esfahbod wrote:

Another silly question, isn't any way to get rid of seqscan, when
doing 'SELECT count(*) FROM tab;'?

No :-( If you want to do that frequently, you should try to find
another way to keep the count.

--
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Crear es tan dificil como ser libre" (Elsa Triolet)

#3Stephan Szabo
sszabo@megazone23.bigpanda.com
In reply to: Behdad Esfahbod (#1)
Re: Setting locale per connection

On Wed, 2 Jul 2003, Behdad Esfahbod wrote:

I'm new to the list, so don't flame at the first date ;).

I usually use PostgreSQL for multiple languages, so I needed to
set locale per connection, or can change the locale on the fly.
I don't know if there is any such ability integrated in or not,
so I have wrote my 10lines function as a wrapper around
setlocale, that is attached. So what I do is just a simple
"SELECT locale('LC_COLLATE', 'fa_IR');" at connection time. Let
me know if there is any standard way already implemented.

Hmm, I'd think there'd be some potential for danger there. I don't play
with the locale stuff, but if the collation changes and you've got indexed
text (varchar, char) fields, wouldn't the index no longer necessarily be
in the correct order?

#4Christopher Kings-Lynne
chriskl@familyhealth.com.au
In reply to: Behdad Esfahbod (#1)
Re: Setting locale per connection

I usually use PostgreSQL for multiple languages, so I needed to
set locale per connection, or can change the locale on the fly.
I don't know if there is any such ability integrated in or not,
so I have wrote my 10lines function as a wrapper around
setlocale, that is attached. So what I do is just a simple
"SELECT locale('LC_COLLATE', 'fa_IR');" at connection time. Let
me know if there is any standard way already implemented.

Don't know the answer to that one..

Another silly question, isn't any way to get rid of seqscan, when
doing 'SELECT count(*) FROM tab;'?

No, there's not. Due to PostgreSQL design restrictions. Just avoid doing
it, or use a trigger to keep a summary table or something.

Chris

#5Behdad Esfahbod
behdad@bamdad.org
In reply to: Stephan Szabo (#3)
Re: Setting locale per connection

On Tue, 1 Jul 2003, Stephan Szabo wrote:

On Wed, 2 Jul 2003, Behdad Esfahbod wrote:

I'm new to the list, so don't flame at the first date ;).

I usually use PostgreSQL for multiple languages, so I needed to
set locale per connection, or can change the locale on the fly.
I don't know if there is any such ability integrated in or not,
so I have wrote my 10lines function as a wrapper around
setlocale, that is attached. So what I do is just a simple
"SELECT locale('LC_COLLATE', 'fa_IR');" at connection time. Let
me know if there is any standard way already implemented.

Hmm, I'd think there'd be some potential for danger there. I don't play
with the locale stuff, but if the collation changes and you've got indexed
text (varchar, char) fields, wouldn't the index no longer necessarily be
in the correct order?

I read in the FAQ that indexes for text fields is used just if
default C locale is used during initdb, well, humm, is not the
case on most distros. BTW, such a function is really needed to
make Unicode collation algorithms effective. I may be able to
convince my provider to define the function, but I can't convince
him to start the backend with my desired locale!

--
Behdad Esfahbod 11 Tir 1382, 2003 Jul 2
http://behdad.org/ [Finger for Geek Code]

If you do a job too well, you'll get stuck with it.

#6Stephan Szabo
sszabo@megazone23.bigpanda.com
In reply to: Behdad Esfahbod (#5)
Re: Setting locale per connection

On Wed, 2 Jul 2003, Behdad Esfahbod wrote:

On Tue, 1 Jul 2003, Stephan Szabo wrote:

On Wed, 2 Jul 2003, Behdad Esfahbod wrote:

I'm new to the list, so don't flame at the first date ;).

I usually use PostgreSQL for multiple languages, so I needed to
set locale per connection, or can change the locale on the fly.
I don't know if there is any such ability integrated in or not,
so I have wrote my 10lines function as a wrapper around
setlocale, that is attached. So what I do is just a simple
"SELECT locale('LC_COLLATE', 'fa_IR');" at connection time. Let
me know if there is any standard way already implemented.

Hmm, I'd think there'd be some potential for danger there. I don't play
with the locale stuff, but if the collation changes and you've got indexed
text (varchar, char) fields, wouldn't the index no longer necessarily be
in the correct order?

I read in the FAQ that indexes for text fields is used just if
default C locale is used during initdb, well, humm, is not the

Indexes are only used for LIKE queries on the "C" locale, but they
should be used for standard =, <, >, etc queries in the other locales
so you may still run into trouble.

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Stephan Szabo (#3)
Re: Setting locale per connection

Stephan Szabo <sszabo@megazone23.bigpanda.com> writes:

On Wed, 2 Jul 2003, Behdad Esfahbod wrote:

so I have wrote my 10lines function as a wrapper around
setlocale, that is attached.

Hmm, I'd think there'd be some potential for danger there. I don't play
with the locale stuff, but if the collation changes and you've got indexed
text (varchar, char) fields, wouldn't the index no longer necessarily be
in the correct order?

Indeed, this is exactly why Postgres goes out of its way to prevent you
from changing the backend's collation setting on-the-fly. The proposed
function is a great way to shoot yourself in the foot :-(. If you doubt
it, check the archives from two or three years ago when we did not have
the interlock to force LC_COLLATE to be frozen at initdb time ...

regards, tom lane

#8Behdad Esfahbod
behdad@bamdad.org
In reply to: Tom Lane (#7)
Re: Setting locale per connection

On Wed, 2 Jul 2003, Tom Lane wrote:

On Wed, 2 Jul 2003, Behdad Esfahbod wrote:

so I have wrote my 10lines function as a wrapper around
setlocale, that is attached.

Indeed, this is exactly why Postgres goes out of its way to prevent you
from changing the backend's collation setting on-the-fly. The proposed
function is a great way to shoot yourself in the foot :-(. If you doubt
it, check the archives from two or three years ago when we did not have
the interlock to force LC_COLLATE to be frozen at initdb time ...

regards, tom lane

So, assuming I want to go for the right way, I've just seen the
column-based LC_COLLATE in the TODO list. Is there any more
information about that?

behdad

--
Behdad Esfahbod 11 Tir 1382, 2003 Jul 2
http://behdad.org/ [Finger for Geek Code]

If you do a job too well, you'll get stuck with it.