|
|
|
|
@ -24,6 +24,8 @@ |
|
|
|
|
static text *dotrim(const char *string, int stringlen, |
|
|
|
|
const char *set, int setlen, |
|
|
|
|
bool doltrim, bool dortrim); |
|
|
|
|
static bytea *dobyteatrim(bytea *string, bytea *set, |
|
|
|
|
bool doltrim, bool dortrim); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
@ -521,27 +523,12 @@ dotrim(const char *string, int stringlen, |
|
|
|
|
return cstring_to_text_with_len(string, stringlen); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
* |
|
|
|
|
* byteatrim |
|
|
|
|
* |
|
|
|
|
* Syntax: |
|
|
|
|
* |
|
|
|
|
* bytea byteatrim(bytea string, bytea set) |
|
|
|
|
* |
|
|
|
|
* Purpose: |
|
|
|
|
* |
|
|
|
|
* Returns string with characters removed from the front and back |
|
|
|
|
* up to the first character not in set. |
|
|
|
|
* |
|
|
|
|
* Cloned from btrim and modified as required. |
|
|
|
|
********************************************************************/ |
|
|
|
|
|
|
|
|
|
Datum |
|
|
|
|
byteatrim(PG_FUNCTION_ARGS) |
|
|
|
|
/*
|
|
|
|
|
* Common implementation for bytea versions of btrim, ltrim, rtrim |
|
|
|
|
*/ |
|
|
|
|
bytea * |
|
|
|
|
dobyteatrim(bytea *string, bytea *set, bool doltrim, bool dortrim) |
|
|
|
|
{ |
|
|
|
|
bytea *string = PG_GETARG_BYTEA_PP(0); |
|
|
|
|
bytea *set = PG_GETARG_BYTEA_PP(1); |
|
|
|
|
bytea *ret; |
|
|
|
|
char *ptr, |
|
|
|
|
*end, |
|
|
|
|
@ -556,7 +543,7 @@ byteatrim(PG_FUNCTION_ARGS) |
|
|
|
|
setlen = VARSIZE_ANY_EXHDR(set); |
|
|
|
|
|
|
|
|
|
if (stringlen <= 0 || setlen <= 0) |
|
|
|
|
PG_RETURN_BYTEA_P(string); |
|
|
|
|
return string; |
|
|
|
|
|
|
|
|
|
m = stringlen; |
|
|
|
|
ptr = VARDATA_ANY(string); |
|
|
|
|
@ -564,39 +551,126 @@ byteatrim(PG_FUNCTION_ARGS) |
|
|
|
|
ptr2start = VARDATA_ANY(set); |
|
|
|
|
end2 = ptr2start + setlen - 1; |
|
|
|
|
|
|
|
|
|
while (m > 0) |
|
|
|
|
if (doltrim) |
|
|
|
|
{ |
|
|
|
|
ptr2 = ptr2start; |
|
|
|
|
while (ptr2 <= end2) |
|
|
|
|
while (m > 0) |
|
|
|
|
{ |
|
|
|
|
if (*ptr == *ptr2) |
|
|
|
|
ptr2 = ptr2start; |
|
|
|
|
while (ptr2 <= end2) |
|
|
|
|
{ |
|
|
|
|
if (*ptr == *ptr2) |
|
|
|
|
break; |
|
|
|
|
++ptr2; |
|
|
|
|
} |
|
|
|
|
if (ptr2 > end2) |
|
|
|
|
break; |
|
|
|
|
++ptr2; |
|
|
|
|
ptr++; |
|
|
|
|
m--; |
|
|
|
|
} |
|
|
|
|
if (ptr2 > end2) |
|
|
|
|
break; |
|
|
|
|
ptr++; |
|
|
|
|
m--; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
while (m > 0) |
|
|
|
|
if (dortrim) |
|
|
|
|
{ |
|
|
|
|
ptr2 = ptr2start; |
|
|
|
|
while (ptr2 <= end2) |
|
|
|
|
while (m > 0) |
|
|
|
|
{ |
|
|
|
|
if (*end == *ptr2) |
|
|
|
|
ptr2 = ptr2start; |
|
|
|
|
while (ptr2 <= end2) |
|
|
|
|
{ |
|
|
|
|
if (*end == *ptr2) |
|
|
|
|
break; |
|
|
|
|
++ptr2; |
|
|
|
|
} |
|
|
|
|
if (ptr2 > end2) |
|
|
|
|
break; |
|
|
|
|
++ptr2; |
|
|
|
|
end--; |
|
|
|
|
m--; |
|
|
|
|
} |
|
|
|
|
if (ptr2 > end2) |
|
|
|
|
break; |
|
|
|
|
end--; |
|
|
|
|
m--; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ret = (bytea *) palloc(VARHDRSZ + m); |
|
|
|
|
SET_VARSIZE(ret, VARHDRSZ + m); |
|
|
|
|
memcpy(VARDATA(ret), ptr, m); |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
* |
|
|
|
|
* byteatrim |
|
|
|
|
* |
|
|
|
|
* Syntax: |
|
|
|
|
* |
|
|
|
|
* bytea byteatrim(bytea string, bytea set) |
|
|
|
|
* |
|
|
|
|
* Purpose: |
|
|
|
|
* |
|
|
|
|
* Returns string with characters removed from the front and back |
|
|
|
|
* up to the first character not in set. |
|
|
|
|
* |
|
|
|
|
* Cloned from btrim and modified as required. |
|
|
|
|
********************************************************************/ |
|
|
|
|
|
|
|
|
|
Datum |
|
|
|
|
byteatrim(PG_FUNCTION_ARGS) |
|
|
|
|
{ |
|
|
|
|
bytea *string = PG_GETARG_BYTEA_PP(0); |
|
|
|
|
bytea *set = PG_GETARG_BYTEA_PP(1); |
|
|
|
|
bytea *ret; |
|
|
|
|
|
|
|
|
|
ret = dobyteatrim(string, set, true, true); |
|
|
|
|
|
|
|
|
|
PG_RETURN_BYTEA_P(ret); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
* |
|
|
|
|
* bytealtrim |
|
|
|
|
* |
|
|
|
|
* Syntax: |
|
|
|
|
* |
|
|
|
|
* bytea bytealtrim(bytea string, bytea set) |
|
|
|
|
* |
|
|
|
|
* Purpose: |
|
|
|
|
* |
|
|
|
|
* Returns string with initial characters removed up to the first |
|
|
|
|
* character not in set. |
|
|
|
|
* |
|
|
|
|
********************************************************************/ |
|
|
|
|
|
|
|
|
|
Datum |
|
|
|
|
bytealtrim(PG_FUNCTION_ARGS) |
|
|
|
|
{ |
|
|
|
|
bytea *string = PG_GETARG_BYTEA_PP(0); |
|
|
|
|
bytea *set = PG_GETARG_BYTEA_PP(1); |
|
|
|
|
bytea *ret; |
|
|
|
|
|
|
|
|
|
ret = dobyteatrim(string, set, true, false); |
|
|
|
|
|
|
|
|
|
PG_RETURN_BYTEA_P(ret); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
|
* |
|
|
|
|
* byteartrim |
|
|
|
|
* |
|
|
|
|
* Syntax: |
|
|
|
|
* |
|
|
|
|
* bytea byteartrim(bytea string, bytea set) |
|
|
|
|
* |
|
|
|
|
* Purpose: |
|
|
|
|
* |
|
|
|
|
* Returns string with final characters removed after the last |
|
|
|
|
* character not in set. |
|
|
|
|
* |
|
|
|
|
********************************************************************/ |
|
|
|
|
|
|
|
|
|
Datum |
|
|
|
|
byteartrim(PG_FUNCTION_ARGS) |
|
|
|
|
{ |
|
|
|
|
bytea *string = PG_GETARG_BYTEA_PP(0); |
|
|
|
|
bytea *set = PG_GETARG_BYTEA_PP(1); |
|
|
|
|
bytea *ret; |
|
|
|
|
|
|
|
|
|
ret = dobyteatrim(string, set, false, true); |
|
|
|
|
|
|
|
|
|
PG_RETURN_BYTEA_P(ret); |
|
|
|
|
} |
|
|
|
|
|