From fb0a76090661149c847203b9f430c9e7781f59e7 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 6 Apr 2009 08:42:53 +0000 Subject: [PATCH] Rename the new CREATE DATABASE options to set collation and ctype into LC_COLLATE and LC_CTYPE, per discussion on pgsql-hackers. --- doc/src/sgml/charset.sgml | 2 +- doc/src/sgml/keywords.sgml | 4 ++-- doc/src/sgml/ref/create_database.sgml | 10 ++++----- src/backend/commands/dbcommands.c | 12 +++++------ src/backend/parser/gram.y | 27 ++++++++++++------------ src/bin/pg_dump/pg_dump.c | 4 ++-- src/bin/pg_dump/pg_dumpall.c | 4 ++-- src/bin/scripts/createdb.c | 4 ++-- src/include/parser/kwlist.h | 3 ++- src/interfaces/ecpg/preproc/ecpg.trailer | 3 ++- 10 files changed, 38 insertions(+), 35 deletions(-) diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index 2bb43a3533..dbd3ec05ca 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -749,7 +749,7 @@ createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr Another way to accomplish this is to use this SQL command: -CREATE DATABASE korean WITH ENCODING 'EUC_KR' COLLATE='ko_KR.euckr' CTYPE='ko_KR.euckr' TEMPLATE=template0; +CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0; The encoding for a database is stored in the system catalog diff --git a/doc/src/sgml/keywords.sgml b/doc/src/sgml/keywords.sgml index 45b3d47a2b..3a34fea9b1 100644 --- a/doc/src/sgml/keywords.sgml +++ b/doc/src/sgml/keywords.sgml @@ -800,7 +800,7 @@ non-reserved - COLLATE + LC_COLLATE reserved reserved reserved @@ -1168,7 +1168,7 @@ - CTYPE + LC_CTYPE non-reserved diff --git a/doc/src/sgml/ref/create_database.sgml b/doc/src/sgml/ref/create_database.sgml index 50aff7fb5d..cf34925f7f 100644 --- a/doc/src/sgml/ref/create_database.sgml +++ b/doc/src/sgml/ref/create_database.sgml @@ -25,8 +25,8 @@ CREATE DATABASE name [ [ WITH ] [ OWNER [=] dbowner ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] - [ COLLATE [=] collate ] - [ CTYPE [=] ctype ] + [ LC_COLLATE [=] lc_collate ] + [ LC_CTYPE [=] lc_ctype ] [ TABLESPACE [=] tablespace ] [ CONNECTION LIMIT [=] connlimit ] ] @@ -207,7 +207,7 @@ CREATE DATABASE name The character set encoding specified for the new database must be - compatible with the chosen COLLATE and CTYPE settings. + compatible with the chosen LC_COLLATE and LC_CTYPE settings. If LC_CTYPE is C (or equivalently POSIX), then all encodings are allowed, but for other locale settings there is only one encoding that will work properly. @@ -219,9 +219,9 @@ CREATE DATABASE name - The COLLATE and CTYPE settings must match + The LC_COLLATE and LC_CTYPE settings must match those of the template database, except when template0 is used as - template. This is because COLLATE and CTYPE + template. This is because LC_COLLATE and LC_CTYPE affects the ordering in indexes, so that any indexes copied from the template database would be invalid in the new database with different settings. template0, however, is known to not diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index d08e3d0853..43ab2c90d4 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -169,7 +169,7 @@ createdb(const CreatedbStmt *stmt) errmsg("conflicting or redundant options"))); dencoding = defel; } - else if (strcmp(defel->defname, "collate") == 0) + else if (strcmp(defel->defname, "lc_collate") == 0) { if (dcollate) ereport(ERROR, @@ -177,7 +177,7 @@ createdb(const CreatedbStmt *stmt) errmsg("conflicting or redundant options"))); dcollate = defel; } - else if (strcmp(defel->defname, "ctype") == 0) + else if (strcmp(defel->defname, "lc_ctype") == 0) { if (dctype) ereport(ERROR, @@ -362,7 +362,7 @@ createdb(const CreatedbStmt *stmt) (errmsg("encoding %s does not match locale %s", pg_encoding_to_char(encoding), dbctype), - errdetail("The chosen CTYPE setting requires encoding %s.", + errdetail("The chosen LC_CTYPE setting requires encoding %s.", pg_encoding_to_char(ctype_encoding)))); if (!(collate_encoding == encoding || @@ -375,7 +375,7 @@ createdb(const CreatedbStmt *stmt) (errmsg("encoding %s does not match locale %s", pg_encoding_to_char(encoding), dbcollate), - errdetail("The chosen COLLATE setting requires encoding %s.", + errdetail("The chosen LC_COLLATE setting requires encoding %s.", pg_encoding_to_char(collate_encoding)))); /* @@ -394,8 +394,8 @@ createdb(const CreatedbStmt *stmt) if (strcmp(dbctype, src_ctype)) ereport(ERROR, - (errmsg("new ctype is incompatible with the ctype of the template database (%s)", src_ctype), - errhint("Use the same ctype as in the template database, or use template0 as template"))); + (errmsg("new LC_CTYPE is incompatible with LC_CTYPE of the template database (%s)", src_ctype), + errhint("Use the same LC_CTYPE as in the template database, or use template0 as template"))); } /* Resolve default tablespace for new database */ diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e1de04e761..b4ee8ba227 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -437,7 +437,7 @@ static TypeName *TableFuncTypeName(List *columns); CLUSTER COALESCE COLLATE COLUMN COMMENT COMMIT COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CREATEDB - CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P + CREATEROLE CREATEUSER CROSS CSV CURRENT_P CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE @@ -464,9 +464,9 @@ static TypeName *TableFuncTypeName(List *columns); KEY - LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEAST LEFT LEVEL - LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION - LOCK_P LOGIN_P + LANCOMPILER LANGUAGE LARGE_P LAST_P LC_COLLATE_P LC_CTYPE_P LEADING + LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP + LOCATION LOCK_P LOGIN_P MAPPING MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE @@ -6011,21 +6011,21 @@ createdb_opt_item: { $$ = makeDefElem("encoding", NULL); } - | COLLATE opt_equal Sconst + | LC_COLLATE_P opt_equal Sconst { - $$ = makeDefElem("collate", (Node *)makeString($3)); + $$ = makeDefElem("lc_collate", (Node *)makeString($3)); } - | COLLATE opt_equal DEFAULT + | LC_COLLATE_P opt_equal DEFAULT { - $$ = makeDefElem("collate", NULL); + $$ = makeDefElem("lc_collate", NULL); } - | CTYPE opt_equal Sconst + | LC_CTYPE_P opt_equal Sconst { - $$ = makeDefElem("ctype", (Node *)makeString($3)); + $$ = makeDefElem("lc_ctype", (Node *)makeString($3)); } - | CTYPE opt_equal DEFAULT + | LC_CTYPE_P opt_equal DEFAULT { - $$ = makeDefElem("ctype", NULL); + $$ = makeDefElem("lc_ctype", NULL); } | CONNECTION LIMIT opt_equal SignedIconst { @@ -10169,7 +10169,6 @@ unreserved_keyword: | CREATEROLE | CREATEUSER | CSV - | CTYPE | CURRENT_P | CURSOR | CYCLE @@ -10236,6 +10235,8 @@ unreserved_keyword: | LANGUAGE | LARGE_P | LAST_P + | LC_COLLATE_P + | LC_CTYPE_P | LEVEL | LISTEN | LOAD diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 2a3e49b8b4..0e2bbcf791 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1716,12 +1716,12 @@ dumpDatabase(Archive *AH) } if (strlen(collate) > 0) { - appendPQExpBuffer(creaQry, " COLLATE = "); + appendPQExpBuffer(creaQry, " LC_COLLATE = "); appendStringLiteralAH(creaQry, collate, AH); } if (strlen(ctype) > 0) { - appendPQExpBuffer(creaQry, " CTYPE = "); + appendPQExpBuffer(creaQry, " LC_CTYPE = "); appendStringLiteralAH(creaQry, ctype, AH); } if (strlen(tablespace) > 0 && strcmp(tablespace, "pg_default") != 0) diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 5a79819e59..889e7280a9 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -1048,13 +1048,13 @@ dumpCreateDB(PGconn *conn) if (strlen(dbcollate) != 0) { - appendPQExpBuffer(buf, " COLLATE = "); + appendPQExpBuffer(buf, " LC_COLLATE = "); appendStringLiteralConn(buf, dbcollate, conn); } if (strlen(dbctype) != 0) { - appendPQExpBuffer(buf, " CTYPE = "); + appendPQExpBuffer(buf, " LC_CTYPE = "); appendStringLiteralConn(buf, dbctype, conn); } diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index 6ea03feab8..395bc6926a 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -186,9 +186,9 @@ main(int argc, char *argv[]) if (template) appendPQExpBuffer(&sql, " TEMPLATE %s", fmtId(template)); if (lc_collate) - appendPQExpBuffer(&sql, " COLLATE '%s'", lc_collate); + appendPQExpBuffer(&sql, " LC_COLLATE '%s'", lc_collate); if (lc_ctype) - appendPQExpBuffer(&sql, " CTYPE '%s'", lc_ctype); + appendPQExpBuffer(&sql, " LC_CTYPE '%s'", lc_ctype); appendPQExpBuffer(&sql, ";\n"); diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index 6fbe997278..67e9cb4d4b 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -98,7 +98,6 @@ PG_KEYWORD("createrole", CREATEROLE, UNRESERVED_KEYWORD) PG_KEYWORD("createuser", CREATEUSER, UNRESERVED_KEYWORD) PG_KEYWORD("cross", CROSS, TYPE_FUNC_NAME_KEYWORD) PG_KEYWORD("csv", CSV, UNRESERVED_KEYWORD) -PG_KEYWORD("ctype", CTYPE, UNRESERVED_KEYWORD) PG_KEYWORD("current", CURRENT_P, UNRESERVED_KEYWORD) PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD) PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD) @@ -209,6 +208,8 @@ PG_KEYWORD("lancompiler", LANCOMPILER, UNRESERVED_KEYWORD) PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD) PG_KEYWORD("large", LARGE_P, UNRESERVED_KEYWORD) PG_KEYWORD("last", LAST_P, UNRESERVED_KEYWORD) +PG_KEYWORD("lc_collate", LC_COLLATE_P, UNRESERVED_KEYWORD) +PG_KEYWORD("lc_ctype", LC_CTYPE_P, UNRESERVED_KEYWORD) PG_KEYWORD("leading", LEADING, RESERVED_KEYWORD) PG_KEYWORD("least", LEAST, COL_NAME_KEYWORD) PG_KEYWORD("left", LEFT, TYPE_FUNC_NAME_KEYWORD) diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index 6f97d679ed..e968ae2c4a 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -1547,7 +1547,6 @@ ECPGunreserved_con: ABORT_P { $$ = make_str("abort"); } | CREATEROLE { $$ = make_str("createrole"); } | CREATEUSER { $$ = make_str("createuser"); } | CSV { $$ = make_str("csv"); } - | CTYPE { $$ = make_str("ctype"); } | CURSOR { $$ = make_str("cursor"); } | CYCLE { $$ = make_str("cycle"); } | DATA_P { $$ = make_str("data"); } @@ -1610,6 +1609,8 @@ ECPGunreserved_con: ABORT_P { $$ = make_str("abort"); } | LANGUAGE { $$ = make_str("language"); } | LARGE_P { $$ = make_str("large"); } | LAST_P { $$ = make_str("last"); } + | LC_COLLATE_P { $$ = make_str("lc_collate"); } + | LC_CTYPE_P { $$ = make_str("lc_ctype"); } | LEVEL { $$ = make_str("level"); } | LISTEN { $$ = make_str("listen"); } | LOAD { $$ = make_str("load"); } -- 2.39.5