diff options
Diffstat (limited to 'src/backend/utils/adt/varlena.c')
-rw-r--r-- | src/backend/utils/adt/varlena.c | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 28b5745ba8..cd036afc00 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -2662,7 +2662,7 @@ bytea_catenate(bytea *t1, bytea *t2) } #define PG_STR_GET_BYTEA(str_) \ - DatumGetByteaP(DirectFunctionCall1(byteain, CStringGetDatum(str_))) + DatumGetByteaPP(DirectFunctionCall1(byteain, CStringGetDatum(str_))) /* * bytea_substr() @@ -2934,13 +2934,12 @@ byteaGetBit(PG_FUNCTION_ARGS) Datum byteaSetByte(PG_FUNCTION_ARGS) { - bytea *v = PG_GETARG_BYTEA_P(0); + bytea *res = PG_GETARG_BYTEA_P_COPY(0); int32 n = PG_GETARG_INT32(1); int32 newByte = PG_GETARG_INT32(2); int len; - bytea *res; - len = VARSIZE(v) - VARHDRSZ; + len = VARSIZE(res) - VARHDRSZ; if (n < 0 || n >= len) ereport(ERROR, @@ -2949,12 +2948,6 @@ byteaSetByte(PG_FUNCTION_ARGS) n, len - 1))); /* - * Make a copy of the original varlena. - */ - res = (bytea *) palloc(VARSIZE(v)); - memcpy((char *) res, (char *) v, VARSIZE(v)); - - /* * Now set the byte. */ ((unsigned char *) VARDATA(res))[n] = newByte; @@ -2973,17 +2966,16 @@ byteaSetByte(PG_FUNCTION_ARGS) Datum byteaSetBit(PG_FUNCTION_ARGS) { - bytea *v = PG_GETARG_BYTEA_P(0); + bytea *res = PG_GETARG_BYTEA_P_COPY(0); int32 n = PG_GETARG_INT32(1); int32 newBit = PG_GETARG_INT32(2); - bytea *res; int len; int oldByte, newByte; int byteNo, bitNo; - len = VARSIZE(v) - VARHDRSZ; + len = VARSIZE(res) - VARHDRSZ; if (n < 0 || n >= len * 8) ereport(ERROR, @@ -3003,12 +2995,6 @@ byteaSetBit(PG_FUNCTION_ARGS) errmsg("new bit must be 0 or 1"))); /* - * Make a copy of the original varlena. - */ - res = (bytea *) palloc(VARSIZE(v)); - memcpy((char *) res, (char *) v, VARSIZE(v)); - - /* * Update the byte. */ oldByte = ((unsigned char *) VARDATA(res))[byteNo]; |