From a9e5699a4d309826885d955d25330221a90edd4a Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 11 Nov 2024 15:23:41 +0800 Subject: [PATCH] enh: add more error case handle code --- include/util/taoserror.h | 1 + source/libs/parser/src/parAstCreater.c | 2 ++ source/libs/parser/src/parTranslater.c | 47 ++++++++++++++++++-------- source/util/src/terror.c | 1 + 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 2c811495fd..eefd2061c4 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -895,6 +895,7 @@ int32_t taosGetErrSize(); #define TSDB_CODE_PAR_INVALID_ANOMALY_WIN_COL TAOS_DEF_ERROR_CODE(0, 0x2683) #define TSDB_CODE_PAR_INVALID_ANOMALY_WIN_OPT TAOS_DEF_ERROR_CODE(0, 0x2684) #define TSDB_CODE_PAR_INVALID_FORECAST_CLAUSE TAOS_DEF_ERROR_CODE(0, 0x2685) +#define TSDB_CODE_PAR_INVALID_VGID_LIST TAOS_DEF_ERROR_CODE(0, 0x2686) #define TSDB_CODE_PAR_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x26FF) //planner diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index e0f88442ed..8774cebe41 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -2132,6 +2132,8 @@ SNode* createCompactVgroupsStmt(SAstCreateContext* pCxt, SNode* pDbName, SNodeLi pStmt->pEnd = pEnd; return (SNode*)pStmt; _err: + nodesDestroyNode(pDbName); + nodesDestroyList(vgidList); nodesDestroyNode(pStart); nodesDestroyNode(pEnd); return NULL; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index d47669a084..c69fbcf67d 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -10449,30 +10449,49 @@ static int32_t translateCompactDb(STranslateContext* pCxt, SCompactDatabaseStmt* } static int32_t translateVgroupList(STranslateContext* pCxt, SNodeList* vgroupList, SArray** ppVgroups) { - int32_t code = TSDB_CODE_SUCCESS; - - int32_t numOfVgroups = LIST_LENGTH(vgroupList); + int32_t code = TSDB_CODE_SUCCESS; + SHashObj* pHash = NULL; + int32_t numOfVgroups = LIST_LENGTH(vgroupList); (*ppVgroups) = taosArrayInit(numOfVgroups, sizeof(int64_t)); if (NULL == *ppVgroups) { return terrno; } - SNode* pNode = NULL; - FOREACH(pNode, vgroupList) { - SValueNode* pVal = (SValueNode*)pNode; - if (DEAL_RES_ERROR == translateValue(pCxt, pVal)) { - code = TSDB_CODE_VND_INVALID_VGROUP_ID; - break; - } + pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK); + if (NULL == pHash) { + code = terrno; + } - int64_t vgroupId = getBigintFromValueNode(pVal); - if (NULL == taosArrayPush(*ppVgroups, &vgroupId)) { - code = terrno; - break; + if (TSDB_CODE_SUCCESS == code) { + SNode* pNode = NULL; + FOREACH(pNode, vgroupList) { + SValueNode* pVal = (SValueNode*)pNode; + if (DEAL_RES_ERROR == translateValue(pCxt, pVal)) { + code = TSDB_CODE_VND_INVALID_VGROUP_ID; + break; + } + + int64_t vgroupId = getBigintFromValueNode(pVal); + + if (NULL != taosHashGet(pHash, &vgroupId, sizeof(vgroupId))) { + code = TSDB_CODE_PAR_INVALID_VGID_LIST; + break; + } + + code = taosHashPut(pHash, &vgroupId, sizeof(vgroupId), NULL, 0); + if (code) { + break; + } + + if (NULL == taosArrayPush(*ppVgroups, &vgroupId)) { + code = terrno; + break; + } } } + taosHashCleanup(pHash); if (code) { taosArrayDestroy(*ppVgroups); *ppVgroups = NULL; diff --git a/source/util/src/terror.c b/source/util/src/terror.c index 0d8a85155a..30ef3ae481 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -739,6 +739,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_ANOMALY_WIN_COL, "ANOMALY_WINDOW not TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_ANOMALY_WIN_OPT, "ANOMALY_WINDOW option should include algo field") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_FORECAST_CLAUSE, "Invalid forecast clause") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_REGULAR_EXPRESSION_ERROR, "Syntax error in regular expression") +TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INVALID_VGID_LIST, "Invalid vgid list") TAOS_DEFINE_ERROR(TSDB_CODE_PAR_INTERNAL_ERROR, "Parser internal error") //planner