📄 int.c
字号:
/*------------------------------------------------------------------------- * * 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 + -