/* * Per-tuple callback from IndexBuildHeapScan */ static void hashbuildCallback(Relation index, HeapTuple htup, Datum *values, bool *isnull, bool tupleIsAlive, void *state) { HashBuildState *buildstate = (HashBuildState *) state; IndexTuple itup; /* Hash indexes don't index nulls, see notes in hashinsert */ if (isnull[0]) return; /* Either spool the tuple for sorting, or just put it into the index */ if (buildstate->spool) _h_spool(buildstate->spool, &htup->t_self, values, isnull); else { /* form an index tuple and point it at the heap tuple */ itup = _hash_form_tuple(index, values, isnull); itup->t_tid = htup->t_self; _hash_doinsert(index, itup); pfree(itup); } buildstate->indtuples += 1; }
/* * Per-tuple callback from IndexBuildHeapScan */ static void hashbuildCallback(Relation index, HeapTuple htup, Datum *values, bool *isnull, bool tupleIsAlive, void *state) { HashBuildState *buildstate = (HashBuildState *) state; Datum index_values[1]; bool index_isnull[1]; IndexTuple itup; /* convert data to a hash key; on failure, do not insert anything */ if (!_hash_convert_tuple(index, values, isnull, index_values, index_isnull)) return; /* Either spool the tuple for sorting, or just put it into the index */ if (buildstate->spool) _h_spool(buildstate->spool, &htup->t_self, index_values, index_isnull); else { /* form an index tuple and point it at the heap tuple */ itup = index_form_tuple(RelationGetDescr(index), index_values, index_isnull); itup->t_tid = htup->t_self; _hash_doinsert(index, itup, buildstate->heapRel); pfree(itup); } buildstate->indtuples += 1; }