aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/int8.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-06-13 07:35:40 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-06-13 07:35:40 +0000
commitf2d120532207b8873a5e74e7350dd2904f377289 (patch)
tree992c89e023c4b29b42bf4fd6563de91f8d6ec8ca /src/backend/utils/adt/int8.c
parent8f057d971d663fff9bbb2ae7d053bf71cf09b4a2 (diff)
downloadpostgresql-f2d120532207b8873a5e74e7350dd2904f377289.tar.gz
postgresql-f2d120532207b8873a5e74e7350dd2904f377289.zip
Another batch of fmgr updates. I think I have gotten all old-style
functions that take pass-by-value datatypes. Should be ready for port testing ...
Diffstat (limited to 'src/backend/utils/adt/int8.c')
-rw-r--r--src/backend/utils/adt/int8.c695
1 files changed, 290 insertions, 405 deletions
diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index a30a920b6a4..774e9aba89c 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.19 2000/05/28 17:56:05 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.20 2000/06/13 07:35:07 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -57,17 +57,15 @@
/* int8in()
*/
-int64 *
-int8in(char *str)
+Datum
+int8in(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
+ char *str = PG_GETARG_CSTRING(0);
+ int64 result;
char *ptr = str;
int64 tmp = 0;
int sign = 1;
- if (!PointerIsValid(str))
- elog(ERROR, "Bad (null) int8 external representation");
-
/*
* Do our own scan, rather than relying on sscanf which might be
* broken for long long.
@@ -91,34 +89,28 @@ int8in(char *str)
if (*ptr) /* trailing junk? */
elog(ERROR, "Bad int8 external representation \"%s\"", str);
- *result = (sign < 0) ? -tmp : tmp;
+ result = (sign < 0) ? -tmp : tmp;
- return result;
-} /* int8in() */
+ PG_RETURN_INT64(result);
+}
/* int8out()
*/
-char *
-int8out(int64 *val)
+Datum
+int8out(PG_FUNCTION_ARGS)
{
+ int64 val = PG_GETARG_INT64(0);
char *result;
-
int len;
char buf[MAXINT8LEN + 1];
- if (!PointerIsValid(val))
- return NULL;
-
- if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, *val)) < 0)
+ if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, val)) < 0)
elog(ERROR, "Unable to format int8");
- result = palloc(len + 1);
-
- strcpy(result, buf);
-
- return result;
-} /* int8out() */
+ result = pstrdup(buf);
+ PG_RETURN_CSTRING(result);
+}
/*----------------------------------------------------------
@@ -128,511 +120,403 @@ int8out(int64 *val)
/* int8relop()
* Is val1 relop val2?
*/
-bool
-int8eq(int64 *val1, int64 *val2)
+Datum
+int8eq(PG_FUNCTION_ARGS)
{
- if (!val1 || !val2)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return *val1 == *val2;
-} /* int8eq() */
+ PG_RETURN_BOOL(val1 == val2);
+}
-bool
-int8ne(int64 *val1, int64 *val2)
+Datum
+int8ne(PG_FUNCTION_ARGS)
{
- if (!val1 || !val2)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return *val1 != *val2;
-} /* int8ne() */
+ PG_RETURN_BOOL(val1 != val2);
+}
-bool
-int8lt(int64 *val1, int64 *val2)
+Datum
+int8lt(PG_FUNCTION_ARGS)
{
- if (!val1 || !val2)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return *val1 < *val2;
-} /* int8lt() */
+ PG_RETURN_BOOL(val1 < val2);
+}
-bool
-int8gt(int64 *val1, int64 *val2)
+Datum
+int8gt(PG_FUNCTION_ARGS)
{
- if (!val1 || !val2)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return *val1 > *val2;
-} /* int8gt() */
+ PG_RETURN_BOOL(val1 > val2);
+}
-bool
-int8le(int64 *val1, int64 *val2)
+Datum
+int8le(PG_FUNCTION_ARGS)
{
- if (!val1 || !val2)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return *val1 <= *val2;
-} /* int8le() */
+ PG_RETURN_BOOL(val1 <= val2);
+}
-bool
-int8ge(int64 *val1, int64 *val2)
+Datum
+int8ge(PG_FUNCTION_ARGS)
{
- if (!val1 || !val2)
- return 0;
-
- return *val1 >= *val2;
-} /* int8ge() */
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+ PG_RETURN_BOOL(val1 >= val2);
+}
/* int84relop()
* Is 64-bit val1 relop 32-bit val2?
*/
-bool
-int84eq(int64 *val1, int32 val2)
+Datum
+int84eq(PG_FUNCTION_ARGS)
{
- if (!val1)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- return *val1 == val2;
-} /* int84eq() */
+ PG_RETURN_BOOL(val1 == val2);
+}
-bool
-int84ne(int64 *val1, int32 val2)
+Datum
+int84ne(PG_FUNCTION_ARGS)
{
- if (!val1)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- return *val1 != val2;
-} /* int84ne() */
+ PG_RETURN_BOOL(val1 != val2);
+}
-bool
-int84lt(int64 *val1, int32 val2)
+Datum
+int84lt(PG_FUNCTION_ARGS)
{
- if (!val1)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- return *val1 < val2;
-} /* int84lt() */
+ PG_RETURN_BOOL(val1 < val2);
+}
-bool
-int84gt(int64 *val1, int32 val2)
+Datum
+int84gt(PG_FUNCTION_ARGS)
{
- if (!val1)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- return *val1 > val2;
-} /* int84gt() */
+ PG_RETURN_BOOL(val1 > val2);
+}
-bool
-int84le(int64 *val1, int32 val2)
+Datum
+int84le(PG_FUNCTION_ARGS)
{
- if (!val1)
- return 0;
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- return *val1 <= val2;
-} /* int84le() */
+ PG_RETURN_BOOL(val1 <= val2);
+}
-bool
-int84ge(int64 *val1, int32 val2)
+Datum
+int84ge(PG_FUNCTION_ARGS)
{
- if (!val1)
- return 0;
-
- return *val1 >= val2;
-} /* int84ge() */
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+ PG_RETURN_BOOL(val1 >= val2);
+}
/* int48relop()
* Is 32-bit val1 relop 64-bit val2?
*/
-bool
-int48eq(int32 val1, int64 *val2)
+Datum
+int48eq(PG_FUNCTION_ARGS)
{
- if (!val2)
- return 0;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return val1 == *val2;
-} /* int48eq() */
+ PG_RETURN_BOOL(val1 == val2);
+}
-bool
-int48ne(int32 val1, int64 *val2)
+Datum
+int48ne(PG_FUNCTION_ARGS)
{
- if (!val2)
- return 0;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return val1 != *val2;
-} /* int48ne() */
+ PG_RETURN_BOOL(val1 != val2);
+}
-bool
-int48lt(int32 val1, int64 *val2)
+Datum
+int48lt(PG_FUNCTION_ARGS)
{
- if (!val2)
- return 0;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return val1 < *val2;
-} /* int48lt() */
+ PG_RETURN_BOOL(val1 < val2);
+}
-bool
-int48gt(int32 val1, int64 *val2)
+Datum
+int48gt(PG_FUNCTION_ARGS)
{
- if (!val2)
- return 0;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return val1 > *val2;
-} /* int48gt() */
+ PG_RETURN_BOOL(val1 > val2);
+}
-bool
-int48le(int32 val1, int64 *val2)
+Datum
+int48le(PG_FUNCTION_ARGS)
{
- if (!val2)
- return 0;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return val1 <= *val2;
-} /* int48le() */
+ PG_RETURN_BOOL(val1 <= val2);
+}
-bool
-int48ge(int32 val1, int64 *val2)
+Datum
+int48ge(PG_FUNCTION_ARGS)
{
- if (!val2)
- return 0;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return val1 >= *val2;
-} /* int48ge() */
+ PG_RETURN_BOOL(val1 >= val2);
+}
/*----------------------------------------------------------
* Arithmetic operators on 64-bit integers.
*---------------------------------------------------------*/
-int64 *
-int8um(int64 *val)
+Datum
+int8um(PG_FUNCTION_ARGS)
{
- int64 temp = 0;
- int64 *result = palloc(sizeof(int64));
-
- if (!PointerIsValid(val))
- return NULL;
-
- result = int8mi(&temp, val);
-
- return result;
-} /* int8um() */
+ int64 val = PG_GETARG_INT64(0);
+ PG_RETURN_INT64(- val);
+}
-int64 *
-int8pl(int64 *val1, int64 *val2)
+Datum
+int8pl(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
- return NULL;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- *result = *val1 + *val2;
-
- return result;
-} /* int8pl() */
+ PG_RETURN_INT64(val1 + val2);
+}
-int64 *
-int8mi(int64 *val1, int64 *val2)
+Datum
+int8mi(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
- return NULL;
-
- *result = *val1 - *val2;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return result;
-} /* int8mi() */
+ PG_RETURN_INT64(val1 - val2);
+}
-int64 *
-int8mul(int64 *val1, int64 *val2)
+Datum
+int8mul(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
- return NULL;
-
- *result = *val1 * *val2;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return result;
-} /* int8mul() */
+ PG_RETURN_INT64(val1 * val2);
+}
-int64 *
-int8div(int64 *val1, int64 *val2)
+Datum
+int8div(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
- return NULL;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
- *result = *val1 / *val2;
-
- return result;
-} /* int8div() */
+ PG_RETURN_INT64(val1 / val2);
+}
/* int8abs()
* Absolute value
*/
-int64 *
-int8abs(int64 *arg1)
+Datum
+int8abs(PG_FUNCTION_ARGS)
{
- int64 *result;
-
- if (!PointerIsValid(arg1))
- return NULL;
-
- result = palloc(sizeof(*result));
-
- *result = ((*arg1 < 0) ? -*arg1 : *arg1);
+ int64 arg1 = PG_GETARG_INT64(0);
- return result;
+ PG_RETURN_INT64((arg1 < 0) ? -arg1 : arg1);
}
/* int8mod()
* Modulo operation.
*/
-int64 *
-int8mod(int64 *val1, int64 *val2)
+Datum
+int8mod(PG_FUNCTION_ARGS)
{
- int64 *result;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+ int64 result;
- /* use the divide operation to check params and allocate storage */
- result = int8div(val1, val2);
- *result *= *val2;
- *result = *val1 - *result;
+ result = val1 / val2;
+ result *= val2;
+ result = val1 - result;
- return result;
-} /* int8mod() */
+ PG_RETURN_INT64(result);
+}
/* int8fac()
* Factorial
*/
-int64 *
-int8fac(int64 *arg1)
+Datum
+int8fac(PG_FUNCTION_ARGS)
{
- int64 *result;
+ int64 arg1 = PG_GETARG_INT64(0);
+ int64 result;
int64 i;
- if (!PointerIsValid(arg1))
- return NULL;
-
- result = palloc(sizeof(*result));
-
- if (*arg1 < 1)
- *result = 0;
+ if (arg1 < 1)
+ result = 0;
else
- for (i = *arg1, *result = 1; i > 0; --i)
- *result *= i;
+ for (i = arg1, result = 1; i > 0; --i)
+ result *= i;
- return result;
+ PG_RETURN_INT64(result);
}
-int64 *
-int8larger(int64 *val1, int64 *val2)
+Datum
+int8larger(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
- return NULL;
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+ int64 result;
- *result = ((*val1 > *val2) ? *val1 : *val2);
+ result = ((val1 > val2) ? val1 : val2);
- return result;
-} /* int8larger() */
+ PG_RETURN_INT64(result);
+}
-int64 *
-int8smaller(int64 *val1, int64 *val2)
+Datum
+int8smaller(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
+ int64 val1 = PG_GETARG_INT64(0);
+ int64 val2 = PG_GETARG_INT64(1);
+ int64 result;
- if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
- return NULL;
-
- *result = ((*val1 < *val2) ? *val1 : *val2);
-
- return result;
-} /* int8smaller() */
+ result = ((val1 < val2) ? val1 : val2);
+ PG_RETURN_INT64(result);
+}
-int64 *
-int84pl(int64 *val1, int32 val2)
+Datum
+int84pl(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- if (!PointerIsValid(val1))
- return NULL;
-
- *result = *val1 + (int64) val2;
-
- return result;
-} /* int84pl() */
+ PG_RETURN_INT64(val1 + val2);
+}
-int64 *
-int84mi(int64 *val1, int32 val2)
+Datum
+int84mi(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- if (!PointerIsValid(val1))
- return NULL;
-
- *result = *val1 - (int64) val2;
-
- return result;
-} /* int84mi() */
+ PG_RETURN_INT64(val1 - val2);
+}
-int64 *
-int84mul(int64 *val1, int32 val2)
+Datum
+int84mul(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if (!PointerIsValid(val1))
- return NULL;
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
- *result = *val1 * (int64) val2;
-
- return result;
-} /* int84mul() */
+ PG_RETURN_INT64(val1 * val2);
+}
-int64 *
-int84div(int64 *val1, int32 val2)
+Datum
+int84div(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if (!PointerIsValid(val1))
- return NULL;
-
- *result = *val1 / (int64) val2;
-
- return result;
-} /* int84div() */
+ int64 val1 = PG_GETARG_INT64(0);
+ int32 val2 = PG_GETARG_INT32(1);
+ PG_RETURN_INT64(val1 / val2);
+}
-int64 *
-int48pl(int32 val1, int64 *val2)
+Datum
+int48pl(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if (!PointerIsValid(val2))
- return NULL;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- *result = (int64) val1 + *val2;
-
- return result;
-} /* int48pl() */
+ PG_RETURN_INT64(val1 + val2);
+}
-int64 *
-int48mi(int32 val1, int64 *val2)
+Datum
+int48mi(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if (!PointerIsValid(val2))
- return NULL;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- *result = (int64) val1 - *val2;
-
- return result;
-} /* int48mi() */
+ PG_RETURN_INT64(val1 - val2);
+}
-int64 *
-int48mul(int32 val1, int64 *val2)
+Datum
+int48mul(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if (!PointerIsValid(val2))
- return NULL;
-
- *result = (int64) val1 **val2;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return result;
-} /* int48mul() */
+ PG_RETURN_INT64(val1 * val2);
+}
-int64 *
-int48div(int32 val1, int64 *val2)
+Datum
+int48div(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
-
- if (!PointerIsValid(val2))
- return NULL;
-
- *result = (int64) val1 / *val2;
+ int32 val1 = PG_GETARG_INT32(0);
+ int64 val2 = PG_GETARG_INT64(1);
- return result;
-} /* int48div() */
+ PG_RETURN_INT64(val1 / val2);
+}
/*----------------------------------------------------------
* Conversion operators.
*---------------------------------------------------------*/
-int64 *
-int48(int32 val)
+Datum
+int48(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
+ int32 val = PG_GETARG_INT32(0);
- *result = val;
-
- return result;
-} /* int48() */
+ PG_RETURN_INT64((int64) val);
+}
-int32
-int84(int64 *val)
+Datum
+int84(PG_FUNCTION_ARGS)
{
+ int64 val = PG_GETARG_INT64(0);
int32 result;
- if (!PointerIsValid(val))
- elog(ERROR, "Invalid (null) int64, can't convert int8 to int4");
-
- if ((*val < INT_MIN) || (*val > INT_MAX))
+ if ((val < INT_MIN) || (val > INT_MAX))
elog(ERROR, "int8 conversion to int4 is out of range");
- result = *val;
-
- return result;
-} /* int84() */
-
-#if NOT_USED
-int64 *
-int2vector (int16 val)
-{
- int64 *result;
-
- result = palloc(sizeof(int64));
-
- *result = val;
-
- return result;
-} /* int2vector() */
-
-int16
-int82(int64 *val)
-{
- int16 result;
-
- if (!PointerIsValid(val))
- elog(ERROR, "Invalid (null) int8, can't convert to int2");
+ result = (int32) val;
- if ((*val < SHRT_MIN) || (*val > SHRT_MAX))
- elog(ERROR, "int8 conversion to int2 is out of range");
-
- result = *val;
-
- return result;
-} /* int82() */
-
-#endif
+ PG_RETURN_INT32(result);
+}
-float64
-i8tod(int64 *val)
+Datum
+i8tod(PG_FUNCTION_ARGS)
{
- float64 result = palloc(sizeof(float64data));
-
- if (!PointerIsValid(val))
- elog(ERROR, "Invalid (null) int8, can't convert to float8");
+ int64 val = PG_GETARG_INT64(0);
+ float8 result;
- *result = *val;
+ result = val;
- return result;
-} /* i8tod() */
+ PG_RETURN_FLOAT8(result);
+}
/* dtoi8()
* Convert double float to 8-byte integer.
@@ -644,62 +528,63 @@ i8tod(int64 *val)
* does the right thing on my i686/linux-rh4.2 box.
* - thomas 1998-06-16
*/
-int64 *
-dtoi8(float64 val)
+Datum
+dtoi8(PG_FUNCTION_ARGS)
{
- int64 *result = palloc(sizeof(int64));
+ float8 val = PG_GETARG_FLOAT8(0);
+ int64 result;
- if (!PointerIsValid(val))
- elog(ERROR, "Invalid (null) float8, can't convert to int8");
-
- if ((*val < (-pow(2, 63) + 1)) || (*val > (pow(2, 63) - 1)))
+ if ((val < (-pow(2.0, 63.0) + 1)) || (val > (pow(2.0, 63.0) - 1)))
elog(ERROR, "Floating point conversion to int64 is out of range");
- *result = *val;
+ result = (int64) val;
- return result;
-} /* dtoi8() */
+ PG_RETURN_INT64(result);
+}
/* text_int8()
*/
-int64 *
-text_int8(text *str)
+Datum
+text_int8(PG_FUNCTION_ARGS)
{
+ text *str = PG_GETARG_TEXT_P(0);
int len;
char *s;
-
- if (!PointerIsValid(str))
- elog(ERROR, "Bad (null) int8 external representation");
+ Datum result;
len = (VARSIZE(str) - VARHDRSZ);
s = palloc(len + 1);
- memmove(s, VARDATA(str), len);
+ memcpy(s, VARDATA(str), len);
*(s + len) = '\0';
- return int8in(s);
-} /* text_int8() */
+ result = DirectFunctionCall1(int8in, CStringGetDatum(s));
+
+ pfree(s);
+
+ return result;
+}
/* int8_text()
*/
-text *
-int8_text(int64 *val)
+Datum
+int8_text(PG_FUNCTION_ARGS)
{
- text *result;
-
- int len;
+ /* val is int64, but easier to leave it as Datum */
+ Datum val = PG_GETARG_DATUM(0);
char *s;
+ int len;
+ text *result;
- if (!PointerIsValid(val))
- return NULL;
-
- s = int8out(val);
+ s = DatumGetCString(DirectFunctionCall1(int8out, val));
len = strlen(s);
- result = palloc(VARHDRSZ + len);
+ result = (text *) palloc(VARHDRSZ + len);
VARSIZE(result) = len + VARHDRSZ;
- memmove(VARDATA(result), s, len);
+ memcpy(VARDATA(result), s, len);
- return result;
-} /* int8_text() */
+ pfree(s);
+
+ PG_RETURN_TEXT_P(result);
+}