summaryrefslogtreecommitdiff
path: root/src/backend/utils/mb/mbutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/mb/mbutils.c')
-rw-r--r--src/backend/utils/mb/mbutils.c46
1 files changed, 38 insertions, 8 deletions
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index 5ee74f747d0..b8a2728e4f5 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -497,14 +497,25 @@ pg_encoding_max_length_sql(PG_FUNCTION_ARGS)
char *
pg_client_to_server(const char *s, int len)
{
+ Assert(ClientEncoding);
+
+ return pg_any_to_server(s, len, ClientEncoding->encoding);
+}
+
+/*
+ * convert any encoding to server encoding.
+ */
+char *
+pg_any_to_server(const char *s, int len, int encoding)
+{
Assert(DatabaseEncoding);
Assert(ClientEncoding);
if (len <= 0)
return (char *) s;
- if (ClientEncoding->encoding == DatabaseEncoding->encoding ||
- ClientEncoding->encoding == PG_SQL_ASCII)
+ if (encoding == DatabaseEncoding->encoding ||
+ encoding == PG_SQL_ASCII)
{
/*
* No conversion is needed, but we must still validate the data.
@@ -524,8 +535,8 @@ pg_client_to_server(const char *s, int len)
* to the parser but we have no way to convert it. We compromise by
* rejecting the data if it contains any non-ASCII characters.
*/
- if (PG_VALID_BE_ENCODING(ClientEncoding->encoding))
- (void) pg_verify_mbstr(ClientEncoding->encoding, s, len, false);
+ if (PG_VALID_BE_ENCODING(encoding))
+ (void) pg_verify_mbstr(encoding, s, len, false);
else
{
int i;
@@ -543,7 +554,11 @@ pg_client_to_server(const char *s, int len)
return (char *) s;
}
- return perform_default_encoding_conversion(s, len, true);
+ if (ClientEncoding->encoding == encoding)
+ return perform_default_encoding_conversion(s, len, true);
+ else
+ return (char *) pg_do_encoding_conversion(
+ (unsigned char *) s, len, encoding, DatabaseEncoding->encoding);
}
/*
@@ -552,18 +567,33 @@ pg_client_to_server(const char *s, int len)
char *
pg_server_to_client(const char *s, int len)
{
+ Assert(ClientEncoding);
+
+ return pg_any_to_server(s, len, ClientEncoding->encoding);
+}
+
+/*
+ * convert server encoding to any encoding.
+ */
+char *
+pg_server_to_any(const char *s, int len, int encoding)
+{
Assert(DatabaseEncoding);
Assert(ClientEncoding);
if (len <= 0)
return (char *) s;
- if (ClientEncoding->encoding == DatabaseEncoding->encoding ||
- ClientEncoding->encoding == PG_SQL_ASCII ||
+ if (encoding == DatabaseEncoding->encoding ||
+ encoding == PG_SQL_ASCII ||
DatabaseEncoding->encoding == PG_SQL_ASCII)
return (char *) s; /* assume data is valid */
- return perform_default_encoding_conversion(s, len, false);
+ if (ClientEncoding->encoding == encoding)
+ return perform_default_encoding_conversion(s, len, false);
+ else
+ return (char *) pg_do_encoding_conversion(
+ (unsigned char *) s, len, DatabaseEncoding->encoding, encoding);
}
/*