diff --git a/src/sparsevec.c b/src/sparsevec.c index 22649cd..6e48f91 100644 --- a/src/sparsevec.c +++ b/src/sparsevec.c @@ -70,6 +70,11 @@ CheckNnz(int nnz, int dim) (errcode(ERRCODE_DATA_EXCEPTION), errmsg("sparsevec must have at least one element"))); + if (nnz > SPARSEVEC_MAX_NNZ) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("sparsevec cannot have more than %d non-zero elements", SPARSEVEC_MAX_NNZ))); + if (nnz > dim) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), @@ -190,6 +195,11 @@ sparsevec_in(PG_FUNCTION_ARGS) pt++; } + if (maxNnz > SPARSEVEC_MAX_NNZ) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("sparsevec cannot have more than %d non-zero elements", SPARSEVEC_MAX_NNZ))); + indices = palloc(maxNnz * sizeof(int32)); values = palloc(maxNnz * sizeof(float)); diff --git a/src/sparsevec.h b/src/sparsevec.h index 673c5b0..1d79957 100644 --- a/src/sparsevec.h +++ b/src/sparsevec.h @@ -2,6 +2,7 @@ #define SPARSEVEC_H #define SPARSEVEC_MAX_DIM 100000 +#define SPARSEVEC_MAX_NNZ 16000 /* Ensure values are aligned */ #define SPARSEVEC_SIZE(_nnz) (offsetof(SparseVector, indices) + MAXALIGN((_nnz) * sizeof(int32)) + (_nnz * sizeof(float)))