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 #include +#ifdef HAVE_LANGINFO_H +#include +#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 .\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,