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) ## 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 - Improved `install` target on Windows
- Fixed `Index Searches` in `EXPLAIN` output for Postgres 18 - Fixed `Index Searches` in `EXPLAIN` output for Postgres 18

View File

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

View File

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

View File

@@ -895,28 +895,24 @@ SparsevecInnerProduct(SparseVector * a, SparseVector * b)
float *ax = SPARSEVEC_VALUES(a); float *ax = SPARSEVEC_VALUES(a);
float *bx = SPARSEVEC_VALUES(b); float *bx = SPARSEVEC_VALUES(b);
float distance = 0.0; 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 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]; distance += ax[i] * bx[j];
i++;
/* Only update when the same index */ j++;
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;
} }
else if (ai < bi)
i++;
else
j++;
} }
return distance; return distance;