Datum
lpad(PG_FUNCTION_ARGS)
{
text *string1 = PG_GETARG_TEXT_PP(0);
int32 len = PG_GETARG_INT32(1);
text *string2 = PG_GETARG_TEXT_PP(2);
text *ret; char *ptr1,
*ptr2,
*ptr2start,
*ptr_ret; constchar *ptr2end; int m,
s1len,
s2len; int bytelen;
/* Negative len is silently taken as zero */ if (len < 0)
len = 0;
Datum
rpad(PG_FUNCTION_ARGS)
{
text *string1 = PG_GETARG_TEXT_PP(0);
int32 len = PG_GETARG_INT32(1);
text *string2 = PG_GETARG_TEXT_PP(2);
text *ret; char *ptr1,
*ptr2,
*ptr2start,
*ptr_ret; constchar *ptr2end; int m,
s1len,
s2len; int bytelen;
/* Negative len is silently taken as zero */ if (len < 0)
len = 0;
Datum
btrim1(PG_FUNCTION_ARGS)
{
text *string = PG_GETARG_TEXT_PP(0);
text *ret;
ret = dotrim(VARDATA_ANY(string), VARSIZE_ANY_EXHDR(string), " ", 1, true, true);
PG_RETURN_TEXT_P(ret);
}
/* *Commonimplementationforbtrim,ltrim,rtrim
*/ static text *
dotrim(constchar *string, int stringlen, constchar *set, int setlen, bool doltrim, bool dortrim)
{ int i;
/* Nothing to do if either string or set is empty */ if (stringlen > 0 && setlen > 0)
{ if (pg_database_encoding_max_length() > 1)
{ /* *Inthemultibyte-encodingcase,buildarraysofpointersto *characterstarts,sothatwecanavoidinefficientchecksin *theinnerloops.
*/ constchar **stringchars; constchar **setchars; constchar *setend; int *stringmblen; int *setmblen; int stringnchars; int setnchars; int resultndx; int resultnchars; constchar *p; constchar *pend; int len; int mblen; constchar *str_pos; int str_len;
stringchars = (constchar **) palloc(stringlen * sizeof(char *));
stringmblen = (int *) palloc(stringlen * sizeof(int));
stringnchars = 0;
p = string;
len = stringlen;
pend = p + len; while (len > 0)
{
stringchars[stringnchars] = p;
stringmblen[stringnchars] = mblen = pg_mblen_range(p, pend);
stringnchars++;
p += mblen;
len -= mblen;
}
setchars = (constchar **) palloc(setlen * sizeof(char *));
setmblen = (int *) palloc(setlen * sizeof(int));
setnchars = 0;
p = set;
len = setlen;
setend = set + setlen; while (len > 0)
{
setchars[setnchars] = p;
setmblen[setnchars] = mblen = pg_mblen_range(p, setend);
setnchars++;
p += mblen;
len -= mblen;
}
resultndx = 0; /* index in stringchars[] */
resultnchars = stringnchars;
if (doltrim)
{ while (resultnchars > 0)
{
str_pos = stringchars[resultndx];
str_len = stringmblen[resultndx]; for (i = 0; i < setnchars; i++)
{ if (str_len == setmblen[i] &&
memcmp(str_pos, setchars[i], str_len) == 0) break;
} if (i >= setnchars) break; /* no match here */
string += str_len;
stringlen -= str_len;
resultndx++;
resultnchars--;
}
}
if (dortrim)
{ while (resultnchars > 0)
{
str_pos = stringchars[resultndx + resultnchars - 1];
str_len = stringmblen[resultndx + resultnchars - 1]; for (i = 0; i < setnchars; i++)
{ if (str_len == setmblen[i] &&
memcmp(str_pos, setchars[i], str_len) == 0) break;
} if (i >= setnchars) break; /* no match here */
stringlen -= str_len;
resultnchars--;
}
}
Datum
translate(PG_FUNCTION_ARGS)
{
text *string = PG_GETARG_TEXT_PP(0);
text *from = PG_GETARG_TEXT_PP(1);
text *to = PG_GETARG_TEXT_PP(2);
text *result; char *from_ptr,
*to_ptr,
*to_end; char *source,
*target; constchar *source_end; constchar *from_end; int m,
fromlen,
tolen,
retlen,
i; int bytelen; int len; int source_len; int from_index;
m = VARSIZE_ANY_EXHDR(string); if (m <= 0)
PG_RETURN_TEXT_P(string);
source = VARDATA_ANY(string);
source_end = source + m;
for (i = 0; i < fromlen; i += len)
{
len = pg_mblen_range(&from_ptr[i], from_end); if (len == source_len &&
memcmp(source, &from_ptr[i], len) == 0) break;
from_index++;
} if (i < fromlen)
{ /* substitute, or delete if no corresponding "to" character */ char *p = to_ptr;
for (i = 0; i < from_index; i++)
{ if (p >= to_end) break;
p += pg_mblen_range(p, to_end);
} if (p < to_end)
{
len = pg_mblen_range(p, to_end);
memcpy(target, p, len);
target += len;
retlen += len;
}
} else
{ /* no match, so copy */
memcpy(target, source, source_len);
target += source_len;
retlen += source_len;
}
Datum
chr (PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
uint32 cvalue;
text *result; int encoding = GetDatabaseEncoding();
/* *Erroroutonargumentsthatmakenosenseorthatwecan'tvalidly *representintheencoding.
*/ if (arg < 0)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("character number must be positive"))); elseif (arg == 0)
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("null character not permitted")));
cvalue = arg;
if (encoding == PG_UTF8 && cvalue > 127)
{ /* for Unicode we treat the argument as a code point */ int bytes; unsignedchar *wch;
/* *WeonlyallowvalidUnicodecodepoints;perRFC3629thatstopsat *U+10FFFF,eventhough4-byteUTF8sequencescanholdvaluesupto *U+1FFFFF.
*/ if (cvalue > 0x0010ffff)
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested character too large for encoding: %u",
cvalue)));
/* *Theprecedingrangecheckisn'tsufficient,becauseUTF8excludes *Unicode"surrogatepair"codes.Makesurewhatwecreatedisvalid *UTF8.
*/ if (!pg_utf8_islegal(wch, bytes))
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested character not valid for encoding: %u",
cvalue)));
} else
{ bool is_mb;
is_mb = pg_encoding_max_length(encoding) > 1;
if ((is_mb && (cvalue > 127)) || (!is_mb && (cvalue > 255)))
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested character too large for encoding: %u",
cvalue)));
Datum
repeat(PG_FUNCTION_ARGS)
{
text *string = PG_GETARG_TEXT_PP(0);
int32 count = PG_GETARG_INT32(1);
text *result; int slen,
tlen; int i; char *cp,
*sp;
if (count < 0)
count = 0;
slen = VARSIZE_ANY_EXHDR(string);
if (unlikely(pg_mul_s32_overflow(count, slen, &tlen)) ||
unlikely(pg_add_s32_overflow(tlen, VARHDRSZ, &tlen)) ||
unlikely(!AllocSizeIsValid(tlen)))
ereport(ERROR,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("requested length too large")));
result = (text *) palloc(tlen);
SET_VARSIZE(result, tlen);
cp = VARDATA(result);
sp = VARDATA_ANY(string); for (i = 0; i < count; i++)
{
memcpy(cp, sp, slen);
cp += slen;
CHECK_FOR_INTERRUPTS();
}
PG_RETURN_TEXT_P(result);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.