From 7117513532e476f1af2e0b49a8a8fc5f8dfc2e89 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Fri, 20 Sep 2024 04:04:23 +0300 Subject: [PATCH] Add error codes to a few errors (#657) With elog(), you get XX000 "internal_error", which sounds scary. It's not self-evident what the right error codes for some of these errors are, but I tried to use my best judgment. --- src/hnswbuild.c | 20 +++++++++++++++----- src/hnswutils.c | 4 +++- src/ivfbuild.c | 16 ++++++++++++---- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/hnswbuild.c b/src/hnswbuild.c index 727eec3..8bd0b4a 100644 --- a/src/hnswbuild.c +++ b/src/hnswbuild.c @@ -192,7 +192,9 @@ CreateGraphPages(HnswBuildState * buildstate) /* Initial size check */ if (etupSize > HNSW_TUPLE_ALLOC_SIZE) - elog(ERROR, "index tuple too large"); + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("index tuple too large"))); HnswSetElementTuple(base, etup, element); @@ -696,17 +698,25 @@ InitBuildState(HnswBuildState * buildstate, Relation heap, Relation index, Index /* Disallow varbit since require fixed dimensions */ if (TupleDescAttr(index->rd_att, 0)->atttypid == VARBITOID) - elog(ERROR, "type not supported for hnsw index"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("type not supported for hnsw index"))); /* Require column to have dimensions to be indexed */ if (buildstate->dimensions < 0) - elog(ERROR, "column does not have dimensions"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("column does not have dimensions"))); if (buildstate->dimensions > buildstate->typeInfo->maxDimensions) - elog(ERROR, "column cannot have more than %d dimensions for hnsw index", buildstate->typeInfo->maxDimensions); + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("column cannot have more than %d dimensions for hnsw index", buildstate->typeInfo->maxDimensions))); if (buildstate->efConstruction < 2 * buildstate->m) - elog(ERROR, "ef_construction must be greater than or equal to 2 * m"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("ef_construction must be greater than or equal to 2 * m"))); buildstate->reltuples = 0; buildstate->indtuples = 0; diff --git a/src/hnswutils.c b/src/hnswutils.c index 446a8a1..53e3096 100644 --- a/src/hnswutils.c +++ b/src/hnswutils.c @@ -1369,7 +1369,9 @@ SparsevecCheckValue(Pointer v) SparseVector *vec = (SparseVector *) v; if (vec->nnz > HNSW_MAX_NNZ) - elog(ERROR, "sparsevec cannot have more than %d non-zero elements for hnsw index", HNSW_MAX_NNZ); + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("sparsevec cannot have more than %d non-zero elements for hnsw index", HNSW_MAX_NNZ))); } /* diff --git a/src/ivfbuild.c b/src/ivfbuild.c index 3c52278..5333588 100644 --- a/src/ivfbuild.c +++ b/src/ivfbuild.c @@ -335,14 +335,20 @@ InitBuildState(IvfflatBuildState * buildstate, Relation heap, Relation index, In /* Disallow varbit since require fixed dimensions */ if (TupleDescAttr(index->rd_att, 0)->atttypid == VARBITOID) - elog(ERROR, "type not supported for ivfflat index"); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("type not supported for ivfflat index"))); /* Require column to have dimensions to be indexed */ if (buildstate->dimensions < 0) - elog(ERROR, "column does not have dimensions"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("column does not have dimensions"))); if (buildstate->dimensions > buildstate->typeInfo->maxDimensions) - elog(ERROR, "column cannot have more than %d dimensions for ivfflat index", buildstate->typeInfo->maxDimensions); + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("column cannot have more than %d dimensions for ivfflat index", buildstate->typeInfo->maxDimensions))); buildstate->reltuples = 0; buildstate->indtuples = 0; @@ -355,7 +361,9 @@ InitBuildState(IvfflatBuildState * buildstate, Relation heap, Relation index, In /* Require more than one dimension for spherical k-means */ if (buildstate->kmeansnormprocinfo != NULL && buildstate->dimensions == 1) - elog(ERROR, "dimensions must be greater than one for this opclass"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("dimensions must be greater than one for this opclass"))); /* Create tuple description for sorting */ buildstate->tupdesc = CreateTemplateTupleDesc(3);