diff options
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/commands/dbcommands.c | 6 | ||||
| -rw-r--r-- | src/backend/utils/adt/ascii.c | 15 | ||||
| -rw-r--r-- | src/backend/utils/adt/xml.c | 30 | ||||
| -rw-r--r-- | src/backend/utils/mb/encnames.c | 29 | ||||
| -rw-r--r-- | src/backend/utils/mb/mbutils.c | 8 |
5 files changed, 66 insertions, 22 deletions
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 434e983894..ec0d02be6b 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.200 2007/10/12 18:55:12 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.201 2007/10/13 20:18:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -178,12 +178,12 @@ createdb(const CreatedbStmt *stmt) else if (IsA(dencoding->arg, String)) { encoding_name = strVal(dencoding->arg); - if (pg_valid_server_encoding(encoding_name) < 0) + encoding = pg_valid_server_encoding(encoding_name); + if (encoding < 0) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("%s is not a valid encoding name", encoding_name))); - encoding = pg_char_to_encoding(encoding_name); } else elog(ERROR, "unrecognized node type: %d", diff --git a/src/backend/utils/adt/ascii.c b/src/backend/utils/adt/ascii.c index 3bd449dcc0..ce4bb6f004 100644 --- a/src/backend/utils/adt/ascii.c +++ b/src/backend/utils/adt/ascii.c @@ -5,7 +5,7 @@ * Portions Copyright (c) 1999-2007, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/ascii.c,v 1.30 2007/01/05 22:19:40 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/ascii.c,v 1.31 2007/10/13 20:18:41 tgl Exp $ * *----------------------------------------------------------------------- */ @@ -117,7 +117,13 @@ Datum to_ascii_encname(PG_FUNCTION_ARGS) { text *data = PG_GETARG_TEXT_P_COPY(0); - int enc = pg_char_to_encoding(NameStr(*PG_GETARG_NAME(1))); + char *encname = NameStr(*PG_GETARG_NAME(1)); + int enc = pg_char_to_encoding(encname); + + if (enc < 0) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("%s is not a valid encoding name", encname))); PG_RETURN_TEXT_P(encode_to_ascii(data, enc)); } @@ -132,6 +138,11 @@ to_ascii_enc(PG_FUNCTION_ARGS) text *data = PG_GETARG_TEXT_P_COPY(0); int enc = PG_GETARG_INT32(1); + if (!PG_VALID_ENCODING(enc)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("%d is not a valid encoding code", enc))); + PG_RETURN_TEXT_P(encode_to_ascii(data, enc)); } diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 0e656b2288..537340811c 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.47 2007/09/23 21:36:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/xml.c,v 1.48 2007/10/13 20:18:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -127,6 +127,24 @@ XmlOptionType xmloption; #define NAMESPACE_SQLXML "http://standards.iso.org/iso/9075/2003/sqlxml" +#ifdef USE_LIBXML + +static int +xmlChar_to_encoding(xmlChar *encoding_name) +{ + int encoding = pg_char_to_encoding((char *) encoding_name); + + if (encoding < 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid encoding name \"%s\"", + (char *) encoding_name))); + return encoding; +} + +#endif + + Datum xml_in(PG_FUNCTION_ARGS) { @@ -263,7 +281,9 @@ xml_recv(PG_FUNCTION_ARGS) /* Now that we know what we're dealing with, convert to server encoding */ newstr = (char *) pg_do_encoding_conversion((unsigned char *) str, nbytes, - encoding ? pg_char_to_encoding((char *) encoding) : PG_UTF8, + encoding ? + xmlChar_to_encoding(encoding) : + PG_UTF8, GetDatabaseEncoding()); if (newstr != str) @@ -1084,9 +1104,9 @@ xml_parse(text *data, XmlOptionType xmloption_arg, bool preserve_whitespace, xml utf8string = pg_do_encoding_conversion(string, len, - encoding - ? pg_char_to_encoding((char *) encoding) - : GetDatabaseEncoding(), + encoding ? + xmlChar_to_encoding(encoding) : + GetDatabaseEncoding(), PG_UTF8); xml_init(); diff --git a/src/backend/utils/mb/encnames.c b/src/backend/utils/mb/encnames.c index 7e884fd4c5..f7ef85511c 100644 --- a/src/backend/utils/mb/encnames.c +++ b/src/backend/utils/mb/encnames.c @@ -2,7 +2,7 @@ * Encoding names and routines for work with it. All * in this file is shared bedween FE and BE. * - * $PostgreSQL: pgsql/src/backend/utils/mb/encnames.c,v 1.34 2007/04/16 18:50:49 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/mb/encnames.c,v 1.35 2007/10/13 20:18:41 tgl Exp $ */ #ifdef FRONTEND #include "postgres_fe.h" @@ -12,10 +12,11 @@ #include "utils/builtins.h" #endif +#include <ctype.h> #include <unistd.h> #include "mb/pg_wchar.h" -#include <ctype.h> + /* ---------- * All encoding names, sorted: *** A L P H A B E T I C *** @@ -314,6 +315,9 @@ pg_enc2name pg_enc2name_tbl[] = "EUC_TW", PG_EUC_TW }, { + "EUC_JIS_2004", PG_EUC_JIS_2004 + }, + { "UTF8", PG_UTF8 }, { @@ -398,9 +402,6 @@ pg_enc2name pg_enc2name_tbl[] = "WIN1257", PG_WIN1257 }, { - "EUC_JIS_2004", PG_EUC_JIS_2004 - }, - { "SJIS", PG_SJIS }, { @@ -413,10 +414,10 @@ pg_enc2name pg_enc2name_tbl[] = "UHC", PG_UHC }, { - "JOHAB", PG_JOHAB + "GB18030", PG_GB18030 }, { - "GB18030", PG_GB18030 + "JOHAB", PG_JOHAB }, { "SHIFT_JIS_2004", PG_SHIFT_JIS_2004 @@ -455,6 +456,12 @@ pg_valid_server_encoding(const char *name) return enc; } +int +pg_valid_server_encoding_id(int encoding) +{ + return PG_VALID_BE_ENCODING(encoding); +} + /* ---------- * Remove irrelevant chars from encoding name * ---------- @@ -533,14 +540,14 @@ pg_char_to_encname_struct(const char *name) * Returns encoding or -1 for error */ int -pg_char_to_encoding(const char *s) +pg_char_to_encoding(const char *name) { - pg_encname *p = NULL; + pg_encname *p; - if (!s) + if (!name) return -1; - p = pg_char_to_encname_struct(s); + p = pg_char_to_encname_struct(name); return p ? p->encoding : -1; } diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 4c7a7afca0..91f65df36a 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -4,7 +4,7 @@ * (currently mule internal code (mic) is used) * Tatsuo Ishii * - * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.66 2007/09/24 16:38:24 adunstan Exp $ + * $PostgreSQL: pgsql/src/backend/utils/mb/mbutils.c,v 1.67 2007/10/13 20:18:41 tgl Exp $ */ #include "postgres.h" @@ -421,6 +421,12 @@ length_in_encoding(PG_FUNCTION_ARGS) int len = VARSIZE(string) - VARHDRSZ; int retval; + if (src_encoding < 0) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid encoding name \"%s\"", + src_encoding_name))); + retval = pg_verify_mbstr_len(src_encoding, VARDATA(string), len, false); PG_RETURN_INT32(retval); |
