int8.c
来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 959 行 · 第 1/2 页
C
959 行
/*------------------------------------------------------------------------- * * int8.c * Internal 64-bit integer operations * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION * $Header: /cvsroot/pgsql/src/backend/utils/adt/int8.c,v 1.48 2003/09/25 06:58:04 petere Exp $ * *------------------------------------------------------------------------- */#include "postgres.h"#include <ctype.h>#include <math.h>#include "libpq/pqformat.h"#include "utils/int8.h"#define MAXINT8LEN 25/*********************************************************************** ** ** Routines for 64-bit integers. ** ***********************************************************************//*---------------------------------------------------------- * Formatting and conversion routines. *---------------------------------------------------------*//* * scanint8 --- try to parse a string into an int8. * * If errorOK is false, ereport a useful error message if the string is bad. * If errorOK is true, just return "false" for bad input. */boolscanint8(const char *str, bool errorOK, int64 *result){ const char *ptr = str; int64 tmp = 0; int sign = 1; /* * Do our own scan, rather than relying on sscanf which might be * broken for long long. */ /* skip leading spaces */ while (*ptr && isspace((unsigned char) *ptr)) ptr++; /* handle sign */ if (*ptr == '-') { ptr++; sign = -1; /* * Do an explicit check for INT64_MIN. Ugly though this is, it's * cleaner than trying to get the loop below to handle it * portably. */#ifndef INT64_IS_BUSTED if (strcmp(ptr, "9223372036854775808") == 0) { *result = -INT64CONST(0x7fffffffffffffff) - 1; return true; }#endif } else if (*ptr == '+') ptr++; /* require at least one digit */ if (!isdigit((unsigned char) *ptr)) { if (errorOK) return false; else ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type bigint: \"%s\"", str))); } /* process digits */ while (*ptr && isdigit((unsigned char) *ptr)) { int64 newtmp = tmp * 10 + (*ptr++ - '0'); if ((newtmp / 10) != tmp) /* overflow? */ { if (errorOK) return false; else ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("integer out of range"))); } tmp = newtmp; } /* trailing junk? */ if (*ptr) { if (errorOK) return false; else ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid input syntax for type bigint: \"%s\"", str))); } *result = (sign < 0) ? -tmp : tmp; return true;}/* int8in() */Datumint8in(PG_FUNCTION_ARGS){ char *str = PG_GETARG_CSTRING(0); int64 result; (void) scanint8(str, false, &result); PG_RETURN_INT64(result);}/* int8out() */Datumint8out(PG_FUNCTION_ARGS){ int64 val = PG_GETARG_INT64(0); char *result; int len; char buf[MAXINT8LEN + 1]; if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, val)) < 0) elog(ERROR, "could not format int8"); result = pstrdup(buf); PG_RETURN_CSTRING(result);}/* * int8recv - converts external binary format to int8 */Datumint8recv(PG_FUNCTION_ARGS){ StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); PG_RETURN_INT64(pq_getmsgint64(buf));}/* * int8send - converts int8 to binary format */Datumint8send(PG_FUNCTION_ARGS){ int64 arg1 = PG_GETARG_INT64(0); StringInfoData buf; pq_begintypsend(&buf); pq_sendint64(&buf, arg1); PG_RETURN_BYTEA_P(pq_endtypsend(&buf));}/*---------------------------------------------------------- * Relational operators for int8s, including cross-data-type comparisons. *---------------------------------------------------------*//* int8relop() * Is val1 relop val2? */Datumint8eq(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 == val2);}Datumint8ne(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 != val2);}Datumint8lt(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 < val2);}Datumint8gt(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 > val2);}Datumint8le(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 <= val2);}Datumint8ge(PG_FUNCTION_ARGS){ 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? */Datumint84eq(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int32 val2 = PG_GETARG_INT32(1); PG_RETURN_BOOL(val1 == val2);}Datumint84ne(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int32 val2 = PG_GETARG_INT32(1); PG_RETURN_BOOL(val1 != val2);}Datumint84lt(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int32 val2 = PG_GETARG_INT32(1); PG_RETURN_BOOL(val1 < val2);}Datumint84gt(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int32 val2 = PG_GETARG_INT32(1); PG_RETURN_BOOL(val1 > val2);}Datumint84le(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int32 val2 = PG_GETARG_INT32(1); PG_RETURN_BOOL(val1 <= val2);}Datumint84ge(PG_FUNCTION_ARGS){ 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? */Datumint48eq(PG_FUNCTION_ARGS){ int32 val1 = PG_GETARG_INT32(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 == val2);}Datumint48ne(PG_FUNCTION_ARGS){ int32 val1 = PG_GETARG_INT32(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 != val2);}Datumint48lt(PG_FUNCTION_ARGS){ int32 val1 = PG_GETARG_INT32(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 < val2);}Datumint48gt(PG_FUNCTION_ARGS){ int32 val1 = PG_GETARG_INT32(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 > val2);}Datumint48le(PG_FUNCTION_ARGS){ int32 val1 = PG_GETARG_INT32(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 <= val2);}Datumint48ge(PG_FUNCTION_ARGS){ int32 val1 = PG_GETARG_INT32(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 >= val2);}/* int82relop() * Is 64-bit val1 relop 16-bit val2? */Datumint82eq(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int16 val2 = PG_GETARG_INT16(1); PG_RETURN_BOOL(val1 == val2);}Datumint82ne(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int16 val2 = PG_GETARG_INT16(1); PG_RETURN_BOOL(val1 != val2);}Datumint82lt(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int16 val2 = PG_GETARG_INT16(1); PG_RETURN_BOOL(val1 < val2);}Datumint82gt(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int16 val2 = PG_GETARG_INT16(1); PG_RETURN_BOOL(val1 > val2);}Datumint82le(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int16 val2 = PG_GETARG_INT16(1); PG_RETURN_BOOL(val1 <= val2);}Datumint82ge(PG_FUNCTION_ARGS){ int64 val1 = PG_GETARG_INT64(0); int16 val2 = PG_GETARG_INT16(1); PG_RETURN_BOOL(val1 >= val2);}/* int28relop() * Is 16-bit val1 relop 64-bit val2? */Datumint28eq(PG_FUNCTION_ARGS){ int16 val1 = PG_GETARG_INT16(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 == val2);}Datumint28ne(PG_FUNCTION_ARGS){ int16 val1 = PG_GETARG_INT16(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 != val2);}Datumint28lt(PG_FUNCTION_ARGS){ int16 val1 = PG_GETARG_INT16(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 < val2);}Datumint28gt(PG_FUNCTION_ARGS){ int16 val1 = PG_GETARG_INT16(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 > val2);}Datumint28le(PG_FUNCTION_ARGS){ int16 val1 = PG_GETARG_INT16(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 <= val2);}Datumint28ge(PG_FUNCTION_ARGS){ int16 val1 = PG_GETARG_INT16(0); int64 val2 = PG_GETARG_INT64(1); PG_RETURN_BOOL(val1 >= val2);}/*---------------------------------------------------------- * Arithmetic operators on 64-bit integers. *---------------------------------------------------------*/Datumint8um(PG_FUNCTION_ARGS){ int64 val = PG_GETARG_INT64(0); PG_RETURN_INT64(-val);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?