/* * Find/store one entry from indexed value. */ static void ginInsertEntry(BuildAccumulator *accum, ItemPointer heapptr, Datum entry) { EntryAccumulator *ea = accum->entries, *pea = NULL; int res = 0; uint32 depth = 1; while (ea) { res = compareEntries(accum->ginstate, entry, ea->value); if (res == 0) break; /* found */ else { pea = ea; if (res < 0) ea = ea->left; else ea = ea->right; } depth++; } if (depth > accum->maxdepth) accum->maxdepth = depth; if (ea == NULL) { ea = EAAllocate(accum); ea->left = ea->right = NULL; ea->value = getDatumCopy(accum, entry); ea->length = DEF_NPTR; ea->number = 1; ea->shouldSort = FALSE; ea->list = (ItemPointerData *) palloc(sizeof(ItemPointerData) * DEF_NPTR); ea->list[0] = *heapptr; accum->allocatedMemory += sizeof(ItemPointerData) * DEF_NPTR; if (pea == NULL) accum->entries = ea; else { Assert(res != 0); if (res < 0) pea->left = ea; else pea->right = ea; } } else ginInsertData(accum, ea, heapptr); }
/* * Find/store one entry from indexed value. */ static void ginInsertBAEntry(BuildAccumulator *accum, ItemPointer heapptr, OffsetNumber attnum, Datum key, GinNullCategory category) { GinEntryAccumulator eatmp; GinEntryAccumulator *ea; bool isNew; /* * For the moment, fill only the fields of eatmp that will be looked at by * cmpEntryAccumulator or ginCombineData. */ eatmp.attnum = attnum; eatmp.key = key; eatmp.category = category; /* temporarily set up single-entry itempointer list */ eatmp.list = heapptr; ea = (GinEntryAccumulator *) rb_insert(accum->tree, (RBNode *) &eatmp, &isNew); if (isNew) { /* * Finish initializing new tree entry, including making permanent * copies of the datum (if it's not null) and itempointer. */ if (category == GIN_CAT_NORM_KEY) ea->key = getDatumCopy(accum, attnum, key); ea->maxcount = DEF_NPTR; ea->count = 1; ea->shouldSort = FALSE; ea->list = (ItemPointerData *) palloc(sizeof(ItemPointerData) * DEF_NPTR); ea->list[0] = *heapptr; accum->allocatedMemory += GetMemoryChunkSpace(ea->list); } else { /* * ginCombineData did everything needed. */ } }
/* * Find/store one entry from indexed value. */ static void ginInsertEntry(BuildAccumulator *accum, ItemPointer heapptr, OffsetNumber attnum, Datum entry) { EntryAccumulator key; EntryAccumulator *ea; bool isNew; /* * For the moment, fill only the fields of key that will be looked at * by cmpEntryAccumulator or ginCombineData. */ key.attnum = attnum; key.value = entry; /* temporarily set up single-entry itempointer list */ key.list = heapptr; ea = (EntryAccumulator *) rb_insert(accum->tree, (RBNode *) &key, &isNew); if (isNew) { /* * Finish initializing new tree entry, including making permanent * copies of the datum and itempointer. */ ea->value = getDatumCopy(accum, attnum, entry); ea->length = DEF_NPTR; ea->number = 1; ea->shouldSort = FALSE; ea->list = (ItemPointerData *) palloc(sizeof(ItemPointerData) * DEF_NPTR); ea->list[0] = *heapptr; accum->allocatedMemory += GetMemoryChunkSpace(ea->list); } else { /* * ginCombineData did everything needed. */ } }