96 int len,
bool is_client_to_server);
97 static int cliplen(
const char *
str,
int len,
int limit);
112 int current_server_encoding;
127 if (current_server_encoding == encoding ||
146 current_server_encoding);
159 convinfo->
s_encoding = current_server_encoding;
168 ConvProcList =
lcons(convinfo, ConvProcList);
188 foreach(lc, ConvProcList)
192 if (oldinfo->
s_encoding == current_server_encoding &&
210 int current_server_encoding;
229 if (current_server_encoding == encoding ||
234 ToServerConvProc = NULL;
235 ToClientConvProc = NULL;
246 foreach(lc, ConvProcList)
250 if (convinfo->
s_encoding == current_server_encoding &&
283 int current_server_encoding;
296 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
297 errmsg(
"conversion between %s and %s is not supported",
308 if (current_server_encoding !=
PG_UTF8 &&
311 Oid utf8_to_server_proc;
314 utf8_to_server_proc =
316 current_server_encoding);
327 Utf8ToServerConvProc = finfo;
347 return ClientEncoding->
name;
357 int src_encoding,
int dest_encoding)
359 unsigned char *result;
365 if (src_encoding == dest_encoding)
379 elog(
ERROR,
"cannot perform encoding conversion outside a transaction");
384 (
errcode(ERRCODE_UNDEFINED_FUNCTION),
385 errmsg(
"default conversion function for encoding \"%s\" to \"%s\" does not exist",
400 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
402 errdetail(
"String of %d bytes is too long for encoding conversion.",
405 result = (
unsigned char *)
407 (
Size) len * MAX_CONVERSION_GROWTH + 1);
423 Size resultlen = strlen((
char *) result);
427 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
429 errdetail(
"String of %d bytes is too long for encoding conversion.",
432 result = (
unsigned char *)
repalloc(result, resultlen + 1);
458 src_encoding_name, dest_encoding_name);
478 src_encoding_name, dest_encoding_name);
508 if (src_encoding < 0)
510 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
511 errmsg(
"invalid source encoding name \"%s\"",
512 src_encoding_name)));
513 if (dest_encoding < 0)
515 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
516 errmsg(
"invalid destination encoding name \"%s\"",
517 dest_encoding_name)));
531 if (dest_str != src_str)
532 len = strlen(dest_str);
539 memcpy(
VARDATA(retval), dest_str, len);
541 if (dest_str != src_str)
567 if (src_encoding < 0)
569 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
570 errmsg(
"invalid encoding name \"%s\"",
571 src_encoding_name)));
624 if (encoding == DatabaseEncoding->
encoding ||
651 for (i = 0; i < len; i++)
655 (
errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
656 errmsg(
"invalid byte value for encoding \"%s\": 0x%02x",
658 (
unsigned char) s[i])));
665 if (encoding == ClientEncoding->
encoding)
697 if (encoding == DatabaseEncoding->
encoding ||
709 if (encoding == ClientEncoding->
encoding)
727 bool is_client_to_server)
734 if (is_client_to_server)
736 src_encoding = ClientEncoding->
encoding;
737 dest_encoding = DatabaseEncoding->
encoding;
742 src_encoding = DatabaseEncoding->
encoding;
743 dest_encoding = ClientEncoding->
encoding;
756 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
758 errdetail(
"String of %d bytes is too long for encoding conversion.",
763 (
Size) len * MAX_CONVERSION_GROWTH + 1);
778 Size resultlen = strlen(result);
782 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
784 errdetail(
"String of %d bytes is too long for encoding conversion.",
787 result = (
char *)
repalloc(result, resultlen + 1);
818 (
errcode(ERRCODE_SYNTAX_ERROR),
819 errmsg(
"invalid Unicode code point")));
824 s[0] = (
unsigned char) c;
831 if (server_encoding ==
PG_UTF8)
839 if (Utf8ToServerConvProc == NULL)
841 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
842 errmsg(
"conversion between %s and %s is not supported",
849 c_as_utf8[c_as_utf8_len] =
'\0';
878 const char *from,
pg_wchar *to,
int len)
900 const pg_wchar *from,
char *to,
int len)
927 return strlen(mbstr);
949 while (limit > 0 && *mbstr)
986 return cliplen(mbstr, len, limit);
990 while (len > 0 && *mbstr)
992 l = (*mblen_fn) ((
const unsigned char *) mbstr);
993 if ((clen + l) > limit)
1017 return cliplen(mbstr, len, limit);
1019 while (len > 0 && *mbstr)
1038 len =
Min(len, limit);
1039 while (l < len && str[l])
1048 elog(
ERROR,
"invalid database encoding: %d", encoding);
1071 raw_pg_bind_textdomain_codeset(
const char *domainname,
int encoding)
1080 if (bind_textdomain_codeset(domainname,
1085 elog(
LOG,
"bind_textdomain_codeset failed");
1116 pg_bind_textdomain_codeset(
const char *domainname)
1123 const char *ctype =
setlocale(LC_CTYPE, NULL);
1128 raw_pg_bind_textdomain_codeset(domainname, encoding))
1136 if (!raw_pg_bind_textdomain_codeset(domainname, new_msgenc))
1159 return DatabaseEncoding->
name;
1217 unsigned char *lastbyte = charptr + len - 1;
1223 while (*lastbyte < (
unsigned char) 255)
1226 if ((*mbverify) (charptr, len) == len)
1252 unsigned char limit;
1297 if (a == 0x7F || a == 0xDF || a == 0xEF || a == 0xF4)
1344 charptr[0] = charptr[1] = 0xa1;
1355 for (i = 2; i > 0; i--)
1379 for (i = 1; i >= 0; i--)
1486 const char *nullpos = memchr(mbstr, 0, len);
1488 if (nullpos == NULL)
1519 l = (*mbverify) ((
const unsigned char *) mbstr, len);
1549 int expected_src_encoding,
1550 int expected_dest_encoding)
1553 elog(
ERROR,
"invalid source encoding ID: %d", src_encoding);
1554 if (src_encoding != expected_src_encoding && expected_src_encoding >= 0)
1555 elog(
ERROR,
"expected source encoding \"%s\", but got \"%s\"",
1559 elog(
ERROR,
"invalid destination encoding ID: %d", dest_encoding);
1560 if (dest_encoding != expected_dest_encoding && expected_dest_encoding >= 0)
1561 elog(
ERROR,
"expected destination encoding \"%s\", but got \"%s\"",
1565 elog(
ERROR,
"encoding conversion length must not be negative");
1578 char buf[8 * 5 + 1];
1583 jlimit =
Min(l, len);
1584 jlimit =
Min(jlimit, 8);
1586 for (j = 0; j < jlimit; j++)
1588 p +=
sprintf(p,
"0x%02x", (
unsigned char) mbstr[j]);
1594 (
errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
1595 errmsg(
"invalid byte sequence for encoding \"%s\": %s",
1608 const char *mbstr,
int len)
1611 char buf[8 * 5 + 1];
1616 jlimit =
Min(l, len);
1617 jlimit =
Min(jlimit, 8);
1619 for (j = 0; j < jlimit; j++)
1621 p +=
sprintf(p,
"0x%02x", (
unsigned char) mbstr[j]);
1627 (
errcode(ERRCODE_UNTRANSLATABLE_CHARACTER),
1628 errmsg(
"character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"",
1643 pgwin32_message_to_UTF16(
const char *
str,
int len,
int *utf16len)
1663 utf16 = (WCHAR *)
palloc(
sizeof(WCHAR) * (len + 1));
1664 dstlen = MultiByteToWideChar(codepage, 0,
str, len, utf16, len);
1665 utf16[dstlen] = (WCHAR) 0;
1685 utf8 = (
char *)
str;
1687 utf16 = (WCHAR *)
palloc(
sizeof(WCHAR) * (len + 1));
1688 dstlen = MultiByteToWideChar(CP_UTF8, 0, utf8, len, utf16, len);
1689 utf16[dstlen] = (WCHAR) 0;
1695 if (dstlen == 0 && len > 0)
#define PG_GETARG_INT32(n)
static FmgrInfo * Utf8ToServerConvProc
int pg_mbcharcliplen(const char *mbstr, int len, int limit)
int(* mblen_converter)(const unsigned char *mbstr)
Datum namein(PG_FUNCTION_ARGS)
void SetMessageEncoding(int encoding)
int pg_char_to_encoding(const char *name)
unsigned char * unicode_to_utf8(pg_wchar c, unsigned char *utf8string)
int PrepareClientEncoding(int encoding)
Datum getdatabaseencoding(PG_FUNCTION_ARGS)
static bool is_valid_unicode_codepoint(pg_wchar c)
int pg_encoding_mb2wchar_with_len(int encoding, const char *from, pg_wchar *to, int len)
char * pg_server_to_client(const char *s, int len)
#define PG_GETARG_DATUM(n)
void report_invalid_encoding(int encoding, const char *mbstr, int len)
static bool backend_startup_complete
Datum PG_char_to_encoding(PG_FUNCTION_ARGS)
static int pending_client_encoding
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define PG_RETURN_INT32(x)
static FmgrInfo * ToServerConvProc
#define write_stderr(str)
static char * perform_default_encoding_conversion(const char *src, int len, bool is_client_to_server)
int errcode(int sqlerrcode)
static const pg_enc2name * ClientEncoding
size_t pg_wchar_strlen(const pg_wchar *str)
mbcharacter_incrementer pg_database_encoding_character_incrementer(void)
#define DirectFunctionCall1(func, arg1)
int pg_strcasecmp(const char *s1, const char *s2)
#define PG_RETURN_BYTEA_P(x)
unsigned char * pg_do_encoding_conversion(unsigned char *src, int len, int src_encoding, int dest_encoding)
#define OidIsValid(objectId)
void check_encoding_conversion_args(int src_encoding, int dest_encoding, int len, int expected_src_encoding, int expected_dest_encoding)
char * pg_server_to_any(const char *s, int len, int encoding)
int pg_wchar2mb(const pg_wchar *from, char *to)
bool pg_verify_mbstr(int encoding, const char *mbstr, int len, bool noError)
const pg_enc2gettext pg_enc2gettext_tbl[]
int pg_mbstrlen_with_len(const char *mbstr, int limit)
#define foreach_delete_current(lst, cell)
mbdisplaylen_converter dsplen
static bool pg_eucjp_increment(unsigned char *charptr, int length)
Datum pg_encoding_max_length_sql(PG_FUNCTION_ARGS)
void pfree(void *pointer)
char * pg_client_to_server(const char *s, int len)
#define IS_HIGHBIT_SET(ch)
#define FunctionCall5(flinfo, arg1, arg2, arg3, arg4, arg5)
static bool pg_utf8_increment(unsigned char *charptr, int length)
Datum pg_client_encoding(PG_FUNCTION_ARGS)
int pg_mbcliplen(const char *mbstr, int len, int limit)
static List * ConvProcList
static bool pg_generic_charinc(unsigned char *charptr, int len)
int pg_encoding_mbcliplen(int encoding, const char *mbstr, int len, int limit)
int pg_encoding_max_length(int encoding)
#define PG_VALID_ENCODING(_enc)
void * MemoryContextAllocHuge(MemoryContext context, Size size)
const pg_enc2name pg_enc2name_tbl[]
int(* mbverifier)(const unsigned char *mbstr, int len)
int errdetail(const char *fmt,...)
int pg_encoding_mblen(int encoding, const char *mbstr)
#define CStringGetDatum(X)
int SetClientEncoding(int encoding)
struct ConvProcInfo ConvProcInfo
MemoryContext CurrentMemoryContext
#define PG_VALID_FE_ENCODING(_enc)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
int pg_mb2wchar(const char *from, pg_wchar *to)
MemoryContext TopMemoryContext
int pg_encoding_wchar2mb_with_len(int encoding, const pg_wchar *from, char *to, int len)
#define DirectFunctionCall3(func, arg1, arg2, arg3)
#define MAX_MULTIBYTE_CHAR_LEN
#define unconstify(underlying_type, expr)
Datum length_in_encoding(PG_FUNCTION_ARGS)
void SetDatabaseEncoding(int encoding)
#define PG_RETURN_DATUM(x)
int GetDatabaseEncoding(void)
int pg_get_client_encoding(void)
void pg_unicode_to_server(pg_wchar c, unsigned char *s)
int pg_mbstrlen(const char *mbstr)
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
bool pg_verifymbstr(const char *mbstr, int len, bool noError)
wchar2mb_with_len_converter wchar2mb_with_len
int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len)
#define ereport(elevel,...)
int pg_dsplen(const char *mbstr)
const char * pg_encoding_to_char(int encoding)
List * lcons(void *datum, List *list)
#define PG_VALID_BE_ENCODING(_enc)
#define Assert(condition)
const char * GetDatabaseEncodingName(void)
static int cliplen(const char *str, int len, int limit)
Datum pg_convert(PG_FUNCTION_ARGS)
const char * pg_get_client_encoding_name(void)
#define PG_GETARG_BYTEA_PP(n)
Oid FindDefaultConversionProc(int32 for_encoding, int32 to_encoding)
bool IsTransactionState(void)
#define PG_FREE_IF_COPY(ptr, n)
Datum pg_convert_from(PG_FUNCTION_ARGS)
int pg_mblen(const char *mbstr)
void * repalloc(void *pointer, Size size)
static const pg_enc2name * MessageEncoding
void InitializeClientEncoding(void)
void report_untranslatable_char(int src_encoding, int dest_encoding, const char *mbstr, int len)
int pg_database_encoding_max_length(void)
int GetMessageEncoding(void)
#define MAX_CONVERSION_GROWTH
bool(* mbcharacter_incrementer)(unsigned char *mbstr, int len)
int pg_utf_mblen(const unsigned char *s)
static FmgrInfo * ToClientConvProc
#define VARSIZE_ANY_EXHDR(PTR)
int errmsg(const char *fmt,...)
const pg_wchar_tbl pg_wchar_table[]
Datum PG_encoding_to_char(PG_FUNCTION_ARGS)
void * MemoryContextAlloc(MemoryContext context, Size size)
static const pg_enc2name * DatabaseEncoding
mb2wchar_with_len_converter mb2wchar_with_len
#define SET_VARSIZE(PTR, len)
int pg_wchar2mb_with_len(const pg_wchar *from, char *to, int len)
char * pg_any_to_server(const char *s, int len, int encoding)
int pg_verify_mbstr_len(int encoding, const char *mbstr, int len, bool noError)
Datum pg_convert_to(PG_FUNCTION_ARGS)
#define PG_GETARG_NAME(n)
#define OidFunctionCall5(functionId, arg1, arg2, arg3, arg4, arg5)