int8.c

来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 959 行 · 第 1/2 页

C
959
字号
Datumint8up(PG_FUNCTION_ARGS){	int64		val = PG_GETARG_INT64(0);	PG_RETURN_INT64(val);}Datumint8pl(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int64		val2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(val1 + val2);}Datumint8mi(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int64		val2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(val1 - val2);}Datumint8mul(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int64		val2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(val1 * val2);}Datumint8div(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int64		val2 = PG_GETARG_INT64(1);	if (val2 == 0)		ereport(ERROR,				(errcode(ERRCODE_DIVISION_BY_ZERO),				 errmsg("division by zero")));	PG_RETURN_INT64(val1 / val2);}/* int8abs() * Absolute value */Datumint8abs(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	PG_RETURN_INT64((arg1 < 0) ? -arg1 : arg1);}/* int8mod() * Modulo operation. */Datumint8mod(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int64		val2 = PG_GETARG_INT64(1);	int64		result;	if (val2 == 0)		ereport(ERROR,				(errcode(ERRCODE_DIVISION_BY_ZERO),				 errmsg("division by zero")));	result = val1 / val2;	result *= val2;	result = val1 - result;	PG_RETURN_INT64(result);}/* int8fac() * Factorial */Datumint8fac(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	int64		result;	int64		i;	if (arg1 == 0)		result = 1;	else if (arg1 < 1)		result = 0;	else		for (i = arg1, result = 1; i > 0; --i)			result *= i;	PG_RETURN_INT64(result);}Datumint8inc(PG_FUNCTION_ARGS){	int64		arg = PG_GETARG_INT64(0);	PG_RETURN_INT64(arg + 1);}Datumint8larger(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int64		val2 = PG_GETARG_INT64(1);	int64		result;	result = ((val1 > val2) ? val1 : val2);	PG_RETURN_INT64(result);}Datumint8smaller(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int64		val2 = PG_GETARG_INT64(1);	int64		result;	result = ((val1 < val2) ? val1 : val2);	PG_RETURN_INT64(result);}Datumint84pl(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int32		val2 = PG_GETARG_INT32(1);	PG_RETURN_INT64(val1 + val2);}Datumint84mi(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int32		val2 = PG_GETARG_INT32(1);	PG_RETURN_INT64(val1 - val2);}Datumint84mul(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int32		val2 = PG_GETARG_INT32(1);	PG_RETURN_INT64(val1 * val2);}Datumint84div(PG_FUNCTION_ARGS){	int64		val1 = PG_GETARG_INT64(0);	int32		val2 = PG_GETARG_INT32(1);	if (val2 == 0)		ereport(ERROR,				(errcode(ERRCODE_DIVISION_BY_ZERO),				 errmsg("division by zero")));	PG_RETURN_INT64(val1 / val2);}Datumint48pl(PG_FUNCTION_ARGS){	int32		val1 = PG_GETARG_INT32(0);	int64		val2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(val1 + val2);}Datumint48mi(PG_FUNCTION_ARGS){	int32		val1 = PG_GETARG_INT32(0);	int64		val2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(val1 - val2);}Datumint48mul(PG_FUNCTION_ARGS){	int32		val1 = PG_GETARG_INT32(0);	int64		val2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(val1 * val2);}Datumint48div(PG_FUNCTION_ARGS){	int32		val1 = PG_GETARG_INT32(0);	int64		val2 = PG_GETARG_INT64(1);	if (val2 == 0)		ereport(ERROR,				(errcode(ERRCODE_DIVISION_BY_ZERO),				 errmsg("division by zero")));	PG_RETURN_INT64(val1 / val2);}/* Binary arithmetics * *		int8and		- returns arg1 & arg2 *		int8or		- returns arg1 | arg2 *		int8xor		- returns arg1 # arg2 *		int8not		- returns ~arg1 *		int8shl		- returns arg1 << arg2 *		int8shr		- returns arg1 >> arg2 */Datumint8and(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	int64		arg2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(arg1 & arg2);}Datumint8or(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	int64		arg2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(arg1 | arg2);}Datumint8xor(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	int64		arg2 = PG_GETARG_INT64(1);	PG_RETURN_INT64(arg1 ^ arg2);}Datumint8not(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	PG_RETURN_INT64(~arg1);}Datumint8shl(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_INT64(arg1 << arg2);}Datumint8shr(PG_FUNCTION_ARGS){	int64		arg1 = PG_GETARG_INT64(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_INT64(arg1 >> arg2);}/*---------------------------------------------------------- *	Conversion operators. *---------------------------------------------------------*/Datumint48(PG_FUNCTION_ARGS){	int32		val = PG_GETARG_INT32(0);	PG_RETURN_INT64((int64) val);}Datumint84(PG_FUNCTION_ARGS){	int64		val = PG_GETARG_INT64(0);	int32		result;	result = (int32) val;	/* Test for overflow by reverse-conversion. */	if ((int64) result != val)		ereport(ERROR,				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),				 errmsg("integer out of range")));	PG_RETURN_INT32(result);}Datumint28(PG_FUNCTION_ARGS){	int16		val = PG_GETARG_INT16(0);	PG_RETURN_INT64((int64) val);}Datumint82(PG_FUNCTION_ARGS){	int64		val = PG_GETARG_INT64(0);	int16		result;	result = (int16) val;	/* Test for overflow by reverse-conversion. */	if ((int64) result != val)		ereport(ERROR,				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),				 errmsg("integer out of range")));	PG_RETURN_INT16(result);}Datumi8tod(PG_FUNCTION_ARGS){	int64		val = PG_GETARG_INT64(0);	float8		result;	result = val;	PG_RETURN_FLOAT8(result);}/* dtoi8() * Convert float8 to 8-byte integer. */Datumdtoi8(PG_FUNCTION_ARGS){	float8		val = PG_GETARG_FLOAT8(0);	int64		result;	/* Round val to nearest integer (but it's still in float form) */	val = rint(val);	/*	 * Does it fit in an int64?  Avoid assuming that we have handy	 * constants defined for the range boundaries, instead test for	 * overflow by reverse-conversion.	 */	result = (int64) val;	if ((float8) result != val)		ereport(ERROR,				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),				 errmsg("integer out of range")));	PG_RETURN_INT64(result);}Datumi8tof(PG_FUNCTION_ARGS){	int64		val = PG_GETARG_INT64(0);	float4		result;	result = val;	PG_RETURN_FLOAT4(result);}/* ftoi8() * Convert float4 to 8-byte integer. */Datumftoi8(PG_FUNCTION_ARGS){	float4		val = PG_GETARG_FLOAT4(0);	int64		result;	float8		dval;	/* Round val to nearest integer (but it's still in float form) */	dval = rint(val);	/*	 * Does it fit in an int64?  Avoid assuming that we have handy	 * constants defined for the range boundaries, instead test for	 * overflow by reverse-conversion.	 */	result = (int64) dval;	if ((float8) result != dval)		ereport(ERROR,				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),				 errmsg("integer out of range")));	PG_RETURN_INT64(result);}Datumi8tooid(PG_FUNCTION_ARGS){	int64		val = PG_GETARG_INT64(0);	Oid			result;	result = (Oid) val;	/* Test for overflow by reverse-conversion. */	if ((int64) result != val)		ereport(ERROR,				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),				 errmsg("OID out of range")));	PG_RETURN_OID(result);}Datumoidtoi8(PG_FUNCTION_ARGS){	Oid			val = PG_GETARG_OID(0);	PG_RETURN_INT64((int64) val);}Datumtext_int8(PG_FUNCTION_ARGS){	text	   *str = PG_GETARG_TEXT_P(0);	int			len;	char	   *s;	Datum		result;	len = (VARSIZE(str) - VARHDRSZ);	s = palloc(len + 1);	memcpy(s, VARDATA(str), len);	*(s + len) = '\0';	result = DirectFunctionCall1(int8in, CStringGetDatum(s));	pfree(s);	return result;}Datumint8_text(PG_FUNCTION_ARGS){	/* val is int64, but easier to leave it as Datum */	Datum		val = PG_GETARG_DATUM(0);	char	   *s;	int			len;	text	   *result;	s = DatumGetCString(DirectFunctionCall1(int8out, val));	len = strlen(s);	result = (text *) palloc(VARHDRSZ + len);	VARATT_SIZEP(result) = len + VARHDRSZ;	memcpy(VARDATA(result), s, len);	pfree(s);	PG_RETURN_TEXT_P(result);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?