PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
int8.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * int8.c
4 * Internal 64-bit integer operations
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * IDENTIFICATION
10 * src/backend/utils/adt/int8.c
11 *
12 *-------------------------------------------------------------------------
13 */
14#include "postgres.h"
15
16#include <ctype.h>
17#include <limits.h>
18#include <math.h>
19
20#include "common/int.h"
21#include "funcapi.h"
22#include "libpq/pqformat.h"
23#include "nodes/nodeFuncs.h"
24#include "nodes/supportnodes.h"
25#include "optimizer/optimizer.h"
26#include "utils/builtins.h"
27
28
29typedef struct
30{
35
36
37/***********************************************************************
38 **
39 ** Routines for 64-bit integers.
40 **
41 ***********************************************************************/
42
43/*----------------------------------------------------------
44 * Formatting and conversion routines.
45 *---------------------------------------------------------*/
46
47/* int8in()
48 */
51{
52 char *num = PG_GETARG_CSTRING(0);
53
54 PG_RETURN_INT64(pg_strtoint64_safe(num, fcinfo->context));
55}
56
57
58/* int8out()
59 */
62{
64 char buf[MAXINT8LEN + 1];
65 char *result;
66 int len;
67
68 len = pg_lltoa(val, buf) + 1;
69
70 /*
71 * Since the length is already known, we do a manual palloc() and memcpy()
72 * to avoid the strlen() call that would otherwise be done in pstrdup().
73 */
74 result = palloc(len);
75 memcpy(result, buf, len);
76 PG_RETURN_CSTRING(result);
77}
78
79/*
80 * int8recv - converts external binary format to int8
81 */
84{
86
88}
89
90/*
91 * int8send - converts int8 to binary format
92 */
95{
96 int64 arg1 = PG_GETARG_INT64(0);
98
100 pq_sendint64(&buf, arg1);
102}
103
104
105/*----------------------------------------------------------
106 * Relational operators for int8s, including cross-data-type comparisons.
107 *---------------------------------------------------------*/
108
109/* int8relop()
110 * Is val1 relop val2?
111 */
112Datum
114{
115 int64 val1 = PG_GETARG_INT64(0);
116 int64 val2 = PG_GETARG_INT64(1);
117
118 PG_RETURN_BOOL(val1 == val2);
119}
120
121Datum
123{
124 int64 val1 = PG_GETARG_INT64(0);
125 int64 val2 = PG_GETARG_INT64(1);
126
127 PG_RETURN_BOOL(val1 != val2);
128}
129
130Datum
132{
133 int64 val1 = PG_GETARG_INT64(0);
134 int64 val2 = PG_GETARG_INT64(1);
135
136 PG_RETURN_BOOL(val1 < val2);
137}
138
139Datum
141{
142 int64 val1 = PG_GETARG_INT64(0);
143 int64 val2 = PG_GETARG_INT64(1);
144
145 PG_RETURN_BOOL(val1 > val2);
146}
147
148Datum
150{
151 int64 val1 = PG_GETARG_INT64(0);
152 int64 val2 = PG_GETARG_INT64(1);
153
154 PG_RETURN_BOOL(val1 <= val2);
155}
156
157Datum
159{
160 int64 val1 = PG_GETARG_INT64(0);
161 int64 val2 = PG_GETARG_INT64(1);
162
163 PG_RETURN_BOOL(val1 >= val2);
164}
165
166/* int84relop()
167 * Is 64-bit val1 relop 32-bit val2?
168 */
169Datum
171{
172 int64 val1 = PG_GETARG_INT64(0);
173 int32 val2 = PG_GETARG_INT32(1);
174
175 PG_RETURN_BOOL(val1 == val2);
176}
177
178Datum
180{
181 int64 val1 = PG_GETARG_INT64(0);
182 int32 val2 = PG_GETARG_INT32(1);
183
184 PG_RETURN_BOOL(val1 != val2);
185}
186
187Datum
189{
190 int64 val1 = PG_GETARG_INT64(0);
191 int32 val2 = PG_GETARG_INT32(1);
192
193 PG_RETURN_BOOL(val1 < val2);
194}
195
196Datum
198{
199 int64 val1 = PG_GETARG_INT64(0);
200 int32 val2 = PG_GETARG_INT32(1);
201
202 PG_RETURN_BOOL(val1 > val2);
203}
204
205Datum
207{
208 int64 val1 = PG_GETARG_INT64(0);
209 int32 val2 = PG_GETARG_INT32(1);
210
211 PG_RETURN_BOOL(val1 <= val2);
212}
213
214Datum
216{
217 int64 val1 = PG_GETARG_INT64(0);
218 int32 val2 = PG_GETARG_INT32(1);
219
220 PG_RETURN_BOOL(val1 >= val2);
221}
222
223/* int48relop()
224 * Is 32-bit val1 relop 64-bit val2?
225 */
226Datum
228{
229 int32 val1 = PG_GETARG_INT32(0);
230 int64 val2 = PG_GETARG_INT64(1);
231
232 PG_RETURN_BOOL(val1 == val2);
233}
234
235Datum
237{
238 int32 val1 = PG_GETARG_INT32(0);
239 int64 val2 = PG_GETARG_INT64(1);
240
241 PG_RETURN_BOOL(val1 != val2);
242}
243
244Datum
246{
247 int32 val1 = PG_GETARG_INT32(0);
248 int64 val2 = PG_GETARG_INT64(1);
249
250 PG_RETURN_BOOL(val1 < val2);
251}
252
253Datum
255{
256 int32 val1 = PG_GETARG_INT32(0);
257 int64 val2 = PG_GETARG_INT64(1);
258
259 PG_RETURN_BOOL(val1 > val2);
260}
261
262Datum
264{
265 int32 val1 = PG_GETARG_INT32(0);
266 int64 val2 = PG_GETARG_INT64(1);
267
268 PG_RETURN_BOOL(val1 <= val2);
269}
270
271Datum
273{
274 int32 val1 = PG_GETARG_INT32(0);
275 int64 val2 = PG_GETARG_INT64(1);
276
277 PG_RETURN_BOOL(val1 >= val2);
278}
279
280/* int82relop()
281 * Is 64-bit val1 relop 16-bit val2?
282 */
283Datum
285{
286 int64 val1 = PG_GETARG_INT64(0);
287 int16 val2 = PG_GETARG_INT16(1);
288
289 PG_RETURN_BOOL(val1 == val2);
290}
291
292Datum
294{
295 int64 val1 = PG_GETARG_INT64(0);
296 int16 val2 = PG_GETARG_INT16(1);
297
298 PG_RETURN_BOOL(val1 != val2);
299}
300
301Datum
303{
304 int64 val1 = PG_GETARG_INT64(0);
305 int16 val2 = PG_GETARG_INT16(1);
306
307 PG_RETURN_BOOL(val1 < val2);
308}
309
310Datum
312{
313 int64 val1 = PG_GETARG_INT64(0);
314 int16 val2 = PG_GETARG_INT16(1);
315
316 PG_RETURN_BOOL(val1 > val2);
317}
318
319Datum
321{
322 int64 val1 = PG_GETARG_INT64(0);
323 int16 val2 = PG_GETARG_INT16(1);
324
325 PG_RETURN_BOOL(val1 <= val2);
326}
327
328Datum
330{
331 int64 val1 = PG_GETARG_INT64(0);
332 int16 val2 = PG_GETARG_INT16(1);
333
334 PG_RETURN_BOOL(val1 >= val2);
335}
336
337/* int28relop()
338 * Is 16-bit val1 relop 64-bit val2?
339 */
340Datum
342{
343 int16 val1 = PG_GETARG_INT16(0);
344 int64 val2 = PG_GETARG_INT64(1);
345
346 PG_RETURN_BOOL(val1 == val2);
347}
348
349Datum
351{
352 int16 val1 = PG_GETARG_INT16(0);
353 int64 val2 = PG_GETARG_INT64(1);
354
355 PG_RETURN_BOOL(val1 != val2);
356}
357
358Datum
360{
361 int16 val1 = PG_GETARG_INT16(0);
362 int64 val2 = PG_GETARG_INT64(1);
363
364 PG_RETURN_BOOL(val1 < val2);
365}
366
367Datum
369{
370 int16 val1 = PG_GETARG_INT16(0);
371 int64 val2 = PG_GETARG_INT64(1);
372
373 PG_RETURN_BOOL(val1 > val2);
374}
375
376Datum
378{
379 int16 val1 = PG_GETARG_INT16(0);
380 int64 val2 = PG_GETARG_INT64(1);
381
382 PG_RETURN_BOOL(val1 <= val2);
383}
384
385Datum
387{
388 int16 val1 = PG_GETARG_INT16(0);
389 int64 val2 = PG_GETARG_INT64(1);
390
391 PG_RETURN_BOOL(val1 >= val2);
392}
393
394/*
395 * in_range support function for int8.
396 *
397 * Note: we needn't supply int8_int4 or int8_int2 variants, as implicit
398 * coercion of the offset value takes care of those scenarios just as well.
399 */
400Datum
402{
404 int64 base = PG_GETARG_INT64(1);
405 int64 offset = PG_GETARG_INT64(2);
406 bool sub = PG_GETARG_BOOL(3);
407 bool less = PG_GETARG_BOOL(4);
408 int64 sum;
409
410 if (offset < 0)
412 (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
413 errmsg("invalid preceding or following size in window function")));
414
415 if (sub)
416 offset = -offset; /* cannot overflow */
417
418 if (unlikely(pg_add_s64_overflow(base, offset, &sum)))
419 {
420 /*
421 * If sub is false, the true sum is surely more than val, so correct
422 * answer is the same as "less". If sub is true, the true sum is
423 * surely less than val, so the answer is "!less".
424 */
425 PG_RETURN_BOOL(sub ? !less : less);
426 }
427
428 if (less)
429 PG_RETURN_BOOL(val <= sum);
430 else
431 PG_RETURN_BOOL(val >= sum);
432}
433
434
435/*----------------------------------------------------------
436 * Arithmetic operators on 64-bit integers.
437 *---------------------------------------------------------*/
438
439Datum
441{
443 int64 result;
444
445 if (unlikely(arg == PG_INT64_MIN))
447 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
448 errmsg("bigint out of range")));
449 result = -arg;
450 PG_RETURN_INT64(result);
451}
452
453Datum
455{
457
459}
460
461Datum
463{
464 int64 arg1 = PG_GETARG_INT64(0);
465 int64 arg2 = PG_GETARG_INT64(1);
466 int64 result;
467
468 if (unlikely(pg_add_s64_overflow(arg1, arg2, &result)))
470 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
471 errmsg("bigint out of range")));
472 PG_RETURN_INT64(result);
473}
474
475Datum
477{
478 int64 arg1 = PG_GETARG_INT64(0);
479 int64 arg2 = PG_GETARG_INT64(1);
480 int64 result;
481
482 if (unlikely(pg_sub_s64_overflow(arg1, arg2, &result)))
484 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
485 errmsg("bigint out of range")));
486 PG_RETURN_INT64(result);
487}
488
489Datum
491{
492 int64 arg1 = PG_GETARG_INT64(0);
493 int64 arg2 = PG_GETARG_INT64(1);
494 int64 result;
495
496 if (unlikely(pg_mul_s64_overflow(arg1, arg2, &result)))
498 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
499 errmsg("bigint out of range")));
500 PG_RETURN_INT64(result);
501}
502
503Datum
505{
506 int64 arg1 = PG_GETARG_INT64(0);
507 int64 arg2 = PG_GETARG_INT64(1);
508 int64 result;
509
510 if (arg2 == 0)
511 {
513 (errcode(ERRCODE_DIVISION_BY_ZERO),
514 errmsg("division by zero")));
515 /* ensure compiler realizes we mustn't reach the division (gcc bug) */
517 }
518
519 /*
520 * INT64_MIN / -1 is problematic, since the result can't be represented on
521 * a two's-complement machine. Some machines produce INT64_MIN, some
522 * produce zero, some throw an exception. We can dodge the problem by
523 * recognizing that division by -1 is the same as negation.
524 */
525 if (arg2 == -1)
526 {
527 if (unlikely(arg1 == PG_INT64_MIN))
529 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
530 errmsg("bigint out of range")));
531 result = -arg1;
532 PG_RETURN_INT64(result);
533 }
534
535 /* No overflow is possible */
536
537 result = arg1 / arg2;
538
539 PG_RETURN_INT64(result);
540}
541
542/* int8abs()
543 * Absolute value
544 */
545Datum
547{
548 int64 arg1 = PG_GETARG_INT64(0);
549 int64 result;
550
551 if (unlikely(arg1 == PG_INT64_MIN))
553 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
554 errmsg("bigint out of range")));
555 result = (arg1 < 0) ? -arg1 : arg1;
556 PG_RETURN_INT64(result);
557}
558
559/* int8mod()
560 * Modulo operation.
561 */
562Datum
564{
565 int64 arg1 = PG_GETARG_INT64(0);
566 int64 arg2 = PG_GETARG_INT64(1);
567
568 if (unlikely(arg2 == 0))
569 {
571 (errcode(ERRCODE_DIVISION_BY_ZERO),
572 errmsg("division by zero")));
573 /* ensure compiler realizes we mustn't reach the division (gcc bug) */
575 }
576
577 /*
578 * Some machines throw a floating-point exception for INT64_MIN % -1,
579 * which is a bit silly since the correct answer is perfectly
580 * well-defined, namely zero.
581 */
582 if (arg2 == -1)
584
585 /* No overflow is possible */
586
587 PG_RETURN_INT64(arg1 % arg2);
588}
589
590/*
591 * Greatest Common Divisor
592 *
593 * Returns the largest positive integer that exactly divides both inputs.
594 * Special cases:
595 * - gcd(x, 0) = gcd(0, x) = abs(x)
596 * because 0 is divisible by anything
597 * - gcd(0, 0) = 0
598 * complies with the previous definition and is a common convention
599 *
600 * Special care must be taken if either input is INT64_MIN ---
601 * gcd(0, INT64_MIN), gcd(INT64_MIN, 0) and gcd(INT64_MIN, INT64_MIN) are
602 * all equal to abs(INT64_MIN), which cannot be represented as a 64-bit signed
603 * integer.
604 */
605static int64
607{
608 int64 swap;
609 int64 a1,
610 a2;
611
612 /*
613 * Put the greater absolute value in arg1.
614 *
615 * This would happen automatically in the loop below, but avoids an
616 * expensive modulo operation, and simplifies the special-case handling
617 * for INT64_MIN below.
618 *
619 * We do this in negative space in order to handle INT64_MIN.
620 */
621 a1 = (arg1 < 0) ? arg1 : -arg1;
622 a2 = (arg2 < 0) ? arg2 : -arg2;
623 if (a1 > a2)
624 {
625 swap = arg1;
626 arg1 = arg2;
627 arg2 = swap;
628 }
629
630 /* Special care needs to be taken with INT64_MIN. See comments above. */
631 if (arg1 == PG_INT64_MIN)
632 {
633 if (arg2 == 0 || arg2 == PG_INT64_MIN)
635 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
636 errmsg("bigint out of range")));
637
638 /*
639 * Some machines throw a floating-point exception for INT64_MIN % -1,
640 * which is a bit silly since the correct answer is perfectly
641 * well-defined, namely zero. Guard against this and just return the
642 * result, gcd(INT64_MIN, -1) = 1.
643 */
644 if (arg2 == -1)
645 return 1;
646 }
647
648 /* Use the Euclidean algorithm to find the GCD */
649 while (arg2 != 0)
650 {
651 swap = arg2;
652 arg2 = arg1 % arg2;
653 arg1 = swap;
654 }
655
656 /*
657 * Make sure the result is positive. (We know we don't have INT64_MIN
658 * anymore).
659 */
660 if (arg1 < 0)
661 arg1 = -arg1;
662
663 return arg1;
664}
665
666Datum
668{
669 int64 arg1 = PG_GETARG_INT64(0);
670 int64 arg2 = PG_GETARG_INT64(1);
671 int64 result;
672
673 result = int8gcd_internal(arg1, arg2);
674
675 PG_RETURN_INT64(result);
676}
677
678/*
679 * Least Common Multiple
680 */
681Datum
683{
684 int64 arg1 = PG_GETARG_INT64(0);
685 int64 arg2 = PG_GETARG_INT64(1);
686 int64 gcd;
687 int64 result;
688
689 /*
690 * Handle lcm(x, 0) = lcm(0, x) = 0 as a special case. This prevents a
691 * division-by-zero error below when x is zero, and an overflow error from
692 * the GCD computation when x = INT64_MIN.
693 */
694 if (arg1 == 0 || arg2 == 0)
696
697 /* lcm(x, y) = abs(x / gcd(x, y) * y) */
698 gcd = int8gcd_internal(arg1, arg2);
699 arg1 = arg1 / gcd;
700
701 if (unlikely(pg_mul_s64_overflow(arg1, arg2, &result)))
703 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
704 errmsg("bigint out of range")));
705
706 /* If the result is INT64_MIN, it cannot be represented. */
707 if (unlikely(result == PG_INT64_MIN))
709 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
710 errmsg("bigint out of range")));
711
712 if (result < 0)
713 result = -result;
714
715 PG_RETURN_INT64(result);
716}
717
718Datum
720{
722 int64 result;
723
724 if (unlikely(pg_add_s64_overflow(arg, 1, &result)))
726 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
727 errmsg("bigint out of range")));
728
729 PG_RETURN_INT64(result);
730}
731
732Datum
734{
736 int64 result;
737
738 if (unlikely(pg_sub_s64_overflow(arg, 1, &result)))
740 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
741 errmsg("bigint out of range")));
742
743 PG_RETURN_INT64(result);
744}
745
746
747/*
748 * These functions are exactly like int8inc/int8dec but are used for
749 * aggregates that count only non-null values. Since the functions are
750 * declared strict, the null checks happen before we ever get here, and all we
751 * need do is increment the state value. We could actually make these pg_proc
752 * entries point right at int8inc/int8dec, but then the opr_sanity regression
753 * test would complain about mismatched entries for a built-in function.
754 */
755
756Datum
758{
759 return int8inc(fcinfo);
760}
761
762Datum
764{
765 return int8inc(fcinfo);
766}
767
768Datum
770{
771 return int8dec(fcinfo);
772}
773
774/*
775 * int8inc_support
776 * prosupport function for int8inc() and int8inc_any()
777 */
778Datum
780{
781 Node *rawreq = (Node *) PG_GETARG_POINTER(0);
782
784 {
787 int frameOptions = req->window_clause->frameOptions;
788
789 /* No ORDER BY clause then all rows are peers */
790 if (req->window_clause->orderClause == NIL)
791 monotonic = MONOTONICFUNC_BOTH;
792 else
793 {
794 /*
795 * Otherwise take into account the frame options. When the frame
796 * bound is the start of the window then the resulting value can
797 * never decrease, therefore is monotonically increasing
798 */
799 if (frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING)
800 monotonic |= MONOTONICFUNC_INCREASING;
801
802 /*
803 * Likewise, if the frame bound is the end of the window then the
804 * resulting value can never decrease.
805 */
806 if (frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING)
807 monotonic |= MONOTONICFUNC_DECREASING;
808 }
809
810 req->monotonic = monotonic;
812 }
813
814 PG_RETURN_POINTER(NULL);
815}
816
817
818Datum
820{
821 int64 arg1 = PG_GETARG_INT64(0);
822 int64 arg2 = PG_GETARG_INT64(1);
823 int64 result;
824
825 result = ((arg1 > arg2) ? arg1 : arg2);
826
827 PG_RETURN_INT64(result);
828}
829
830Datum
832{
833 int64 arg1 = PG_GETARG_INT64(0);
834 int64 arg2 = PG_GETARG_INT64(1);
835 int64 result;
836
837 result = ((arg1 < arg2) ? arg1 : arg2);
838
839 PG_RETURN_INT64(result);
840}
841
842Datum
844{
845 int64 arg1 = PG_GETARG_INT64(0);
846 int32 arg2 = PG_GETARG_INT32(1);
847 int64 result;
848
849 if (unlikely(pg_add_s64_overflow(arg1, (int64) arg2, &result)))
851 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
852 errmsg("bigint out of range")));
853 PG_RETURN_INT64(result);
854}
855
856Datum
858{
859 int64 arg1 = PG_GETARG_INT64(0);
860 int32 arg2 = PG_GETARG_INT32(1);
861 int64 result;
862
863 if (unlikely(pg_sub_s64_overflow(arg1, (int64) arg2, &result)))
865 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
866 errmsg("bigint out of range")));
867 PG_RETURN_INT64(result);
868}
869
870Datum
872{
873 int64 arg1 = PG_GETARG_INT64(0);
874 int32 arg2 = PG_GETARG_INT32(1);
875 int64 result;
876
877 if (unlikely(pg_mul_s64_overflow(arg1, (int64) arg2, &result)))
879 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
880 errmsg("bigint out of range")));
881 PG_RETURN_INT64(result);
882}
883
884Datum
886{
887 int64 arg1 = PG_GETARG_INT64(0);
888 int32 arg2 = PG_GETARG_INT32(1);
889 int64 result;
890
891 if (arg2 == 0)
892 {
894 (errcode(ERRCODE_DIVISION_BY_ZERO),
895 errmsg("division by zero")));
896 /* ensure compiler realizes we mustn't reach the division (gcc bug) */
898 }
899
900 /*
901 * INT64_MIN / -1 is problematic, since the result can't be represented on
902 * a two's-complement machine. Some machines produce INT64_MIN, some
903 * produce zero, some throw an exception. We can dodge the problem by
904 * recognizing that division by -1 is the same as negation.
905 */
906 if (arg2 == -1)
907 {
908 if (unlikely(arg1 == PG_INT64_MIN))
910 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
911 errmsg("bigint out of range")));
912 result = -arg1;
913 PG_RETURN_INT64(result);
914 }
915
916 /* No overflow is possible */
917
918 result = arg1 / arg2;
919
920 PG_RETURN_INT64(result);
921}
922
923Datum
925{
926 int32 arg1 = PG_GETARG_INT32(0);
927 int64 arg2 = PG_GETARG_INT64(1);
928 int64 result;
929
930 if (unlikely(pg_add_s64_overflow((int64) arg1, arg2, &result)))
932 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
933 errmsg("bigint out of range")));
934 PG_RETURN_INT64(result);
935}
936
937Datum
939{
940 int32 arg1 = PG_GETARG_INT32(0);
941 int64 arg2 = PG_GETARG_INT64(1);
942 int64 result;
943
944 if (unlikely(pg_sub_s64_overflow((int64) arg1, arg2, &result)))
946 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
947 errmsg("bigint out of range")));
948 PG_RETURN_INT64(result);
949}
950
951Datum
953{
954 int32 arg1 = PG_GETARG_INT32(0);
955 int64 arg2 = PG_GETARG_INT64(1);
956 int64 result;
957
958 if (unlikely(pg_mul_s64_overflow((int64) arg1, arg2, &result)))
960 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
961 errmsg("bigint out of range")));
962 PG_RETURN_INT64(result);
963}
964
965Datum
967{
968 int32 arg1 = PG_GETARG_INT32(0);
969 int64 arg2 = PG_GETARG_INT64(1);
970
971 if (unlikely(arg2 == 0))
972 {
974 (errcode(ERRCODE_DIVISION_BY_ZERO),
975 errmsg("division by zero")));
976 /* ensure compiler realizes we mustn't reach the division (gcc bug) */
978 }
979
980 /* No overflow is possible */
981 PG_RETURN_INT64((int64) arg1 / arg2);
982}
983
984Datum
986{
987 int64 arg1 = PG_GETARG_INT64(0);
988 int16 arg2 = PG_GETARG_INT16(1);
989 int64 result;
990
991 if (unlikely(pg_add_s64_overflow(arg1, (int64) arg2, &result)))
993 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
994 errmsg("bigint out of range")));
995 PG_RETURN_INT64(result);
996}
997
998Datum
1000{
1001 int64 arg1 = PG_GETARG_INT64(0);
1002 int16 arg2 = PG_GETARG_INT16(1);
1003 int64 result;
1004
1005 if (unlikely(pg_sub_s64_overflow(arg1, (int64) arg2, &result)))
1006 ereport(ERROR,
1007 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1008 errmsg("bigint out of range")));
1009 PG_RETURN_INT64(result);
1010}
1011
1012Datum
1014{
1015 int64 arg1 = PG_GETARG_INT64(0);
1016 int16 arg2 = PG_GETARG_INT16(1);
1017 int64 result;
1018
1019 if (unlikely(pg_mul_s64_overflow(arg1, (int64) arg2, &result)))
1020 ereport(ERROR,
1021 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1022 errmsg("bigint out of range")));
1023 PG_RETURN_INT64(result);
1024}
1025
1026Datum
1028{
1029 int64 arg1 = PG_GETARG_INT64(0);
1030 int16 arg2 = PG_GETARG_INT16(1);
1031 int64 result;
1032
1033 if (unlikely(arg2 == 0))
1034 {
1035 ereport(ERROR,
1036 (errcode(ERRCODE_DIVISION_BY_ZERO),
1037 errmsg("division by zero")));
1038 /* ensure compiler realizes we mustn't reach the division (gcc bug) */
1040 }
1041
1042 /*
1043 * INT64_MIN / -1 is problematic, since the result can't be represented on
1044 * a two's-complement machine. Some machines produce INT64_MIN, some
1045 * produce zero, some throw an exception. We can dodge the problem by
1046 * recognizing that division by -1 is the same as negation.
1047 */
1048 if (arg2 == -1)
1049 {
1050 if (unlikely(arg1 == PG_INT64_MIN))
1051 ereport(ERROR,
1052 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1053 errmsg("bigint out of range")));
1054 result = -arg1;
1055 PG_RETURN_INT64(result);
1056 }
1057
1058 /* No overflow is possible */
1059
1060 result = arg1 / arg2;
1061
1062 PG_RETURN_INT64(result);
1063}
1064
1065Datum
1067{
1068 int16 arg1 = PG_GETARG_INT16(0);
1069 int64 arg2 = PG_GETARG_INT64(1);
1070 int64 result;
1071
1072 if (unlikely(pg_add_s64_overflow((int64) arg1, arg2, &result)))
1073 ereport(ERROR,
1074 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1075 errmsg("bigint out of range")));
1076 PG_RETURN_INT64(result);
1077}
1078
1079Datum
1081{
1082 int16 arg1 = PG_GETARG_INT16(0);
1083 int64 arg2 = PG_GETARG_INT64(1);
1084 int64 result;
1085
1086 if (unlikely(pg_sub_s64_overflow((int64) arg1, arg2, &result)))
1087 ereport(ERROR,
1088 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1089 errmsg("bigint out of range")));
1090 PG_RETURN_INT64(result);
1091}
1092
1093Datum
1095{
1096 int16 arg1 = PG_GETARG_INT16(0);
1097 int64 arg2 = PG_GETARG_INT64(1);
1098 int64 result;
1099
1100 if (unlikely(pg_mul_s64_overflow((int64) arg1, arg2, &result)))
1101 ereport(ERROR,
1102 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1103 errmsg("bigint out of range")));
1104 PG_RETURN_INT64(result);
1105}
1106
1107Datum
1109{
1110 int16 arg1 = PG_GETARG_INT16(0);
1111 int64 arg2 = PG_GETARG_INT64(1);
1112
1113 if (unlikely(arg2 == 0))
1114 {
1115 ereport(ERROR,
1116 (errcode(ERRCODE_DIVISION_BY_ZERO),
1117 errmsg("division by zero")));
1118 /* ensure compiler realizes we mustn't reach the division (gcc bug) */
1120 }
1121
1122 /* No overflow is possible */
1123 PG_RETURN_INT64((int64) arg1 / arg2);
1124}
1125
1126/* Binary arithmetics
1127 *
1128 * int8and - returns arg1 & arg2
1129 * int8or - returns arg1 | arg2
1130 * int8xor - returns arg1 # arg2
1131 * int8not - returns ~arg1
1132 * int8shl - returns arg1 << arg2
1133 * int8shr - returns arg1 >> arg2
1134 */
1135
1136Datum
1138{
1139 int64 arg1 = PG_GETARG_INT64(0);
1140 int64 arg2 = PG_GETARG_INT64(1);
1141
1142 PG_RETURN_INT64(arg1 & arg2);
1143}
1144
1145Datum
1147{
1148 int64 arg1 = PG_GETARG_INT64(0);
1149 int64 arg2 = PG_GETARG_INT64(1);
1150
1151 PG_RETURN_INT64(arg1 | arg2);
1152}
1153
1154Datum
1156{
1157 int64 arg1 = PG_GETARG_INT64(0);
1158 int64 arg2 = PG_GETARG_INT64(1);
1159
1160 PG_RETURN_INT64(arg1 ^ arg2);
1161}
1162
1163Datum
1165{
1166 int64 arg1 = PG_GETARG_INT64(0);
1167
1168 PG_RETURN_INT64(~arg1);
1169}
1170
1171Datum
1173{
1174 int64 arg1 = PG_GETARG_INT64(0);
1175 int32 arg2 = PG_GETARG_INT32(1);
1176
1177 PG_RETURN_INT64(arg1 << arg2);
1178}
1179
1180Datum
1182{
1183 int64 arg1 = PG_GETARG_INT64(0);
1184 int32 arg2 = PG_GETARG_INT32(1);
1185
1186 PG_RETURN_INT64(arg1 >> arg2);
1187}
1188
1189/*----------------------------------------------------------
1190 * Conversion operators.
1191 *---------------------------------------------------------*/
1192
1193Datum
1195{
1197
1199}
1200
1201Datum
1203{
1205
1207 ereport(ERROR,
1208 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1209 errmsg("integer out of range")));
1210
1212}
1213
1214Datum
1216{
1218
1220}
1221
1222Datum
1224{
1226
1228 ereport(ERROR,
1229 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1230 errmsg("smallint out of range")));
1231
1233}
1234
1235Datum
1237{
1239 float8 result;
1240
1241 result = arg;
1242
1243 PG_RETURN_FLOAT8(result);
1244}
1245
1246/* dtoi8()
1247 * Convert float8 to 8-byte integer.
1248 */
1249Datum
1251{
1252 float8 num = PG_GETARG_FLOAT8(0);
1253
1254 /*
1255 * Get rid of any fractional part in the input. This is so we don't fail
1256 * on just-out-of-range values that would round into range. Note
1257 * assumption that rint() will pass through a NaN or Inf unchanged.
1258 */
1259 num = rint(num);
1260
1261 /* Range check */
1262 if (unlikely(isnan(num) || !FLOAT8_FITS_IN_INT64(num)))
1263 ereport(ERROR,
1264 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1265 errmsg("bigint out of range")));
1266
1267 PG_RETURN_INT64((int64) num);
1268}
1269
1270Datum
1272{
1274 float4 result;
1275
1276 result = arg;
1277
1278 PG_RETURN_FLOAT4(result);
1279}
1280
1281/* ftoi8()
1282 * Convert float4 to 8-byte integer.
1283 */
1284Datum
1286{
1287 float4 num = PG_GETARG_FLOAT4(0);
1288
1289 /*
1290 * Get rid of any fractional part in the input. This is so we don't fail
1291 * on just-out-of-range values that would round into range. Note
1292 * assumption that rint() will pass through a NaN or Inf unchanged.
1293 */
1294 num = rint(num);
1295
1296 /* Range check */
1297 if (unlikely(isnan(num) || !FLOAT4_FITS_IN_INT64(num)))
1298 ereport(ERROR,
1299 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1300 errmsg("bigint out of range")));
1301
1302 PG_RETURN_INT64((int64) num);
1303}
1304
1305Datum
1307{
1309
1310 if (unlikely(arg < 0) || unlikely(arg > PG_UINT32_MAX))
1311 ereport(ERROR,
1312 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
1313 errmsg("OID out of range")));
1314
1316}
1317
1318Datum
1320{
1321 Oid arg = PG_GETARG_OID(0);
1322
1324}
1325
1326/*
1327 * non-persistent numeric series generator
1328 */
1329Datum
1331{
1332 return generate_series_step_int8(fcinfo);
1333}
1334
1335Datum
1337{
1338 FuncCallContext *funcctx;
1340 int64 result;
1341 MemoryContext oldcontext;
1342
1343 /* stuff done only on the first call of the function */
1344 if (SRF_IS_FIRSTCALL())
1345 {
1347 int64 finish = PG_GETARG_INT64(1);
1348 int64 step = 1;
1349
1350 /* see if we were given an explicit step size */
1351 if (PG_NARGS() == 3)
1352 step = PG_GETARG_INT64(2);
1353 if (step == 0)
1354 ereport(ERROR,
1355 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1356 errmsg("step size cannot equal zero")));
1357
1358 /* create a function context for cross-call persistence */
1359 funcctx = SRF_FIRSTCALL_INIT();
1360
1361 /*
1362 * switch to memory context appropriate for multiple function calls
1363 */
1364 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
1365
1366 /* allocate memory for user context */
1368
1369 /*
1370 * Use fctx to keep state from call to call. Seed current with the
1371 * original start value
1372 */
1373 fctx->current = start;
1374 fctx->finish = finish;
1375 fctx->step = step;
1376
1377 funcctx->user_fctx = fctx;
1378 MemoryContextSwitchTo(oldcontext);
1379 }
1380
1381 /* stuff done on every call of the function */
1382 funcctx = SRF_PERCALL_SETUP();
1383
1384 /*
1385 * get the saved state and use current as the result for this iteration
1386 */
1387 fctx = funcctx->user_fctx;
1388 result = fctx->current;
1389
1390 if ((fctx->step > 0 && fctx->current <= fctx->finish) ||
1391 (fctx->step < 0 && fctx->current >= fctx->finish))
1392 {
1393 /*
1394 * Increment current in preparation for next iteration. If next-value
1395 * computation overflows, this is the final result.
1396 */
1397 if (pg_add_s64_overflow(fctx->current, fctx->step, &fctx->current))
1398 fctx->step = 0;
1399
1400 /* do when there is more left to send */
1401 SRF_RETURN_NEXT(funcctx, Int64GetDatum(result));
1402 }
1403 else
1404 /* do when there is no more left */
1405 SRF_RETURN_DONE(funcctx);
1406}
1407
1408/*
1409 * Planner support function for generate_series(int8, int8 [, int8])
1410 */
1411Datum
1413{
1414 Node *rawreq = (Node *) PG_GETARG_POINTER(0);
1415 Node *ret = NULL;
1416
1417 if (IsA(rawreq, SupportRequestRows))
1418 {
1419 /* Try to estimate the number of rows returned */
1420 SupportRequestRows *req = (SupportRequestRows *) rawreq;
1421
1422 if (is_funcclause(req->node)) /* be paranoid */
1423 {
1424 List *args = ((FuncExpr *) req->node)->args;
1425 Node *arg1,
1426 *arg2,
1427 *arg3;
1428
1429 /* We can use estimated argument values here */
1432 if (list_length(args) >= 3)
1434 else
1435 arg3 = NULL;
1436
1437 /*
1438 * If any argument is constant NULL, we can safely assume that
1439 * zero rows are returned. Otherwise, if they're all non-NULL
1440 * constants, we can calculate the number of rows that will be
1441 * returned. Use double arithmetic to avoid overflow hazards.
1442 */
1443 if ((IsA(arg1, Const) &&
1444 ((Const *) arg1)->constisnull) ||
1445 (IsA(arg2, Const) &&
1446 ((Const *) arg2)->constisnull) ||
1447 (arg3 != NULL && IsA(arg3, Const) &&
1448 ((Const *) arg3)->constisnull))
1449 {
1450 req->rows = 0;
1451 ret = (Node *) req;
1452 }
1453 else if (IsA(arg1, Const) &&
1454 IsA(arg2, Const) &&
1455 (arg3 == NULL || IsA(arg3, Const)))
1456 {
1457 double start,
1458 finish,
1459 step;
1460
1461 start = DatumGetInt64(((Const *) arg1)->constvalue);
1462 finish = DatumGetInt64(((Const *) arg2)->constvalue);
1463 step = arg3 ? DatumGetInt64(((Const *) arg3)->constvalue) : 1;
1464
1465 /* This equation works for either sign of step */
1466 if (step != 0)
1467 {
1468 req->rows = floor((finish - start + step) / step);
1469 ret = (Node *) req;
1470 }
1471 }
1472 }
1473 }
1474
1475 PG_RETURN_POINTER(ret);
1476}
#define MAXINT8LEN
Definition: builtins.h:22
#define PG_INT32_MAX
Definition: c.h:594
#define PG_UINT32_MAX
Definition: c.h:595
#define FLOAT4_FITS_IN_INT64(num)
Definition: c.h:1085
int64_t int64
Definition: c.h:535
double float8
Definition: c.h:635
int16_t int16
Definition: c.h:533
#define FLOAT8_FITS_IN_INT64(num)
Definition: c.h:1091
#define PG_INT16_MIN
Definition: c.h:590
int32_t int32
Definition: c.h:534
#define PG_INT64_MIN
Definition: c.h:596
#define unlikely(x)
Definition: c.h:402
float float4
Definition: c.h:634
#define PG_INT32_MIN
Definition: c.h:593
#define PG_INT16_MAX
Definition: c.h:591
Node * estimate_expression_value(PlannerInfo *root, Node *node)
Definition: clauses.c:2403
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:150
#define PG_GETARG_OID(n)
Definition: fmgr.h:275
#define PG_RETURN_BYTEA_P(x)
Definition: fmgr.h:371
#define PG_GETARG_FLOAT8(n)
Definition: fmgr.h:282
#define PG_RETURN_FLOAT8(x)
Definition: fmgr.h:367
#define PG_GETARG_POINTER(n)
Definition: fmgr.h:276
#define PG_RETURN_CSTRING(x)
Definition: fmgr.h:362
#define PG_RETURN_INT64(x)
Definition: fmgr.h:368
#define PG_NARGS()
Definition: fmgr.h:203
#define PG_GETARG_CSTRING(n)
Definition: fmgr.h:277
#define PG_RETURN_NULL()
Definition: fmgr.h:345
#define PG_GETARG_INT64(n)
Definition: fmgr.h:283
#define PG_RETURN_INT16(x)
Definition: fmgr.h:356
#define PG_RETURN_INT32(x)
Definition: fmgr.h:354
#define PG_GETARG_INT32(n)
Definition: fmgr.h:269
#define PG_GETARG_BOOL(n)
Definition: fmgr.h:274
#define PG_GETARG_FLOAT4(n)
Definition: fmgr.h:281
#define PG_RETURN_POINTER(x)
Definition: fmgr.h:361
#define PG_RETURN_FLOAT4(x)
Definition: fmgr.h:366
#define PG_RETURN_OID(x)
Definition: fmgr.h:360
#define PG_FUNCTION_ARGS
Definition: fmgr.h:193
#define PG_RETURN_BOOL(x)
Definition: fmgr.h:359
#define PG_GETARG_INT16(n)
Definition: fmgr.h:271
#define SRF_IS_FIRSTCALL()
Definition: funcapi.h:304
#define SRF_PERCALL_SETUP()
Definition: funcapi.h:308
#define SRF_RETURN_NEXT(_funcctx, _result)
Definition: funcapi.h:310
#define SRF_FIRSTCALL_INIT()
Definition: funcapi.h:306
#define SRF_RETURN_DONE(_funcctx)
Definition: funcapi.h:328
return str start
static const FormData_pg_attribute a1
Definition: heap.c:144
static const FormData_pg_attribute a2
Definition: heap.c:157
long val
Definition: informix.c:689
Datum int8lcm(PG_FUNCTION_ARGS)
Definition: int8.c:682
Datum int84div(PG_FUNCTION_ARGS)
Definition: int8.c:885
Datum int8ge(PG_FUNCTION_ARGS)
Definition: int8.c:158
Datum i8tooid(PG_FUNCTION_ARGS)
Definition: int8.c:1306
Datum int8dec_any(PG_FUNCTION_ARGS)
Definition: int8.c:769
Datum in_range_int8_int8(PG_FUNCTION_ARGS)
Definition: int8.c:401
Datum int8abs(PG_FUNCTION_ARGS)
Definition: int8.c:546
Datum int48ge(PG_FUNCTION_ARGS)
Definition: int8.c:272
Datum int82le(PG_FUNCTION_ARGS)
Definition: int8.c:320
Datum int28lt(PG_FUNCTION_ARGS)
Definition: int8.c:359
Datum int84pl(PG_FUNCTION_ARGS)
Definition: int8.c:843
Datum int48pl(PG_FUNCTION_ARGS)
Definition: int8.c:924
Datum int8out(PG_FUNCTION_ARGS)
Definition: int8.c:61
Datum int82mi(PG_FUNCTION_ARGS)
Definition: int8.c:999
Datum int84gt(PG_FUNCTION_ARGS)
Definition: int8.c:197
Datum int28ne(PG_FUNCTION_ARGS)
Definition: int8.c:350
Datum int8send(PG_FUNCTION_ARGS)
Definition: int8.c:94
Datum int8ne(PG_FUNCTION_ARGS)
Definition: int8.c:122
Datum int84(PG_FUNCTION_ARGS)
Definition: int8.c:1202
Datum int8mul(PG_FUNCTION_ARGS)
Definition: int8.c:490
Datum int84ge(PG_FUNCTION_ARGS)
Definition: int8.c:215
Datum int48lt(PG_FUNCTION_ARGS)
Definition: int8.c:245
Datum int8gcd(PG_FUNCTION_ARGS)
Definition: int8.c:667
Datum int8not(PG_FUNCTION_ARGS)
Definition: int8.c:1164
Datum int8le(PG_FUNCTION_ARGS)
Definition: int8.c:149
Datum int8lt(PG_FUNCTION_ARGS)
Definition: int8.c:131
Datum int48eq(PG_FUNCTION_ARGS)
Definition: int8.c:227
Datum generate_series_step_int8(PG_FUNCTION_ARGS)
Definition: int8.c:1336
Datum generate_series_int8(PG_FUNCTION_ARGS)
Definition: int8.c:1330
Datum int8eq(PG_FUNCTION_ARGS)
Definition: int8.c:113
Datum generate_series_int8_support(PG_FUNCTION_ARGS)
Definition: int8.c:1412
Datum int82div(PG_FUNCTION_ARGS)
Definition: int8.c:1027
Datum int48le(PG_FUNCTION_ARGS)
Definition: int8.c:263
Datum int28gt(PG_FUNCTION_ARGS)
Definition: int8.c:368
Datum i8tod(PG_FUNCTION_ARGS)
Definition: int8.c:1236
Datum int8inc_support(PG_FUNCTION_ARGS)
Definition: int8.c:779
Datum int8in(PG_FUNCTION_ARGS)
Definition: int8.c:50
Datum int8mod(PG_FUNCTION_ARGS)
Definition: int8.c:563
Datum oidtoi8(PG_FUNCTION_ARGS)
Definition: int8.c:1319
Datum int28pl(PG_FUNCTION_ARGS)
Definition: int8.c:1066
Datum int84eq(PG_FUNCTION_ARGS)
Definition: int8.c:170
Datum int28div(PG_FUNCTION_ARGS)
Definition: int8.c:1108
Datum int8pl(PG_FUNCTION_ARGS)
Definition: int8.c:462
Datum int8larger(PG_FUNCTION_ARGS)
Definition: int8.c:819
Datum int8xor(PG_FUNCTION_ARGS)
Definition: int8.c:1155
Datum int28(PG_FUNCTION_ARGS)
Definition: int8.c:1215
Datum int8gt(PG_FUNCTION_ARGS)
Definition: int8.c:140
Datum int8div(PG_FUNCTION_ARGS)
Definition: int8.c:504
Datum int48ne(PG_FUNCTION_ARGS)
Definition: int8.c:236
Datum int82pl(PG_FUNCTION_ARGS)
Definition: int8.c:985
Datum int48mul(PG_FUNCTION_ARGS)
Definition: int8.c:952
Datum int48mi(PG_FUNCTION_ARGS)
Definition: int8.c:938
Datum int8up(PG_FUNCTION_ARGS)
Definition: int8.c:454
Datum int8smaller(PG_FUNCTION_ARGS)
Definition: int8.c:831
Datum int28le(PG_FUNCTION_ARGS)
Definition: int8.c:377
static int64 int8gcd_internal(int64 arg1, int64 arg2)
Definition: int8.c:606
Datum int82lt(PG_FUNCTION_ARGS)
Definition: int8.c:302
Datum int82gt(PG_FUNCTION_ARGS)
Definition: int8.c:311
Datum int82mul(PG_FUNCTION_ARGS)
Definition: int8.c:1013
Datum dtoi8(PG_FUNCTION_ARGS)
Definition: int8.c:1250
Datum int82ge(PG_FUNCTION_ARGS)
Definition: int8.c:329
Datum int48div(PG_FUNCTION_ARGS)
Definition: int8.c:966
Datum int8inc_any(PG_FUNCTION_ARGS)
Definition: int8.c:757
Datum int48gt(PG_FUNCTION_ARGS)
Definition: int8.c:254
Datum int8or(PG_FUNCTION_ARGS)
Definition: int8.c:1146
Datum int48(PG_FUNCTION_ARGS)
Definition: int8.c:1194
Datum int8shr(PG_FUNCTION_ARGS)
Definition: int8.c:1181
Datum int8recv(PG_FUNCTION_ARGS)
Definition: int8.c:83
Datum int84le(PG_FUNCTION_ARGS)
Definition: int8.c:206
Datum int8dec(PG_FUNCTION_ARGS)
Definition: int8.c:733
Datum int84mi(PG_FUNCTION_ARGS)
Definition: int8.c:857
Datum int82ne(PG_FUNCTION_ARGS)
Definition: int8.c:293
Datum int82(PG_FUNCTION_ARGS)
Definition: int8.c:1223
Datum int8inc_float8_float8(PG_FUNCTION_ARGS)
Definition: int8.c:763
Datum int28ge(PG_FUNCTION_ARGS)
Definition: int8.c:386
Datum int8shl(PG_FUNCTION_ARGS)
Definition: int8.c:1172
Datum i8tof(PG_FUNCTION_ARGS)
Definition: int8.c:1271
Datum int82eq(PG_FUNCTION_ARGS)
Definition: int8.c:284
Datum int84ne(PG_FUNCTION_ARGS)
Definition: int8.c:179
Datum int8mi(PG_FUNCTION_ARGS)
Definition: int8.c:476
Datum ftoi8(PG_FUNCTION_ARGS)
Definition: int8.c:1285
Datum int8and(PG_FUNCTION_ARGS)
Definition: int8.c:1137
Datum int84mul(PG_FUNCTION_ARGS)
Definition: int8.c:871
Datum int8um(PG_FUNCTION_ARGS)
Definition: int8.c:440
Datum int28mi(PG_FUNCTION_ARGS)
Definition: int8.c:1080
Datum int84lt(PG_FUNCTION_ARGS)
Definition: int8.c:188
Datum int28eq(PG_FUNCTION_ARGS)
Definition: int8.c:341
Datum int28mul(PG_FUNCTION_ARGS)
Definition: int8.c:1094
Datum int8inc(PG_FUNCTION_ARGS)
Definition: int8.c:719
static bool pg_mul_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:293
static bool pg_sub_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:262
static bool pg_add_s64_overflow(int64 a, int64 b, int64 *result)
Definition: int.h:235
void * palloc(Size size)
Definition: mcxt.c:1365
static bool is_funcclause(const void *clause)
Definition: nodeFuncs.h:69
#define IsA(nodeptr, _type_)
Definition: nodes.h:164
int64 pg_strtoint64_safe(const char *s, Node *escontext)
Definition: numutils.c:650
int pg_lltoa(int64 value, char *a)
Definition: numutils.c:1227
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Definition: palloc.h:124
#define FRAMEOPTION_START_UNBOUNDED_PRECEDING
Definition: parsenodes.h:614
#define FRAMEOPTION_END_UNBOUNDED_FOLLOWING
Definition: parsenodes.h:617
void * arg
const void size_t len
static int list_length(const List *l)
Definition: pg_list.h:152
#define NIL
Definition: pg_list.h:68
#define lthird(l)
Definition: pg_list.h:188
#define linitial(l)
Definition: pg_list.h:178
#define lsecond(l)
Definition: pg_list.h:183
static char * buf
Definition: pg_test_fsync.c:72
MonotonicFunction
Definition: plannodes.h:1819
@ MONOTONICFUNC_NONE
Definition: plannodes.h:1820
@ MONOTONICFUNC_DECREASING
Definition: plannodes.h:1822
@ MONOTONICFUNC_INCREASING
Definition: plannodes.h:1821
@ MONOTONICFUNC_BOTH
Definition: plannodes.h:1823
static Datum Int64GetDatum(int64 X)
Definition: postgres.h:403
static int64 DatumGetInt64(Datum X)
Definition: postgres.h:393
uint64_t Datum
Definition: postgres.h:70
unsigned int Oid
Definition: postgres_ext.h:32
void pq_begintypsend(StringInfo buf)
Definition: pqformat.c:326
int64 pq_getmsgint64(StringInfo msg)
Definition: pqformat.c:453
bytea * pq_endtypsend(StringInfo buf)
Definition: pqformat.c:346
static void pq_sendint64(StringInfo buf, uint64 i)
Definition: pqformat.h:152
struct StringInfoData * StringInfo
Definition: string.h:15
void * user_fctx
Definition: funcapi.h:82
MemoryContext multi_call_memory_ctx
Definition: funcapi.h:101
Definition: pg_list.h:54
Definition: nodes.h:135
PlannerInfo * root
Definition: supportnodes.h:163
MonotonicFunction monotonic
Definition: supportnodes.h:299
List * orderClause
Definition: parsenodes.h:1576
int32 current
Definition: int.c:49
int32 finish
Definition: int.c:50
static uint32 gcd(uint32 a, uint32 b)