1 /*-------------------------------------------------------------------------
4 * Functions for the built-in integer types (except int8).
6 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $Header: /cvsroot/pgsql/src/backend/utils/adt/int.c,v 1.38 2000/06/14 18:17:44 petere Exp $
13 *-------------------------------------------------------------------------
18 * int2in, int2out, int2vectorin, int2vectorout, int4in, int4out
19 * Conversion routines:
20 * itoi, int2_text, int4_text
22 * inteq, intne, intlt, intle, intgt, intge
23 * Arithmetic operators:
24 * intpl, intmi, int4mul, intdiv
26 * Arithmetic operators:
38 #include "utils/builtins.h"
41 #define SHRT_MAX (0x7FFF)
44 #define SHRT_MIN (-0x8000)
47 /*****************************************************************************
49 *****************************************************************************/
52 * int2in - converts "num" to short
55 int2in(PG_FUNCTION_ARGS)
57 char *num = PG_GETARG_CSTRING(0);
59 PG_RETURN_INT16(pg_atoi(num, sizeof(int16), '\0'));
63 * int2out - converts short to "num"
66 int2out(PG_FUNCTION_ARGS)
68 int16 arg1 = PG_GETARG_INT16(0);
69 char *result = (char *) palloc(7); /* sign, 5 digits, '\0' */
71 itoa((int) arg1, result);
72 PG_RETURN_CSTRING(result);
76 * int2vectorin - converts "num num ..." to internal form
78 * Note: Fills any missing slots with zeroes.
81 int2vectorin(PG_FUNCTION_ARGS)
83 char *intString = PG_GETARG_CSTRING(0);
84 int16 *result = (int16 *) palloc(sizeof(int16[INDEX_MAX_KEYS]));
87 for (slot = 0; *intString && slot < INDEX_MAX_KEYS; slot++)
89 if (sscanf(intString, "%hd", &result[slot]) != 1)
91 while (*intString && isspace((int) *intString))
93 while (*intString && !isspace((int) *intString))
96 while (*intString && isspace((int) *intString))
99 elog(ERROR, "int2vector value has too many values");
100 while (slot < INDEX_MAX_KEYS)
103 PG_RETURN_POINTER(result);
107 * int2vectorout - converts internal form to "num num ..."
110 int2vectorout(PG_FUNCTION_ARGS)
112 int16 *int2Array = (int16 *) PG_GETARG_POINTER(0);
118 /* find last non-zero value in vector */
119 for (maxnum = INDEX_MAX_KEYS - 1; maxnum >= 0; maxnum--)
120 if (int2Array[maxnum] != 0)
123 /* assumes sign, 5 digits, ' ' */
124 rp = result = (char *) palloc((maxnum + 1) * 7 + 1);
125 for (num = 0; num <= maxnum; num++)
129 ltoa(int2Array[num], rp);
130 while (*++rp != '\0')
134 PG_RETURN_CSTRING(result);
138 * We don't have a complete set of int2vector support routines,
139 * but we need int2vectoreq for catcache indexing.
142 int2vectoreq(PG_FUNCTION_ARGS)
144 int16 *arg1 = (int16 *) PG_GETARG_POINTER(0);
145 int16 *arg2 = (int16 *) PG_GETARG_POINTER(1);
147 PG_RETURN_BOOL(memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(int16)) == 0);
151 * Type int44 has no real-world use, but the regression tests use it.
152 * It's a four-element vector of int4's.
156 * int44in - converts "num num ..." to internal form
158 * Note: Fills any missing positions with zeroes.
161 int44in(PG_FUNCTION_ARGS)
163 char *input_string = PG_GETARG_CSTRING(0);
164 int32 *result = (int32 *) palloc(4 * sizeof(int32));
167 i = sscanf(input_string,
176 PG_RETURN_POINTER(result);
180 * int44out - converts internal form to "num num ..."
183 int44out(PG_FUNCTION_ARGS)
185 int32 *an_array = (int32 *) PG_GETARG_POINTER(0);
186 char *result = (char *) palloc(16 * 4); /* Allow 14 digits + sign */
191 for (i = 0; i < 4; i++)
193 itoa(an_array[i], walk);
194 while (*++walk != '\0')
199 PG_RETURN_CSTRING(result);
203 /*****************************************************************************
205 *****************************************************************************/
208 * int4in - converts "num" to int4
211 int4in(PG_FUNCTION_ARGS)
213 char *num = PG_GETARG_CSTRING(0);
215 PG_RETURN_INT32(pg_atoi(num, sizeof(int32), '\0'));
219 * int4out - converts int4 to "num"
222 int4out(PG_FUNCTION_ARGS)
224 int32 arg1 = PG_GETARG_INT32(0);
225 char *result = (char *) palloc(12); /* sign, 10 digits, '\0' */
228 PG_RETURN_CSTRING(result);
233 * ===================
234 * CONVERSION ROUTINES
235 * ===================
239 i2toi4(PG_FUNCTION_ARGS)
241 int16 arg1 = PG_GETARG_INT16(0);
243 PG_RETURN_INT32((int32) arg1);
247 i4toi2(PG_FUNCTION_ARGS)
249 int32 arg1 = PG_GETARG_INT32(0);
252 elog(ERROR, "i4toi2: '%d' causes int2 underflow", arg1);
254 elog(ERROR, "i4toi2: '%d' causes int2 overflow", arg1);
256 PG_RETURN_INT16((int16) arg1);
260 int2_text(PG_FUNCTION_ARGS)
262 int16 arg1 = PG_GETARG_INT16(0);
263 text *result = (text *) palloc(7+VARHDRSZ); /* sign,5 digits, '\0' */
265 itoa((int) arg1, VARDATA(result));
266 VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
267 PG_RETURN_TEXT_P(result);
271 text_int2(PG_FUNCTION_ARGS)
273 text *string = PG_GETARG_TEXT_P(0);
278 len = VARSIZE(string) - VARHDRSZ;
280 str = palloc(len + 1);
281 memcpy(str, VARDATA(string), len);
284 result = DirectFunctionCall1(int2in, CStringGetDatum(str));
291 int4_text(PG_FUNCTION_ARGS)
293 int32 arg1 = PG_GETARG_INT32(0);
294 text *result = (text *) palloc(12+VARHDRSZ); /* sign,10 digits,'\0' */
296 ltoa(arg1, VARDATA(result));
297 VARSIZE(result) = strlen(VARDATA(result)) + VARHDRSZ;
298 PG_RETURN_TEXT_P(result);
302 text_int4(PG_FUNCTION_ARGS)
304 text *string = PG_GETARG_TEXT_P(0);
309 len = VARSIZE(string) - VARHDRSZ;
311 str = palloc(len + 1);
312 memcpy(str, VARDATA(string), len);
315 result = DirectFunctionCall1(int4in, CStringGetDatum(str));
323 * ============================
324 * COMPARISON OPERATOR ROUTINES
325 * ============================
329 * inteq - returns 1 iff arg1 == arg2
330 * intne - returns 1 iff arg1 != arg2
331 * intlt - returns 1 iff arg1 < arg2
332 * intle - returns 1 iff arg1 <= arg2
333 * intgt - returns 1 iff arg1 > arg2
334 * intge - returns 1 iff arg1 >= arg2
338 int4eq(PG_FUNCTION_ARGS)
340 int32 arg1 = PG_GETARG_INT32(0);
341 int32 arg2 = PG_GETARG_INT32(1);
343 PG_RETURN_BOOL(arg1 == arg2);
347 int4ne(PG_FUNCTION_ARGS)
349 int32 arg1 = PG_GETARG_INT32(0);
350 int32 arg2 = PG_GETARG_INT32(1);
352 PG_RETURN_BOOL(arg1 != arg2);
356 int4lt(PG_FUNCTION_ARGS)
358 int32 arg1 = PG_GETARG_INT32(0);
359 int32 arg2 = PG_GETARG_INT32(1);
361 PG_RETURN_BOOL(arg1 < arg2);
365 int4le(PG_FUNCTION_ARGS)
367 int32 arg1 = PG_GETARG_INT32(0);
368 int32 arg2 = PG_GETARG_INT32(1);
370 PG_RETURN_BOOL(arg1 <= arg2);
374 int4gt(PG_FUNCTION_ARGS)
376 int32 arg1 = PG_GETARG_INT32(0);
377 int32 arg2 = PG_GETARG_INT32(1);
379 PG_RETURN_BOOL(arg1 > arg2);
383 int4ge(PG_FUNCTION_ARGS)
385 int32 arg1 = PG_GETARG_INT32(0);
386 int32 arg2 = PG_GETARG_INT32(1);
388 PG_RETURN_BOOL(arg1 >= arg2);
392 int2eq(PG_FUNCTION_ARGS)
394 int16 arg1 = PG_GETARG_INT16(0);
395 int16 arg2 = PG_GETARG_INT16(1);
397 PG_RETURN_BOOL(arg1 == arg2);
401 int2ne(PG_FUNCTION_ARGS)
403 int16 arg1 = PG_GETARG_INT16(0);
404 int16 arg2 = PG_GETARG_INT16(1);
406 PG_RETURN_BOOL(arg1 != arg2);
410 int2lt(PG_FUNCTION_ARGS)
412 int16 arg1 = PG_GETARG_INT16(0);
413 int16 arg2 = PG_GETARG_INT16(1);
415 PG_RETURN_BOOL(arg1 < arg2);
419 int2le(PG_FUNCTION_ARGS)
421 int16 arg1 = PG_GETARG_INT16(0);
422 int16 arg2 = PG_GETARG_INT16(1);
424 PG_RETURN_BOOL(arg1 <= arg2);
428 int2gt(PG_FUNCTION_ARGS)
430 int16 arg1 = PG_GETARG_INT16(0);
431 int16 arg2 = PG_GETARG_INT16(1);
433 PG_RETURN_BOOL(arg1 > arg2);
437 int2ge(PG_FUNCTION_ARGS)
439 int16 arg1 = PG_GETARG_INT16(0);
440 int16 arg2 = PG_GETARG_INT16(1);
442 PG_RETURN_BOOL(arg1 >= arg2);
446 int24eq(PG_FUNCTION_ARGS)
448 int16 arg1 = PG_GETARG_INT16(0);
449 int32 arg2 = PG_GETARG_INT32(1);
451 PG_RETURN_BOOL(arg1 == arg2);
455 int24ne(PG_FUNCTION_ARGS)
457 int16 arg1 = PG_GETARG_INT16(0);
458 int32 arg2 = PG_GETARG_INT32(1);
460 PG_RETURN_BOOL(arg1 != arg2);
464 int24lt(PG_FUNCTION_ARGS)
466 int16 arg1 = PG_GETARG_INT16(0);
467 int32 arg2 = PG_GETARG_INT32(1);
469 PG_RETURN_BOOL(arg1 < arg2);
473 int24le(PG_FUNCTION_ARGS)
475 int16 arg1 = PG_GETARG_INT16(0);
476 int32 arg2 = PG_GETARG_INT32(1);
478 PG_RETURN_BOOL(arg1 <= arg2);
482 int24gt(PG_FUNCTION_ARGS)
484 int16 arg1 = PG_GETARG_INT16(0);
485 int32 arg2 = PG_GETARG_INT32(1);
487 PG_RETURN_BOOL(arg1 > arg2);
491 int24ge(PG_FUNCTION_ARGS)
493 int16 arg1 = PG_GETARG_INT16(0);
494 int32 arg2 = PG_GETARG_INT32(1);
496 PG_RETURN_BOOL(arg1 >= arg2);
500 int42eq(PG_FUNCTION_ARGS)
502 int32 arg1 = PG_GETARG_INT32(0);
503 int16 arg2 = PG_GETARG_INT16(1);
505 PG_RETURN_BOOL(arg1 == arg2);
509 int42ne(PG_FUNCTION_ARGS)
511 int32 arg1 = PG_GETARG_INT32(0);
512 int16 arg2 = PG_GETARG_INT16(1);
514 PG_RETURN_BOOL(arg1 != arg2);
518 int42lt(PG_FUNCTION_ARGS)
520 int32 arg1 = PG_GETARG_INT32(0);
521 int16 arg2 = PG_GETARG_INT16(1);
523 PG_RETURN_BOOL(arg1 < arg2);
527 int42le(PG_FUNCTION_ARGS)
529 int32 arg1 = PG_GETARG_INT32(0);
530 int16 arg2 = PG_GETARG_INT16(1);
532 PG_RETURN_BOOL(arg1 <= arg2);
536 int42gt(PG_FUNCTION_ARGS)
538 int32 arg1 = PG_GETARG_INT32(0);
539 int16 arg2 = PG_GETARG_INT16(1);
541 PG_RETURN_BOOL(arg1 > arg2);
545 int42ge(PG_FUNCTION_ARGS)
547 int32 arg1 = PG_GETARG_INT32(0);
548 int16 arg2 = PG_GETARG_INT16(1);
550 PG_RETURN_BOOL(arg1 >= arg2);
554 * int[24]pl - returns arg1 + arg2
555 * int[24]mi - returns arg1 - arg2
556 * int[24]mul - returns arg1 * arg2
557 * int[24]div - returns arg1 / arg2
561 int4um(PG_FUNCTION_ARGS)
563 int32 arg = PG_GETARG_INT32(0);
565 PG_RETURN_INT32(-arg);
569 int4pl(PG_FUNCTION_ARGS)
571 int32 arg1 = PG_GETARG_INT32(0);
572 int32 arg2 = PG_GETARG_INT32(1);
574 PG_RETURN_INT32(arg1 + arg2);
578 int4mi(PG_FUNCTION_ARGS)
580 int32 arg1 = PG_GETARG_INT32(0);
581 int32 arg2 = PG_GETARG_INT32(1);
583 PG_RETURN_INT32(arg1 - arg2);
587 int4mul(PG_FUNCTION_ARGS)
589 int32 arg1 = PG_GETARG_INT32(0);
590 int32 arg2 = PG_GETARG_INT32(1);
592 PG_RETURN_INT32(arg1 * arg2);
596 int4div(PG_FUNCTION_ARGS)
598 int32 arg1 = PG_GETARG_INT32(0);
599 int32 arg2 = PG_GETARG_INT32(1);
601 PG_RETURN_INT32(arg1 / arg2);
605 int4inc(PG_FUNCTION_ARGS)
607 int32 arg = PG_GETARG_INT32(0);
609 PG_RETURN_INT32(arg + 1);
613 int2um(PG_FUNCTION_ARGS)
615 int16 arg = PG_GETARG_INT16(0);
617 PG_RETURN_INT16(-arg);
621 int2pl(PG_FUNCTION_ARGS)
623 int16 arg1 = PG_GETARG_INT16(0);
624 int16 arg2 = PG_GETARG_INT16(1);
626 PG_RETURN_INT16(arg1 + arg2);
630 int2mi(PG_FUNCTION_ARGS)
632 int16 arg1 = PG_GETARG_INT16(0);
633 int16 arg2 = PG_GETARG_INT16(1);
635 PG_RETURN_INT16(arg1 - arg2);
639 int2mul(PG_FUNCTION_ARGS)
641 int16 arg1 = PG_GETARG_INT16(0);
642 int16 arg2 = PG_GETARG_INT16(1);
644 PG_RETURN_INT16(arg1 * arg2);
648 int2div(PG_FUNCTION_ARGS)
650 int16 arg1 = PG_GETARG_INT16(0);
651 int16 arg2 = PG_GETARG_INT16(1);
653 PG_RETURN_INT16(arg1 / arg2);
657 int2inc(PG_FUNCTION_ARGS)
659 int16 arg = PG_GETARG_INT16(0);
661 PG_RETURN_INT16(arg + 1);
665 int24pl(PG_FUNCTION_ARGS)
667 int16 arg1 = PG_GETARG_INT16(0);
668 int32 arg2 = PG_GETARG_INT32(1);
670 PG_RETURN_INT32(arg1 + arg2);
674 int24mi(PG_FUNCTION_ARGS)
676 int16 arg1 = PG_GETARG_INT16(0);
677 int32 arg2 = PG_GETARG_INT32(1);
679 PG_RETURN_INT32(arg1 - arg2);
683 int24mul(PG_FUNCTION_ARGS)
685 int16 arg1 = PG_GETARG_INT16(0);
686 int32 arg2 = PG_GETARG_INT32(1);
688 PG_RETURN_INT32(arg1 * arg2);
692 int24div(PG_FUNCTION_ARGS)
694 int16 arg1 = PG_GETARG_INT16(0);
695 int32 arg2 = PG_GETARG_INT32(1);
697 PG_RETURN_INT32(arg1 / arg2);
701 int42pl(PG_FUNCTION_ARGS)
703 int32 arg1 = PG_GETARG_INT32(0);
704 int16 arg2 = PG_GETARG_INT16(1);
706 PG_RETURN_INT32(arg1 + arg2);
710 int42mi(PG_FUNCTION_ARGS)
712 int32 arg1 = PG_GETARG_INT32(0);
713 int16 arg2 = PG_GETARG_INT16(1);
715 PG_RETURN_INT32(arg1 - arg2);
719 int42mul(PG_FUNCTION_ARGS)
721 int32 arg1 = PG_GETARG_INT32(0);
722 int16 arg2 = PG_GETARG_INT16(1);
724 PG_RETURN_INT32(arg1 * arg2);
728 int42div(PG_FUNCTION_ARGS)
730 int32 arg1 = PG_GETARG_INT32(0);
731 int16 arg2 = PG_GETARG_INT16(1);
733 PG_RETURN_INT32(arg1 / arg2);
737 int4mod(PG_FUNCTION_ARGS)
739 int32 arg1 = PG_GETARG_INT32(0);
740 int32 arg2 = PG_GETARG_INT32(1);
742 PG_RETURN_INT32(arg1 % arg2);
746 int2mod(PG_FUNCTION_ARGS)
748 int16 arg1 = PG_GETARG_INT16(0);
749 int16 arg2 = PG_GETARG_INT16(1);
751 PG_RETURN_INT16(arg1 % arg2);
755 int24mod(PG_FUNCTION_ARGS)
757 int16 arg1 = PG_GETARG_INT16(0);
758 int32 arg2 = PG_GETARG_INT32(1);
760 PG_RETURN_INT32(arg1 % arg2);
764 int42mod(PG_FUNCTION_ARGS)
766 int32 arg1 = PG_GETARG_INT32(0);
767 int16 arg2 = PG_GETARG_INT16(1);
769 PG_RETURN_INT32(arg1 % arg2);
776 int4fac(PG_FUNCTION_ARGS)
778 int32 arg1 = PG_GETARG_INT32(0);
784 for (result = 1; arg1 > 0; --arg1)
786 PG_RETURN_INT32(result);
790 int2fac(PG_FUNCTION_ARGS)
792 int16 arg1 = PG_GETARG_INT16(0);
798 for (result = 1; arg1 > 0; --arg1)
800 PG_RETURN_INT32(result);
807 int4abs(PG_FUNCTION_ARGS)
809 int32 arg1 = PG_GETARG_INT32(0);
811 PG_RETURN_INT32((arg1 < 0) ? -arg1 : arg1);
815 int2abs(PG_FUNCTION_ARGS)
817 int16 arg1 = PG_GETARG_INT16(0);
819 PG_RETURN_INT16((arg1 < 0) ? -arg1 : arg1);
823 int2larger(PG_FUNCTION_ARGS)
825 int16 arg1 = PG_GETARG_INT16(0);
826 int16 arg2 = PG_GETARG_INT16(1);
828 PG_RETURN_INT16((arg1 > arg2) ? arg1 : arg2);
832 int2smaller(PG_FUNCTION_ARGS)
834 int16 arg1 = PG_GETARG_INT16(0);
835 int16 arg2 = PG_GETARG_INT16(1);
837 PG_RETURN_INT16((arg1 < arg2) ? arg1 : arg2);
841 int4larger(PG_FUNCTION_ARGS)
843 int32 arg1 = PG_GETARG_INT32(0);
844 int32 arg2 = PG_GETARG_INT32(1);
846 PG_RETURN_INT32((arg1 > arg2) ? arg1 : arg2);
850 int4smaller(PG_FUNCTION_ARGS)
852 int32 arg1 = PG_GETARG_INT32(0);
853 int32 arg2 = PG_GETARG_INT32(1);
855 PG_RETURN_INT32((arg1 < arg2) ? arg1 : arg2);