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.44 2000/12/03 20:45:36 tgl 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:
35 #include "utils/builtins.h"
38 #define SHRT_MAX (0x7FFF)
41 #define SHRT_MIN (-0x8000)
44 /*****************************************************************************
46 *****************************************************************************/
49 * int2in - converts "num" to short
52 int2in(PG_FUNCTION_ARGS)
54 char *num = PG_GETARG_CSTRING(0);
56 PG_RETURN_INT16(pg_atoi(num, sizeof(int16), '\0'));
60 * int2out - converts short to "num"
63 int2out(PG_FUNCTION_ARGS)
65 int16 arg1 = PG_GETARG_INT16(0);
66 char *result = (char *) palloc(7); /* sign, 5 digits, '\0' */
68 pg_itoa(arg1, result);
69 PG_RETURN_CSTRING(result);
73 * int2vectorin - converts "num num ..." to internal form
75 * Note: Fills any missing slots with zeroes.
78 int2vectorin(PG_FUNCTION_ARGS)
80 char *intString = PG_GETARG_CSTRING(0);
81 int16 *result = (int16 *) palloc(sizeof(int16[INDEX_MAX_KEYS]));
84 for (slot = 0; *intString && slot < INDEX_MAX_KEYS; slot++)
86 if (sscanf(intString, "%hd", &result[slot]) != 1)
88 while (*intString && isspace((unsigned char) *intString))
90 while (*intString && !isspace((unsigned char) *intString))
93 while (*intString && isspace((unsigned char) *intString))
96 elog(ERROR, "int2vector value has too many values");
97 while (slot < INDEX_MAX_KEYS)
100 PG_RETURN_POINTER(result);
104 * int2vectorout - converts internal form to "num num ..."
107 int2vectorout(PG_FUNCTION_ARGS)
109 int16 *int2Array = (int16 *) PG_GETARG_POINTER(0);
115 /* find last non-zero value in vector */
116 for (maxnum = INDEX_MAX_KEYS - 1; maxnum >= 0; maxnum--)
117 if (int2Array[maxnum] != 0)
120 /* assumes sign, 5 digits, ' ' */
121 rp = result = (char *) palloc((maxnum + 1) * 7 + 1);
122 for (num = 0; num <= maxnum; num++)
126 pg_itoa(int2Array[num], rp);
127 while (*++rp != '\0')
131 PG_RETURN_CSTRING(result);
135 * We don't have a complete set of int2vector support routines,
136 * but we need int2vectoreq for catcache indexing.
139 int2vectoreq(PG_FUNCTION_ARGS)
141 int16 *arg1 = (int16 *) PG_GETARG_POINTER(0);
142 int16 *arg2 = (int16 *) PG_GETARG_POINTER(1);
144 PG_RETURN_BOOL(memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(int16)) == 0);
148 * Type int44 has no real-world use, but the regression tests use it.
149 * It's a four-element vector of int4's.
153 * int44in - converts "num num ..." to internal form
155 * Note: Fills any missing positions with zeroes.
158 int44in(PG_FUNCTION_ARGS)
160 char *input_string = PG_GETARG_CSTRING(0);
161 int32 *result = (int32 *) palloc(4 * sizeof(int32));
164 i = sscanf(input_string,
173 PG_RETURN_POINTER(result);
177 * int44out - converts internal form to "num num ..."
180 int44out(PG_FUNCTION_ARGS)
182 int32 *an_array = (int32 *) PG_GETARG_POINTER(0);
183 char *result = (char *) palloc(16 * 4); /* Allow 14 digits + sign */
188 for (i = 0; i < 4; i++)
190 pg_ltoa(an_array[i], walk);
191 while (*++walk != '\0')
196 PG_RETURN_CSTRING(result);
200 /*****************************************************************************
202 *****************************************************************************/
205 * int4in - converts "num" to int4
208 int4in(PG_FUNCTION_ARGS)
210 char *num = PG_GETARG_CSTRING(0);
212 PG_RETURN_INT32(pg_atoi(num, sizeof(int32), '\0'));
216 * int4out - converts int4 to "num"
219 int4out(PG_FUNCTION_ARGS)
221 int32 arg1 = PG_GETARG_INT32(0);
222 char *result = (char *) palloc(12); /* sign, 10 digits, '\0' */
224 pg_ltoa(arg1, result);
225 PG_RETURN_CSTRING(result);
230 * ===================
231 * CONVERSION ROUTINES
232 * ===================
236 i2toi4(PG_FUNCTION_ARGS)
238 int16 arg1 = PG_GETARG_INT16(0);
240 PG_RETURN_INT32((int32) arg1);
244 i4toi2(PG_FUNCTION_ARGS)
246 int32 arg1 = PG_GETARG_INT32(0);
249 elog(ERROR, "i4toi2: '%d' causes int2 underflow", arg1);
251 elog(ERROR, "i4toi2: '%d' causes int2 overflow", arg1);
253 PG_RETURN_INT16((int16) arg1);
257 int2_text(PG_FUNCTION_ARGS)
259 int16 arg1 = PG_GETARG_INT16(0);
260 text *result = (text *) palloc(7+VARHDRSZ); /* sign,5 digits, '\0' */
262 pg_itoa(arg1, VARDATA(result));
263 VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
264 PG_RETURN_TEXT_P(result);
268 text_int2(PG_FUNCTION_ARGS)
270 text *string = PG_GETARG_TEXT_P(0);
275 len = VARSIZE(string) - VARHDRSZ;
277 str = palloc(len + 1);
278 memcpy(str, VARDATA(string), len);
281 result = DirectFunctionCall1(int2in, CStringGetDatum(str));
288 int4_text(PG_FUNCTION_ARGS)
290 int32 arg1 = PG_GETARG_INT32(0);
291 text *result = (text *) palloc(12+VARHDRSZ); /* sign,10 digits,'\0' */
293 pg_ltoa(arg1, VARDATA(result));
294 VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
295 PG_RETURN_TEXT_P(result);
299 text_int4(PG_FUNCTION_ARGS)
301 text *string = PG_GETARG_TEXT_P(0);
306 len = VARSIZE(string) - VARHDRSZ;
308 str = palloc(len + 1);
309 memcpy(str, VARDATA(string), len);
312 result = DirectFunctionCall1(int4in, CStringGetDatum(str));
320 * ============================
321 * COMPARISON OPERATOR ROUTINES
322 * ============================
326 * inteq - returns 1 iff arg1 == arg2
327 * intne - returns 1 iff arg1 != arg2
328 * intlt - returns 1 iff arg1 < arg2
329 * intle - returns 1 iff arg1 <= arg2
330 * intgt - returns 1 iff arg1 > arg2
331 * intge - returns 1 iff arg1 >= arg2
335 int4eq(PG_FUNCTION_ARGS)
337 int32 arg1 = PG_GETARG_INT32(0);
338 int32 arg2 = PG_GETARG_INT32(1);
340 PG_RETURN_BOOL(arg1 == arg2);
344 int4ne(PG_FUNCTION_ARGS)
346 int32 arg1 = PG_GETARG_INT32(0);
347 int32 arg2 = PG_GETARG_INT32(1);
349 PG_RETURN_BOOL(arg1 != arg2);
353 int4lt(PG_FUNCTION_ARGS)
355 int32 arg1 = PG_GETARG_INT32(0);
356 int32 arg2 = PG_GETARG_INT32(1);
358 PG_RETURN_BOOL(arg1 < arg2);
362 int4le(PG_FUNCTION_ARGS)
364 int32 arg1 = PG_GETARG_INT32(0);
365 int32 arg2 = PG_GETARG_INT32(1);
367 PG_RETURN_BOOL(arg1 <= arg2);
371 int4gt(PG_FUNCTION_ARGS)
373 int32 arg1 = PG_GETARG_INT32(0);
374 int32 arg2 = PG_GETARG_INT32(1);
376 PG_RETURN_BOOL(arg1 > arg2);
380 int4ge(PG_FUNCTION_ARGS)
382 int32 arg1 = PG_GETARG_INT32(0);
383 int32 arg2 = PG_GETARG_INT32(1);
385 PG_RETURN_BOOL(arg1 >= arg2);
389 int2eq(PG_FUNCTION_ARGS)
391 int16 arg1 = PG_GETARG_INT16(0);
392 int16 arg2 = PG_GETARG_INT16(1);
394 PG_RETURN_BOOL(arg1 == arg2);
398 int2ne(PG_FUNCTION_ARGS)
400 int16 arg1 = PG_GETARG_INT16(0);
401 int16 arg2 = PG_GETARG_INT16(1);
403 PG_RETURN_BOOL(arg1 != arg2);
407 int2lt(PG_FUNCTION_ARGS)
409 int16 arg1 = PG_GETARG_INT16(0);
410 int16 arg2 = PG_GETARG_INT16(1);
412 PG_RETURN_BOOL(arg1 < arg2);
416 int2le(PG_FUNCTION_ARGS)
418 int16 arg1 = PG_GETARG_INT16(0);
419 int16 arg2 = PG_GETARG_INT16(1);
421 PG_RETURN_BOOL(arg1 <= arg2);
425 int2gt(PG_FUNCTION_ARGS)
427 int16 arg1 = PG_GETARG_INT16(0);
428 int16 arg2 = PG_GETARG_INT16(1);
430 PG_RETURN_BOOL(arg1 > arg2);
434 int2ge(PG_FUNCTION_ARGS)
436 int16 arg1 = PG_GETARG_INT16(0);
437 int16 arg2 = PG_GETARG_INT16(1);
439 PG_RETURN_BOOL(arg1 >= arg2);
443 int24eq(PG_FUNCTION_ARGS)
445 int16 arg1 = PG_GETARG_INT16(0);
446 int32 arg2 = PG_GETARG_INT32(1);
448 PG_RETURN_BOOL(arg1 == arg2);
452 int24ne(PG_FUNCTION_ARGS)
454 int16 arg1 = PG_GETARG_INT16(0);
455 int32 arg2 = PG_GETARG_INT32(1);
457 PG_RETURN_BOOL(arg1 != arg2);
461 int24lt(PG_FUNCTION_ARGS)
463 int16 arg1 = PG_GETARG_INT16(0);
464 int32 arg2 = PG_GETARG_INT32(1);
466 PG_RETURN_BOOL(arg1 < arg2);
470 int24le(PG_FUNCTION_ARGS)
472 int16 arg1 = PG_GETARG_INT16(0);
473 int32 arg2 = PG_GETARG_INT32(1);
475 PG_RETURN_BOOL(arg1 <= arg2);
479 int24gt(PG_FUNCTION_ARGS)
481 int16 arg1 = PG_GETARG_INT16(0);
482 int32 arg2 = PG_GETARG_INT32(1);
484 PG_RETURN_BOOL(arg1 > arg2);
488 int24ge(PG_FUNCTION_ARGS)
490 int16 arg1 = PG_GETARG_INT16(0);
491 int32 arg2 = PG_GETARG_INT32(1);
493 PG_RETURN_BOOL(arg1 >= arg2);
497 int42eq(PG_FUNCTION_ARGS)
499 int32 arg1 = PG_GETARG_INT32(0);
500 int16 arg2 = PG_GETARG_INT16(1);
502 PG_RETURN_BOOL(arg1 == arg2);
506 int42ne(PG_FUNCTION_ARGS)
508 int32 arg1 = PG_GETARG_INT32(0);
509 int16 arg2 = PG_GETARG_INT16(1);
511 PG_RETURN_BOOL(arg1 != arg2);
515 int42lt(PG_FUNCTION_ARGS)
517 int32 arg1 = PG_GETARG_INT32(0);
518 int16 arg2 = PG_GETARG_INT16(1);
520 PG_RETURN_BOOL(arg1 < arg2);
524 int42le(PG_FUNCTION_ARGS)
526 int32 arg1 = PG_GETARG_INT32(0);
527 int16 arg2 = PG_GETARG_INT16(1);
529 PG_RETURN_BOOL(arg1 <= arg2);
533 int42gt(PG_FUNCTION_ARGS)
535 int32 arg1 = PG_GETARG_INT32(0);
536 int16 arg2 = PG_GETARG_INT16(1);
538 PG_RETURN_BOOL(arg1 > arg2);
542 int42ge(PG_FUNCTION_ARGS)
544 int32 arg1 = PG_GETARG_INT32(0);
545 int16 arg2 = PG_GETARG_INT16(1);
547 PG_RETURN_BOOL(arg1 >= arg2);
551 * int[24]pl - returns arg1 + arg2
552 * int[24]mi - returns arg1 - arg2
553 * int[24]mul - returns arg1 * arg2
554 * int[24]div - returns arg1 / arg2
558 int4um(PG_FUNCTION_ARGS)
560 int32 arg = PG_GETARG_INT32(0);
562 PG_RETURN_INT32(-arg);
566 int4pl(PG_FUNCTION_ARGS)
568 int32 arg1 = PG_GETARG_INT32(0);
569 int32 arg2 = PG_GETARG_INT32(1);
571 PG_RETURN_INT32(arg1 + arg2);
575 int4mi(PG_FUNCTION_ARGS)
577 int32 arg1 = PG_GETARG_INT32(0);
578 int32 arg2 = PG_GETARG_INT32(1);
580 PG_RETURN_INT32(arg1 - arg2);
584 int4mul(PG_FUNCTION_ARGS)
586 int32 arg1 = PG_GETARG_INT32(0);
587 int32 arg2 = PG_GETARG_INT32(1);
589 PG_RETURN_INT32(arg1 * arg2);
593 int4div(PG_FUNCTION_ARGS)
595 int32 arg1 = PG_GETARG_INT32(0);
596 int32 arg2 = PG_GETARG_INT32(1);
598 PG_RETURN_INT32(arg1 / arg2);
602 int4inc(PG_FUNCTION_ARGS)
604 int32 arg = PG_GETARG_INT32(0);
606 PG_RETURN_INT32(arg + 1);
610 int2um(PG_FUNCTION_ARGS)
612 int16 arg = PG_GETARG_INT16(0);
614 PG_RETURN_INT16(-arg);
618 int2pl(PG_FUNCTION_ARGS)
620 int16 arg1 = PG_GETARG_INT16(0);
621 int16 arg2 = PG_GETARG_INT16(1);
623 PG_RETURN_INT16(arg1 + arg2);
627 int2mi(PG_FUNCTION_ARGS)
629 int16 arg1 = PG_GETARG_INT16(0);
630 int16 arg2 = PG_GETARG_INT16(1);
632 PG_RETURN_INT16(arg1 - arg2);
636 int2mul(PG_FUNCTION_ARGS)
638 int16 arg1 = PG_GETARG_INT16(0);
639 int16 arg2 = PG_GETARG_INT16(1);
641 PG_RETURN_INT16(arg1 * arg2);
645 int2div(PG_FUNCTION_ARGS)
647 int16 arg1 = PG_GETARG_INT16(0);
648 int16 arg2 = PG_GETARG_INT16(1);
650 PG_RETURN_INT16(arg1 / arg2);
654 int24pl(PG_FUNCTION_ARGS)
656 int16 arg1 = PG_GETARG_INT16(0);
657 int32 arg2 = PG_GETARG_INT32(1);
659 PG_RETURN_INT32(arg1 + arg2);
663 int24mi(PG_FUNCTION_ARGS)
665 int16 arg1 = PG_GETARG_INT16(0);
666 int32 arg2 = PG_GETARG_INT32(1);
668 PG_RETURN_INT32(arg1 - arg2);
672 int24mul(PG_FUNCTION_ARGS)
674 int16 arg1 = PG_GETARG_INT16(0);
675 int32 arg2 = PG_GETARG_INT32(1);
677 PG_RETURN_INT32(arg1 * arg2);
681 int24div(PG_FUNCTION_ARGS)
683 int16 arg1 = PG_GETARG_INT16(0);
684 int32 arg2 = PG_GETARG_INT32(1);
686 PG_RETURN_INT32(arg1 / arg2);
690 int42pl(PG_FUNCTION_ARGS)
692 int32 arg1 = PG_GETARG_INT32(0);
693 int16 arg2 = PG_GETARG_INT16(1);
695 PG_RETURN_INT32(arg1 + arg2);
699 int42mi(PG_FUNCTION_ARGS)
701 int32 arg1 = PG_GETARG_INT32(0);
702 int16 arg2 = PG_GETARG_INT16(1);
704 PG_RETURN_INT32(arg1 - arg2);
708 int42mul(PG_FUNCTION_ARGS)
710 int32 arg1 = PG_GETARG_INT32(0);
711 int16 arg2 = PG_GETARG_INT16(1);
713 PG_RETURN_INT32(arg1 * arg2);
717 int42div(PG_FUNCTION_ARGS)
719 int32 arg1 = PG_GETARG_INT32(0);
720 int16 arg2 = PG_GETARG_INT16(1);
722 PG_RETURN_INT32(arg1 / arg2);
726 int4mod(PG_FUNCTION_ARGS)
728 int32 arg1 = PG_GETARG_INT32(0);
729 int32 arg2 = PG_GETARG_INT32(1);
731 PG_RETURN_INT32(arg1 % arg2);
735 int2mod(PG_FUNCTION_ARGS)
737 int16 arg1 = PG_GETARG_INT16(0);
738 int16 arg2 = PG_GETARG_INT16(1);
740 PG_RETURN_INT16(arg1 % arg2);
744 int24mod(PG_FUNCTION_ARGS)
746 int16 arg1 = PG_GETARG_INT16(0);
747 int32 arg2 = PG_GETARG_INT32(1);
749 PG_RETURN_INT32(arg1 % arg2);
753 int42mod(PG_FUNCTION_ARGS)
755 int32 arg1 = PG_GETARG_INT32(0);
756 int16 arg2 = PG_GETARG_INT16(1);
758 PG_RETURN_INT32(arg1 % arg2);
765 int4fac(PG_FUNCTION_ARGS)
767 int32 arg1 = PG_GETARG_INT32(0);
773 for (result = 1; arg1 > 0; --arg1)
775 PG_RETURN_INT32(result);
779 int2fac(PG_FUNCTION_ARGS)
781 int16 arg1 = PG_GETARG_INT16(0);
787 for (result = 1; arg1 > 0; --arg1)
789 PG_RETURN_INT32(result);
796 int4abs(PG_FUNCTION_ARGS)
798 int32 arg1 = PG_GETARG_INT32(0);
800 PG_RETURN_INT32((arg1 < 0) ? -arg1 : arg1);
804 int2abs(PG_FUNCTION_ARGS)
806 int16 arg1 = PG_GETARG_INT16(0);
808 PG_RETURN_INT16((arg1 < 0) ? -arg1 : arg1);
812 int2larger(PG_FUNCTION_ARGS)
814 int16 arg1 = PG_GETARG_INT16(0);
815 int16 arg2 = PG_GETARG_INT16(1);
817 PG_RETURN_INT16((arg1 > arg2) ? arg1 : arg2);
821 int2smaller(PG_FUNCTION_ARGS)
823 int16 arg1 = PG_GETARG_INT16(0);
824 int16 arg2 = PG_GETARG_INT16(1);
826 PG_RETURN_INT16((arg1 < arg2) ? arg1 : arg2);
830 int4larger(PG_FUNCTION_ARGS)
832 int32 arg1 = PG_GETARG_INT32(0);
833 int32 arg2 = PG_GETARG_INT32(1);
835 PG_RETURN_INT32((arg1 > arg2) ? arg1 : arg2);
839 int4smaller(PG_FUNCTION_ARGS)
841 int32 arg1 = PG_GETARG_INT32(0);
842 int32 arg2 = PG_GETARG_INT32(1);
844 PG_RETURN_INT32((arg1 < arg2) ? arg1 : arg2);
847 /* Binary arithmetics
849 * int[24]and - returns arg1 & arg2
850 * int[24]or - returns arg1 | arg2
851 * int[24]xor - returns arg1 # arg2
852 * int[24]not - returns ~arg1
853 * int[24]shl - returns arg1 << arg2
854 * int[24]shr - returns arg1 >> arg2
858 int4and(PG_FUNCTION_ARGS)
860 int32 arg1 = PG_GETARG_INT32(0);
861 int32 arg2 = PG_GETARG_INT32(1);
863 PG_RETURN_INT32(arg1 & arg2);
867 int4or(PG_FUNCTION_ARGS)
869 int32 arg1 = PG_GETARG_INT32(0);
870 int32 arg2 = PG_GETARG_INT32(1);
872 PG_RETURN_INT32(arg1 | arg2);
876 int4xor(PG_FUNCTION_ARGS)
878 int32 arg1 = PG_GETARG_INT32(0);
879 int32 arg2 = PG_GETARG_INT32(1);
881 PG_RETURN_INT32(arg1 ^ arg2);
885 int4shl(PG_FUNCTION_ARGS)
887 int32 arg1 = PG_GETARG_INT32(0);
888 int32 arg2 = PG_GETARG_INT32(1);
890 PG_RETURN_INT32(arg1 << arg2);
894 int4shr(PG_FUNCTION_ARGS)
896 int32 arg1 = PG_GETARG_INT32(0);
897 int32 arg2 = PG_GETARG_INT32(1);
899 PG_RETURN_INT32(arg1 >> arg2);
903 int4not(PG_FUNCTION_ARGS)
905 int32 arg1 = PG_GETARG_INT32(0);
907 PG_RETURN_INT32(~arg1);
911 int2and(PG_FUNCTION_ARGS)
913 int16 arg1 = PG_GETARG_INT16(0);
914 int16 arg2 = PG_GETARG_INT16(1);
916 PG_RETURN_INT16(arg1 & arg2);
920 int2or(PG_FUNCTION_ARGS)
922 int16 arg1 = PG_GETARG_INT16(0);
923 int16 arg2 = PG_GETARG_INT16(1);
925 PG_RETURN_INT16(arg1 | arg2);
929 int2xor(PG_FUNCTION_ARGS)
931 int16 arg1 = PG_GETARG_INT16(0);
932 int16 arg2 = PG_GETARG_INT16(1);
934 PG_RETURN_INT16(arg1 ^ arg2);
938 int2not(PG_FUNCTION_ARGS)
940 int16 arg1 = PG_GETARG_INT16(0);
942 PG_RETURN_INT16(~arg1);
947 int2shl(PG_FUNCTION_ARGS)
949 int16 arg1 = PG_GETARG_INT16(0);
950 int32 arg2 = PG_GETARG_INT32(1);
952 PG_RETURN_INT16(arg1 << arg2);
956 int2shr(PG_FUNCTION_ARGS)
958 int16 arg1 = PG_GETARG_INT16(0);
959 int32 arg2 = PG_GETARG_INT32(1);
961 PG_RETURN_INT16(arg1 >> arg2);