⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int.c

📁 PostgreSQL7.4.6 for Linux
💻 C
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------------------------------- * * int.c *	  Functions for the built-in integer types (except int8). * * 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/int.c,v 1.57 2003/08/04 02:40:05 momjian Exp $ * *------------------------------------------------------------------------- *//* * OLD COMMENTS *		I/O routines: *		 int2in, int2out, int2recv, int2send *		 int4in, int4out, int4recv, int4send *		 int2vectorin, int2vectorout, int2vectorrecv, int2vectorsend *		Conversion routines: *		 itoi, int2_text, int4_text *		Boolean operators: *		 inteq, intne, intlt, intle, intgt, intge *		Arithmetic operators: *		 intpl, intmi, int4mul, intdiv * *		Arithmetic operators: *		 intmod, int4fac */#include "postgres.h"#include <ctype.h>#include <limits.h>#include "libpq/pqformat.h"#include "utils/builtins.h"#ifndef SHRT_MAX#define SHRT_MAX (0x7FFF)#endif#ifndef SHRT_MIN#define SHRT_MIN (-0x8000)#endif/***************************************************************************** *	 USER I/O ROUTINES														 * *****************************************************************************//* *		int2in			- converts "num" to short */Datumint2in(PG_FUNCTION_ARGS){	char	   *num = PG_GETARG_CSTRING(0);	PG_RETURN_INT16(pg_atoi(num, sizeof(int16), '\0'));}/* *		int2out			- converts short to "num" */Datumint2out(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	char	   *result = (char *) palloc(7);	/* sign, 5 digits, '\0' */	pg_itoa(arg1, result);	PG_RETURN_CSTRING(result);}/* *		int2recv			- converts external binary format to int2 */Datumint2recv(PG_FUNCTION_ARGS){	StringInfo	buf = (StringInfo) PG_GETARG_POINTER(0);	PG_RETURN_INT16((int16) pq_getmsgint(buf, sizeof(int16)));}/* *		int2send			- converts int2 to binary format */Datumint2send(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	StringInfoData buf;	pq_begintypsend(&buf);	pq_sendint(&buf, arg1, sizeof(int16));	PG_RETURN_BYTEA_P(pq_endtypsend(&buf));}/* *		int2vectorin			- converts "num num ..." to internal form * *		Note: Fills any missing slots with zeroes. */Datumint2vectorin(PG_FUNCTION_ARGS){	char	   *intString = PG_GETARG_CSTRING(0);	int16	   *result = (int16 *) palloc(sizeof(int16[INDEX_MAX_KEYS]));	int			slot;	for (slot = 0; *intString && slot < INDEX_MAX_KEYS; slot++)	{		if (sscanf(intString, "%hd", &result[slot]) != 1)			break;		while (*intString && isspace((unsigned char) *intString))			intString++;		while (*intString && !isspace((unsigned char) *intString))			intString++;	}	while (*intString && isspace((unsigned char) *intString))		intString++;	if (*intString)		ereport(ERROR,				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),				 errmsg("int2vector has too many elements")));	while (slot < INDEX_MAX_KEYS)		result[slot++] = 0;	PG_RETURN_POINTER(result);}/* *		int2vectorout		- converts internal form to "num num ..." */Datumint2vectorout(PG_FUNCTION_ARGS){	int16	   *int2Array = (int16 *) PG_GETARG_POINTER(0);	int			num,				maxnum;	char	   *rp;	char	   *result;	/* find last non-zero value in vector */	for (maxnum = INDEX_MAX_KEYS - 1; maxnum >= 0; maxnum--)		if (int2Array[maxnum] != 0)			break;	/* assumes sign, 5 digits, ' ' */	rp = result = (char *) palloc((maxnum + 1) * 7 + 1);	for (num = 0; num <= maxnum; num++)	{		if (num != 0)			*rp++ = ' ';		pg_itoa(int2Array[num], rp);		while (*++rp != '\0')			;	}	*rp = '\0';	PG_RETURN_CSTRING(result);}/* *		int2vectorrecv			- converts external binary format to int2vector */Datumint2vectorrecv(PG_FUNCTION_ARGS){	StringInfo	buf = (StringInfo) PG_GETARG_POINTER(0);	int16	   *result = (int16 *) palloc(sizeof(int16[INDEX_MAX_KEYS]));	int			slot;	for (slot = 0; slot < INDEX_MAX_KEYS; slot++)		result[slot] = (int16) pq_getmsgint(buf, sizeof(int16));	PG_RETURN_POINTER(result);}/* *		int2vectorsend			- converts int2vector to binary format */Datumint2vectorsend(PG_FUNCTION_ARGS){	int16	   *int2Array = (int16 *) PG_GETARG_POINTER(0);	StringInfoData buf;	int			slot;	pq_begintypsend(&buf);	for (slot = 0; slot < INDEX_MAX_KEYS; slot++)		pq_sendint(&buf, int2Array[slot], sizeof(int16));	PG_RETURN_BYTEA_P(pq_endtypsend(&buf));}/* * We don't have a complete set of int2vector support routines, * but we need int2vectoreq for catcache indexing. */Datumint2vectoreq(PG_FUNCTION_ARGS){	int16	   *arg1 = (int16 *) PG_GETARG_POINTER(0);	int16	   *arg2 = (int16 *) PG_GETARG_POINTER(1);	PG_RETURN_BOOL(memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(int16)) == 0);}/***************************************************************************** *	 PUBLIC ROUTINES														 * *****************************************************************************//* *		int4in			- converts "num" to int4 */Datumint4in(PG_FUNCTION_ARGS){	char	   *num = PG_GETARG_CSTRING(0);	PG_RETURN_INT32(pg_atoi(num, sizeof(int32), '\0'));}/* *		int4out			- converts int4 to "num" */Datumint4out(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	char	   *result = (char *) palloc(12);	/* sign, 10 digits, '\0' */	pg_ltoa(arg1, result);	PG_RETURN_CSTRING(result);}/* *		int4recv			- converts external binary format to int4 */Datumint4recv(PG_FUNCTION_ARGS){	StringInfo	buf = (StringInfo) PG_GETARG_POINTER(0);	PG_RETURN_INT32((int32) pq_getmsgint(buf, sizeof(int32)));}/* *		int4send			- converts int4 to binary format */Datumint4send(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	StringInfoData buf;	pq_begintypsend(&buf);	pq_sendint(&buf, arg1, sizeof(int32));	PG_RETURN_BYTEA_P(pq_endtypsend(&buf));}/* *		=================== *		CONVERSION ROUTINES *		=================== */Datumi2toi4(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	PG_RETURN_INT32((int32) arg1);}Datumi4toi2(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	if (arg1 < SHRT_MIN || arg1 > SHRT_MAX)		ereport(ERROR,				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),				 errmsg("integer out of range")));	PG_RETURN_INT16((int16) arg1);}Datumint2_text(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	text	   *result = (text *) palloc(7 + VARHDRSZ); /* sign,5 digits, '\0' */	pg_itoa(arg1, VARDATA(result));	VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;	PG_RETURN_TEXT_P(result);}Datumtext_int2(PG_FUNCTION_ARGS){	text	   *string = PG_GETARG_TEXT_P(0);	Datum		result;	int			len;	char	   *str;	len = VARSIZE(string) - VARHDRSZ;	str = palloc(len + 1);	memcpy(str, VARDATA(string), len);	*(str + len) = '\0';	result = DirectFunctionCall1(int2in, CStringGetDatum(str));	pfree(str);	return result;}Datumint4_text(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	text	   *result = (text *) palloc(12 + VARHDRSZ);		/* sign,10 digits,'\0' */	pg_ltoa(arg1, VARDATA(result));	VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;	PG_RETURN_TEXT_P(result);}Datumtext_int4(PG_FUNCTION_ARGS){	text	   *string = PG_GETARG_TEXT_P(0);	Datum		result;	int			len;	char	   *str;	len = VARSIZE(string) - VARHDRSZ;	str = palloc(len + 1);	memcpy(str, VARDATA(string), len);	*(str + len) = '\0';	result = DirectFunctionCall1(int4in, CStringGetDatum(str));	pfree(str);	return result;}/* *		============================ *		COMPARISON OPERATOR ROUTINES *		============================ *//* *		inteq			- returns 1 iff arg1 == arg2 *		intne			- returns 1 iff arg1 != arg2 *		intlt			- returns 1 iff arg1 < arg2 *		intle			- returns 1 iff arg1 <= arg2 *		intgt			- returns 1 iff arg1 > arg2 *		intge			- returns 1 iff arg1 >= arg2 */Datumint4eq(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 == arg2);}Datumint4ne(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 != arg2);}Datumint4lt(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 < arg2);}Datumint4le(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 <= arg2);}Datumint4gt(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 > arg2);}Datumint4ge(PG_FUNCTION_ARGS){	int32		arg1 = PG_GETARG_INT32(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 >= arg2);}Datumint2eq(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int16		arg2 = PG_GETARG_INT16(1);	PG_RETURN_BOOL(arg1 == arg2);}Datumint2ne(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int16		arg2 = PG_GETARG_INT16(1);	PG_RETURN_BOOL(arg1 != arg2);}Datumint2lt(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int16		arg2 = PG_GETARG_INT16(1);	PG_RETURN_BOOL(arg1 < arg2);}Datumint2le(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int16		arg2 = PG_GETARG_INT16(1);	PG_RETURN_BOOL(arg1 <= arg2);}Datumint2gt(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int16		arg2 = PG_GETARG_INT16(1);	PG_RETURN_BOOL(arg1 > arg2);}Datumint2ge(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int16		arg2 = PG_GETARG_INT16(1);	PG_RETURN_BOOL(arg1 >= arg2);}Datumint24eq(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 == arg2);}Datumint24ne(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 != arg2);}Datumint24lt(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 < arg2);}Datumint24le(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 <= arg2);}Datumint24gt(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 > arg2);}Datumint24ge(PG_FUNCTION_ARGS){	int16		arg1 = PG_GETARG_INT16(0);	int32		arg2 = PG_GETARG_INT32(1);	PG_RETURN_BOOL(arg1 >= arg2);}

⌨️ 快捷键说明

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