Datum * extractEntriesSU(GinState *ginstate, OffsetNumber attnum, Datum value, int32 *nentries) { bool needUnique; Datum *entries = extractEntriesS(ginstate, attnum, value, nentries, &needUnique); if (needUnique) { Datum *ptr, *res; ptr = res = entries; while (ptr - entries < *nentries) { if (compareEntries(ginstate, attnum, *ptr, *res) != 0) *(++res) = *ptr++; else ptr++; } *nentries = res + 1 - entries; } return entries; }
static void fillScanKey(GinState *ginstate, GinScanKey key, Datum query, Datum *entryValues, uint32 nEntryValues, StrategyNumber strategy) { uint32 i, j; key->nentries = nEntryValues; key->entryRes = (bool *) palloc0(sizeof(bool) * nEntryValues); key->scanEntry = (GinScanEntry) palloc(sizeof(GinScanEntryData) * nEntryValues); key->strategy = strategy; key->query = query; key->firstCall = TRUE; ItemPointerSet(&(key->curItem), InvalidBlockNumber, InvalidOffsetNumber); for (i = 0; i < nEntryValues; i++) { key->scanEntry[i].pval = key->entryRes + i; key->scanEntry[i].entry = entryValues[i]; ItemPointerSet(&(key->scanEntry[i].curItem), InvalidBlockNumber, InvalidOffsetNumber); key->scanEntry[i].offset = InvalidOffsetNumber; key->scanEntry[i].buffer = InvalidBuffer; key->scanEntry[i].list = NULL; key->scanEntry[i].nlist = 0; /* link to the equals entry in current scan key */ key->scanEntry[i].master = NULL; for (j = 0; j < i; j++) if (compareEntries(ginstate, entryValues[i], entryValues[j]) == 0) { key->scanEntry[i].master = key->scanEntry + j; break; } } }
int compareAttEntries(GinState *ginstate, OffsetNumber attnum_a, Datum a, OffsetNumber attnum_b, Datum b) { if (attnum_a == attnum_b) return compareEntries(ginstate, attnum_a, a, b); return (attnum_a < attnum_b) ? -1 : 1; }
/* * 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); }