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 + -
显示快捷键?