1 /*-------------------------------------------------------------------------
4 * Functions for the built-in integer types (except int8).
6 * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $PostgreSQL: pgsql/src/backend/utils/adt/int.c,v 1.59 2003/12/01 21:52:37 momjian Exp $
13 *-------------------------------------------------------------------------
18 * int2in, int2out, int2recv, int2send
19 * int4in, int4out, int4recv, int4send
20 * int2vectorin, int2vectorout, int2vectorrecv, int2vectorsend
21 * Conversion routines:
22 * itoi, int2_text, int4_text
24 * inteq, intne, intlt, intle, intgt, intge
25 * Arithmetic operators:
26 * intpl, intmi, int4mul, intdiv
28 * Arithmetic operators:
37 #include "libpq/pqformat.h"
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 pg_itoa(arg1, result);
72 PG_RETURN_CSTRING(result);
76 * int2recv - converts external binary format to int2
79 int2recv(PG_FUNCTION_ARGS)
81 StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
83 PG_RETURN_INT16((int16) pq_getmsgint(buf, sizeof(int16)));
87 * int2send - converts int2 to binary format
90 int2send(PG_FUNCTION_ARGS)
92 int16 arg1 = PG_GETARG_INT16(0);
95 pq_begintypsend(&buf);
96 pq_sendint(&buf, arg1, sizeof(int16));
97 PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
101 * int2vectorin - converts "num num ..." to internal form
103 * Note: Fills any missing slots with zeroes.
106 int2vectorin(PG_FUNCTION_ARGS)
108 char *intString = PG_GETARG_CSTRING(0);
109 int16 *result = (int16 *) palloc(sizeof(int16[INDEX_MAX_KEYS]));
112 for (slot = 0; *intString && slot < INDEX_MAX_KEYS; slot++)
114 if (sscanf(intString, "%hd", &result[slot]) != 1)
116 while (*intString && isspace((unsigned char) *intString))
118 while (*intString && !isspace((unsigned char) *intString))
121 while (*intString && isspace((unsigned char) *intString))
125 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
126 errmsg("int2vector has too many elements")));
128 while (slot < INDEX_MAX_KEYS)
131 PG_RETURN_POINTER(result);
135 * int2vectorout - converts internal form to "num num ..."
138 int2vectorout(PG_FUNCTION_ARGS)
140 int16 *int2Array = (int16 *) PG_GETARG_POINTER(0);
146 /* find last non-zero value in vector */
147 for (maxnum = INDEX_MAX_KEYS - 1; maxnum >= 0; maxnum--)
148 if (int2Array[maxnum] != 0)
151 /* assumes sign, 5 digits, ' ' */
152 rp = result = (char *) palloc((maxnum + 1) * 7 + 1);
153 for (num = 0; num <= maxnum; num++)
157 pg_itoa(int2Array[num], rp);
158 while (*++rp != '\0')
162 PG_RETURN_CSTRING(result);
166 * int2vectorrecv - converts external binary format to int2vector
169 int2vectorrecv(PG_FUNCTION_ARGS)
171 StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
172 int16 *result = (int16 *) palloc(sizeof(int16[INDEX_MAX_KEYS]));
175 for (slot = 0; slot < INDEX_MAX_KEYS; slot++)
176 result[slot] = (int16) pq_getmsgint(buf, sizeof(int16));
177 PG_RETURN_POINTER(result);
181 * int2vectorsend - converts int2vector to binary format
184 int2vectorsend(PG_FUNCTION_ARGS)
186 int16 *int2Array = (int16 *) PG_GETARG_POINTER(0);
190 pq_begintypsend(&buf);
191 for (slot = 0; slot < INDEX_MAX_KEYS; slot++)
192 pq_sendint(&buf, int2Array[slot], sizeof(int16));
193 PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
197 * We don't have a complete set of int2vector support routines,
198 * but we need int2vectoreq for catcache indexing.
201 int2vectoreq(PG_FUNCTION_ARGS)
203 int16 *arg1 = (int16 *) PG_GETARG_POINTER(0);
204 int16 *arg2 = (int16 *) PG_GETARG_POINTER(1);
206 PG_RETURN_BOOL(memcmp(arg1, arg2, INDEX_MAX_KEYS * sizeof(int16)) == 0);
210 /*****************************************************************************
212 *****************************************************************************/
215 * int4in - converts "num" to int4
218 int4in(PG_FUNCTION_ARGS)
220 char *num = PG_GETARG_CSTRING(0);
222 PG_RETURN_INT32(pg_atoi(num, sizeof(int32), '\0'));
226 * int4out - converts int4 to "num"
229 int4out(PG_FUNCTION_ARGS)
231 int32 arg1 = PG_GETARG_INT32(0);
232 char *result = (char *) palloc(12); /* sign, 10 digits, '\0' */
234 pg_ltoa(arg1, result);
235 PG_RETURN_CSTRING(result);
239 * int4recv - converts external binary format to int4
242 int4recv(PG_FUNCTION_ARGS)
244 StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
246 PG_RETURN_INT32((int32) pq_getmsgint(buf, sizeof(int32)));
250 * int4send - converts int4 to binary format
253 int4send(PG_FUNCTION_ARGS)
255 int32 arg1 = PG_GETARG_INT32(0);
258 pq_begintypsend(&buf);
259 pq_sendint(&buf, arg1, sizeof(int32));
260 PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
265 * ===================
266 * CONVERSION ROUTINES
267 * ===================
271 i2toi4(PG_FUNCTION_ARGS)
273 int16 arg1 = PG_GETARG_INT16(0);
275 PG_RETURN_INT32((int32) arg1);
279 i4toi2(PG_FUNCTION_ARGS)
281 int32 arg1 = PG_GETARG_INT32(0);
283 if (arg1 < SHRT_MIN || arg1 > SHRT_MAX)
285 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
286 errmsg("integer out of range")));
288 PG_RETURN_INT16((int16) arg1);
292 int2_text(PG_FUNCTION_ARGS)
294 int16 arg1 = PG_GETARG_INT16(0);
295 text *result = (text *) palloc(7 + VARHDRSZ); /* sign,5 digits, '\0' */
297 pg_itoa(arg1, VARDATA(result));
298 VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
299 PG_RETURN_TEXT_P(result);
303 text_int2(PG_FUNCTION_ARGS)
305 text *string = PG_GETARG_TEXT_P(0);
310 len = VARSIZE(string) - VARHDRSZ;
312 str = palloc(len + 1);
313 memcpy(str, VARDATA(string), len);
316 result = DirectFunctionCall1(int2in, CStringGetDatum(str));
323 int4_text(PG_FUNCTION_ARGS)
325 int32 arg1 = PG_GETARG_INT32(0);
326 text *result = (text *) palloc(12 + VARHDRSZ); /* sign,10 digits,'\0' */
328 pg_ltoa(arg1, VARDATA(result));
329 VARATT_SIZEP(result) = strlen(VARDATA(result)) + VARHDRSZ;
330 PG_RETURN_TEXT_P(result);
334 text_int4(PG_FUNCTION_ARGS)
336 text *string = PG_GETARG_TEXT_P(0);
341 len = VARSIZE(string) - VARHDRSZ;
343 str = palloc(len + 1);
344 memcpy(str, VARDATA(string), len);
347 result = DirectFunctionCall1(int4in, CStringGetDatum(str));
355 * ============================
356 * COMPARISON OPERATOR ROUTINES
357 * ============================
361 * inteq - returns 1 iff arg1 == arg2
362 * intne - returns 1 iff arg1 != arg2
363 * intlt - returns 1 iff arg1 < arg2
364 * intle - returns 1 iff arg1 <= arg2
365 * intgt - returns 1 iff arg1 > arg2
366 * intge - returns 1 iff arg1 >= arg2
370 int4eq(PG_FUNCTION_ARGS)
372 int32 arg1 = PG_GETARG_INT32(0);
373 int32 arg2 = PG_GETARG_INT32(1);
375 PG_RETURN_BOOL(arg1 == arg2);
379 int4ne(PG_FUNCTION_ARGS)
381 int32 arg1 = PG_GETARG_INT32(0);
382 int32 arg2 = PG_GETARG_INT32(1);
384 PG_RETURN_BOOL(arg1 != arg2);
388 int4lt(PG_FUNCTION_ARGS)
390 int32 arg1 = PG_GETARG_INT32(0);
391 int32 arg2 = PG_GETARG_INT32(1);
393 PG_RETURN_BOOL(arg1 < arg2);
397 int4le(PG_FUNCTION_ARGS)
399 int32 arg1 = PG_GETARG_INT32(0);
400 int32 arg2 = PG_GETARG_INT32(1);
402 PG_RETURN_BOOL(arg1 <= arg2);
406 int4gt(PG_FUNCTION_ARGS)
408 int32 arg1 = PG_GETARG_INT32(0);
409 int32 arg2 = PG_GETARG_INT32(1);
411 PG_RETURN_BOOL(arg1 > arg2);
415 int4ge(PG_FUNCTION_ARGS)
417 int32 arg1 = PG_GETARG_INT32(0);
418 int32 arg2 = PG_GETARG_INT32(1);
420 PG_RETURN_BOOL(arg1 >= arg2);
424 int2eq(PG_FUNCTION_ARGS)
426 int16 arg1 = PG_GETARG_INT16(0);
427 int16 arg2 = PG_GETARG_INT16(1);
429 PG_RETURN_BOOL(arg1 == arg2);
433 int2ne(PG_FUNCTION_ARGS)
435 int16 arg1 = PG_GETARG_INT16(0);
436 int16 arg2 = PG_GETARG_INT16(1);
438 PG_RETURN_BOOL(arg1 != arg2);
442 int2lt(PG_FUNCTION_ARGS)
444 int16 arg1 = PG_GETARG_INT16(0);
445 int16 arg2 = PG_GETARG_INT16(1);
447 PG_RETURN_BOOL(arg1 < arg2);
451 int2le(PG_FUNCTION_ARGS)
453 int16 arg1 = PG_GETARG_INT16(0);
454 int16 arg2 = PG_GETARG_INT16(1);
456 PG_RETURN_BOOL(arg1 <= arg2);
460 int2gt(PG_FUNCTION_ARGS)
462 int16 arg1 = PG_GETARG_INT16(0);
463 int16 arg2 = PG_GETARG_INT16(1);
465 PG_RETURN_BOOL(arg1 > arg2);
469 int2ge(PG_FUNCTION_ARGS)
471 int16 arg1 = PG_GETARG_INT16(0);
472 int16 arg2 = PG_GETARG_INT16(1);
474 PG_RETURN_BOOL(arg1 >= arg2);
478 int24eq(PG_FUNCTION_ARGS)
480 int16 arg1 = PG_GETARG_INT16(0);
481 int32 arg2 = PG_GETARG_INT32(1);
483 PG_RETURN_BOOL(arg1 == arg2);
487 int24ne(PG_FUNCTION_ARGS)
489 int16 arg1 = PG_GETARG_INT16(0);
490 int32 arg2 = PG_GETARG_INT32(1);
492 PG_RETURN_BOOL(arg1 != arg2);
496 int24lt(PG_FUNCTION_ARGS)
498 int16 arg1 = PG_GETARG_INT16(0);
499 int32 arg2 = PG_GETARG_INT32(1);
501 PG_RETURN_BOOL(arg1 < arg2);
505 int24le(PG_FUNCTION_ARGS)
507 int16 arg1 = PG_GETARG_INT16(0);
508 int32 arg2 = PG_GETARG_INT32(1);
510 PG_RETURN_BOOL(arg1 <= arg2);
514 int24gt(PG_FUNCTION_ARGS)
516 int16 arg1 = PG_GETARG_INT16(0);
517 int32 arg2 = PG_GETARG_INT32(1);
519 PG_RETURN_BOOL(arg1 > arg2);
523 int24ge(PG_FUNCTION_ARGS)
525 int16 arg1 = PG_GETARG_INT16(0);
526 int32 arg2 = PG_GETARG_INT32(1);
528 PG_RETURN_BOOL(arg1 >= arg2);
532 int42eq(PG_FUNCTION_ARGS)
534 int32 arg1 = PG_GETARG_INT32(0);
535 int16 arg2 = PG_GETARG_INT16(1);
537 PG_RETURN_BOOL(arg1 == arg2);
541 int42ne(PG_FUNCTION_ARGS)
543 int32 arg1 = PG_GETARG_INT32(0);
544 int16 arg2 = PG_GETARG_INT16(1);
546 PG_RETURN_BOOL(arg1 != arg2);
550 int42lt(PG_FUNCTION_ARGS)
552 int32 arg1 = PG_GETARG_INT32(0);
553 int16 arg2 = PG_GETARG_INT16(1);
555 PG_RETURN_BOOL(arg1 < arg2);
559 int42le(PG_FUNCTION_ARGS)
561 int32 arg1 = PG_GETARG_INT32(0);
562 int16 arg2 = PG_GETARG_INT16(1);
564 PG_RETURN_BOOL(arg1 <= arg2);
568 int42gt(PG_FUNCTION_ARGS)
570 int32 arg1 = PG_GETARG_INT32(0);
571 int16 arg2 = PG_GETARG_INT16(1);
573 PG_RETURN_BOOL(arg1 > arg2);
577 int42ge(PG_FUNCTION_ARGS)
579 int32 arg1 = PG_GETARG_INT32(0);
580 int16 arg2 = PG_GETARG_INT16(1);
582 PG_RETURN_BOOL(arg1 >= arg2);
586 * int[24]pl - returns arg1 + arg2
587 * int[24]mi - returns arg1 - arg2
588 * int[24]mul - returns arg1 * arg2
589 * int[24]div - returns arg1 / arg2
593 int4um(PG_FUNCTION_ARGS)
595 int32 arg = PG_GETARG_INT32(0);
597 PG_RETURN_INT32(-arg);
601 int4up(PG_FUNCTION_ARGS)
603 int32 arg = PG_GETARG_INT32(0);
605 PG_RETURN_INT32(arg);
609 int4pl(PG_FUNCTION_ARGS)
611 int32 arg1 = PG_GETARG_INT32(0);
612 int32 arg2 = PG_GETARG_INT32(1);
614 PG_RETURN_INT32(arg1 + arg2);
618 int4mi(PG_FUNCTION_ARGS)
620 int32 arg1 = PG_GETARG_INT32(0);
621 int32 arg2 = PG_GETARG_INT32(1);
623 PG_RETURN_INT32(arg1 - arg2);
627 int4mul(PG_FUNCTION_ARGS)
629 int32 arg1 = PG_GETARG_INT32(0);
630 int32 arg2 = PG_GETARG_INT32(1);
632 PG_RETURN_INT32(arg1 * arg2);
636 int4div(PG_FUNCTION_ARGS)
638 int32 arg1 = PG_GETARG_INT32(0);
639 int32 arg2 = PG_GETARG_INT32(1);
643 (errcode(ERRCODE_DIVISION_BY_ZERO),
644 errmsg("division by zero")));
646 PG_RETURN_INT32(arg1 / arg2);
650 int4inc(PG_FUNCTION_ARGS)
652 int32 arg = PG_GETARG_INT32(0);
654 PG_RETURN_INT32(arg + 1);
658 int2um(PG_FUNCTION_ARGS)
660 int16 arg = PG_GETARG_INT16(0);
662 PG_RETURN_INT16(-arg);
666 int2up(PG_FUNCTION_ARGS)
668 int16 arg = PG_GETARG_INT16(0);
670 PG_RETURN_INT16(arg);
674 int2pl(PG_FUNCTION_ARGS)
676 int16 arg1 = PG_GETARG_INT16(0);
677 int16 arg2 = PG_GETARG_INT16(1);
679 PG_RETURN_INT16(arg1 + arg2);
683 int2mi(PG_FUNCTION_ARGS)
685 int16 arg1 = PG_GETARG_INT16(0);
686 int16 arg2 = PG_GETARG_INT16(1);
688 PG_RETURN_INT16(arg1 - arg2);
692 int2mul(PG_FUNCTION_ARGS)
694 int16 arg1 = PG_GETARG_INT16(0);
695 int16 arg2 = PG_GETARG_INT16(1);
697 PG_RETURN_INT16(arg1 * arg2);
701 int2div(PG_FUNCTION_ARGS)
703 int16 arg1 = PG_GETARG_INT16(0);
704 int16 arg2 = PG_GETARG_INT16(1);
708 (errcode(ERRCODE_DIVISION_BY_ZERO),
709 errmsg("division by zero")));
711 PG_RETURN_INT16(arg1 / arg2);
715 int24pl(PG_FUNCTION_ARGS)
717 int16 arg1 = PG_GETARG_INT16(0);
718 int32 arg2 = PG_GETARG_INT32(1);
720 PG_RETURN_INT32(arg1 + arg2);
724 int24mi(PG_FUNCTION_ARGS)
726 int16 arg1 = PG_GETARG_INT16(0);
727 int32 arg2 = PG_GETARG_INT32(1);
729 PG_RETURN_INT32(arg1 - arg2);
733 int24mul(PG_FUNCTION_ARGS)
735 int16 arg1 = PG_GETARG_INT16(0);
736 int32 arg2 = PG_GETARG_INT32(1);
738 PG_RETURN_INT32(arg1 * arg2);
742 int24div(PG_FUNCTION_ARGS)
744 int16 arg1 = PG_GETARG_INT16(0);
745 int32 arg2 = PG_GETARG_INT32(1);
749 (errcode(ERRCODE_DIVISION_BY_ZERO),
750 errmsg("division by zero")));
752 PG_RETURN_INT32(arg1 / arg2);
756 int42pl(PG_FUNCTION_ARGS)
758 int32 arg1 = PG_GETARG_INT32(0);
759 int16 arg2 = PG_GETARG_INT16(1);
761 PG_RETURN_INT32(arg1 + arg2);
765 int42mi(PG_FUNCTION_ARGS)
767 int32 arg1 = PG_GETARG_INT32(0);
768 int16 arg2 = PG_GETARG_INT16(1);
770 PG_RETURN_INT32(arg1 - arg2);
774 int42mul(PG_FUNCTION_ARGS)
776 int32 arg1 = PG_GETARG_INT32(0);
777 int16 arg2 = PG_GETARG_INT16(1);
779 PG_RETURN_INT32(arg1 * arg2);
783 int42div(PG_FUNCTION_ARGS)
785 int32 arg1 = PG_GETARG_INT32(0);
786 int16 arg2 = PG_GETARG_INT16(1);
790 (errcode(ERRCODE_DIVISION_BY_ZERO),
791 errmsg("division by zero")));
793 PG_RETURN_INT32(arg1 / arg2);
797 int4mod(PG_FUNCTION_ARGS)
799 int32 arg1 = PG_GETARG_INT32(0);
800 int32 arg2 = PG_GETARG_INT32(1);
804 (errcode(ERRCODE_DIVISION_BY_ZERO),
805 errmsg("division by zero")));
807 PG_RETURN_INT32(arg1 % arg2);
811 int2mod(PG_FUNCTION_ARGS)
813 int16 arg1 = PG_GETARG_INT16(0);
814 int16 arg2 = PG_GETARG_INT16(1);
818 (errcode(ERRCODE_DIVISION_BY_ZERO),
819 errmsg("division by zero")));
821 PG_RETURN_INT16(arg1 % arg2);
825 int24mod(PG_FUNCTION_ARGS)
827 int16 arg1 = PG_GETARG_INT16(0);
828 int32 arg2 = PG_GETARG_INT32(1);
832 (errcode(ERRCODE_DIVISION_BY_ZERO),
833 errmsg("division by zero")));
835 PG_RETURN_INT32(arg1 % arg2);
839 int42mod(PG_FUNCTION_ARGS)
841 int32 arg1 = PG_GETARG_INT32(0);
842 int16 arg2 = PG_GETARG_INT16(1);
846 (errcode(ERRCODE_DIVISION_BY_ZERO),
847 errmsg("division by zero")));
849 PG_RETURN_INT32(arg1 % arg2);
857 int4abs(PG_FUNCTION_ARGS)
859 int32 arg1 = PG_GETARG_INT32(0);
861 PG_RETURN_INT32((arg1 < 0) ? -arg1 : arg1);
865 int2abs(PG_FUNCTION_ARGS)
867 int16 arg1 = PG_GETARG_INT16(0);
869 PG_RETURN_INT16((arg1 < 0) ? -arg1 : arg1);
873 int2larger(PG_FUNCTION_ARGS)
875 int16 arg1 = PG_GETARG_INT16(0);
876 int16 arg2 = PG_GETARG_INT16(1);
878 PG_RETURN_INT16((arg1 > arg2) ? arg1 : arg2);
882 int2smaller(PG_FUNCTION_ARGS)
884 int16 arg1 = PG_GETARG_INT16(0);
885 int16 arg2 = PG_GETARG_INT16(1);
887 PG_RETURN_INT16((arg1 < arg2) ? arg1 : arg2);
891 int4larger(PG_FUNCTION_ARGS)
893 int32 arg1 = PG_GETARG_INT32(0);
894 int32 arg2 = PG_GETARG_INT32(1);
896 PG_RETURN_INT32((arg1 > arg2) ? arg1 : arg2);
900 int4smaller(PG_FUNCTION_ARGS)
902 int32 arg1 = PG_GETARG_INT32(0);
903 int32 arg2 = PG_GETARG_INT32(1);
905 PG_RETURN_INT32((arg1 < arg2) ? arg1 : arg2);
908 /* Binary arithmetics
910 * int[24]and - returns arg1 & arg2
911 * int[24]or - returns arg1 | arg2
912 * int[24]xor - returns arg1 # arg2
913 * int[24]not - returns ~arg1
914 * int[24]shl - returns arg1 << arg2
915 * int[24]shr - returns arg1 >> arg2
919 int4and(PG_FUNCTION_ARGS)
921 int32 arg1 = PG_GETARG_INT32(0);
922 int32 arg2 = PG_GETARG_INT32(1);
924 PG_RETURN_INT32(arg1 & arg2);
928 int4or(PG_FUNCTION_ARGS)
930 int32 arg1 = PG_GETARG_INT32(0);
931 int32 arg2 = PG_GETARG_INT32(1);
933 PG_RETURN_INT32(arg1 | arg2);
937 int4xor(PG_FUNCTION_ARGS)
939 int32 arg1 = PG_GETARG_INT32(0);
940 int32 arg2 = PG_GETARG_INT32(1);
942 PG_RETURN_INT32(arg1 ^ arg2);
946 int4shl(PG_FUNCTION_ARGS)
948 int32 arg1 = PG_GETARG_INT32(0);
949 int32 arg2 = PG_GETARG_INT32(1);
951 PG_RETURN_INT32(arg1 << arg2);
955 int4shr(PG_FUNCTION_ARGS)
957 int32 arg1 = PG_GETARG_INT32(0);
958 int32 arg2 = PG_GETARG_INT32(1);
960 PG_RETURN_INT32(arg1 >> arg2);
964 int4not(PG_FUNCTION_ARGS)
966 int32 arg1 = PG_GETARG_INT32(0);
968 PG_RETURN_INT32(~arg1);
972 int2and(PG_FUNCTION_ARGS)
974 int16 arg1 = PG_GETARG_INT16(0);
975 int16 arg2 = PG_GETARG_INT16(1);
977 PG_RETURN_INT16(arg1 & arg2);
981 int2or(PG_FUNCTION_ARGS)
983 int16 arg1 = PG_GETARG_INT16(0);
984 int16 arg2 = PG_GETARG_INT16(1);
986 PG_RETURN_INT16(arg1 | arg2);
990 int2xor(PG_FUNCTION_ARGS)
992 int16 arg1 = PG_GETARG_INT16(0);
993 int16 arg2 = PG_GETARG_INT16(1);
995 PG_RETURN_INT16(arg1 ^ arg2);
999 int2not(PG_FUNCTION_ARGS)
1001 int16 arg1 = PG_GETARG_INT16(0);
1003 PG_RETURN_INT16(~arg1);
1008 int2shl(PG_FUNCTION_ARGS)
1010 int16 arg1 = PG_GETARG_INT16(0);
1011 int32 arg2 = PG_GETARG_INT32(1);
1013 PG_RETURN_INT16(arg1 << arg2);
1017 int2shr(PG_FUNCTION_ARGS)
1019 int16 arg1 = PG_GETARG_INT16(0);
1020 int32 arg2 = PG_GETARG_INT32(1);
1022 PG_RETURN_INT16(arg1 >> arg2);