diff --git a/src/hnsw.h b/src/hnsw.h index 3c3d1b1..6c0fc0d 100644 --- a/src/hnsw.h +++ b/src/hnsw.h @@ -407,6 +407,7 @@ void HnswInitLockTranche(void); const HnswTypeInfo *HnswGetTypeInfo(Relation index); PGDLLEXPORT void HnswParallelBuildMain(dsm_segment *seg, shm_toc *toc); void HnswInitProcinfo(FmgrInfo **procinfo, Oid **collation, Relation index); +Size HnswGetElementTupleSize(char *base, HnswElement element, bool useIndexTuple); bool HnswIndexTupleIsEqual(IndexTuple a, IndexTuple b, TupleDesc tupdesc); /* Index access methods */ diff --git a/src/hnswbuild.c b/src/hnswbuild.c index adf32f3..7fc77dc 100644 --- a/src/hnswbuild.c +++ b/src/hnswbuild.c @@ -176,7 +176,7 @@ CreateGraphPages(HnswBuildState * buildstate) MemSet(etup, 0, HNSW_TUPLE_ALLOC_SIZE); /* Calculate sizes */ - etupSize = HNSW_ELEMENT_TUPLE_SIZE(useIndexTuple ? IndexTupleSize(HnswPtrAccess(base, element->itup)) : VARSIZE_ANY(HnswPtrAccess(base, element->value))); + etupSize = HnswGetElementTupleSize(base, element, useIndexTuple); ntupSize = HNSW_NEIGHBOR_TUPLE_SIZE(element->level, buildstate->m); combinedSize = etupSize + ntupSize + sizeof(ItemIdData); diff --git a/src/hnswinsert.c b/src/hnswinsert.c index 7759f1d..7467117 100644 --- a/src/hnswinsert.c +++ b/src/hnswinsert.c @@ -157,7 +157,7 @@ AddElementOnDisk(Relation index, HnswElement e, int m, BlockNumber insertPage, B bool useIndexTuple = HnswUseIndexTuple(index); /* Calculate sizes */ - etupSize = HNSW_ELEMENT_TUPLE_SIZE(useIndexTuple ? IndexTupleSize(HnswPtrAccess(base, e->itup)) : VARSIZE_ANY(HnswPtrAccess(base, e->value))); + etupSize = HnswGetElementTupleSize(base, e, useIndexTuple); ntupSize = HNSW_NEIGHBOR_TUPLE_SIZE(e->level, m); combinedSize = etupSize + ntupSize + sizeof(ItemIdData); maxSize = HNSW_MAX_SIZE; diff --git a/src/hnswutils.c b/src/hnswutils.c index 233d54c..4e86e1c 100644 --- a/src/hnswutils.c +++ b/src/hnswutils.c @@ -167,6 +167,30 @@ HnswInitProcinfo(FmgrInfo **procinfo, Oid **collation, Relation index) *collation = index->rd_indcollation; } +/* + * Get element tuple size + */ +Size +HnswGetElementTupleSize(char *base, HnswElement element, bool useIndexTuple) +{ + Size size; + + if (useIndexTuple) + { + IndexTuple itup = HnswPtrAccess(base, element->itup); + + size = IndexTupleSize(itup); + } + else + { + Pointer valuePtr = HnswPtrAccess(base, element->value); + + size = VARSIZE_ANY(valuePtr); + } + + return HNSW_ELEMENT_TUPLE_SIZE(size); +} + /* * Normalize value */