Hi,

it's a renewed locale per database patch. Unfortunately, i've not found
clean way to rebuild database indexes automatically, if locale settings
of two databases (created and template) are differs. Now it's only
raises a NOTICE. So, if anyone has a right notion about it - let will
express. Comment and suggestions are highly appreciated

Index: src/backend/access/transam/xlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/access/transam/xlog.c,v
retrieving revision 1.226
diff -u -r1.226 xlog.c
--- src/backend/access/transam/xlog.c   11 Jan 2006 08:43:12 -0000      1.226
+++ src/backend/access/transam/xlog.c   22 Jan 2006 16:41:02 -0000
@@ -3394,7 +3394,6 @@
 {
        int                     fd;
        char            buffer[BLCKSZ]; /* need not be aligned */
-       char       *localeptr;
 
        /*
         * Initialize version and compatibility-check fields
@@ -3418,18 +3417,6 @@
        ControlFile->enableIntTimes = FALSE;
 #endif
 
-       ControlFile->localeBuflen = LOCALE_NAME_BUFLEN;
-       localeptr = setlocale(LC_COLLATE, NULL);
-       if (!localeptr)
-               ereport(PANIC,
-                               (errmsg("invalid LC_COLLATE setting")));
-       StrNCpy(ControlFile->lc_collate, localeptr, LOCALE_NAME_BUFLEN);
-       localeptr = setlocale(LC_CTYPE, NULL);
-       if (!localeptr)
-               ereport(PANIC,
-                               (errmsg("invalid LC_CTYPE setting")));
-       StrNCpy(ControlFile->lc_ctype, localeptr, LOCALE_NAME_BUFLEN);
-
        /* Contents are protected with a CRC */
        INIT_CRC32(ControlFile->crc);
        COMP_CRC32(ControlFile->crc,
@@ -3612,34 +3599,6 @@
                           " but the server was compiled without 
HAVE_INT64_TIMESTAMP."),
                                 errhint("It looks like you need to recompile 
or initdb.")));
 #endif
-
-       if (ControlFile->localeBuflen != LOCALE_NAME_BUFLEN)
-               ereport(FATAL,
-                               (errmsg("database files are incompatible with 
server"),
-                                errdetail("The database cluster was 
initialized with LOCALE_NAME_BUFLEN %d,"
-                                 " but the server was compiled with 
LOCALE_NAME_BUFLEN %d.",
-                                                  ControlFile->localeBuflen, 
LOCALE_NAME_BUFLEN),
-                                errhint("It looks like you need to recompile 
or initdb.")));
-       if (pg_perm_setlocale(LC_COLLATE, ControlFile->lc_collate) == NULL)
-               ereport(FATAL,
-                       (errmsg("database files are incompatible with operating 
system"),
-                        errdetail("The database cluster was initialized with 
LC_COLLATE \"%s\","
-                                          " which is not recognized by 
setlocale().",
-                                          ControlFile->lc_collate),
-                        errhint("It looks like you need to initdb or install 
locale support.")));
-       if (pg_perm_setlocale(LC_CTYPE, ControlFile->lc_ctype) == NULL)
-               ereport(FATAL,
-                       (errmsg("database files are incompatible with operating 
system"),
-               errdetail("The database cluster was initialized with LC_CTYPE 
\"%s\","
-                                 " which is not recognized by setlocale().",
-                                 ControlFile->lc_ctype),
-                        errhint("It looks like you need to initdb or install 
locale support.")));
-
-       /* Make the fixed locale settings visible as GUC variables, too */
-       SetConfigOption("lc_collate", ControlFile->lc_collate,
-                                       PGC_INTERNAL, PGC_S_OVERRIDE);
-       SetConfigOption("lc_ctype", ControlFile->lc_ctype,
-                                       PGC_INTERNAL, PGC_S_OVERRIDE);
 }
 
 void
Index: src/backend/commands/dbcommands.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/dbcommands.c,v
retrieving revision 1.175
diff -u -r1.175 dbcommands.c
--- src/backend/commands/dbcommands.c   22 Nov 2005 18:17:08 -0000      1.175
+++ src/backend/commands/dbcommands.c   22 Jan 2006 16:41:03 -0000
@@ -25,6 +25,10 @@
 #include <unistd.h>
 #include <sys/stat.h>
 
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
 #include "access/genam.h"
 #include "access/heapam.h"
 #include "catalog/catalog.h"
@@ -49,6 +53,7 @@
 #include "utils/fmgroids.h"
 #include "utils/guc.h"
 #include "utils/lsyscache.h"
+#include "utils/pg_locale.h"
 #include "utils/syscache.h"
 
 
@@ -57,9 +62,11 @@
                        int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP,
                        Oid *dbLastSysOidP,
                        TransactionId *dbVacuumXidP, TransactionId 
*dbFrozenXidP,
-                       Oid *dbTablespace);
+                       Oid *dbTablespace, char **dbCollate, char **dbCtype);
 static bool have_createdb_privilege(void);
 static void remove_dbtablespaces(Oid db_id);
+static char * get_locale_encoding(const char *ctype);
+static int check_locale_encoding(int encid, const char *ctype);
 
 
 /*
@@ -73,6 +80,8 @@
        Oid                     src_dboid;
        Oid                     src_owner;
        int                     src_encoding;
+       char                    *src_collate;
+       char                    *src_ctype;
        bool            src_istemplate;
        bool            src_allowconn;
        Oid                     src_lastsysoid;
@@ -92,10 +101,14 @@
        DefElem    *downer = NULL;
        DefElem    *dtemplate = NULL;
        DefElem    *dencoding = NULL;
+       DefElem    *dlc_collate = NULL;
+       DefElem    *dlc_ctype = NULL;
        DefElem    *dconnlimit = NULL;
        char       *dbname = stmt->dbname;
        char       *dbowner = NULL;
        const char *dbtemplate = NULL;
+       char *lc_collate = NULL;
+       char *lc_ctype = NULL;
        volatile int encoding = -1;
        volatile int dbconnlimit = -1;
 
@@ -139,6 +152,22 @@
                                                 errmsg("conflicting or 
redundant options")));
                        dencoding = defel;
                }
+               else if (strcmp(defel->defname, "lccollate") == 0)
+               {
+                       if (dlc_collate)
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                               errmsg("conflicting or 
redundant options")));
+                       dlc_collate = defel;
+               }
+               else if (strcmp(defel->defname, "lcctype") == 0)
+               {
+                       if (dlc_ctype)
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_SYNTAX_ERROR),
+                                               errmsg("conflicting or 
redundant options")));
+                       dlc_ctype = defel;
+               }
                else if (strcmp(defel->defname, "connectionlimit") == 0)
                {
                        if (dconnlimit)
@@ -192,6 +221,22 @@
                        elog(ERROR, "unrecognized node type: %d",
                                 nodeTag(dencoding->arg));
        }
+       if (dlc_collate && dlc_collate->arg) {
+               lc_collate = strVal(dlc_collate->arg);
+               if ((locale_collate_assign(lc_collate, false, (GucSource)NULL)) 
== NULL)
+                       ereport(ERROR,
+                               (errcode(ERRCODE_UNDEFINED_OBJECT),
+                               errmsg("%s is not a valid LC_COLLATE name",
+                                               lc_collate)));
+       }
+       if (dlc_ctype && dlc_ctype->arg) {
+               lc_ctype = strVal(dlc_ctype->arg);
+               if ((locale_collate_assign(lc_ctype, false, (GucSource)NULL)) 
== NULL)
+                       ereport(ERROR,
+                               (errcode(ERRCODE_UNDEFINED_OBJECT),
+                               errmsg("%s is not a valid LC_CTYPE name",
+                                               lc_ctype)));
+       }
        if (dconnlimit && dconnlimit->arg)
                dbconnlimit = intVal(dconnlimit->arg);
 
@@ -224,7 +269,7 @@
         * grab the exclusive lock.
         */
        if (get_db_info(dbname, NULL, NULL, NULL,
-                                       NULL, NULL, NULL, NULL, NULL, NULL))
+                                       NULL, NULL, NULL, NULL, NULL, NULL, 
NULL, NULL))
                ereport(ERROR,
                                (errcode(ERRCODE_DUPLICATE_DATABASE),
                                 errmsg("database \"%s\" already exists", 
dbname)));
@@ -237,7 +282,8 @@
 
        if (!get_db_info(dbtemplate, &src_dboid, &src_owner, &src_encoding,
                                         &src_istemplate, &src_allowconn, 
&src_lastsysoid,
-                                        &src_vacuumxid, &src_frozenxid, 
&src_deftablespace))
+                                        &src_vacuumxid, &src_frozenxid, 
&src_deftablespace,
+                                        &src_collate, &src_ctype))
                ereport(ERROR,
                                (errcode(ERRCODE_UNDEFINED_DATABASE),
                         errmsg("template database \"%s\" does not exist", 
dbtemplate)));
@@ -277,6 +323,21 @@
                                (errcode(ERRCODE_WRONG_OBJECT_TYPE),
                                 errmsg("invalid server encoding %d", 
encoding)));
 
+       /* Set database lc_collate and lc_ctype */
+       if (!lc_collate)
+               lc_collate = src_collate;
+       if (!lc_ctype) 
+               lc_ctype = src_ctype;
+
+#if defined(HAVE_LANGINFO_H) && defined(CODESET)
+       if (encoding > 0 && check_locale_encoding(encoding, lc_ctype) == -1)
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("encoding %s is not suitable for locale 
%s", 
+                                                       
pg_encoding_to_char(encoding), 
+                                                       lc_ctype)));
+#endif
+
        /* Resolve default tablespace for new database */
        if (dtablespacename && dtablespacename->arg)
        {
@@ -441,7 +502,7 @@
 
                /* Check to see if someone else created same DB name meanwhile. 
*/
                if (get_db_info(dbname, NULL, NULL, NULL,
-                                               NULL, NULL, NULL, NULL, NULL, 
NULL))
+                                               NULL, NULL, NULL, NULL, NULL, 
NULL, NULL, NULL))
                        ereport(ERROR,
                                        (errcode(ERRCODE_DUPLICATE_DATABASE),
                                         errmsg("database \"%s\" already 
exists", dbname)));
@@ -459,6 +520,11 @@
                        DirectFunctionCall1(namein, CStringGetDatum(dbname));
                new_record[Anum_pg_database_datdba - 1] = 
ObjectIdGetDatum(datdba);
                new_record[Anum_pg_database_encoding - 1] = 
Int32GetDatum(encoding);
+               new_record[Anum_pg_database_datcollate - 1] = 
+                       DirectFunctionCall1(namein, 
CStringGetDatum(lc_collate));
+               new_record[Anum_pg_database_datctype - 1] = 
+                       DirectFunctionCall1(namein, CStringGetDatum(lc_ctype));
+
                new_record[Anum_pg_database_datistemplate - 1] = 
BoolGetDatum(false);
                new_record[Anum_pg_database_datallowconn - 1] = 
BoolGetDatum(true);
                new_record[Anum_pg_database_datconnlimit - 1] = 
Int32GetDatum(dbconnlimit);
@@ -527,6 +593,15 @@
                 * Set flag to update flat database file at commit.
                 */
                database_file_update_needed();
+
+               /*
+                * Message about reindexing new database
+                */
+               if (lc_collate != src_collate || lc_ctype != src_ctype)
+                       ereport(NOTICE,
+                                       (errmsg("database \"%s\" need to be 
reindexed manually (REINDEX DATABASE)",
+                                                       dbname)));
+
        }
        PG_CATCH();
        {
@@ -584,7 +659,7 @@
        pgdbrel = heap_open(DatabaseRelationId, ExclusiveLock);
 
        if (!get_db_info(dbname, &db_id, NULL, NULL,
-                                        &db_istemplate, NULL, NULL, NULL, 
NULL, NULL))
+                                        &db_istemplate, NULL, NULL, NULL, 
NULL, NULL, NULL, NULL))
        {
                if (!missing_ok)
                {
@@ -1100,7 +1175,7 @@
                        int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP,
                        Oid *dbLastSysOidP,
                        TransactionId *dbVacuumXidP, TransactionId 
*dbFrozenXidP,
-                       Oid *dbTablespace)
+                       Oid *dbTablespace, char **dbCollate, char **dbCtype)
 {
        Relation        relation;
        ScanKeyData scanKey;
@@ -1155,6 +1230,11 @@
                /* default tablespace for this database */
                if (dbTablespace)
                        *dbTablespace = dbform->dattablespace;
+               /* default locale settings for this database */
+               if (dbCollate)
+                       *dbCollate = NameStr(dbform->datcollate);
+               if (dbCtype)
+                       *dbCtype = NameStr(dbform->datctype);
        }
 
        systable_endscan(scan);
@@ -1416,3 +1496,45 @@
        else
                strcat(buf, "UNKNOWN");
 }
+
+#if defined(HAVE_LANGINFO_H) && defined(CODESET)
+   
+static char *
+get_locale_encoding(const char *ctype)
+{
+       char       *save;
+       char       *sys;
+                        
+        save = setlocale(LC_CTYPE, NULL);
+        if (!save)
+                return NULL;
+        save = pstrdup(save);
+                                
+        setlocale(LC_CTYPE, ctype);
+        sys = nl_langinfo(CODESET);
+        sys = pstrdup(sys);
+                        
+        setlocale(LC_CTYPE, save);
+        pfree(save);
+            
+        return sys;
+}
+        
+static int
+check_locale_encoding(int encid, const char *ctype)
+{
+        char       *sys;
+        
+        sys = get_locale_encoding(ctype);
+        if (encid == pg_char_to_encoding(sys))
+        {
+                pfree(sys);
+                return 0;
+        }
+        
+        pfree(sys);
+        return -1;
+}
+
+#endif
+
Index: src/backend/parser/gram.y
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.522
diff -u -r2.522 gram.y
--- src/backend/parser/gram.y   21 Jan 2006 02:16:19 -0000      2.522
+++ src/backend/parser/gram.y   22 Jan 2006 16:41:09 -0000
@@ -372,7 +372,7 @@
 
        KEY
 
-       LANCOMPILER LANGUAGE LARGE_P  LAST_P LEADING LEAST LEFT LEVEL
+       LANCOMPILER LANGUAGE LARGE_P  LAST_P LCCOLLATE LCCTYPE LEADING LEAST 
LEFT LEVEL
        LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
        LOCK_P LOGIN_P
 
@@ -4635,6 +4635,22 @@
                                {
                                        $$ = makeDefElem("encoding", NULL);
                                }
+                       | LCCOLLATE opt_equal name
+                               {
+                                       $$ = makeDefElem("lccollate", (Node 
*)makeString($3));
+                               }
+                       | LCCOLLATE opt_equal DEFAULT
+                               {
+                                       $$ = makeDefElem("lccollate", NULL);
+                               }
+                       | LCCTYPE opt_equal name
+                               {
+                                       $$ = makeDefElem("lcctype", (Node 
*)makeString($3));
+                               }
+                       | LCCTYPE opt_equal DEFAULT
+                               {
+                                       $$ = makeDefElem("lcctype", NULL);
+                               }
                        | CONNECTION LIMIT opt_equal SignedIconst
                                {
                                        $$ = makeDefElem("connectionlimit", 
(Node *)makeInteger($4));
@@ -8225,6 +8241,8 @@
                        | LANGUAGE
                        | LARGE_P
                        | LAST_P
+                       | LCCOLLATE
+                       | LCCTYPE
                        | LEVEL
                        | LISTEN
                        | LOAD
Index: src/backend/parser/keywords.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/keywords.c,v
retrieving revision 1.170
diff -u -r1.170 keywords.c
--- src/backend/parser/keywords.c       27 Dec 2005 04:00:07 -0000      1.170
+++ src/backend/parser/keywords.c       22 Jan 2006 16:41:09 -0000
@@ -193,6 +193,8 @@
        {"language", LANGUAGE},
        {"large", LARGE_P},
        {"last", LAST_P},
+       {"lccollate", LCCOLLATE},
+       {"lcctype", LCCTYPE},
        {"leading", LEADING},
        {"least", LEAST},
        {"left", LEFT},
Index: src/backend/utils/adt/pg_locale.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/pg_locale.c,v
retrieving revision 1.34
diff -u -r1.34 pg_locale.c
--- src/backend/utils/adt/pg_locale.c   2 Jan 2006 20:25:45 -0000       1.34
+++ src/backend/utils/adt/pg_locale.c   22 Jan 2006 16:41:10 -0000
@@ -10,10 +10,8 @@
  */
 
 /*----------
- * Here is how the locale stuff is handled: LC_COLLATE and LC_CTYPE
- * are fixed by initdb, stored in pg_control, and cannot be changed.
- * Thus, the effects of strcoll(), strxfrm(), isupper(), toupper(),
- * etc. are always in the same fixed locale.
+ * Here is how the locale stuff is handled: 
+ * LC_COLLATE and LC_CTYPE are defined by createdb and stored in pg_database.
  *
  * LC_MESSAGES is settable at run time and will take effect
  * immediately.
@@ -208,6 +206,17 @@
        return value;
 }
 
+const char *
+locale_collate_assign(const char *value, bool doit, GucSource source)
+{
+       return locale_xxx_assign(LC_COLLATE, value, doit, source);
+}
+
+const char *
+locale_ctype_assign(const char *value, bool doit, GucSource source)
+{
+       return locale_xxx_assign(LC_CTYPE, value, doit, source);
+}
 
 const char *
 locale_monetary_assign(const char *value, bool doit, GucSource source)
Index: src/backend/utils/init/postinit.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/utils/init/postinit.c,v
retrieving revision 1.160
diff -u -r1.160 postinit.c
--- src/backend/utils/init/postinit.c   4 Jan 2006 21:06:32 -0000       1.160
+++ src/backend/utils/init/postinit.c   22 Jan 2006 16:41:10 -0000
@@ -138,6 +138,8 @@
        ScanKeyData key;
        HeapTuple       tup;
        Form_pg_database dbform;
+       char            *lc_ctype;
+       char            *lc_collate;
 
        /*
         * Because we grab RowShareLock here, we can be sure that dropdb() is 
not
@@ -225,6 +227,32 @@
        SetConfigOption("client_encoding", GetDatabaseEncodingName(),
                                        PGC_BACKEND, PGC_S_DEFAULT);
 
+       /* Set up database locale */
+       lc_collate = NameStr(dbform->datcollate);
+       lc_ctype = NameStr(dbform->datctype);
+
+       if (setlocale(LC_COLLATE, lc_collate) == NULL)
+               ereport(FATAL,
+                       (errmsg("database locale is incompatible with operating 
system"),
+                       errdetail("The database was initialized with LC_COLLATE 
\"%s\","
+                                       " which is not recognized by 
setlocale().",
+                                       lc_collate),
+                       errhint("It looks like you need to recreate database or 
install locale support.")));
+       if (setlocale(LC_CTYPE, lc_ctype) == NULL)
+               ereport(FATAL,
+                       (errmsg("database locale are incompatible with 
operating system"),
+                       errdetail("The database was initialized with LC_CTYPE 
\"%s\","
+                                       " which is not recognized by 
setlocale().",
+                                       lc_ctype),
+                       errhint("It looks like you need to recreate database or 
install locale support.")));
+
+       /* Record it as a GUC internal option, too */
+       SetConfigOption("lc_collate", lc_collate,
+                                       PGC_INTERNAL, PGC_S_DATABASE);
+       SetConfigOption("lc_ctype", lc_ctype,
+                                       PGC_INTERNAL, PGC_S_DATABASE);
+
+
        /*
         * Lastly, set up any database-specific configuration variables.
         */
Index: src/bin/initdb/initdb.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/initdb/initdb.c,v
retrieving revision 1.106
diff -u -r1.106 initdb.c
--- src/bin/initdb/initdb.c     5 Jan 2006 10:07:46 -0000       1.106
+++ src/bin/initdb/initdb.c     22 Jan 2006 16:41:13 -0000
@@ -1377,6 +1377,10 @@
 
        bki_lines = replace_token(bki_lines, "ENCODING", encodingid);
 
+       bki_lines = replace_token(bki_lines, "LC_COLLATE", lc_collate);
+
+       bki_lines = replace_token(bki_lines, "LC_CTYPE", lc_ctype);
+
        /*
         * Pass correct LC_xxx environment to bootstrap.
         *
@@ -2617,7 +2621,7 @@
                printf(_("The database cluster will be initialized with locale 
%s.\n"), lc_ctype);
        else
        {
-               printf(_("The database cluster will be initialized with 
locales\n"
+               printf(_("The database template1 will be initialized with 
locales\n"
                                 "  COLLATE:  %s\n"
                                 "  CTYPE:    %s\n"
                                 "  MESSAGES: %s\n"
Index: src/bin/pg_controldata/pg_controldata.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_controldata/pg_controldata.c,v
retrieving revision 1.27
diff -u -r1.27 pg_controldata.c
--- src/bin/pg_controldata/pg_controldata.c     15 Oct 2005 02:49:37 -0000      
1.27
+++ src/bin/pg_controldata/pg_controldata.c     22 Jan 2006 16:41:13 -0000
@@ -177,9 +177,5 @@
        printf(_("Maximum columns in an index:          %u\n"), 
ControlFile.indexMaxKeys);
        printf(_("Date/time type storage:               %s\n"),
                   (ControlFile.enableIntTimes ? _("64-bit integers") : 
_("floating-point numbers")));
-       printf(_("Maximum length of locale name:        %u\n"), 
ControlFile.localeBuflen);
-       printf(_("LC_COLLATE:                           %s\n"), 
ControlFile.lc_collate);
-       printf(_("LC_CTYPE:                             %s\n"), 
ControlFile.lc_ctype);
-
        return 0;
 }
Index: src/bin/pg_resetxlog/pg_resetxlog.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/pg_resetxlog/pg_resetxlog.c,v
retrieving revision 1.39
diff -u -r1.39 pg_resetxlog.c
--- src/bin/pg_resetxlog/pg_resetxlog.c 5 Jan 2006 03:01:37 -0000       1.39
+++ src/bin/pg_resetxlog/pg_resetxlog.c 22 Jan 2006 16:41:13 -0000
@@ -465,22 +465,6 @@
 #else
        ControlFile.enableIntTimes = FALSE;
 #endif
-       ControlFile.localeBuflen = LOCALE_NAME_BUFLEN;
-
-       localeptr = setlocale(LC_COLLATE, "");
-       if (!localeptr)
-       {
-               fprintf(stderr, _("%s: invalid LC_COLLATE setting\n"), 
progname);
-               exit(1);
-       }
-       StrNCpy(ControlFile.lc_collate, localeptr, LOCALE_NAME_BUFLEN);
-       localeptr = setlocale(LC_CTYPE, "");
-       if (!localeptr)
-       {
-               fprintf(stderr, _("%s: invalid LC_CTYPE setting\n"), progname);
-               exit(1);
-       }
-       StrNCpy(ControlFile.lc_ctype, localeptr, LOCALE_NAME_BUFLEN);
 
        /*
         * XXX eventually, should try to grovel through old XLOG to develop more
@@ -530,9 +514,6 @@
        printf(_("Maximum columns in an index:          %u\n"), 
ControlFile.indexMaxKeys);
        printf(_("Date/time type storage:               %s\n"),
                   (ControlFile.enableIntTimes ? _("64-bit integers") : 
_("floating-point numbers")));
-       printf(_("Maximum length of locale name:        %u\n"), 
ControlFile.localeBuflen);
-       printf(_("LC_COLLATE:                           %s\n"), 
ControlFile.lc_collate);
-       printf(_("LC_CTYPE:                             %s\n"), 
ControlFile.lc_ctype);
 }
 
 
Index: src/bin/psql/describe.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/describe.c,v
retrieving revision 1.130
diff -u -r1.130 describe.c
--- src/bin/psql/describe.c     22 Nov 2005 18:17:29 -0000      1.130
+++ src/bin/psql/describe.c     22 Jan 2006 16:41:15 -0000
@@ -360,6 +360,12 @@
        appendPQExpBuffer(&buf,
                        ",\n       pg_catalog.pg_encoding_to_char(d.encoding) 
as \"%s\"",
                                          _("Encoding"));
+       appendPQExpBuffer(&buf,
+               ",\n       d.datcollate as \"%s\"",
+                                        _("LC_COLLATE"));
+       appendPQExpBuffer(&buf,
+               ",\n       d.datctype as \"%s\"",
+                                        _("LC_CTYPE"));
        if (verbose)
                appendPQExpBuffer(&buf,
                                                  ",\n       
pg_catalog.obj_description(d.oid, 'pg_database') as \"%s\"",
Index: src/bin/scripts/createdb.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/scripts/createdb.c,v
retrieving revision 1.15
diff -u -r1.15 createdb.c
--- src/bin/scripts/createdb.c  21 Jun 2005 04:02:33 -0000      1.15
+++ src/bin/scripts/createdb.c  22 Jan 2006 16:41:15 -0000
@@ -34,6 +34,8 @@
                {"tablespace", required_argument, NULL, 'D'},
                {"template", required_argument, NULL, 'T'},
                {"encoding", required_argument, NULL, 'E'},
+               {"lc-collate", required_argument, NULL, 1},
+               {"lc-ctype", required_argument, NULL, 2},
                {NULL, 0, NULL, 0}
        };
 
@@ -53,6 +55,8 @@
        char       *tablespace = NULL;
        char       *template = NULL;
        char       *encoding = NULL;
+       char       *lc_collate = NULL;
+       char       *lc_ctype = NULL;
 
        PQExpBufferData sql;
 
@@ -98,6 +102,12 @@
                        case 'E':
                                encoding = optarg;
                                break;
+                       case 1:
+                               lc_collate = optarg;
+                               break;
+                       case 2:
+                               lc_ctype = optarg;
+                               break;
                        default:
                                fprintf(stderr, _("Try \"%s --help\" for more 
information.\n"), progname);
                                exit(1);
@@ -155,7 +165,12 @@
                appendPQExpBuffer(&sql, " ENCODING '%s'", encoding);
        if (template)
                appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template));
+       if (lc_collate)
+               appendPQExpBuffer(&sql, " LCCOLLATE %s", fmtId(lc_collate));
+       if (lc_ctype)
+               appendPQExpBuffer(&sql, " LCCTYPE %s", fmtId(lc_ctype));
        appendPQExpBuffer(&sql, ";\n");
+       
 
        conn = connectDatabase(strcmp(dbname, "postgres") == 0 ? "template1" : 
"postgres",
                                                   host, port, username, 
password, progname);
@@ -219,19 +234,20 @@
        printf(_("Usage:\n"));
        printf(_("  %s [OPTION]... [DBNAME] [DESCRIPTION]\n"), progname);
        printf(_("\nOptions:\n"));
-       printf(_("  -D, --tablespace=TABLESPACE  default tablespace for the 
database\n"));
-       printf(_("  -E, --encoding=ENCODING      encoding for the database\n"));
-       printf(_("  -O, --owner=OWNER            database user to own the new 
database\n"));
-       printf(_("  -T, --template=TEMPLATE      template database to copy\n"));
-       printf(_("  -e, --echo                   show the commands being sent 
to the server\n"));
-       printf(_("  -q, --quiet                  don't write any messages\n"));
-       printf(_("  --help                       show this help, then exit\n"));
-       printf(_("  --version                    output version information, 
then exit\n"));
+       printf(_("  -D, --tablespace=TABLESPACE         default tablespace for 
the database\n"));
+       printf(_("  -E, --encoding=ENCODING             encoding for the 
database\n"));
+       printf(_("  --lc-collate, --lc-ctype=LOCALE     initialize database 
with given locale\n"));
+       printf(_("  -O, --owner=OWNER                   database user to own 
the new database\n"));
+       printf(_("  -T, --template=TEMPLATE             template database to 
copy\n"));
+       printf(_("  -e, --echo                          show the commands being 
sent to the server\n"));
+       printf(_("  -q, --quiet                         don't write any 
messages\n"));
+       printf(_("  --help                              show this help, then 
exit\n"));
+       printf(_("  --version                           output version 
information, then exit\n"));
        printf(_("\nConnection options:\n"));
-       printf(_("  -h, --host=HOSTNAME          database server host or socket 
directory\n"));
-       printf(_("  -p, --port=PORT              database server port\n"));
-       printf(_("  -U, --username=USERNAME      user name to connect as\n"));
-       printf(_("  -W, --password               prompt for password\n"));
+       printf(_("  -h, --host=HOSTNAME                 database server host or 
socket directory\n"));
+       printf(_("  -p, --port=PORT                     database server 
port\n"));
+       printf(_("  -U, --username=USERNAME             user name to connect 
as\n"));
+       printf(_("  -W, --password                      prompt for 
password\n"));
        printf(_("\nBy default, a database with the same name as the current 
user is created.\n"));
        printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));
 }
Index: src/include/catalog/pg_control.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/catalog/pg_control.h,v
retrieving revision 1.26
diff -u -r1.26 pg_control.h
--- src/include/catalog/pg_control.h    22 Nov 2005 18:17:30 -0000      1.26
+++ src/include/catalog/pg_control.h    22 Jan 2006 16:41:15 -0000
@@ -137,11 +137,6 @@
        /* flag indicating internal format of timestamp, interval, time */
        uint32          enableIntTimes; /* int64 storage enabled? */
 
-       /* active locales */
-       uint32          localeBuflen;
-       char            lc_collate[LOCALE_NAME_BUFLEN];
-       char            lc_ctype[LOCALE_NAME_BUFLEN];
-
        /* CRC of all above ... MUST BE LAST! */
        pg_crc32        crc;
 } ControlFileData;
Index: src/include/catalog/pg_database.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/catalog/pg_database.h,v
retrieving revision 1.38
diff -u -r1.38 pg_database.h
--- src/include/catalog/pg_database.h   15 Oct 2005 02:49:42 -0000      1.38
+++ src/include/catalog/pg_database.h   22 Jan 2006 16:41:16 -0000
@@ -38,6 +38,8 @@
        NameData        datname;                /* database name */
        Oid                     datdba;                 /* owner of database */
        int4            encoding;               /* character encoding */
+       NameData        datcollate;             /* locale LC_COLLATE */
+       NameData        datctype;               /* locale LC_CTYPE */
        bool            datistemplate;  /* allowed as CREATE DATABASE template? 
*/
        bool            datallowconn;   /* new connections allowed? */
        int4            datconnlimit;   /* max connections allowed (-1=no 
limit) */
@@ -60,21 +62,23 @@
  *             compiler constants for pg_database
  * ----------------
  */
-#define Natts_pg_database                              12
+#define Natts_pg_database                              14
 #define Anum_pg_database_datname               1
 #define Anum_pg_database_datdba                        2
 #define Anum_pg_database_encoding              3
-#define Anum_pg_database_datistemplate 4
-#define Anum_pg_database_datallowconn  5
-#define Anum_pg_database_datconnlimit  6
-#define Anum_pg_database_datlastsysoid 7
-#define Anum_pg_database_datvacuumxid  8
-#define Anum_pg_database_datfrozenxid  9
-#define Anum_pg_database_dattablespace 10
-#define Anum_pg_database_datconfig             11
-#define Anum_pg_database_datacl                        12
+#define Anum_pg_database_datcollate    4
+#define Anum_pg_database_datctype      5       
+#define Anum_pg_database_datistemplate 6
+#define Anum_pg_database_datallowconn  7
+#define Anum_pg_database_datconnlimit  8
+#define Anum_pg_database_datlastsysoid 9
+#define Anum_pg_database_datvacuumxid  10      
+#define Anum_pg_database_datfrozenxid  11      
+#define Anum_pg_database_dattablespace 12      
+#define Anum_pg_database_datconfig             13
+#define Anum_pg_database_datacl                        14
 
-DATA(insert OID = 1 (  template1 PGUID ENCODING t t -1 0 0 0 1663 _null_ 
_null_ ));
+DATA(insert OID = 1 (  template1 PGUID ENCODING "LC_CTYPE" "LC_COLLATE" t t -1 
0 0 0 1663 _null_ _null_ ));
 DESCR("Default template database");
 #define TemplateDbOid                  1
 
Index: src/include/utils/pg_locale.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/utils/pg_locale.h,v
retrieving revision 1.21
diff -u -r1.21 pg_locale.h
--- src/include/utils/pg_locale.h       28 Dec 2005 23:22:51 -0000      1.21
+++ src/include/utils/pg_locale.h       22 Jan 2006 16:41:16 -0000
@@ -22,6 +22,10 @@
 extern char *locale_numeric;
 extern char *locale_time;
 
+extern const char *locale_collate_assign(const char *value,
+                                          bool doit, GucSource source);
+extern const char *locale_ctype_assign(const char *value,
+                                          bool doit, GucSource source);
 extern const char *locale_messages_assign(const char *value,
                                           bool doit, GucSource source);
 extern const char *locale_monetary_assign(const char *value,

---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to