PostgreSQL Source Code: src/backend/lib/integerset.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
73
76
77
78
79
80
81
82
83#define SIMPLE8B_MAX_VALUES_PER_CODEWORD 240
84
85
86
87
88
89
90
91
92
93
94#define MAX_INTERNAL_ITEMS 64
95#define MAX_LEAF_ITEMS 64
96
97
98
99
100
101
102
103
104
105
106
107
108
109#define MAX_TREE_LEVELS 11
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
136
137
139{
142};
143
144
146{
147
150
151
152
153
154
157};
158
159
160typedef struct
161{
165
166#define MAX_VALUES_PER_LEAF_ITEM (1 + SIMPLE8B_MAX_VALUES_PER_CODEWORD)
167
169{
170
173
175
177};
178
179
180
181
182
183
184
185
186#define MAX_BUFFERED_VALUES (MAX_VALUES_PER_LEAF_ITEM * 2)
187
188
189
190
191
192
193
194
195
197{
198
199
200
201
202
203
204
205
208
211
212
213
214
215
216
217
218
219
220
225
226
227
228
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
247
251
253 int iter_itemno;
254
256};
257
258
259
260
264
266 bool nextkey);
268 bool nextkey);
269
273
274
275
276
277
278
279
280
281
284{
286
290
291 intset->num_entries = 0;
292 intset->highest_value = 0;
293
294 intset->num_levels = 0;
296 memset(intset->rightmost_nodes, 0, sizeof(intset->rightmost_nodes));
297 intset->leftmost_leaf = NULL;
298
299 intset->num_buffered_values = 0;
300
301 intset->iter_active = false;
302 intset->iter_node = NULL;
303 intset->iter_itemno = 0;
304 intset->iter_valueno = 0;
305 intset->iter_num_values = 0;
306 intset->iter_values = NULL;
307
309}
310
311
312
313
316{
318
322
323 n->level = 0;
325
326 return n;
327}
328
331{
333
337
340 n->next = NULL;
341
342 return n;
343}
344
345
346
347
350{
351 return intset->num_entries;
352}
353
354
355
356
359{
360 return intset->mem_used;
361}
362
363
364
365
366
367
368void
370{
371 if (intset->iter_active)
372 elog(ERROR, "cannot add new values to integer set while iteration is in progress");
373
374 if (x <= intset->highest_value && intset->num_entries > 0)
375 elog(ERROR, "cannot add value to integer set out of order");
376
378 {
379
382 }
383
384
385 intset->buffered_values[intset->num_buffered_values] = x;
386 intset->num_buffered_values++;
387 intset->num_entries++;
388 intset->highest_value = x;
389}
390
391
392
393
394static void
396{
398 uint64 num_values = intset->num_buffered_values;
399 int num_packed = 0;
401
403
404
405
406
407
408 if (leaf == NULL)
409 {
410
411
412
413
414
416
418 intset->leftmost_leaf = leaf;
420 intset->num_levels = 1;
421 }
422
423
424
425
426
427
428
430 {
432 int num_encoded;
433
434
435
436
437
440 &num_encoded,
442
443
444
445
446
448 {
449
451
453 old_leaf->next = leaf;
456 }
458
459 num_packed += 1 + num_encoded;
460 }
461
462
463
464
465 if (num_packed < intset->num_buffered_values)
466 {
467 memmove(&intset->buffered_values[0],
468 &intset->buffered_values[num_packed],
469 (intset->num_buffered_values - num_packed) * sizeof(uint64));
470 }
471 intset->num_buffered_values -= num_packed;
472}
473
474
475
476
477
478
479static void
482{
484
486
487
488
489
490 if (level >= intset->num_levels)
491 {
494
495
497 elog(ERROR, "could not expand integer set, maximum number of levels reached");
498 intset->num_levels++;
499
500
501
502
503
504 if (intset->root->level == 0)
505 downlink_key = ((intset_leaf_node *) oldroot)->items[0].first;
506 else
508
510 parent->level = level;
511 parent->values[0] = downlink_key;
514
517 }
518
519
520
521
523
525 {
529 }
530 else
531 {
532
533
534
535
536
538 parent->level = level;
539 parent->values[0] = child_key;
542
544
546 }
547}
548
549
550
551
552bool
554{
557 int level;
558 int itemno;
560
561
562
563
564 if (intset->num_buffered_values > 0 && x >= intset->buffered_values[0])
565 {
567 intset->buffered_values,
568 intset->num_buffered_values,
569 false);
570 if (itemno >= intset->num_buffered_values)
571 return false;
572 else
573 return (intset->buffered_values[itemno] == x);
574 }
575
576
577
578
579
581 return false;
583 for (level = intset->num_levels - 1; level > 0; level--)
584 {
586
588
590 if (itemno == 0)
591 return false;
593 }
596
597
598
599
601 if (itemno == 0)
602 return false;
603 item = &leaf->items[itemno - 1];
604
605
607 return true;
609
610
612 return true;
613
614 return false;
615}
616
617
618
619
620
621
622void
624{
625
626 intset->iter_active = true;
628 intset->iter_itemno = 0;
629 intset->iter_valueno = 0;
630 intset->iter_num_values = 0;
631 intset->iter_values = intset->iter_values_buf;
632}
633
634
635
636
637
638
639
640
641bool
643{
645 for (;;)
646 {
647
648 if (intset->iter_valueno < intset->iter_num_values)
649 {
651 return true;
652 }
653
654
655 if (intset->iter_node &&
656 intset->iter_itemno < intset->iter_node->num_items)
657 {
659 int num_decoded;
660
661 item = &intset->iter_node->items[intset->iter_itemno++];
662
663 intset->iter_values_buf[0] = item->first;
665 &intset->iter_values_buf[1],
667 intset->iter_num_values = num_decoded + 1;
668 intset->iter_valueno = 0;
669 continue;
670 }
671
672
673 if (intset->iter_node)
674 {
676 intset->iter_itemno = 0;
677 continue;
678 }
679
680
681
682
683
685 {
686 intset->iter_values = intset->buffered_values;
687 intset->iter_num_values = intset->num_buffered_values;
688 intset->iter_valueno = 0;
689 continue;
690 }
691
692 break;
693 }
694
695
696 intset->iter_active = false;
697 *next = 0;
698 return false;
699}
700
701
702
703
704
705
706
707
708
709
710
711
712static int
714{
715 int low,
716 high,
717 mid;
718
719 low = 0;
720 high = arr_elems;
721 while (high > low)
722 {
723 mid = low + (high - low) / 2;
724
725 if (nextkey)
726 {
727 if (item >= arr[mid])
728 low = mid + 1;
729 else
730 high = mid;
731 }
732 else
733 {
734 if (item > arr[mid])
735 low = mid + 1;
736 else
737 high = mid;
738 }
739 }
740
741 return low;
742}
743
744
745static int
747{
748 int low,
749 high,
750 mid;
751
752 low = 0;
753 high = arr_elems;
754 while (high > low)
755 {
756 mid = low + (high - low) / 2;
757
758 if (nextkey)
759 {
760 if (item >= arr[mid].first)
761 low = mid + 1;
762 else
763 high = mid;
764 }
765 else
766 {
767 if (item > arr[mid].first)
768 low = mid + 1;
769 else
770 high = mid;
771 }
772 }
773
774 return low;
775}
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
821{
825
826{
827 {0, 240},
828 {0, 120},
829 {1, 60},
830 {2, 30},
831 {3, 20},
832 {4, 15},
833 {5, 12},
834 {6, 10},
835 {7, 8},
836
837 {8, 7},
838
839 {10, 6},
840 {12, 5},
841 {15, 4},
842 {20, 3},
843 {30, 2},
844 {60, 1},
845
846 {0, 0}
848
849
850
851
852
853
854
855
856#define EMPTY_CODEWORD UINT64CONST(0x0FFFFFFFFFFFFFFF)
857
858
859
860
861
862
863
864
865
866
867
868
869
870
873{
874 int selector;
875 int nints;
876 int bits;
880 int i;
881
882 Assert(ints[0] > base);
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899 selector = 0;
902 diff = ints[0] - base - 1;
903 last_val = ints[0];
904 i = 0;
905 for (;;)
906 {
908 {
909
910 selector++;
913
914 if (i >= nints)
915 break;
916 }
917 else
918 {
919
920 i++;
921 if (i >= nints)
922 break;
923
924 Assert(ints[i] > last_val);
925 diff = ints[i] - last_val - 1;
926 last_val = ints[i];
927 }
928 }
929
930 if (nints == 0)
931 {
932
933
934
935
936
937
938
940 *num_encoded = 0;
942 }
943
944
945
946
947
948
949 codeword = 0;
950 if (bits > 0)
951 {
952 for (i = nints - 1; i > 0; i--)
953 {
954 diff = ints[i] - ints[i - 1] - 1;
955 codeword |= diff;
956 codeword <<= bits;
957 }
958 diff = ints[0] - base - 1;
959 codeword |= diff;
960 }
961
962
963 codeword |= (uint64) selector << 60;
964
965 *num_encoded = nints;
966 return codeword;
967}
968
969
970
971
972
973static int
975{
976 int selector = (codeword >> 60);
981
983 return 0;
984
985 curr_value = base;
986 for (int i = 0; i < nints; i++)
987 {
988 uint64 diff = codeword & mask;
989
990 curr_value += 1 + diff;
991 decoded[i] = curr_value;
992 codeword >>= bits;
993 }
994 return nints;
995}
996
997
998
999
1000
1001
1002static bool
1004{
1005 int selector = (codeword >> 60);
1008
1010 return false;
1011
1012 if (bits == 0)
1013 {
1014
1015 return (key - base) <= nints;
1016 }
1017 else
1018 {
1021
1022 curr_value = base;
1023 for (int i = 0; i < nints; i++)
1024 {
1025 uint64 diff = codeword & mask;
1026
1027 curr_value += 1 + diff;
1028
1029 if (curr_value >= key)
1030 {
1031 if (curr_value == key)
1032 return true;
1033 else
1034 return false;
1035 }
1036
1037 codeword >>= bits;
1038 }
1039 }
1040 return false;
1041}
Datum intset(PG_FUNCTION_ARGS)
static Datum values[MAXATTR]
Assert(PointerIsAligned(start, uint64))
#define MAX_VALUES_PER_LEAF_ITEM
uint64 intset_memory_usage(IntegerSet *intset)
uint64 intset_num_entries(IntegerSet *intset)
static void intset_update_upper(IntegerSet *intset, int level, intset_node *child, uint64 child_key)
bool intset_is_member(IntegerSet *intset, uint64 x)
#define MAX_INTERNAL_ITEMS
#define MAX_BUFFERED_VALUES
static intset_internal_node * intset_new_internal_node(IntegerSet *intset)
void intset_begin_iterate(IntegerSet *intset)
static int intset_binsrch_uint64(uint64 item, uint64 *arr, int arr_elems, bool nextkey)
static void intset_flush_buffered_values(IntegerSet *intset)
static uint64 simple8b_encode(const uint64 *ints, int *num_encoded, uint64 base)
bool intset_iterate_next(IntegerSet *intset, uint64 *next)
static int simple8b_decode(uint64 codeword, uint64 *decoded, uint64 base)
IntegerSet * intset_create(void)
void intset_add_member(IntegerSet *intset, uint64 x)
static const struct simple8b_mode simple8b_modes[17]
static int intset_binsrch_leaf(uint64 item, leaf_item *arr, int arr_elems, bool nextkey)
static bool simple8b_contains(uint64 codeword, uint64 key, uint64 base)
static intset_leaf_node * intset_new_leaf_node(IntegerSet *intset)
if(TABLE==NULL||TABLE_index==NULL)
void * MemoryContextAlloc(MemoryContext context, Size size)
Size GetMemoryChunkSpace(void *pointer)
MemoryContext CurrentMemoryContext
intset_node * rightmost_nodes[MAX_TREE_LEVELS]
uint64 iter_values_buf[MAX_VALUES_PER_LEAF_ITEM]
intset_leaf_node * leftmost_leaf
const uint64 * iter_values
uint64 buffered_values[MAX_BUFFERED_VALUES]
intset_leaf_node * iter_node
intset_node * downlinks[MAX_INTERNAL_ITEMS]
uint64 values[MAX_INTERNAL_ITEMS]
leaf_item items[MAX_LEAF_ITEMS]