From e91014f807b6f2981ee6d9cc43985fdf1912b953 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Tue, 25 Feb 2025 18:21:32 +0800 Subject: [PATCH] feat: show variables like --- include/common/tcommon.h | 2 +- include/common/tmsg.h | 7 ++-- include/util/tcompare.h | 1 + source/client/src/clientMsgHandler.c | 40 +++++++++++---------- source/common/src/msg/tmsg.c | 32 ++++++++++++++++- source/common/src/tmisce.c | 6 +++- source/dnode/mgmt/mgmt_dnode/src/dmHandle.c | 2 +- source/dnode/mnode/impl/src/mndConfig.c | 21 ++++++++--- source/libs/command/src/command.c | 28 ++++++++++----- source/libs/parser/inc/parAst.h | 1 + source/libs/parser/inc/sql.y | 6 ++-- source/libs/parser/src/parAstCreater.c | 16 +++++++++ source/libs/parser/src/parTranslater.c | 7 ++++ source/util/src/tcompare.c | 13 +++++++ 14 files changed, 141 insertions(+), 41 deletions(-) diff --git a/include/common/tcommon.h b/include/common/tcommon.h index bd5bdb927d..dae9eab31e 100644 --- a/include/common/tcommon.h +++ b/include/common/tcommon.h @@ -414,7 +414,7 @@ typedef struct STUidTagInfo { #define NOTIFY_EVENT_STR_COLUMN_INDEX 0 int32_t taosGenCrashJsonMsg(int signum, char** pMsg, int64_t clusterId, int64_t startTime); -int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol); +int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol, char* likePattern); #define TSMA_RES_STB_POSTFIX "_tsma_res_stb_" #define MD5_OUTPUT_LEN 32 diff --git a/include/common/tmsg.h b/include/common/tmsg.h index 6d58748a3b..305e6f02ed 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -2247,11 +2247,14 @@ typedef struct { } STagData; typedef struct { - int32_t useless; // useless + int32_t opType; + uint32_t valLen; + char* val; } SShowVariablesReq; int32_t tSerializeSShowVariablesReq(void* buf, int32_t bufLen, SShowVariablesReq* pReq); -// int32_t tDeserializeSShowVariablesReq(void* buf, int32_t bufLen, SShowVariablesReq* pReq); +int32_t tDeserializeSShowVariablesReq(void* buf, int32_t bufLen, SShowVariablesReq* pReq); +void tFreeSShowVariablesReq(SShowVariablesReq* pReq); typedef struct { char name[TSDB_CONFIG_OPTION_LEN + 1]; diff --git a/include/util/tcompare.h b/include/util/tcompare.h index c7a29cad57..09b35bbc8c 100644 --- a/include/util/tcompare.h +++ b/include/util/tcompare.h @@ -47,6 +47,7 @@ typedef struct SPatternCompareInfo { int32_t InitRegexCache(); void DestroyRegexCache(); +int32_t rawStrPatternMatch(const char *pattern, const char *str); int32_t patternMatch(const char *pattern, size_t psize, const char *str, size_t ssize, const SPatternCompareInfo *pInfo); int32_t checkRegexPattern(const char *pPattern); void DestoryThreadLocalRegComp(); diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c index 58ba39864d..d3a0aaca18 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -628,26 +628,30 @@ static int32_t buildShowVariablesRsp(SArray* pVars, SRetrieveTableRsp** pRsp) { (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows); (*pRsp)->numOfCols = htonl(SHOW_VARIABLES_RESULT_COLS); - int32_t len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, SHOW_VARIABLES_RESULT_COLS); - if (len < 0) { - uError("buildShowVariablesRsp error, len:%d", len); - code = terrno; - goto _exit; + int32_t len = 0; + if ((*pRsp)->numOfRows > 0) { + len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, SHOW_VARIABLES_RESULT_COLS); + if (len < 0) { + uError("buildShowVariablesRsp error, len:%d", len); + code = terrno; + goto _exit; + } + SET_PAYLOAD_LEN((*pRsp)->data, len, len); + + int32_t payloadLen = len + PAYLOAD_PREFIX_LEN; + (*pRsp)->payloadLen = htonl(payloadLen); + (*pRsp)->compLen = htonl(payloadLen); + + if (payloadLen != rspSize - sizeof(SRetrieveTableRsp)) { + uError("buildShowVariablesRsp error, len:%d != rspSize - sizeof(SRetrieveTableRsp):%" PRIu64, len, + (uint64_t)(rspSize - sizeof(SRetrieveTableRsp))); + code = TSDB_CODE_TSC_INVALID_INPUT; + goto _exit; + } } + blockDataDestroy(pBlock); - - SET_PAYLOAD_LEN((*pRsp)->data, len, len); - - int32_t payloadLen = len + PAYLOAD_PREFIX_LEN; - (*pRsp)->payloadLen = htonl(payloadLen); - (*pRsp)->compLen = htonl(payloadLen); - - if (payloadLen != rspSize - sizeof(SRetrieveTableRsp)) { - uError("buildShowVariablesRsp error, len:%d != rspSize - sizeof(SRetrieveTableRsp):%" PRIu64, len, - (uint64_t)(rspSize - sizeof(SRetrieveTableRsp))); - code = TSDB_CODE_TSC_INVALID_INPUT; - goto _exit; - } + pBlock = NULL; return TSDB_CODE_SUCCESS; _exit: diff --git a/source/common/src/msg/tmsg.c b/source/common/src/msg/tmsg.c index 6a3e1948c8..ea7d332344 100644 --- a/source/common/src/msg/tmsg.c +++ b/source/common/src/msg/tmsg.c @@ -5807,7 +5807,11 @@ int32_t tSerializeSShowVariablesReq(void *buf, int32_t bufLen, SShowVariablesReq tEncoderInit(&encoder, buf, bufLen); TAOS_CHECK_EXIT(tStartEncode(&encoder)); - TAOS_CHECK_EXIT(tEncodeI32(&encoder, pReq->useless)); + TAOS_CHECK_EXIT(tEncodeI32(&encoder, pReq->opType)); + TAOS_CHECK_EXIT(tEncodeI32(&encoder, pReq->valLen)); + if (pReq->valLen > 0) { + TAOS_CHECK_EXIT(tEncodeBinary(&encoder, (const uint8_t *)pReq->val, pReq->valLen)); + } tEndEncode(&encoder); _exit: @@ -5820,6 +5824,32 @@ _exit: return tlen; } +int32_t tDeserializeSShowVariablesReq(void *buf, int32_t bufLen, SShowVariablesReq *pReq) { + SDecoder decoder = {0}; + int32_t code = 0; + int32_t lino; + tDecoderInit(&decoder, buf, bufLen); + + TAOS_CHECK_EXIT(tStartDecode(&decoder)); + TAOS_CHECK_EXIT(tDecodeI32(&decoder, &pReq->opType)); + TAOS_CHECK_EXIT(tDecodeU32(&decoder, &pReq->valLen)); + if (pReq->valLen > 0) { + TAOS_CHECK_EXIT(tDecodeBinary(&decoder, (uint8_t **)&pReq->val, &pReq->valLen)); + } + + tEndDecode(&decoder); +_exit: + tDecoderClear(&decoder); + return code; +} + +void tFreeSShowVariablesReq(SShowVariablesReq *pReq) { + if (NULL != pReq && NULL != pReq->val) { + taosMemoryFree(pReq->val); + pReq->val = NULL; + } +} + int32_t tEncodeSVariablesInfo(SEncoder *pEncoder, SVariablesInfo *pInfo) { TAOS_CHECK_RETURN(tEncodeCStr(pEncoder, pInfo->name)); TAOS_CHECK_RETURN(tEncodeCStr(pEncoder, pInfo->value)); diff --git a/source/common/src/tmisce.c b/source/common/src/tmisce.c index a966513629..fbe3cba4c4 100644 --- a/source/common/src/tmisce.c +++ b/source/common/src/tmisce.c @@ -18,6 +18,7 @@ #include "tglobal.h" #include "tjson.h" #include "tmisce.h" +#include "tcompare.h" int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) { pEp->port = 0; @@ -257,7 +258,7 @@ _exit: TAOS_RETURN(code); } -int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) { +int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol, char* likePattern) { int32_t code = 0; SConfig* pConf = taosGetCfg(); if (pConf == NULL) { @@ -291,6 +292,9 @@ int32_t dumpConfToDataBlock(SSDataBlock* pBlock, int32_t startCol) { // GRANT_CFG_SKIP; char name[TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE] = {0}; + if (likePattern && rawStrPatternMatch(pItem->name, likePattern) != TSDB_PATTERN_MATCH) { + continue; + } STR_WITH_MAXSIZE_TO_VARSTR(name, pItem->name, TSDB_CONFIG_OPTION_LEN + VARSTR_HEADER_SIZE); SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, col++); diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c index 0a3543ac07..0bf18525fa 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -660,7 +660,7 @@ _exit: } int32_t dmAppendVariablesToBlock(SSDataBlock *pBlock, int32_t dnodeId) { - int32_t code = dumpConfToDataBlock(pBlock, 1); + int32_t code = dumpConfToDataBlock(pBlock, 1, NULL); if (code != 0) { return code; } diff --git a/source/dnode/mnode/impl/src/mndConfig.c b/source/dnode/mnode/impl/src/mndConfig.c index 099fff7aee..844cd74b6a 100644 --- a/source/dnode/mnode/impl/src/mndConfig.c +++ b/source/dnode/mnode/impl/src/mndConfig.c @@ -23,6 +23,7 @@ #include "mndTrans.h" #include "mndUser.h" #include "tutil.h" +#include "tcompare.h" #define CFG_VER_NUMBER 1 #define CFG_RESERVE_SIZE 63 @@ -807,7 +808,7 @@ static void cfgObjArrayCleanUp(SArray *array) { taosArrayDestroy(array); } -SArray *initVariablesFromItems(SArray *pItems) { +static SArray *initVariablesFromItems(SArray *pItems, const char* likePattern) { if (pItems == NULL) { return NULL; } @@ -823,6 +824,9 @@ SArray *initVariablesFromItems(SArray *pItems) { SConfigItem *pItem = taosArrayGet(pItems, i); SVariablesInfo info = {0}; tstrncpy(info.name, pItem->name, sizeof(info.name)); + if (likePattern != NULL && rawStrPatternMatch(pItem->name, likePattern) != TSDB_PATTERN_MATCH) { + continue; + } // init info value switch (pItem->dtype) { @@ -889,15 +893,23 @@ SArray *initVariablesFromItems(SArray *pItems) { static int32_t mndProcessShowVariablesReq(SRpcMsg *pReq) { SShowVariablesRsp rsp = {0}; - int32_t code = -1; + int32_t code = TSDB_CODE_SUCCESS; + SShowVariablesReq req = {0}; + SArray *array = NULL; + + code = tDeserializeSShowVariablesReq(pReq->pCont, pReq->contLen, &req); + if (code != 0) { + mError("failed to deserialize config req, since %s", terrstr()); + goto _OVER; + } if ((code = mndCheckOperPrivilege(pReq->info.node, pReq->info.conn.user, MND_OPER_SHOW_VARIABLES)) != 0) { goto _OVER; } SVariablesInfo info = {0}; - - rsp.variables = initVariablesFromItems(taosGetGlobalCfg(tsCfg)); + char *likePattern = req.opType == OP_TYPE_LIKE ? req.val : NULL; + rsp.variables = initVariablesFromItems(taosGetGlobalCfg(tsCfg), likePattern); if (rsp.variables == NULL) { code = terrno; goto _OVER; @@ -924,7 +936,6 @@ _OVER: if (code != 0) { mError("failed to get show variables info since %s", tstrerror(code)); } - tFreeSShowVariablesRsp(&rsp); TAOS_RETURN(code); } diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c index e0a917ace9..243f85ff47 100644 --- a/source/libs/command/src/command.c +++ b/source/libs/command/src/command.c @@ -20,6 +20,7 @@ #include "systable.h" #include "taosdef.h" #include "tdatablock.h" +#include "tdataformat.h" #include "tglobal.h" #include "tgrant.h" @@ -53,13 +54,16 @@ static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRe (*pRsp)->numOfRows = htobe64((int64_t)pBlock->info.rows); (*pRsp)->numOfCols = htonl(numOfCols); - int32_t len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, numOfCols); - if (len < 0) { - taosMemoryFree(*pRsp); - *pRsp = NULL; - return terrno; + int32_t len = 0; + if ((*pRsp)->numOfRows > 0) { + len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, numOfCols); + if (len < 0) { + taosMemoryFree(*pRsp); + *pRsp = NULL; + return terrno; + } + SET_PAYLOAD_LEN((*pRsp)->data, len, len); } - SET_PAYLOAD_LEN((*pRsp)->data, len, len); int32_t payloadLen = len + PAYLOAD_PREFIX_LEN; (*pRsp)->payloadLen = htonl(payloadLen); @@ -985,11 +989,17 @@ _exit: return terrno; } -static int32_t execShowLocalVariables(SRetrieveTableRsp** pRsp) { +static int32_t execShowLocalVariables(SShowStmt* pStmt, SRetrieveTableRsp** pRsp) { SSDataBlock* pBlock = NULL; + char* likePattern = NULL; int32_t code = buildLocalVariablesResultDataBlock(&pBlock); if (TSDB_CODE_SUCCESS == code) { - code = dumpConfToDataBlock(pBlock, 0); + if (pStmt->tableCondType == OP_TYPE_LIKE) { + likePattern = ((SValueNode*)pStmt->pTbName)->literal; + } + } + if (TSDB_CODE_SUCCESS == code) { + code = dumpConfToDataBlock(pBlock, 0, likePattern); } if (TSDB_CODE_SUCCESS == code) { code = buildRetrieveTableRsp(pBlock, SHOW_LOCAL_VARIABLES_RESULT_COLS, pRsp); @@ -1091,7 +1101,7 @@ int32_t qExecCommand(int64_t* pConnId, bool sysInfoUser, SNode* pStmt, SRetrieve case QUERY_NODE_ALTER_LOCAL_STMT: return execAlterLocal((SAlterLocalStmt*)pStmt); case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT: - return execShowLocalVariables(pRsp); + return execShowLocalVariables((SShowStmt*)pStmt, pRsp); case QUERY_NODE_SELECT_STMT: return execSelectWithoutFrom((SSelectStmt*)pStmt, pRsp); default: diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h index 65274f85e1..7d102d85fb 100644 --- a/source/libs/parser/inc/parAst.h +++ b/source/libs/parser/inc/parAst.h @@ -241,6 +241,7 @@ SNode* createUseDatabaseStmt(SAstCreateContext* pCxt, SToken* pDbName); SNode* setShowKind(SAstCreateContext* pCxt, SNode* pStmt, EShowKind showKind); SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type); SNode* createShowStmtWithFull(SAstCreateContext* pCxt, ENodeType type); +SNode* createShowStmtWithLike(SAstCreateContext* pCxt, ENodeType type, SNode* pLikePattern); SNode* createShowStmtWithCond(SAstCreateContext* pCxt, ENodeType type, SNode* pDbName, SNode* pTbName, EOperatorType tableCondType); SNode* createShowTablesStmt(SAstCreateContext* pCxt, SShowTablesOption option, SNode* pTbName, diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y index 42d2e95d24..ef2d57f1d6 100755 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -593,9 +593,9 @@ cmd ::= SHOW ENCRYPTIONS. cmd ::= SHOW QUERIES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); } cmd ::= SHOW SCORES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SCORES_STMT); } cmd ::= SHOW TOPICS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TOPICS_STMT); } -cmd ::= SHOW VARIABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } -cmd ::= SHOW CLUSTER VARIABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT); } -cmd ::= SHOW LOCAL VARIABLES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); } +cmd ::= SHOW VARIABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmtWithLike(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT, B); } +cmd ::= SHOW CLUSTER VARIABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmtWithLike(pCxt, QUERY_NODE_SHOW_VARIABLES_STMT, B); } +cmd ::= SHOW LOCAL VARIABLES like_pattern_opt(B). { pCxt->pRootNode = createShowStmtWithLike(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT, B); } cmd ::= SHOW DNODE NK_INTEGER(A) VARIABLES like_pattern_opt(B). { pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A), B); } cmd ::= SHOW BNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); } cmd ::= SHOW SNODES. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SNODES_STMT); } diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c index 341fc7e603..bd93dc2fea 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -2747,6 +2747,22 @@ static bool needDbShowStmt(ENodeType type) { QUERY_NODE_SHOW_VIEWS_STMT == type || QUERY_NODE_SHOW_TSMAS_STMT == type || QUERY_NODE_SHOW_USAGE_STMT == type; } +SNode* createShowStmtWithLike(SAstCreateContext* pCxt, ENodeType type, SNode* pLikePattern) { + CHECK_PARSER_STATUS(pCxt); + SShowStmt* pStmt = NULL; + pCxt->errCode = nodesMakeNode(type, (SNode**)&pStmt); + CHECK_MAKE_NODE(pStmt); + pStmt->withFull = false; + pStmt->pTbName = pLikePattern; + if (pLikePattern) { + pStmt->tableCondType = OP_TYPE_LIKE; + } + return (SNode*)pStmt; +_err: + nodesDestroyNode(pLikePattern); + return NULL; +} + SNode* createShowStmt(SAstCreateContext* pCxt, ENodeType type) { CHECK_PARSER_STATUS(pCxt); SShowStmt* pStmt = NULL; diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 2fdba9bad9..0815b443a7 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -13244,6 +13244,13 @@ static int32_t translateSplitVgroup(STranslateContext* pCxt, SSplitVgroupStmt* p static int32_t translateShowVariables(STranslateContext* pCxt, SShowStmt* pStmt) { SShowVariablesReq req = {0}; + req.opType = pStmt->tableCondType; + if (req.opType == OP_TYPE_LIKE && pStmt->pTbName) { + req.valLen = strlen(((SValueNode*)pStmt->pTbName)->literal); + if (req.valLen > 0) { + req.val = taosStrdupi(((SValueNode*)pStmt->pTbName)->literal); + } + } return buildCmdMsg(pCxt, TDMT_MND_SHOW_VARIABLES, (FSerializeFunc)tSerializeSShowVariablesReq, &req); } diff --git a/source/util/src/tcompare.c b/source/util/src/tcompare.c index c95030b06e..a253c58415 100644 --- a/source/util/src/tcompare.c +++ b/source/util/src/tcompare.c @@ -1123,6 +1123,19 @@ int32_t patternMatch(const char *pattern, size_t psize, const char *str, size_t return (j >= ssize || str[j] == 0) ? TSDB_PATTERN_MATCH : TSDB_PATTERN_NOMATCH; } +int32_t rawStrPatternMatch(const char *str, const char *pattern) { + SPatternCompareInfo pInfo = PATTERN_COMPARE_INFO_INITIALIZER; + + size_t pLen = strlen(pattern); + size_t sz = strlen(str); + if (pLen > TSDB_MAX_FIELD_LEN) { + return 1; + } + + int32_t ret = patternMatch(pattern, pLen, str, sz, &pInfo); + return (ret == TSDB_PATTERN_MATCH) ? 0 : 1; +} + int32_t wcsPatternMatch(const TdUcs4 *pattern, size_t psize, const TdUcs4 *str, size_t ssize, const SPatternCompareInfo *pInfo) { TdUcs4 c, c1;