26 static text *
dotrim(
const char *
string,
int stringlen,
27 const char *set,
int setlen,
28 bool doltrim,
bool dortrim);
30 bool doltrim,
bool dortrim);
188 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
189 errmsg(
"requested length too large")));
196 ptr2end = ptr2 + s2len;
203 memcpy(ptr_ret, ptr2, mlen);
216 memcpy(ptr_ret, ptr1, mlen);
286 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
287 errmsg(
"requested length too large")));
300 memcpy(ptr_ret, ptr1, mlen);
306 ptr2end = ptr2 + s2len;
312 memcpy(ptr_ret, ptr2, mlen);
377 dotrim(
const char *
string,
int stringlen,
378 const char *set,
int setlen,
379 bool doltrim,
bool dortrim)
384 if (stringlen > 0 && setlen > 0)
393 const char **stringchars;
394 const char **setchars;
407 stringchars = (
const char **)
palloc(stringlen *
sizeof(
char *));
408 stringmblen = (
int *)
palloc(stringlen *
sizeof(
int));
414 stringchars[stringnchars] = p;
415 stringmblen[stringnchars] = mblen =
pg_mblen(p);
421 setchars = (
const char **)
palloc(setlen *
sizeof(
char *));
422 setmblen = (
int *)
palloc(setlen *
sizeof(
int));
428 setchars[setnchars] = p;
429 setmblen[setnchars] = mblen =
pg_mblen(p);
436 resultnchars = stringnchars;
440 while (resultnchars > 0)
442 str_pos = stringchars[resultndx];
443 str_len = stringmblen[resultndx];
444 for (
i = 0;
i < setnchars;
i++)
446 if (str_len == setmblen[
i] &&
447 memcmp(str_pos, setchars[
i], str_len) == 0)
453 stringlen -= str_len;
461 while (resultnchars > 0)
463 str_pos = stringchars[resultndx + resultnchars - 1];
464 str_len = stringmblen[resultndx + resultnchars - 1];
465 for (
i = 0;
i < setnchars;
i++)
467 if (str_len == setmblen[
i] &&
468 memcmp(str_pos, setchars[
i], str_len) == 0)
473 stringlen -= str_len;
490 while (stringlen > 0)
494 for (
i = 0;
i < setlen;
i++)
496 if (str_ch == set[
i])
508 while (stringlen > 0)
510 char str_ch =
string[stringlen - 1];
512 for (
i = 0;
i < setlen;
i++)
514 if (str_ch == set[
i])
548 if (stringlen <= 0 || setlen <= 0)
553 end = ptr + stringlen - 1;
555 end2 = ptr2start + setlen - 1;
835 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
836 errmsg(
"requested length too large")));
848 for (
i = 0;
i < fromlen;
i +=
len)
851 if (
len == source_len &&
862 for (
i = 0;
i < from_index;
i++)
865 if (p >= (to_ptr + tolen))
868 if (p < (to_ptr + tolen))
871 memcpy(target, p,
len);
879 memcpy(target,
source, source_len);
880 target += source_len;
881 retlen += source_len;
943 result = *
data & 0x07;
946 else if (*
data >= 0xE0)
948 result = *
data & 0x0F;
954 result = *
data & 0x1f;
960 for (
i = 1;
i <= tbytes;
i++)
963 result = (result << 6) + (
data[
i] & 0x3f);
972 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
973 errmsg(
"requested character too large")));
1016 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1017 errmsg(
"character number must be positive")));
1020 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1021 errmsg(
"null character not permitted")));
1036 if (cvalue > 0x0010ffff)
1038 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1039 errmsg(
"requested character too large for encoding: %u",
1042 if (cvalue > 0xffff)
1044 else if (cvalue > 0x07ff)
1051 wch = (
unsigned char *)
VARDATA(result);
1055 wch[0] = 0xC0 | ((cvalue >> 6) & 0x1F);
1056 wch[1] = 0x80 | (cvalue & 0x3F);
1058 else if (bytes == 3)
1060 wch[0] = 0xE0 | ((cvalue >> 12) & 0x0F);
1061 wch[1] = 0x80 | ((cvalue >> 6) & 0x3F);
1062 wch[2] = 0x80 | (cvalue & 0x3F);
1066 wch[0] = 0xF0 | ((cvalue >> 18) & 0x07);
1067 wch[1] = 0x80 | ((cvalue >> 12) & 0x3F);
1068 wch[2] = 0x80 | ((cvalue >> 6) & 0x3F);
1069 wch[3] = 0x80 | (cvalue & 0x3F);
1079 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1080 errmsg(
"requested character not valid for encoding: %u",
1089 if ((is_mb && (cvalue > 127)) || (!is_mb && (cvalue > 255)))
1091 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1092 errmsg(
"requested character too large for encoding: %u",
1097 *
VARDATA(result) = (char) cvalue;
1138 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1139 errmsg(
"requested length too large")));
1146 for (
i = 0;
i < count;
i++)
1148 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)