diff --git a/CHANGELOG.md b/CHANGELOG.md index b40dc79..4d99402 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.6 (unreleased) + +- Fixed array to `sparsevec` cast not limiting to 16,000 non-zero elements + ## 0.8.5 (2026-07-08) - Reduced memory usage for small tables for IVFFlat index builds diff --git a/src/sparsevec.c b/src/sparsevec.c index c6bc50d..2e99ce9 100644 --- a/src/sparsevec.c +++ b/src/sparsevec.c @@ -745,6 +745,7 @@ array_to_sparsevec(PG_FUNCTION_ARGS) errmsg("unsupported array type"))); } + CheckNnz(nnz, nelemsp); result = InitSparseVector(nelemsp, nnz); values = SPARSEVEC_VALUES(result); diff --git a/test/expected/cast.out b/test/expected/cast.out index 9087653..58c418a 100644 --- a/test/expected/cast.out +++ b/test/expected/cast.out @@ -270,6 +270,8 @@ SELECT array_to_vector(array_agg(n), 16001, false) FROM generate_series(1, 16001 ERROR: vector cannot have more than 16000 dimensions SELECT array_agg(n)::halfvec FROM generate_series(1, 16001) n; ERROR: halfvec cannot have more than 16000 dimensions +SELECT array_agg(n)::sparsevec FROM generate_series(1, 16001) n; +ERROR: sparsevec cannot have more than 16000 non-zero elements -- ensure no error SELECT ARRAY[1,2,3] = ARRAY[1,2,3]; ?column? diff --git a/test/sql/cast.sql b/test/sql/cast.sql index c35799e..07746ff 100644 --- a/test/sql/cast.sql +++ b/test/sql/cast.sql @@ -77,6 +77,7 @@ SELECT '{{1}}'::real[]::sparsevec; SELECT array_agg(n)::vector FROM generate_series(1, 16001) n; SELECT array_to_vector(array_agg(n), 16001, false) FROM generate_series(1, 16001) n; SELECT array_agg(n)::halfvec FROM generate_series(1, 16001) n; +SELECT array_agg(n)::sparsevec FROM generate_series(1, 16001) n; -- ensure no error SELECT ARRAY[1,2,3] = ARRAY[1,2,3];