diff --git a/src/ivfflat.c b/src/ivfflat.c index 35c0e48..3004e40 100644 --- a/src/ivfflat.c +++ b/src/ivfflat.c @@ -13,6 +13,7 @@ #endif int ivfflat_probes; +int ivfflat_bound; static relopt_kind ivfflat_relopt_kind; /* @@ -32,6 +33,10 @@ _PG_init(void) DefineCustomIntVariable("ivfflat.probes", "Sets the number of probes", "Valid range is 1..lists.", &ivfflat_probes, 1, 1, IVFFLAT_MAX_LISTS, PGC_USERSET, 0, NULL, NULL, NULL); + + DefineCustomIntVariable("ivfflat.bound", "Sets the max results from index (experimental)", + NULL, &ivfflat_bound, + 0, 0, INT_MAX, PGC_USERSET, 0, NULL, NULL, NULL); } /* diff --git a/src/ivfflat.h b/src/ivfflat.h index 1337941..7ed0516 100644 --- a/src/ivfflat.h +++ b/src/ivfflat.h @@ -69,6 +69,7 @@ /* Variables */ extern int ivfflat_probes; +extern int ivfflat_bound; typedef struct VectorArrayData { diff --git a/src/ivfscan.c b/src/ivfscan.c index dfd52af..41ea550 100644 --- a/src/ivfscan.c +++ b/src/ivfscan.c @@ -111,6 +111,10 @@ GetScanItems(IndexScanDesc scan, Datum value) */ BufferAccessStrategy bas = GetAccessStrategy(BAS_BULKREAD); + /* Set the max number of results */ + if (ivfflat_bound > 0) + tuplesort_set_bound(so->sortstate, ivfflat_bound); + /* Search closest probes lists */ for (i = 0; i < so->probes; i++) {