PostgreSQL Source Code git master
Loading...
Searching...
No Matches
varbit.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * varbit.c
4 * Functions for the SQL datatypes BIT() and BIT VARYING().
5 *
6 * The data structure contains the following elements:
7 * header -- length of the whole data structure (incl header)
8 * in bytes (as with all varying length datatypes)
9 * data section -- private data section for the bits data structures
10 * bitlength -- length of the bit string in bits
11 * bitdata -- bit string, most significant byte first
12 *
13 * The length of the bitdata vector should always be exactly as many
14 * bytes as are needed for the given bitlength. If the bitlength is
15 * not a multiple of 8, the extra low-order padding bits of the last
16 * byte must be zeroes.
17 *
18 * attypmod is defined as the length of the bit string in bits, or for
19 * varying bits the maximum length.
20 *
21 * Code originally contributed by Adriaan Joubert.
22 *
23 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
24 * Portions Copyright (c) 1994, Regents of the University of California
25 *
26 * IDENTIFICATION
27 * src/backend/utils/adt/varbit.c
28 *
29 *-------------------------------------------------------------------------
30 */
31
32#include "postgres.h"
33
34#include "access/htup_details.h"
35#include "common/int.h"
36#include "libpq/pqformat.h"
37#include "nodes/nodeFuncs.h"
38#include "nodes/supportnodes.h"
39#include "port/pg_bitutils.h"
40#include "utils/array.h"
41#include "utils/fmgrprotos.h"
42#include "utils/varbit.h"
43
44#define HEXDIG(z) ((z)<10 ? ((z)+'0') : ((z)-10+'A'))
45
46/* Mask off any bits that should be zero in the last byte of a bitstring */
47#define VARBIT_PAD(vb) \
48 do { \
49 int32 pad_ = VARBITPAD(vb); \
50 Assert(pad_ >= 0 && pad_ < BITS_PER_BYTE); \
51 if (pad_ > 0) \
52 *(VARBITS(vb) + VARBITBYTES(vb) - 1) &= BITMASK << pad_; \
53 } while (0)
54
55/*
56 * Many functions work byte-by-byte, so they have a pointer handy to the
57 * last-plus-one byte, which saves a cycle or two.
58 */
59#define VARBIT_PAD_LAST(vb, ptr) \
60 do { \
61 int32 pad_ = VARBITPAD(vb); \
62 Assert(pad_ >= 0 && pad_ < BITS_PER_BYTE); \
63 if (pad_ > 0) \
64 *((ptr) - 1) &= BITMASK << pad_; \
65 } while (0)
66
67/* Assert proper padding of a bitstring */
68#ifdef USE_ASSERT_CHECKING
69#define VARBIT_CORRECTLY_PADDED(vb) \
70 do { \
71 int32 pad_ = VARBITPAD(vb); \
72 Assert(pad_ >= 0 && pad_ < BITS_PER_BYTE); \
73 Assert(pad_ == 0 || \
74 (*(VARBITS(vb) + VARBITBYTES(vb) - 1) & ~(BITMASK << pad_)) == 0); \
75 } while (0)
76#else
77#define VARBIT_CORRECTLY_PADDED(vb) ((void) 0)
78#endif
79
83static VarBit *bit_overlay(VarBit *t1, VarBit *t2, int sp, int sl);
84
85
86/*
87 * common code for bittypmodin and varbittypmodin
88 */
89static int32
90anybit_typmodin(ArrayType *ta, const char *typename)
91{
92 int32 typmod;
93 int32 *tl;
94 int n;
95
97
98 /*
99 * we're not too tense about good error message here because grammar
100 * shouldn't allow wrong number of modifiers for BIT
101 */
102 if (n != 1)
105 errmsg("invalid type modifier")));
106
107 if (*tl < 1)
110 errmsg("length for type %s must be at least 1",
111 typename)));
112 if (*tl > (MaxAttrSize * BITS_PER_BYTE))
115 errmsg("length for type %s cannot exceed %d",
116 typename, MaxAttrSize * BITS_PER_BYTE)));
117
118 typmod = *tl;
119
120 return typmod;
121}
122
123/*
124 * common code for bittypmodout and varbittypmodout
125 */
126static char *
128{
129 char *res = (char *) palloc(64);
130
131 if (typmod >= 0)
132 snprintf(res, 64, "(%d)", typmod);
133 else
134 *res = '\0';
135
136 return res;
137}
138
139
140/*
141 * bit_in -
142 * converts a char string to the internal representation of a bitstring.
143 * The length is determined by the number of bits required plus
144 * VARHDRSZ bytes or from atttypmod.
145 */
146Datum
148{
150#ifdef NOT_USED
151 Oid typelem = PG_GETARG_OID(1);
152#endif
153 int32 atttypmod = PG_GETARG_INT32(2);
154 Node *escontext = fcinfo->context;
155 VarBit *result; /* The resulting bit string */
156 char *sp; /* pointer into the character string */
157 uint8 *r; /* pointer into the result */
158 int len, /* Length of the whole data structure */
159 bitlen, /* Number of bits in the bit string */
160 slen; /* Length of the input string */
161 bool bit_not_hex; /* false = hex string true = bit string */
162 int bc;
163 uint8 x = 0;
164
165 /* Check that the first character is a b or an x */
166 if (input_string[0] == 'b' || input_string[0] == 'B')
167 {
168 bit_not_hex = true;
169 sp = input_string + 1;
170 }
171 else if (input_string[0] == 'x' || input_string[0] == 'X')
172 {
173 bit_not_hex = false;
174 sp = input_string + 1;
175 }
176 else
177 {
178 /*
179 * Otherwise it's binary. This allows things like cast('1001' as bit)
180 * to work transparently.
181 */
182 bit_not_hex = true;
184 }
185
186 /*
187 * Determine bitlength from input string. MaxAllocSize ensures a regular
188 * input is small enough, but we must check hex input.
189 */
190 slen = strlen(sp);
191 if (bit_not_hex)
192 bitlen = slen;
193 else
194 {
195 if (slen > VARBITMAXLEN / 4)
196 ereturn(escontext, (Datum) 0,
198 errmsg("bit string length exceeds the maximum allowed (%d)",
199 VARBITMAXLEN)));
200 bitlen = slen * 4;
201 }
202
203 /*
204 * Sometimes atttypmod is not supplied. If it is supplied we need to make
205 * sure that the bitstring fits.
206 */
207 if (atttypmod <= 0)
208 atttypmod = bitlen;
209 else if (bitlen != atttypmod)
210 ereturn(escontext, (Datum) 0,
212 errmsg("bit string length %d does not match type bit(%d)",
213 bitlen, atttypmod)));
214
215 len = VARBITTOTALLEN(atttypmod);
216 /* set to 0 so that *r is always initialised and string is zero-padded */
217 result = (VarBit *) palloc0(len);
219 VARBITLEN(result) = atttypmod;
220
221 r = VARBITS(result);
222 if (bit_not_hex)
223 {
224 /* Parse the bit representation of the string */
225 /* We know it fits, as bitlen was compared to atttypmod */
226 x = HIGHBIT;
227 for (; *sp; sp++)
228 {
229 if (*sp == '1')
230 *r |= x;
231 else if (*sp != '0')
232 ereturn(escontext, (Datum) 0,
234 errmsg("\"%.*s\" is not a valid binary digit",
235 pg_mblen_cstr(sp), sp)));
236
237 x >>= 1;
238 if (x == 0)
239 {
240 x = HIGHBIT;
241 r++;
242 }
243 }
244 }
245 else
246 {
247 /* Parse the hex representation of the string */
248 for (bc = 0; *sp; sp++)
249 {
250 if (*sp >= '0' && *sp <= '9')
251 x = (uint8) (*sp - '0');
252 else if (*sp >= 'A' && *sp <= 'F')
253 x = (uint8) (*sp - 'A') + 10;
254 else if (*sp >= 'a' && *sp <= 'f')
255 x = (uint8) (*sp - 'a') + 10;
256 else
257 ereturn(escontext, (Datum) 0,
259 errmsg("\"%.*s\" is not a valid hexadecimal digit",
260 pg_mblen_cstr(sp), sp)));
261
262 if (bc)
263 {
264 *r++ |= x;
265 bc = 0;
266 }
267 else
268 {
269 *r = x << 4;
270 bc = 1;
271 }
272 }
273 }
274
276}
277
278
279Datum
281{
282#if 1
283 /* same as varbit output */
284 return varbit_out(fcinfo);
285#else
286
287 /*
288 * This is how one would print a hex string, in case someone wants to
289 * write a formatting function.
290 */
292 char *result,
293 *r;
294 uint8 *sp;
295 int i,
296 len,
297 bitlen;
298
299 /* Assertion to help catch any bit functions that don't pad correctly */
301
302 bitlen = VARBITLEN(s);
303 len = (bitlen + 3) / 4;
304 result = (char *) palloc(len + 2);
305 sp = VARBITS(s);
306 r = result;
307 *r++ = 'X';
308 /* we cheat by knowing that we store full bytes zero padded */
309 for (i = 0; i < len; i += 2, sp++)
310 {
311 *r++ = HEXDIG((*sp) >> 4);
312 *r++ = HEXDIG((*sp) & 0xF);
313 }
314
315 /*
316 * Go back one step if we printed a hex number that was not part of the
317 * bitstring anymore
318 */
319 if (i > len)
320 r--;
321 *r = '\0';
322
324#endif
325}
326
327/*
328 * bit_recv - converts external binary format to bit
329 */
330Datum
332{
334
335#ifdef NOT_USED
336 Oid typelem = PG_GETARG_OID(1);
337#endif
338 int32 atttypmod = PG_GETARG_INT32(2);
339 VarBit *result;
340 int len,
341 bitlen;
342
343 bitlen = pq_getmsgint(buf, sizeof(int32));
347 errmsg("invalid length in external bit string")));
348
349 /*
350 * Sometimes atttypmod is not supplied. If it is supplied we need to make
351 * sure that the bitstring fits.
352 */
353 if (atttypmod > 0 && bitlen != atttypmod)
356 errmsg("bit string length %d does not match type bit(%d)",
357 bitlen, atttypmod)));
358
360 result = (VarBit *) palloc(len);
363
365
366 /* Make sure last byte is correctly zero-padded */
368
370}
371
372/*
373 * bit_send - converts bit to binary format
374 */
375Datum
377{
378 /* Exactly the same as varbit_send, so share code */
379 return varbit_send(fcinfo);
380}
381
382/*
383 * bit()
384 * Converts a bit() type to a specific internal length.
385 * len is the bitlength specified in the column definition.
386 *
387 * If doing implicit cast, raise error when source data is wrong length.
388 * If doing explicit cast, silently truncate or zero-pad to specified length.
389 */
390Datum
392{
395 bool isExplicit = PG_GETARG_BOOL(2);
396 VarBit *result;
397 int rlen;
398
399 /* No work if typmod is invalid or supplied data matches it already */
402
403 if (!isExplicit)
404 ereturn(fcinfo->context, (Datum) 0,
406 errmsg("bit string length %d does not match type bit(%d)",
407 VARBITLEN(arg), len)));
408
410 /* set to 0 so that string is zero-padded */
411 result = (VarBit *) palloc0(rlen);
414
417
418 /*
419 * Make sure last byte is zero-padded if needed. This is useless but safe
420 * if source data was shorter than target length (we assume the last byte
421 * of the source data was itself correctly zero-padded).
422 */
424
426}
427
428Datum
435
436Datum
443
444
445/*
446 * varbit_in -
447 * converts a string to the internal representation of a bitstring.
448 * This is the same as bit_in except that atttypmod is taken as
449 * the maximum length, not the exact length to force the bitstring to.
450 */
451Datum
453{
455#ifdef NOT_USED
456 Oid typelem = PG_GETARG_OID(1);
457#endif
458 int32 atttypmod = PG_GETARG_INT32(2);
459 Node *escontext = fcinfo->context;
460 VarBit *result; /* The resulting bit string */
461 char *sp; /* pointer into the character string */
462 uint8 *r; /* pointer into the result */
463 int len, /* Length of the whole data structure */
464 bitlen, /* Number of bits in the bit string */
465 slen; /* Length of the input string */
466 bool bit_not_hex; /* false = hex string true = bit string */
467 int bc;
468 uint8 x = 0;
469
470 /* Check that the first character is a b or an x */
471 if (input_string[0] == 'b' || input_string[0] == 'B')
472 {
473 bit_not_hex = true;
474 sp = input_string + 1;
475 }
476 else if (input_string[0] == 'x' || input_string[0] == 'X')
477 {
478 bit_not_hex = false;
479 sp = input_string + 1;
480 }
481 else
482 {
483 bit_not_hex = true;
485 }
486
487 /*
488 * Determine bitlength from input string. MaxAllocSize ensures a regular
489 * input is small enough, but we must check hex input.
490 */
491 slen = strlen(sp);
492 if (bit_not_hex)
493 bitlen = slen;
494 else
495 {
496 if (slen > VARBITMAXLEN / 4)
497 ereturn(escontext, (Datum) 0,
499 errmsg("bit string length exceeds the maximum allowed (%d)",
500 VARBITMAXLEN)));
501 bitlen = slen * 4;
502 }
503
504 /*
505 * Sometimes atttypmod is not supplied. If it is supplied we need to make
506 * sure that the bitstring fits.
507 */
508 if (atttypmod <= 0)
509 atttypmod = bitlen;
510 else if (bitlen > atttypmod)
511 ereturn(escontext, (Datum) 0,
513 errmsg("bit string too long for type bit varying(%d)",
514 atttypmod)));
515
517 /* set to 0 so that *r is always initialised and string is zero-padded */
518 result = (VarBit *) palloc0(len);
520 VARBITLEN(result) = Min(bitlen, atttypmod);
521
522 r = VARBITS(result);
523 if (bit_not_hex)
524 {
525 /* Parse the bit representation of the string */
526 /* We know it fits, as bitlen was compared to atttypmod */
527 x = HIGHBIT;
528 for (; *sp; sp++)
529 {
530 if (*sp == '1')
531 *r |= x;
532 else if (*sp != '0')
533 ereturn(escontext, (Datum) 0,
535 errmsg("\"%.*s\" is not a valid binary digit",
536 pg_mblen_cstr(sp), sp)));
537
538 x >>= 1;
539 if (x == 0)
540 {
541 x = HIGHBIT;
542 r++;
543 }
544 }
545 }
546 else
547 {
548 /* Parse the hex representation of the string */
549 for (bc = 0; *sp; sp++)
550 {
551 if (*sp >= '0' && *sp <= '9')
552 x = (uint8) (*sp - '0');
553 else if (*sp >= 'A' && *sp <= 'F')
554 x = (uint8) (*sp - 'A') + 10;
555 else if (*sp >= 'a' && *sp <= 'f')
556 x = (uint8) (*sp - 'a') + 10;
557 else
558 ereturn(escontext, (Datum) 0,
560 errmsg("\"%.*s\" is not a valid hexadecimal digit",
561 pg_mblen_cstr(sp), sp)));
562
563 if (bc)
564 {
565 *r++ |= x;
566 bc = 0;
567 }
568 else
569 {
570 *r = x << 4;
571 bc = 1;
572 }
573 }
574 }
575
577}
578
579/*
580 * varbit_out -
581 * Prints the string as bits to preserve length accurately
582 *
583 * XXX varbit_recv() and hex input to varbit_in() can load a value that this
584 * cannot emit. Consider using hex output for such values.
585 */
586Datum
588{
590 char *result,
591 *r;
592 uint8 *sp;
593 uint8 x;
594 int i,
595 k,
596 len;
597
598 /* Assertion to help catch any bit functions that don't pad correctly */
600
601 len = VARBITLEN(s);
602 result = (char *) palloc(len + 1);
603 sp = VARBITS(s);
604 r = result;
605 for (i = 0; i <= len - BITS_PER_BYTE; i += BITS_PER_BYTE, sp++)
606 {
607 /* print full bytes */
608 x = *sp;
609 for (k = 0; k < BITS_PER_BYTE; k++)
610 {
611 *r++ = IS_HIGHBIT_SET(x) ? '1' : '0';
612 x <<= 1;
613 }
614 }
615 if (i < len)
616 {
617 /* print the last partial byte */
618 x = *sp;
619 for (k = i; k < len; k++)
620 {
621 *r++ = IS_HIGHBIT_SET(x) ? '1' : '0';
622 x <<= 1;
623 }
624 }
625 *r = '\0';
626
628}
629
630/*
631 * varbit_recv - converts external binary format to varbit
632 *
633 * External format is the bitlen as an int32, then the byte array.
634 */
635Datum
637{
639
640#ifdef NOT_USED
641 Oid typelem = PG_GETARG_OID(1);
642#endif
643 int32 atttypmod = PG_GETARG_INT32(2);
644 VarBit *result;
645 int len,
646 bitlen;
647
648 bitlen = pq_getmsgint(buf, sizeof(int32));
652 errmsg("invalid length in external bit string")));
653
654 /*
655 * Sometimes atttypmod is not supplied. If it is supplied we need to make
656 * sure that the bitstring fits.
657 */
658 if (atttypmod > 0 && bitlen > atttypmod)
661 errmsg("bit string too long for type bit varying(%d)",
662 atttypmod)));
663
665 result = (VarBit *) palloc(len);
668
670
671 /* Make sure last byte is correctly zero-padded */
673
675}
676
677/*
678 * varbit_send - converts varbit to binary format
679 */
680Datum
691
692/*
693 * varbit_support()
694 *
695 * Planner support function for the varbit() length coercion function.
696 *
697 * Currently, the only interesting thing we can do is flatten calls that set
698 * the new maximum length >= the previous maximum length. We can ignore the
699 * isExplicit argument, since that only affects truncation cases.
700 */
701Datum
703{
705 Node *ret = NULL;
706
708 {
710 FuncExpr *expr = req->fcall;
711 Node *typmod;
712
713 Assert(list_length(expr->args) >= 2);
714
715 typmod = (Node *) lsecond(expr->args);
716
717 if (IsA(typmod, Const) && !((Const *) typmod)->constisnull)
718 {
719 Node *source = (Node *) linitial(expr->args);
723
724 /* Note: varbit() treats typmod 0 as invalid, so we do too */
725 if (new_max <= 0 || (old_max > 0 && old_max <= new_max))
727 }
728 }
729
731}
732
733/*
734 * varbit()
735 * Converts a varbit() type to a specific internal length.
736 * len is the maximum bitlength specified in the column definition.
737 *
738 * If doing implicit cast, raise error when source data is too long.
739 * If doing explicit cast, silently truncate to max length.
740 */
741Datum
743{
746 bool isExplicit = PG_GETARG_BOOL(2);
747 VarBit *result;
748 int rlen;
749
750 /* No work if typmod is invalid or supplied data matches it already */
753
754 if (!isExplicit)
755 ereturn(fcinfo->context, (Datum) 0,
757 errmsg("bit string too long for type bit varying(%d)",
758 len)));
759
761 result = (VarBit *) palloc(rlen);
764
766
767 /* Make sure last byte is correctly zero-padded */
769
771}
772
773Datum
780
781Datum
788
789
790/*
791 * Comparison operators
792 *
793 * We only need one set of comparison operators for bitstrings, as the lengths
794 * are stored in the same way for zero-padded and varying bit strings.
795 *
796 * Note that the standard is not unambiguous about the comparison between
797 * zero-padded bit strings and varying bitstrings. If the same value is written
798 * into a zero padded bitstring as into a varying bitstring, but the zero
799 * padded bitstring has greater length, it will be bigger.
800 *
801 * Zeros from the beginning of a bitstring cannot simply be ignored, as they
802 * may be part of a bit string and may be significant.
803 *
804 * Note: btree indexes need these routines not to leak memory; therefore,
805 * be careful to free working copies of toasted datums. Most places don't
806 * need to be so careful.
807 */
808
809/*
810 * bit_cmp
811 *
812 * Compares two bitstrings and returns <0, 0, >0 depending on whether the first
813 * string is smaller, equal, or bigger than the second. All bits are considered
814 * and additional zero bits may make one string smaller/larger than the other,
815 * even if their zero-padded values would be the same.
816 */
817static int32
819{
820 int bitlen1,
821 bytelen1,
822 bitlen2,
823 bytelen2;
824 int32 cmp;
825
828
830 if (cmp == 0)
831 {
834 if (bitlen1 != bitlen2)
835 cmp = (bitlen1 < bitlen2) ? -1 : 1;
836 }
837 return cmp;
838}
839
840Datum
842{
845 bool result;
846 int bitlen1,
847 bitlen2;
848
851
852 /* fast path for different-length inputs */
853 if (bitlen1 != bitlen2)
854 result = false;
855 else
856 result = (bit_cmp(arg1, arg2) == 0);
857
860
862}
863
864Datum
866{
869 bool result;
870 int bitlen1,
871 bitlen2;
872
875
876 /* fast path for different-length inputs */
877 if (bitlen1 != bitlen2)
878 result = true;
879 else
880 result = (bit_cmp(arg1, arg2) != 0);
881
884
886}
887
888Datum
890{
893 bool result;
894
895 result = (bit_cmp(arg1, arg2) < 0);
896
899
901}
902
903Datum
905{
908 bool result;
909
910 result = (bit_cmp(arg1, arg2) <= 0);
911
914
916}
917
918Datum
920{
923 bool result;
924
925 result = (bit_cmp(arg1, arg2) > 0);
926
929
931}
932
933Datum
935{
938 bool result;
939
940 result = (bit_cmp(arg1, arg2) >= 0);
941
944
946}
947
948Datum
962
963/*
964 * bitcat
965 * Concatenation of bit strings
966 */
967Datum
975
976static VarBit *
978{
979 VarBit *result;
980 int bitlen1,
981 bitlen2,
982 bytelen,
983 bit1pad,
984 bit2shift;
985 uint8 *pr,
986 *pa;
987
990
994 errmsg("bit string length exceeds the maximum allowed (%d)",
995 VARBITMAXLEN)));
997
1001
1002 /* Copy the first bitstring in */
1004
1005 /* Copy the second bit string */
1007 if (bit1pad == 0)
1008 {
1010 VARBITBYTES(arg2));
1011 }
1012 else if (bitlen2 > 0)
1013 {
1014 /* We need to shift all the bits to fit */
1016 pr = VARBITS(result) + VARBITBYTES(arg1) - 1;
1017 for (pa = VARBITS(arg2); pa < VARBITEND(arg2); pa++)
1018 {
1019 *pr |= ((*pa >> bit2shift) & BITMASK);
1020 pr++;
1021 if (pr < VARBITEND(result))
1022 *pr = (*pa << bit1pad) & BITMASK;
1023 }
1024 }
1025
1026 /* The pad bits should be already zero at this point */
1027
1028 return result;
1029}
1030
1031/*
1032 * bitsubstr
1033 * retrieve a substring from the bit string.
1034 * Note, s is 1-based.
1035 * SQL draft 6.10 9)
1036 */
1037Datum
1045
1046Datum
1053
1054static VarBit *
1056{
1057 VarBit *result;
1058 int bitlen,
1059 rbitlen,
1060 len,
1061 ishift,
1062 i;
1063 int32 e,
1064 s1,
1065 e1;
1066 uint8 *r,
1067 *ps;
1068
1069 bitlen = VARBITLEN(arg);
1070 s1 = Max(s, 1);
1071 /* If we do not have an upper bound, use end of string */
1073 {
1074 e1 = bitlen + 1;
1075 }
1076 else if (l < 0)
1077 {
1078 /* SQL99 says to throw an error for E < S, i.e., negative length */
1079 ereport(ERROR,
1081 errmsg("negative substring length not allowed")));
1082 e1 = -1; /* silence stupider compilers */
1083 }
1084 else if (pg_add_s32_overflow(s, l, &e))
1085 {
1086 /*
1087 * L could be large enough for S + L to overflow, in which case the
1088 * substring must run to end of string.
1089 */
1090 e1 = bitlen + 1;
1091 }
1092 else
1093 {
1094 e1 = Min(e, bitlen + 1);
1095 }
1096 if (s1 > bitlen || e1 <= s1)
1097 {
1098 /* Need to return a zero-length bitstring */
1099 len = VARBITTOTALLEN(0);
1100 result = (VarBit *) palloc(len);
1102 VARBITLEN(result) = 0;
1103 }
1104 else
1105 {
1106 /*
1107 * OK, we've got a true substring starting at position s1-1 and ending
1108 * at position e1-1
1109 */
1110 rbitlen = e1 - s1;
1112 result = (VarBit *) palloc(len);
1116 /* Are we copying from a byte boundary? */
1117 if ((s1 - 1) % BITS_PER_BYTE == 0)
1118 {
1119 /* Yep, we are copying bytes */
1121 len);
1122 }
1123 else
1124 {
1125 /* Figure out how much we need to shift the sequence by */
1126 ishift = (s1 - 1) % BITS_PER_BYTE;
1127 r = VARBITS(result);
1128 ps = VARBITS(arg) + (s1 - 1) / BITS_PER_BYTE;
1129 for (i = 0; i < len; i++)
1130 {
1131 *r = (*ps << ishift) & BITMASK;
1132 if ((++ps) < VARBITEND(arg))
1133 *r |= *ps >> (BITS_PER_BYTE - ishift);
1134 r++;
1135 }
1136 }
1137
1138 /* Make sure last byte is correctly zero-padded */
1140 }
1141
1142 return result;
1143}
1144
1145/*
1146 * bitoverlay
1147 * Replace specified substring of first string with second
1148 *
1149 * The SQL standard defines OVERLAY() in terms of substring and concatenation.
1150 * This code is a direct implementation of what the standard says.
1151 */
1152Datum
1154{
1157 int sp = PG_GETARG_INT32(2); /* substring start position */
1158 int sl = PG_GETARG_INT32(3); /* substring length */
1159
1161}
1162
1163Datum
1165{
1168 int sp = PG_GETARG_INT32(2); /* substring start position */
1169 int sl;
1170
1171 sl = VARBITLEN(t2); /* defaults to length(t2) */
1173}
1174
1175static VarBit *
1177{
1178 VarBit *result;
1179 VarBit *s1;
1180 VarBit *s2;
1181 int sp_pl_sl;
1182
1183 /*
1184 * Check for possible integer-overflow cases. For negative sp, throw a
1185 * "substring length" error because that's what should be expected
1186 * according to the spec's definition of OVERLAY().
1187 */
1188 if (sp <= 0)
1189 ereport(ERROR,
1191 errmsg("negative substring length not allowed")));
1193 ereport(ERROR,
1195 errmsg("integer out of range")));
1196
1197 s1 = bitsubstring(t1, 1, sp - 1, false);
1198 s2 = bitsubstring(t1, sp_pl_sl, -1, true);
1201
1202 return result;
1203}
1204
1205/*
1206 * bit_count
1207 *
1208 * Returns the number of bits set in a bit string.
1209 */
1210Datum
1217
1218/*
1219 * bitlength, bitoctetlength
1220 * Return the length of a bit string
1221 */
1222Datum
1229
1230Datum
1237
1238/*
1239 * bit_and
1240 * perform a logical AND on two bit strings.
1241 */
1242Datum
1244{
1247 VarBit *result;
1248 int len,
1249 bitlen1,
1250 bitlen2;
1251 uint8 *p1,
1252 *p2,
1253 *r;
1254
1257 if (bitlen1 != bitlen2)
1258 ereport(ERROR,
1260 errmsg("cannot AND bit strings of different sizes")));
1261
1262 len = VARSIZE(arg1);
1263 result = (VarBit *) palloc(len);
1266
1267 p1 = VARBITS(arg1);
1268 p2 = VARBITS(arg2);
1269 r = VARBITS(result);
1270 for (size_t i = 0; i < VARBITBYTES(arg1); i++)
1271 *r++ = *p1++ & *p2++;
1272
1273 /* Padding is not needed as & of 0 pads is 0 */
1274
1276}
1277
1278/*
1279 * bit_or
1280 * perform a logical OR on two bit strings.
1281 */
1282Datum
1284{
1287 VarBit *result;
1288 int len,
1289 bitlen1,
1290 bitlen2;
1291 uint8 *p1,
1292 *p2,
1293 *r;
1294
1297 if (bitlen1 != bitlen2)
1298 ereport(ERROR,
1300 errmsg("cannot OR bit strings of different sizes")));
1301 len = VARSIZE(arg1);
1302 result = (VarBit *) palloc(len);
1305
1306 p1 = VARBITS(arg1);
1307 p2 = VARBITS(arg2);
1308 r = VARBITS(result);
1309 for (size_t i = 0; i < VARBITBYTES(arg1); i++)
1310 *r++ = *p1++ | *p2++;
1311
1312 /* Padding is not needed as | of 0 pads is 0 */
1313
1315}
1316
1317/*
1318 * bitxor
1319 * perform a logical XOR on two bit strings.
1320 */
1321Datum
1323{
1326 VarBit *result;
1327 int len,
1328 bitlen1,
1329 bitlen2;
1330 uint8 *p1,
1331 *p2,
1332 *r;
1333
1336 if (bitlen1 != bitlen2)
1337 ereport(ERROR,
1339 errmsg("cannot XOR bit strings of different sizes")));
1340
1341 len = VARSIZE(arg1);
1342 result = (VarBit *) palloc(len);
1345
1346 p1 = VARBITS(arg1);
1347 p2 = VARBITS(arg2);
1348 r = VARBITS(result);
1349 for (size_t i = 0; i < VARBITBYTES(arg1); i++)
1350 *r++ = *p1++ ^ *p2++;
1351
1352 /* Padding is not needed as ^ of 0 pads is 0 */
1353
1355}
1356
1357/*
1358 * bitnot
1359 * perform a logical NOT on a bit string.
1360 */
1361Datum
1363{
1365 VarBit *result;
1366 uint8 *p,
1367 *r;
1368
1369 result = (VarBit *) palloc(VARSIZE(arg));
1372
1373 p = VARBITS(arg);
1374 r = VARBITS(result);
1375 for (; p < VARBITEND(arg); p++)
1376 *r++ = ~*p;
1377
1378 /* Must zero-pad the result, because extra bits are surely 1's here */
1380
1382}
1383
1384/*
1385 * bitshiftleft
1386 * do a left shift (i.e. towards the beginning of the string)
1387 */
1388Datum
1390{
1393 VarBit *result;
1394 int byte_shift,
1395 ishift,
1396 len;
1397 uint8 *p,
1398 *r;
1399
1400 /* Negative shift is a shift to the right */
1401 if (shft < 0)
1402 {
1403 /* Prevent integer overflow in negation */
1404 if (shft < -VARBITMAXLEN)
1405 shft = -VARBITMAXLEN;
1408 Int32GetDatum(-shft)));
1409 }
1410
1411 result = (VarBit *) palloc(VARSIZE(arg));
1414 r = VARBITS(result);
1415
1416 /* If we shifted all the bits out, return an all-zero string */
1417 if (shft >= VARBITLEN(arg))
1418 {
1419 MemSet(r, 0, VARBITBYTES(arg));
1421 }
1422
1425 p = VARBITS(arg) + byte_shift;
1426
1427 if (ishift == 0)
1428 {
1429 /* Special case: we can do a memcpy */
1431 memcpy(r, p, len);
1432 MemSet(r + len, 0, byte_shift);
1433 }
1434 else
1435 {
1436 for (; p < VARBITEND(arg); r++)
1437 {
1438 *r = *p << ishift;
1439 if ((++p) < VARBITEND(arg))
1440 *r |= *p >> (BITS_PER_BYTE - ishift);
1441 }
1442 for (; r < VARBITEND(result); r++)
1443 *r = 0;
1444 }
1445
1446 /* The pad bits should be already zero at this point */
1447
1449}
1450
1451/*
1452 * bitshiftright
1453 * do a right shift (i.e. towards the end of the string)
1454 */
1455Datum
1457{
1460 VarBit *result;
1461 int byte_shift,
1462 ishift,
1463 len;
1464 uint8 *p,
1465 *r;
1466
1467 /* Negative shift is a shift to the left */
1468 if (shft < 0)
1469 {
1470 /* Prevent integer overflow in negation */
1471 if (shft < -VARBITMAXLEN)
1472 shft = -VARBITMAXLEN;
1475 Int32GetDatum(-shft)));
1476 }
1477
1478 result = (VarBit *) palloc(VARSIZE(arg));
1481 r = VARBITS(result);
1482
1483 /* If we shifted all the bits out, return an all-zero string */
1484 if (shft >= VARBITLEN(arg))
1485 {
1486 MemSet(r, 0, VARBITBYTES(arg));
1488 }
1489
1492 p = VARBITS(arg);
1493
1494 /* Set the first part of the result to 0 */
1495 MemSet(r, 0, byte_shift);
1496 r += byte_shift;
1497
1498 if (ishift == 0)
1499 {
1500 /* Special case: we can do a memcpy */
1502 memcpy(r, p, len);
1503 r += len;
1504 }
1505 else
1506 {
1507 if (r < VARBITEND(result))
1508 *r = 0; /* initialize first byte */
1509 for (; r < VARBITEND(result); p++)
1510 {
1511 *r |= *p >> ishift;
1512 if ((++r) < VARBITEND(result))
1513 *r = (*p << (BITS_PER_BYTE - ishift)) & BITMASK;
1514 }
1515 }
1516
1517 /* We may have shifted 1's into the pad bits, so fix that */
1519
1521}
1522
1523/*
1524 * This is not defined in any standard. We retain the natural ordering of
1525 * bits here, as it just seems more intuitive.
1526 */
1527Datum
1529{
1530 int32 a = PG_GETARG_INT32(0);
1531 int32 typmod = PG_GETARG_INT32(1);
1532 VarBit *result;
1533 uint8 *r;
1534 int rlen;
1535 int destbitsleft,
1537
1539 typmod = 1; /* default bit length */
1540
1541 rlen = VARBITTOTALLEN(typmod);
1542 result = (VarBit *) palloc(rlen);
1544 VARBITLEN(result) = typmod;
1545
1546 r = VARBITS(result);
1547 destbitsleft = typmod;
1548 srcbitsleft = 32;
1549 /* drop any input bits that don't fit */
1551 /* sign-fill any excess bytes in output */
1552 while (destbitsleft >= srcbitsleft + 8)
1553 {
1554 *r++ = (uint8) ((a < 0) ? BITMASK : 0);
1555 destbitsleft -= 8;
1556 }
1557 /* store first fractional byte */
1559 {
1560 unsigned int val = (unsigned int) (a >> (destbitsleft - 8));
1561
1562 /* Force sign-fill in case the compiler implements >> as zero-fill */
1563 if (a < 0)
1564 val |= ((unsigned int) -1) << (srcbitsleft + 8 - destbitsleft);
1565 *r++ = (uint8) (val & BITMASK);
1566 destbitsleft -= 8;
1567 }
1568 /* Now srcbitsleft and destbitsleft are the same, need not track both */
1569 /* store whole bytes */
1570 while (destbitsleft >= 8)
1571 {
1572 *r++ = (uint8) ((a >> (destbitsleft - 8)) & BITMASK);
1573 destbitsleft -= 8;
1574 }
1575 /* store last fractional byte */
1576 if (destbitsleft > 0)
1577 *r = (uint8) ((a << (8 - destbitsleft)) & BITMASK);
1578
1580}
1581
1582Datum
1584{
1586 uint32 result;
1587 uint8 *r;
1588
1589 /* Check that the bit string is not too long */
1590 if (VARBITLEN(arg) > sizeof(result) * BITS_PER_BYTE)
1591 ereturn(fcinfo->context, (Datum) 0,
1593 errmsg("integer out of range")));
1594
1595 result = 0;
1596 for (r = VARBITS(arg); r < VARBITEND(arg); r++)
1597 {
1599 result |= *r;
1600 }
1601 /* Now shift the result to take account of the padding at the end */
1602 result >>= VARBITPAD(arg);
1603
1605}
1606
1607Datum
1609{
1610 int64 a = PG_GETARG_INT64(0);
1611 int32 typmod = PG_GETARG_INT32(1);
1612 VarBit *result;
1613 uint8 *r;
1614 int rlen;
1615 int destbitsleft,
1617
1619 typmod = 1; /* default bit length */
1620
1621 rlen = VARBITTOTALLEN(typmod);
1622 result = (VarBit *) palloc(rlen);
1624 VARBITLEN(result) = typmod;
1625
1626 r = VARBITS(result);
1627 destbitsleft = typmod;
1628 srcbitsleft = 64;
1629 /* drop any input bits that don't fit */
1631 /* sign-fill any excess bytes in output */
1632 while (destbitsleft >= srcbitsleft + 8)
1633 {
1634 *r++ = (uint8) ((a < 0) ? BITMASK : 0);
1635 destbitsleft -= 8;
1636 }
1637 /* store first fractional byte */
1639 {
1640 unsigned int val = (unsigned int) (a >> (destbitsleft - 8));
1641
1642 /* Force sign-fill in case the compiler implements >> as zero-fill */
1643 if (a < 0)
1644 val |= ((unsigned int) -1) << (srcbitsleft + 8 - destbitsleft);
1645 *r++ = (uint8) (val & BITMASK);
1646 destbitsleft -= 8;
1647 }
1648 /* Now srcbitsleft and destbitsleft are the same, need not track both */
1649 /* store whole bytes */
1650 while (destbitsleft >= 8)
1651 {
1652 *r++ = (uint8) ((a >> (destbitsleft - 8)) & BITMASK);
1653 destbitsleft -= 8;
1654 }
1655 /* store last fractional byte */
1656 if (destbitsleft > 0)
1657 *r = (uint8) ((a << (8 - destbitsleft)) & BITMASK);
1658
1660}
1661
1662Datum
1664{
1666 uint64 result;
1667 uint8 *r;
1668
1669 /* Check that the bit string is not too long */
1670 if (VARBITLEN(arg) > sizeof(result) * BITS_PER_BYTE)
1671 ereturn(fcinfo->context, (Datum) 0,
1673 errmsg("bigint out of range")));
1674
1675 result = 0;
1676 for (r = VARBITS(arg); r < VARBITEND(arg); r++)
1677 {
1679 result |= *r;
1680 }
1681 /* Now shift the result to take account of the padding at the end */
1682 result >>= VARBITPAD(arg);
1683
1685}
1686
1687
1688/*
1689 * Determines the position of S2 in the bitstring S1 (1-based string).
1690 * If S2 does not appear in S1 this function returns 0.
1691 * If S2 is of length 0 this function returns 1.
1692 * Compatible in usage with POSITION() functions for other data types.
1693 */
1694Datum
1696{
1699 int substr_length,
1700 str_length,
1701 is;
1702 uint8 *s, /* pointer into substring */
1703 *p; /* pointer into str */
1704 uint8 cmp, /* shifted substring byte to compare */
1705 mask1, /* mask for substring byte shifted right */
1706 mask2, /* mask for substring byte shifted left */
1707 end_mask, /* pad mask for last substring byte */
1708 str_mask; /* pad mask for last string byte */
1709 bool is_match;
1710
1711 /* Get the substring length */
1714
1715 /* String has zero length or substring longer than string, return 0 */
1716 if ((str_length == 0) || (substr_length > str_length))
1717 PG_RETURN_INT32(0);
1718
1719 /* zero-length substring means return 1 */
1720 if (substr_length == 0)
1721 PG_RETURN_INT32(1);
1722
1723 /* Initialise the padding masks */
1726 for (size_t i = 0; i < VARBITBYTES(str) - VARBITBYTES(substr) + 1; i++)
1727 {
1728 for (is = 0; is < BITS_PER_BYTE; is++)
1729 {
1730 is_match = true;
1731 p = VARBITS(str) + i;
1732 mask1 = BITMASK >> is;
1733 mask2 = ~mask1;
1734 for (s = VARBITS(substr);
1735 is_match && s < VARBITEND(substr); s++)
1736 {
1737 cmp = *s >> is;
1738 if (s == VARBITEND(substr) - 1)
1739 {
1740 mask1 &= end_mask >> is;
1741 if (p == VARBITEND(str) - 1)
1742 {
1743 /* Check that there is enough of str left */
1744 if (mask1 & ~str_mask)
1745 {
1746 is_match = false;
1747 break;
1748 }
1749 mask1 &= str_mask;
1750 }
1751 }
1752 is_match = ((cmp ^ *p) & mask1) == 0;
1753 if (!is_match)
1754 break;
1755 /* Move on to the next byte */
1756 p++;
1757 if (p == VARBITEND(str))
1758 {
1759 mask2 = end_mask << (BITS_PER_BYTE - is);
1760 is_match = mask2 == 0;
1761#if 0
1762 elog(DEBUG4, "S. %d %d em=%2x sm=%2x r=%d",
1763 i, is, end_mask, mask2, is_match);
1764#endif
1765 break;
1766 }
1767 cmp = *s << (BITS_PER_BYTE - is);
1768 if (s == VARBITEND(substr) - 1)
1769 {
1770 mask2 &= end_mask << (BITS_PER_BYTE - is);
1771 if (p == VARBITEND(str) - 1)
1772 {
1773 if (mask2 & ~str_mask)
1774 {
1775 is_match = false;
1776 break;
1777 }
1778 mask2 &= str_mask;
1779 }
1780 }
1781 is_match = ((cmp ^ *p) & mask2) == 0;
1782 }
1783 /* Have we found a match? */
1784 if (is_match)
1786 }
1787 }
1788 PG_RETURN_INT32(0);
1789}
1790
1791
1792/*
1793 * bitsetbit
1794 *
1795 * Given an instance of type 'bit' creates a new one with
1796 * the Nth bit set to the given value.
1797 *
1798 * The bit location is specified left-to-right in a zero-based fashion
1799 * consistent with the other get_bit and set_bit functions, but
1800 * inconsistent with the standard substring, position, overlay functions
1801 */
1802Datum
1804{
1806 int32 n = PG_GETARG_INT32(1);
1808 VarBit *result;
1809 int len,
1810 bitlen;
1811 uint8 *r,
1812 *p;
1813 int byteNo,
1814 bitNo;
1815
1817 if (n < 0 || n >= bitlen)
1818 ereport(ERROR,
1820 errmsg("bit index %d out of valid range (0..%d)",
1821 n, bitlen - 1)));
1822
1823 /*
1824 * sanity check!
1825 */
1826 if (newBit != 0 && newBit != 1)
1827 ereport(ERROR,
1829 errmsg("new bit must be 0 or 1")));
1830
1831 len = VARSIZE(arg1);
1832 result = (VarBit *) palloc(len);
1835
1836 p = VARBITS(arg1);
1837 r = VARBITS(result);
1838
1839 memcpy(r, p, VARBITBYTES(arg1));
1840
1841 byteNo = n / BITS_PER_BYTE;
1842 bitNo = BITS_PER_BYTE - 1 - (n % BITS_PER_BYTE);
1843
1844 /*
1845 * Update the byte.
1846 */
1847 if (newBit == 0)
1848 r[byteNo] &= (~(1 << bitNo));
1849 else
1850 r[byteNo] |= (1 << bitNo);
1851
1853}
1854
1855/*
1856 * bitgetbit
1857 *
1858 * returns the value of the Nth bit of a bit array (0 or 1).
1859 *
1860 * The bit location is specified left-to-right in a zero-based fashion
1861 * consistent with the other get_bit and set_bit functions, but
1862 * inconsistent with the standard substring, position, overlay functions
1863 */
1864Datum
1866{
1868 int32 n = PG_GETARG_INT32(1);
1869 int bitlen;
1870 uint8 *p;
1871 int byteNo,
1872 bitNo;
1873
1875 if (n < 0 || n >= bitlen)
1876 ereport(ERROR,
1878 errmsg("bit index %d out of valid range (0..%d)",
1879 n, bitlen - 1)));
1880
1881 p = VARBITS(arg1);
1882
1883 byteNo = n / BITS_PER_BYTE;
1884 bitNo = BITS_PER_BYTE - 1 - (n % BITS_PER_BYTE);
1885
1886 if (p[byteNo] & (1 << bitNo))
1887 PG_RETURN_INT32(1);
1888 else
1889 PG_RETURN_INT32(0);
1890}
#define PG_GETARG_ARRAYTYPE_P(n)
Definition array.h:263
int32 * ArrayGetIntegerTypmods(ArrayType *arr, int *n)
Definition arrayutils.c:233
#define Min(x, y)
Definition c.h:1131
uint8_t uint8
Definition c.h:681
#define IS_HIGHBIT_SET(ch)
Definition c.h:1284
#define Max(x, y)
Definition c.h:1125
#define VARHDRSZ
Definition c.h:840
#define Assert(condition)
Definition c.h:1002
int64_t int64
Definition c.h:680
int32_t int32
Definition c.h:679
uint64_t uint64
Definition c.h:684
uint32_t uint32
Definition c.h:683
#define MemSet(start, val, len)
Definition c.h:1147
#define HIGHBIT
Definition c.h:1283
uint32 result
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
Datum arg
Definition elog.c:1323
int errcode(int sqlerrcode)
Definition elog.c:875
#define ereturn(context, dummy_value,...)
Definition elog.h:280
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
#define ereport(elevel,...)
Definition elog.h:152
#define DEBUG4
Definition elog.h:28
#define PG_FREE_IF_COPY(ptr, n)
Definition fmgr.h:260
#define PG_GETARG_OID(n)
Definition fmgr.h:275
#define PG_RETURN_BYTEA_P(x)
Definition fmgr.h:373
#define DirectFunctionCall2(func, arg1, arg2)
Definition fmgr.h:690
#define PG_GETARG_POINTER(n)
Definition fmgr.h:277
#define PG_RETURN_CSTRING(x)
Definition fmgr.h:364
#define PG_RETURN_INT64(x)
Definition fmgr.h:370
#define PG_GETARG_CSTRING(n)
Definition fmgr.h:278
#define PG_GETARG_INT64(n)
Definition fmgr.h:284
#define PG_RETURN_INT32(x)
Definition fmgr.h:355
#define PG_GETARG_INT32(n)
Definition fmgr.h:269
#define PG_GETARG_BOOL(n)
Definition fmgr.h:274
#define PG_RETURN_DATUM(x)
Definition fmgr.h:354
#define PG_RETURN_POINTER(x)
Definition fmgr.h:363
#define PG_FUNCTION_ARGS
Definition fmgr.h:193
#define PG_RETURN_BOOL(x)
Definition fmgr.h:360
const char * str
#define MaxAttrSize
struct parser_state ps
long val
Definition informix.c:689
static bool pg_add_s32_overflow(int32 a, int32 b, int32 *result)
Definition int.h:151
int x
Definition isn.c:75
int a
Definition isn.c:73
int i
Definition isn.c:77
int pg_mblen_cstr(const char *mbstr)
Definition mbutils.c:1045
void * palloc0(Size size)
Definition mcxt.c:1420
void * palloc(Size size)
Definition mcxt.c:1390
int32 exprTypmod(const Node *expr)
Definition nodeFuncs.c:304
Node * relabel_to_typmod(Node *expr, int32 typmod)
Definition nodeFuncs.c:694
#define IsA(nodeptr, _type_)
Definition nodes.h:162
static char * errmsg
static uint64 pg_popcount(const char *buf, int bytes)
#define BITS_PER_BYTE
const void size_t len
static int list_length(const List *l)
Definition pg_list.h:152
#define linitial(l)
Definition pg_list.h:178
#define lsecond(l)
Definition pg_list.h:183
static rewind_source * source
Definition pg_rewind.c:89
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define snprintf
Definition port.h:261
uint64_t Datum
Definition postgres.h:70
static Datum Int32GetDatum(int32 X)
Definition postgres.h:212
static int32 DatumGetInt32(Datum X)
Definition postgres.h:202
unsigned int Oid
unsigned int pq_getmsgint(StringInfo msg, int b)
Definition pqformat.c:414
void pq_sendbytes(StringInfo buf, const void *data, int datalen)
Definition pqformat.c:126
void pq_copymsgbytes(StringInfo msg, void *buf, int datalen)
Definition pqformat.c:527
void pq_begintypsend(StringInfo buf)
Definition pqformat.c:325
bytea * pq_endtypsend(StringInfo buf)
Definition pqformat.c:345
static void pq_sendint32(StringInfo buf, uint32 i)
Definition pqformat.h:144
e
static int fb(int x)
char * s1
char * s2
static int cmp(const chr *x, const chr *y, size_t len)
struct StringInfoData * StringInfo
Definition string.h:15
List * args
Definition primnodes.h:788
Definition nodes.h:133
static Size VARSIZE(const void *PTR)
Definition varatt.h:298
static void SET_VARSIZE(void *PTR, Size len)
Definition varatt.h:432
Datum bitoverlay(PG_FUNCTION_ARGS)
Definition varbit.c:1153
Datum bitfromint4(PG_FUNCTION_ARGS)
Definition varbit.c:1528
Datum bitxor(PG_FUNCTION_ARGS)
Definition varbit.c:1322
Datum bitcmp(PG_FUNCTION_ARGS)
Definition varbit.c:949
Datum bitcat(PG_FUNCTION_ARGS)
Definition varbit.c:968
Datum bittoint4(PG_FUNCTION_ARGS)
Definition varbit.c:1583
Datum varbit_send(PG_FUNCTION_ARGS)
Definition varbit.c:681
Datum bitfromint8(PG_FUNCTION_ARGS)
Definition varbit.c:1608
#define VARBIT_CORRECTLY_PADDED(vb)
Definition varbit.c:77
Datum varbittypmodin(PG_FUNCTION_ARGS)
Definition varbit.c:774
Datum bitoverlay_no_len(PG_FUNCTION_ARGS)
Definition varbit.c:1164
static char * anybit_typmodout(int32 typmod)
Definition varbit.c:127
Datum bit(PG_FUNCTION_ARGS)
Definition varbit.c:391
Datum bit_send(PG_FUNCTION_ARGS)
Definition varbit.c:376
Datum varbit(PG_FUNCTION_ARGS)
Definition varbit.c:742
Datum bitne(PG_FUNCTION_ARGS)
Definition varbit.c:865
Datum bittypmodout(PG_FUNCTION_ARGS)
Definition varbit.c:437
Datum varbit_out(PG_FUNCTION_ARGS)
Definition varbit.c:587
Datum varbit_support(PG_FUNCTION_ARGS)
Definition varbit.c:702
Datum bit_out(PG_FUNCTION_ARGS)
Definition varbit.c:280
#define HEXDIG(z)
Definition varbit.c:44
static int32 anybit_typmodin(ArrayType *ta, const char *typename)
Definition varbit.c:90
Datum bitgetbit(PG_FUNCTION_ARGS)
Definition varbit.c:1865
Datum bitsetbit(PG_FUNCTION_ARGS)
Definition varbit.c:1803
Datum bit_bit_count(PG_FUNCTION_ARGS)
Definition varbit.c:1211
Datum bit_and(PG_FUNCTION_ARGS)
Definition varbit.c:1243
Datum varbit_recv(PG_FUNCTION_ARGS)
Definition varbit.c:636
Datum bitge(PG_FUNCTION_ARGS)
Definition varbit.c:934
static VarBit * bit_catenate(VarBit *arg1, VarBit *arg2)
Definition varbit.c:977
Datum bitle(PG_FUNCTION_ARGS)
Definition varbit.c:904
static VarBit * bit_overlay(VarBit *t1, VarBit *t2, int sp, int sl)
Definition varbit.c:1176
#define VARBIT_PAD(vb)
Definition varbit.c:47
#define VARBIT_PAD_LAST(vb, ptr)
Definition varbit.c:59
Datum biteq(PG_FUNCTION_ARGS)
Definition varbit.c:841
Datum bitsubstr_no_len(PG_FUNCTION_ARGS)
Definition varbit.c:1047
static VarBit * bitsubstring(VarBit *arg, int32 s, int32 l, bool length_not_specified)
Definition varbit.c:1055
Datum bitlt(PG_FUNCTION_ARGS)
Definition varbit.c:889
Datum bittoint8(PG_FUNCTION_ARGS)
Definition varbit.c:1663
Datum bit_or(PG_FUNCTION_ARGS)
Definition varbit.c:1283
Datum bitgt(PG_FUNCTION_ARGS)
Definition varbit.c:919
Datum bittypmodin(PG_FUNCTION_ARGS)
Definition varbit.c:429
Datum bitposition(PG_FUNCTION_ARGS)
Definition varbit.c:1695
Datum bitoctetlength(PG_FUNCTION_ARGS)
Definition varbit.c:1231
Datum bit_in(PG_FUNCTION_ARGS)
Definition varbit.c:147
Datum bit_recv(PG_FUNCTION_ARGS)
Definition varbit.c:331
Datum bitsubstr(PG_FUNCTION_ARGS)
Definition varbit.c:1038
Datum varbittypmodout(PG_FUNCTION_ARGS)
Definition varbit.c:782
Datum bitshiftright(PG_FUNCTION_ARGS)
Definition varbit.c:1456
Datum bitnot(PG_FUNCTION_ARGS)
Definition varbit.c:1362
Datum bitshiftleft(PG_FUNCTION_ARGS)
Definition varbit.c:1389
Datum bitlength(PG_FUNCTION_ARGS)
Definition varbit.c:1223
Datum varbit_in(PG_FUNCTION_ARGS)
Definition varbit.c:452
static int32 bit_cmp(VarBit *arg1, VarBit *arg2)
Definition varbit.c:818
#define VARBITLEN(PTR)
Definition varbit.h:69
#define VARBITBYTES(PTR)
Definition varbit.h:73
#define VARBITS(PTR)
Definition varbit.h:71
#define BITMASK
Definition varbit.h:87
#define VARBITEND(PTR)
Definition varbit.h:85
#define PG_RETURN_VARBIT_P(x)
Definition varbit.h:64
#define PG_GETARG_VARBIT_P(n)
Definition varbit.h:62
static Datum VarBitPGetDatum(const VarBit *X)
Definition varbit.h:57
#define VARBITMAXLEN
Definition varbit.h:83
#define VARBITTOTALLEN(BITLEN)
Definition varbit.h:77
#define VARBITHDRSZ
Definition varbit.h:67
#define VARBITPAD(PTR)
Definition varbit.h:75