Compare commits

...

5 Commits

Author SHA1 Message Date
Andrew Kane
434ef7a5ab Updated SparsevecInnerProduct [skip ci] 2026-03-17 14:31:58 -07:00
Andrew Kane
17916cad00 Improved includes [skip ci] 2026-02-25 17:35:23 -08:00
Andrew Kane
284f2f0fec Improved casting for HNSW scan memory limit [skip ci] 2026-02-25 12:59:17 -08:00
Andrew Kane
edd49863ba Improved limit for HNSW scan memory 2026-02-25 12:52:29 -08:00
Andrew Kane
411291189d Updated changelog [skip ci] 2026-02-25 11:28:43 -08:00
4 changed files with 18 additions and 18 deletions

View File

@@ -1,6 +1,6 @@
## 0.8.2 (2026-02-25)
- Fixed buffer overflow with parallel HNSW index build
- Fixed buffer overflow with parallel HNSW index build - [more info](https://github.com/pgvector/pgvector/issues/959)
- Improved `install` target on Windows
- Fixed `Index Searches` in `EXPLAIN` output for Postgres 18

View File

@@ -36,6 +36,8 @@
*/
#include "postgres.h"
#include <limits.h>
#include "access/genam.h"
#include "access/parallel.h"
#include "access/relscan.h"

View File

@@ -1,5 +1,7 @@
#include "postgres.h"
#include <limits.h>
#include "access/genam.h"
#include "access/relscan.h"
#include "hnsw.h"
@@ -151,7 +153,7 @@ hnswbeginscan(Relation index, int nkeys, int norderbys)
/* Calculate max memory */
/* Add 256 extra bytes to fill last block when close */
maxMemory = (double) work_mem * hnsw_scan_mem_multiplier * 1024.0 + 256;
so->maxMemory = Min(maxMemory, (double) SIZE_MAX);
so->maxMemory = Min(maxMemory, (double) (SIZE_MAX / 2));
scan->opaque = so;

View File

@@ -895,28 +895,24 @@ SparsevecInnerProduct(SparseVector * a, SparseVector * b)
float *ax = SPARSEVEC_VALUES(a);
float *bx = SPARSEVEC_VALUES(b);
float distance = 0.0;
int bpos = 0;
int i = 0;
int j = 0;
for (int i = 0; i < a->nnz; i++)
while (i < a->nnz && j < b->nnz)
{
int ai = a->indices[i];
int bi = b->indices[j];
for (int j = bpos; j < b->nnz; j++)
if (ai == bi)
{
int bi = b->indices[j];
/* Only update when the same index */
if (ai == bi)
distance += ax[i] * bx[j];
/* Update start for next iteration */
if (ai >= bi)
bpos = j + 1;
/* Found or passed it */
if (bi >= ai)
break;
distance += ax[i] * bx[j];
i++;
j++;
}
else if (ai < bi)
i++;
else
j++;
}
return distance;