27 static text *
dotrim(
const char *
string,
int stringlen,
28 const char *set,
int setlen,
29 bool doltrim,
bool dortrim);
31 bool doltrim,
bool dortrim);
189 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
190 errmsg(
"requested length too large")));
197 ptr2end = ptr2 + s2len;
204 memcpy(ptr_ret, ptr2, mlen);
217 memcpy(ptr_ret, ptr1, mlen);
287 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
288 errmsg(
"requested length too large")));
301 memcpy(ptr_ret, ptr1, mlen);
307 ptr2end = ptr2 + s2len;
313 memcpy(ptr_ret, ptr2, mlen);
378 dotrim(
const char *
string,
int stringlen,
379 const char *set,
int setlen,
380 bool doltrim,
bool dortrim)
385 if (stringlen > 0 && setlen > 0)
394 const char **stringchars;
395 const char **setchars;
408 stringchars = (
const char **)
palloc(stringlen *
sizeof(
char *));
409 stringmblen = (
int *)
palloc(stringlen *
sizeof(
int));
415 stringchars[stringnchars] = p;
416 stringmblen[stringnchars] = mblen =
pg_mblen(p);
422 setchars = (
const char **)
palloc(setlen *
sizeof(
char *));
423 setmblen = (
int *)
palloc(setlen *
sizeof(
int));
429 setchars[setnchars] = p;
430 setmblen[setnchars] = mblen =
pg_mblen(p);
437 resultnchars = stringnchars;
441 while (resultnchars > 0)
443 str_pos = stringchars[resultndx];
444 str_len = stringmblen[resultndx];
445 for (
i = 0;
i < setnchars;
i++)
447 if (str_len == setmblen[
i] &&
448 memcmp(str_pos, setchars[
i], str_len) == 0)
454 stringlen -= str_len;
462 while (resultnchars > 0)
464 str_pos = stringchars[resultndx + resultnchars - 1];
465 str_len = stringmblen[resultndx + resultnchars - 1];
466 for (
i = 0;
i < setnchars;
i++)
468 if (str_len == setmblen[
i] &&
469 memcmp(str_pos, setchars[
i], str_len) == 0)
474 stringlen -= str_len;
491 while (stringlen > 0)
495 for (
i = 0;
i < setlen;
i++)
497 if (str_ch == set[
i])
509 while (stringlen > 0)
511 char str_ch =
string[stringlen - 1];
513 for (
i = 0;
i < setlen;
i++)
515 if (str_ch == set[
i])
549 if (stringlen <= 0 || setlen <= 0)
554 end = ptr + stringlen - 1;
556 end2 = ptr2start + setlen - 1;
827 to_end = to_ptr + tolen;
838 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
839 errmsg(
"requested length too large")));
851 for (
i = 0;
i < fromlen;
i +=
len)
854 if (
len == source_len &&
865 for (
i = 0;
i < from_index;
i++)
874 memcpy(target, p,
len);
882 memcpy(target,
source, source_len);
883 target += source_len;
884 retlen += source_len;
946 result = *
data & 0x07;
949 else if (*
data >= 0xE0)
951 result = *
data & 0x0F;
957 result = *
data & 0x1f;
963 for (
i = 1;
i <= tbytes;
i++)
966 result = (result << 6) + (
data[
i] & 0x3f);
975 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
976 errmsg(
"requested character too large")));
1019 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1020 errmsg(
"character number must be positive")));
1023 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1024 errmsg(
"null character not permitted")));
1039 if (cvalue > 0x0010ffff)
1041 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1042 errmsg(
"requested character too large for encoding: %u",
1045 if (cvalue > 0xffff)
1047 else if (cvalue > 0x07ff)
1054 wch = (
unsigned char *)
VARDATA(result);
1058 wch[0] = 0xC0 | ((cvalue >> 6) & 0x1F);
1059 wch[1] = 0x80 | (cvalue & 0x3F);
1061 else if (bytes == 3)
1063 wch[0] = 0xE0 | ((cvalue >> 12) & 0x0F);
1064 wch[1] = 0x80 | ((cvalue >> 6) & 0x3F);
1065 wch[2] = 0x80 | (cvalue & 0x3F);
1069 wch[0] = 0xF0 | ((cvalue >> 18) & 0x07);
1070 wch[1] = 0x80 | ((cvalue >> 12) & 0x3F);
1071 wch[2] = 0x80 | ((cvalue >> 6) & 0x3F);
1072 wch[3] = 0x80 | (cvalue & 0x3F);
1082 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1083 errmsg(
"requested character not valid for encoding: %u",
1092 if ((is_mb && (cvalue > 127)) || (!is_mb && (cvalue > 255)))
1094 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1095 errmsg(
"requested character too large for encoding: %u",
1100 *
VARDATA(result) = (char) cvalue;
1141 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1142 errmsg(
"requested length too large")));
1149 for (
i = 0;
i < count;
i++)
1151 memcpy(cp, sp, slen);
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define PG_GETARG_BYTEA_PP(n)
#define PG_GETARG_TEXT_PP(n)
#define PG_RETURN_BYTEA_P(x)
#define PG_RETURN_TEXT_P(x)
#define PG_RETURN_INT32(x)
#define PG_GETARG_INT32(n)
#define PG_GET_COLLATION()
static bool pg_mul_s32_overflow(int32 a, int32 b, int32 *result)
static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)
Assert(fmt[strlen(fmt) - 1] !='\n')
int GetDatabaseEncoding(void)
int pg_mbstrlen_with_len(const char *mbstr, int limit)
int pg_database_encoding_max_length(void)
int pg_mblen(const char *mbstr)
void pfree(void *pointer)
#define AllocSizeIsValid(size)
#define CHECK_FOR_INTERRUPTS()
static text * dotrim(const char *string, int stringlen, const char *set, int setlen, bool doltrim, bool dortrim)
Datum bytealtrim(PG_FUNCTION_ARGS)
Datum ltrim(PG_FUNCTION_ARGS)
Datum byteatrim(PG_FUNCTION_ARGS)
Datum lower(PG_FUNCTION_ARGS)
Datum initcap(PG_FUNCTION_ARGS)
Datum upper(PG_FUNCTION_ARGS)
Datum byteartrim(PG_FUNCTION_ARGS)
Datum rtrim(PG_FUNCTION_ARGS)
Datum rpad(PG_FUNCTION_ARGS)
Datum chr(PG_FUNCTION_ARGS)
Datum ltrim1(PG_FUNCTION_ARGS)
Datum btrim1(PG_FUNCTION_ARGS)
Datum ascii(PG_FUNCTION_ARGS)
Datum rtrim1(PG_FUNCTION_ARGS)
Datum translate(PG_FUNCTION_ARGS)
static bytea * dobyteatrim(bytea *string, bytea *set, bool doltrim, bool dortrim)
Datum lpad(PG_FUNCTION_ARGS)
Datum btrim(PG_FUNCTION_ARGS)
Datum repeat(PG_FUNCTION_ARGS)
static rewind_source * source
#define SET_VARSIZE(PTR, len)
#define VARSIZE_ANY_EXHDR(PTR)
text * cstring_to_text_with_len(const char *s, int len)
text * cstring_to_text(const char *s)
bool pg_utf8_islegal(const unsigned char *source, int length)
int pg_encoding_max_length(int encoding)