64 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
65 errmsg(
"unrecognized encoding: \"%s\"", namebuf)));
78 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
79 errmsg(
"result of encoding conversion is too large")));
87 elog(
FATAL,
"overflow - encode estimate too small");
112 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
113 errmsg(
"unrecognized encoding: \"%s\"", namebuf)));
126 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
127 errmsg(
"result of decoding conversion is too large")));
135 elog(
FATAL,
"overflow - decode estimate too small");
147 static const char hextbl[] =
"0123456789abcdef";
150 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
151 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
152 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
153 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
154 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
155 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
156 -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
157 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
163 const char *end = src +
len;
167 *dst++ =
hextbl[(*src >> 4) & 0xF];
168 *dst++ =
hextbl[*src & 0xF];
171 return (uint64)
len * 2;
177 unsigned char c = (
unsigned char) *cp;
185 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
186 errmsg(
"invalid hexadecimal digit: \"%.*s\"",
206 if (*s ==
' ' || *s ==
'\n' || *s ==
'\t' || *s ==
'\r')
215 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
216 errmsg(
"invalid hexadecimal data: odd number of digits")));
229 return (uint64) srclen << 1;
235 return (uint64) srclen >> 1;
243 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
246 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
247 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
248 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
249 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
250 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
251 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
252 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
253 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
271 buf |= (
unsigned char) *s << (pos << 3);
296 *p++ = (pos == 0) ?
_base64[(
buf >> 6) & 0x3f] :
'=';
306 const char *srcend = src +
len,
319 if (
c ==
' ' ||
c ==
'\t' ||
c ==
'\n' ||
c ==
'\r')
333 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
334 errmsg(
"unexpected \"=\" while decoding base64 sequence")));
341 if (
c > 0 &&
c < 127)
345 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
346 errmsg(
"invalid symbol \"%.*s\" found while decoding base64 sequence",
354 *p++ = (
buf >> 16) & 255;
355 if (end == 0 || end > 1)
356 *p++ = (
buf >> 8) & 255;
357 if (end == 0 || end > 2)
366 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
367 errmsg(
"invalid base64 end sequence"),
368 errhint(
"Input data is missing padding, is truncated, or is otherwise corrupted.")));
378 return ((uint64) srclen + 2) * 4 / 3 + (uint64) srclen / (76 * 3 / 4);
384 return ((uint64) srclen * 3) >> 2;
401 #define VAL(CH) ((CH) - '0')
402 #define DIG(VAL) ((VAL) + '0')
407 const char *end = src + srclen;
413 unsigned char c = (
unsigned char) *src;
419 rp[2] =
DIG((
c >> 3) & 7);
446 const char *end = src + srclen;
454 else if (src + 3 < end &&
455 (src[1] >=
'0' && src[1] <=
'3') &&
456 (src[2] >=
'0' && src[2] <=
'7') &&
457 (src[3] >=
'0' && src[3] <=
'7'))
465 *rp++ =
val +
VAL(src[3]);
468 else if (src + 1 < end &&
481 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
482 errmsg(
"invalid input syntax for type %s",
"bytea")));
494 const char *end = src + srclen;
501 else if (*src ==
'\\')
515 const char *end = src + srclen;
522 else if (src + 3 < end &&
523 (src[1] >=
'0' && src[1] <=
'3') &&
524 (src[2] >=
'0' && src[2] <=
'7') &&
525 (src[3] >=
'0' && src[3] <=
'7'))
532 else if (src + 1 < end &&
546 (
errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
547 errmsg(
"invalid input syntax for type %s",
"bytea")));
587 NULL, NULL, NULL, NULL
#define TextDatumGetCString(d)
#define IS_HIGHBIT_SET(ch)
static void PGresult * res
elog(ERROR, "%s: %s", p2, msg)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
static uint64 pg_base64_decode(const char *src, size_t len, char *dst)
static char get_hex(const char *cp)
static uint64 hex_dec_len(const char *src, size_t srclen)
static const struct pg_encoding * pg_find_encoding(const char *name)
static uint64 pg_base64_encode(const char *src, size_t len, char *dst)
static uint64 esc_encode(const char *src, size_t srclen, char *dst)
static uint64 hex_enc_len(const char *src, size_t srclen)
Datum binary_decode(PG_FUNCTION_ARGS)
static const struct @19 enclist[]
static const char hextbl[]
uint64 hex_encode(const char *src, size_t len, char *dst)
static uint64 esc_enc_len(const char *src, size_t srclen)
static uint64 pg_base64_enc_len(const char *src, size_t srclen)
static const char _base64[]
static uint64 esc_decode(const char *src, size_t srclen, char *dst)
static uint64 esc_dec_len(const char *src, size_t srclen)
Datum binary_encode(PG_FUNCTION_ARGS)
uint64 hex_decode(const char *src, size_t len, char *dst)
static const int8 b64lookup[128]
static const int8 hexlookup[128]
static uint64 pg_base64_dec_len(const char *src, size_t srclen)
#define PG_GETARG_BYTEA_PP(n)
#define PG_GETARG_TEXT_PP(n)
#define PG_RETURN_BYTEA_P(x)
#define PG_GETARG_DATUM(n)
#define PG_RETURN_TEXT_P(x)
int pg_mblen(const char *mbstr)
int pg_strcasecmp(const char *s1, const char *s2)
#define SET_VARSIZE(PTR, len)
#define VARSIZE_ANY_EXHDR(PTR)
uint64(* encode_len)(const char *data, size_t dlen)
uint64(* decode_len)(const char *data, size_t dlen)
uint64(* decode)(const char *data, size_t dlen, char *res)
uint64(* encode)(const char *data, size_t dlen, char *res)