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