40#include "utils/fmgrprotos.h"
298 errmsg(
"conversion between %s and %s is not supported",
360 unsigned char *result;
380 elog(
ERROR,
"cannot perform encoding conversion outside a transaction");
386 errmsg(
"default conversion function for encoding \"%s\" to \"%s\" does not exist",
403 errdetail(
"String of %d bytes is too long for encoding conversion.",
406 result = (
unsigned char *)
431 errdetail(
"String of %d bytes is too long for encoding conversion.",
473 unsigned char *src,
int srclen,
474 unsigned char *dest,
int destlen,
571 errmsg(
"invalid source encoding name \"%s\"",
576 errmsg(
"invalid destination encoding name \"%s\"",
630 errmsg(
"invalid encoding name \"%s\"",
716 errmsg(
"invalid byte value for encoding \"%s\": 0x%02x",
718 (
unsigned char) s[
i])));
818 errdetail(
"String of %d bytes is too long for encoding conversion.",
845 errdetail(
"String of %d bytes is too long for encoding conversion.",
880 errmsg(
"invalid Unicode code point")));
885 s[0] = (
unsigned char)
c;
903 errmsg(
"conversion between %s and %s is not supported",
943 s[0] = (
unsigned char)
c;
1068 while (limit > 0 && *
mbstr)
1111 l = (*mblen_fn) ((
const unsigned char *)
mbstr);
1112 if ((
clen + l) > limit)
1158 while (l <
len &&
str[l])
1202 elog(
LOG,
"bind_textdomain_codeset failed");
1336 while (*
lastbyte < (
unsigned char) 255)
1365 unsigned char limit;
1410 if (
a == 0x7F ||
a == 0xDF ||
a == 0xEF ||
a == 0xF4)
1468 for (
i = 2;
i > 0;
i--)
1492 for (
i = 1;
i >= 0;
i--)
1645 l = (*mbverifychar) ((
const unsigned char *)
mbstr,
len);
1681 elog(
ERROR,
"expected source encoding \"%s\", but got \"%s\"",
1687 elog(
ERROR,
"expected destination encoding \"%s\", but got \"%s\"",
1691 elog(
ERROR,
"encoding conversion length must not be negative");
1704 char buf[8 * 5 + 1];
1721 errmsg(
"invalid byte sequence for encoding \"%s\": %s",
1737 char buf[8 * 5 + 1];
1762 errmsg(
"character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"",
#define write_stderr(str)
#define unconstify(underlying_type, expr)
#define IS_HIGHBIT_SET(ch)
#define Assert(condition)
#define OidIsValid(objectId)
int errdetail(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
const char * pg_enc2gettext_tbl[]
const pg_enc2name pg_enc2name_tbl[]
#define palloc_array(type, count)
void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo, MemoryContext mcxt)
#define PG_FREE_IF_COPY(ptr, n)
#define PG_GETARG_BYTEA_PP(n)
#define PG_RETURN_BYTEA_P(x)
#define DirectFunctionCall1(func, arg1)
#define PG_GETARG_DATUM(n)
#define PG_GETARG_NAME(n)
#define OidFunctionCall6(functionId, arg1, arg2, arg3, arg4, arg5, arg6)
#define PG_RETURN_INT32(x)
#define PG_GETARG_INT32(n)
#define PG_RETURN_DATUM(x)
#define DirectFunctionCall3(func, arg1, arg2, arg3)
#define FunctionCall6(flinfo, arg1, arg2, arg3, arg4, arg5, arg6)
List * lcons(void *datum, List *list)
char * pg_client_to_server(const char *s, int len)
int GetDatabaseEncoding(void)
Datum pg_convert_to(PG_FUNCTION_ARGS)
int pg_encoding_wchar2mb_with_len(int encoding, const pg_wchar *from, char *to, int len)
static bool pg_generic_charinc(unsigned char *charptr, int len)
static const pg_enc2name * ClientEncoding
static FmgrInfo * ToServerConvProc
static FmgrInfo * ToClientConvProc
int pg_verify_mbstr_len(int encoding, const char *mbstr, int len, bool noError)
void InitializeClientEncoding(void)
int pg_dsplen(const char *mbstr)
int pg_mbstrlen_with_len(const char *mbstr, int limit)
mbcharacter_incrementer pg_database_encoding_character_incrementer(void)
int pg_wchar2mb_with_len(const pg_wchar *from, char *to, int len)
static FmgrInfo * Utf8ToServerConvProc
static List * ConvProcList
int pg_mb2wchar(const char *from, pg_wchar *to)
char * pg_any_to_server(const char *s, int len, int encoding)
int pg_mbcharcliplen(const char *mbstr, int len, int limit)
bool pg_unicode_to_server_noerror(char32_t c, unsigned char *s)
Datum PG_char_to_encoding(PG_FUNCTION_ARGS)
unsigned char * pg_do_encoding_conversion(unsigned char *src, int len, int src_encoding, int dest_encoding)
static const pg_enc2name * MessageEncoding
void report_untranslatable_char(int src_encoding, int dest_encoding, const char *mbstr, int len)
int pg_wchar2mb(const pg_wchar *from, char *to)
int pg_mbstrlen(const char *mbstr)
bool pg_verify_mbstr(int encoding, const char *mbstr, int len, bool noError)
static char * perform_default_encoding_conversion(const char *src, int len, bool is_client_to_server)
bool pg_verifymbstr(const char *mbstr, int len, bool noError)
int pg_mbcliplen(const char *mbstr, int len, int limit)
int GetMessageEncoding(void)
Datum pg_encoding_max_length_sql(PG_FUNCTION_ARGS)
Datum getdatabaseencoding(PG_FUNCTION_ARGS)
int pg_do_encoding_conversion_buf(Oid proc, int src_encoding, int dest_encoding, unsigned char *src, int srclen, unsigned char *dest, int destlen, bool noError)
void report_invalid_encoding(int encoding, const char *mbstr, int len)
const char * GetDatabaseEncodingName(void)
int SetClientEncoding(int encoding)
void SetMessageEncoding(int encoding)
char * pg_server_to_client(const char *s, int len)
Datum pg_convert(PG_FUNCTION_ARGS)
void check_encoding_conversion_args(int src_encoding, int dest_encoding, int len, int expected_src_encoding, int expected_dest_encoding)
int pg_database_encoding_max_length(void)
int PrepareClientEncoding(int encoding)
static bool backend_startup_complete
Datum pg_convert_from(PG_FUNCTION_ARGS)
int pg_get_client_encoding(void)
void pg_unicode_to_server(char32_t c, unsigned char *s)
static bool pg_utf8_increment(unsigned char *charptr, int length)
char * pg_server_to_any(const char *s, int len, int encoding)
Datum length_in_encoding(PG_FUNCTION_ARGS)
static int cliplen(const char *str, int len, int limit)
static int pending_client_encoding
void SetDatabaseEncoding(int encoding)
int pg_encoding_mbcliplen(int encoding, const char *mbstr, int len, int limit)
const char * pg_get_client_encoding_name(void)
Datum pg_client_encoding(PG_FUNCTION_ARGS)
Datum PG_encoding_to_char(PG_FUNCTION_ARGS)
int pg_encoding_mb2wchar_with_len(int encoding, const char *from, pg_wchar *to, int len)
static bool pg_eucjp_increment(unsigned char *charptr, int length)
int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len)
static const pg_enc2name * DatabaseEncoding
int pg_mblen(const char *mbstr)
void * MemoryContextAlloc(MemoryContext context, Size size)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
MemoryContext TopMemoryContext
MemoryContext CurrentMemoryContext
void * MemoryContextAllocHuge(MemoryContext context, Size size)
Datum namein(PG_FUNCTION_ARGS)
Oid FindDefaultConversionProc(int32 for_encoding, int32 to_encoding)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define foreach_delete_current(lst, var_or_cell)
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define MAX_MULTIBYTE_CHAR_LEN
#define MAX_CONVERSION_GROWTH
static unsigned char * unicode_to_utf8(char32_t c, unsigned char *utf8string)
bool(* mbcharacter_incrementer)(unsigned char *mbstr, int len)
int(* mbchar_verifier)(const unsigned char *mbstr, int len)
#define PG_VALID_ENCODING(_enc)
#define PG_VALID_FE_ENCODING(_enc)
#define PG_VALID_BE_ENCODING(_enc)
static bool is_valid_unicode_codepoint(char32_t c)
#define pg_encoding_to_char
#define pg_char_to_encoding
int(* mblen_converter)(const unsigned char *mbstr)
int pg_strcasecmp(const char *s1, const char *s2)
int pg_get_encoding_from_locale(const char *ctype, bool write_message)
static Datum BoolGetDatum(bool X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
static int32 DatumGetInt32(Datum X)
static void AssertCouldGetRelation(void)
mbstr_verifier mbverifystr
wchar2mb_with_len_converter wchar2mb_with_len
mb2wchar_with_len_converter mb2wchar_with_len
mbdisplaylen_converter dsplen
mbchar_verifier mbverifychar
static Size VARSIZE_ANY_EXHDR(const void *PTR)
static char * VARDATA(const void *PTR)
static char * VARDATA_ANY(const void *PTR)
static void SET_VARSIZE(void *PTR, Size len)
int pg_encoding_mblen_or_incomplete(int encoding, const char *mbstr, size_t remaining)
const pg_wchar_tbl pg_wchar_table[]
int pg_encoding_max_length(int encoding)
size_t pg_wchar_strlen(const pg_wchar *str)
bool IsTransactionState(void)