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 1/5] 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; From 36bec2c9585fc016d95e7bb9b963dbc0db23ebd4 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Tue, 25 Feb 2025 23:18:13 +0800 Subject: [PATCH 2/5] fix: rows --- source/libs/command/src/command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c index 243f85ff47..1458164e28 100644 --- a/source/libs/command/src/command.c +++ b/source/libs/command/src/command.c @@ -55,7 +55,7 @@ static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRe (*pRsp)->numOfCols = htonl(numOfCols); int32_t len = 0; - if ((*pRsp)->numOfRows > 0) { + if (pBlock->info.rows > 0) { len = blockEncode(pBlock, (*pRsp)->data + PAYLOAD_PREFIX_LEN, dataEncodeBufSize, numOfCols); if (len < 0) { taosMemoryFree(*pRsp); From 6da2e6f54722a0386d7a60b4c66c43cd5890cec2 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Sun, 2 Mar 2025 22:45:58 +0800 Subject: [PATCH 3/5] fix: test case --- source/common/src/msg/tmsg.c | 7 ++- source/dnode/mnode/impl/src/mndConfig.c | 1 + source/libs/parser/src/parTranslater.c | 4 +- tests/system-test/2-query/db.py | 60 +++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/source/common/src/msg/tmsg.c b/source/common/src/msg/tmsg.c index ea7d332344..85a5c8dbeb 100644 --- a/source/common/src/msg/tmsg.c +++ b/source/common/src/msg/tmsg.c @@ -5833,8 +5833,13 @@ int32_t tDeserializeSShowVariablesReq(void *buf, int32_t bufLen, SShowVariablesR 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)); + pReq->val = taosMemoryCalloc(1, pReq->valLen + 1); + if (pReq->val == NULL) { + TAOS_CHECK_EXIT(terrno); + } + TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->val)); } tEndDecode(&decoder); diff --git a/source/dnode/mnode/impl/src/mndConfig.c b/source/dnode/mnode/impl/src/mndConfig.c index 844cd74b6a..16d1bb5a5f 100644 --- a/source/dnode/mnode/impl/src/mndConfig.c +++ b/source/dnode/mnode/impl/src/mndConfig.c @@ -936,6 +936,7 @@ _OVER: if (code != 0) { mError("failed to get show variables info since %s", tstrerror(code)); } + tFreeSShowVariablesReq(&req); tFreeSShowVariablesRsp(&rsp); TAOS_RETURN(code); } diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c index 0815b443a7..edbf724a75 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -13251,7 +13251,9 @@ static int32_t translateShowVariables(STranslateContext* pCxt, SShowStmt* pStmt) req.val = taosStrdupi(((SValueNode*)pStmt->pTbName)->literal); } } - return buildCmdMsg(pCxt, TDMT_MND_SHOW_VARIABLES, (FSerializeFunc)tSerializeSShowVariablesReq, &req); + int32_t code = buildCmdMsg(pCxt, TDMT_MND_SHOW_VARIABLES, (FSerializeFunc)tSerializeSShowVariablesReq, &req); + tFreeSShowVariablesReq(&req); + return code; } static int32_t translateShowCreateDatabase(STranslateContext* pCxt, SShowCreateDatabaseStmt* pStmt) { diff --git a/tests/system-test/2-query/db.py b/tests/system-test/2-query/db.py index f380fdf00b..3408f02e8b 100644 --- a/tests/system-test/2-query/db.py +++ b/tests/system-test/2-query/db.py @@ -85,7 +85,59 @@ class TDTestCase: tdSql.checkData(0, 0, 1) tdSql.checkData(0, 1, 's3UploadDelaySec') tdSql.checkData(0, 2, 60) + + def show_local_variables_like(self): + tdSql.query("show local variables") + tdSql.checkRows(85) + tdSql.query("show local variables like 'debugFlag'") + tdSql.checkRows(1) + tdSql.checkData(0, 0, 'debugFlag') + tdSql.checkData(0, 1, 0) + + tdSql.query("show local variables like '%debugFlag'") + tdSql.checkRows(9) + + tdSql.query("show local variables like '____debugFlag'") + tdSql.checkRows(0) + + tdSql.query("show local variables like 's3MigrateEnab%'") + tdSql.checkRows(0) + + tdSql.query("show local variables like 'mini%'") + tdSql.checkRows(3) + tdSql.checkData(0, 0, 'minimalTmpDirGB') + + tdSql.query("show local variables like '%info'") + tdSql.checkRows(2) + + def show_cluster_variables_like(self): + zones = ["", "cluster"] + for zone in zones: + tdLog.info(f"show {zone} variables") + tdSql.query(f"show {zone} variables") + tdSql.checkRows(87) + + tdLog.info(f"show {zone} variables like 'debugFlag'") + #tdSql.query(f"show {zone} variables like 'debugFlag'") + #tdSql.checkRows(0) + + tdSql.query(f"show {zone} variables like 's3%'") + tdSql.checkRows(6) + + tdSql.query(f"show {zone} variables like 'Max%'") + tdSql.checkRows(3) + + tdSql.query(f"show {zone} variables like 'ttl%'") + tdSql.checkRows(5) + + tdSql.query(f"show {zone} variables like 'ttl34343434%'") + tdSql.checkRows(0) + + tdSql.query(f"show {zone} variables like 'jdlkfdjdfkdfnldlfdnfkdkfdmfdlfmnnnnnjkjk'") + tdSql.checkRows(0) + + def threadTest(self, threadID): print(f"Thread {threadID} starting...") tdsqln = tdCom.newTdSql() @@ -127,6 +179,14 @@ class TDTestCase: tdLog.printNoPrefix("==========start case3 run ...............") self.case3() tdLog.printNoPrefix("==========end case3 run ...............") + + tdLog.printNoPrefix("==========start show_local_variables_like run ...............") + self.show_local_variables_like() + tdLog.printNoPrefix("==========end show_local_variables_like run ...............") + + tdLog.printNoPrefix("==========start show_cluster_variables_like run ...............") + self.show_cluster_variables_like() + tdLog.printNoPrefix("==========end show_cluster_variables_like run ...............") def stop(self): tdSql.close() From 2e64d8578e2889523f5e24c8bafdde10e027f849 Mon Sep 17 00:00:00 2001 From: factosea <285808407@qq.com> Date: Thu, 6 Mar 2025 15:59:58 +0800 Subject: [PATCH 4/5] feat: doc desc --- docs/en/14-reference/03-taos-sql/24-show.md | 9 +++++---- docs/zh/14-reference/03-taos-sql/24-show.md | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/en/14-reference/03-taos-sql/24-show.md b/docs/en/14-reference/03-taos-sql/24-show.md index b46fb41fa0..589caab39d 100644 --- a/docs/en/14-reference/03-taos-sql/24-show.md +++ b/docs/en/14-reference/03-taos-sql/24-show.md @@ -127,10 +127,11 @@ Displays created indexes. ## SHOW LOCAL VARIABLES ```sql -SHOW LOCAL VARIABLES; +SHOW LOCAL VARIABLES [like pattern]; ``` Displays the runtime values of configuration parameters for the current client. +You can use the like pattern to filter by name. ## SHOW MNODES @@ -320,11 +321,11 @@ Displays information about all users in the current system, including user-defin ## SHOW CLUSTER VARIABLES (before version 3.0.1.6 it was SHOW VARIABLES) ```sql -SHOW CLUSTER VARIABLES; -SHOW DNODE dnode_id VARIABLES; +SHOW CLUSTER VARIABLES [like pattern]; +SHOW DNODE dnode_id VARIABLES [like pattern]; ``` -Displays the runtime values of configuration parameters that need to be the same across nodes in the current system, or you can specify a DNODE to view its configuration parameters. +Displays the runtime values of configuration parameters that need to be the same across nodes in the current system, or you can specify a DNODE to view its configuration parameters. And you can use the like pattern to filter by name. ## SHOW VGROUPS diff --git a/docs/zh/14-reference/03-taos-sql/24-show.md b/docs/zh/14-reference/03-taos-sql/24-show.md index 3898920e65..622cc544b2 100644 --- a/docs/zh/14-reference/03-taos-sql/24-show.md +++ b/docs/zh/14-reference/03-taos-sql/24-show.md @@ -128,10 +128,10 @@ SHOW INDEXES FROM [db_name.]tbl_name; ## SHOW LOCAL VARIABLES ```sql -SHOW LOCAL VARIABLES; +SHOW LOCAL VARIABLES [like pattern]; ``` -显示当前客户端配置参数的运行值。 +显示当前客户端配置参数的运行值,可使用 like pattern 根据 name 进行过滤。 ## SHOW MNODES @@ -322,11 +322,12 @@ SHOW USERS; ## SHOW CLUSTER VARIABLES(3.0.1.6 之前为 SHOW VARIABLES) ```sql -SHOW CLUSTER VARIABLES; -SHOW DNODE dnode_id VARIABLES; +SHOW CLUSTER VARIABLES [like pattern];; +SHOW DNODE dnode_id VARIABLES [like pattern];; ``` 显示当前系统中各节点需要相同的配置参数的运行值,也可以指定 DNODE 来查看其的配置参数。 +可使用 like pattern 根据 name 进行过滤。 ## SHOW VGROUPS From c27662cf09a5b6c35aa58182fb921e0e9333f879 Mon Sep 17 00:00:00 2001 From: facetosea <285808407@qq.com> Date: Fri, 7 Mar 2025 09:51:05 +0800 Subject: [PATCH 5/5] fix: show variables rows check --- tests/pytest/util/sql.py | 11 +++++++++++ tests/system-test/2-query/db.py | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py index 3c79c22bee..fca3eb70e5 100644 --- a/tests/pytest/util/sql.py +++ b/tests/pytest/util/sql.py @@ -704,6 +704,17 @@ class TDSql: tdLog.info("sql:%s, elm:%s == expect_elm:%s" % (self.sql, elm, expect_elm)) return True self.print_error_frame_info(elm, expect_elm) + + def checkGreater(self, elm, expect_elm): + if elm > expect_elm: + tdLog.info("sql:%s, elm:%s > expect_elm:%s" % (self.sql, elm, expect_elm)) + return True + else: + caller = inspect.getframeinfo(inspect.stack()[1][0]) + args = (caller.filename, caller.lineno, self.sql, elm, expect_elm) + tdLog.info("%s(%d) failed: sql:%s, elm:%s <= expect_elm:%s" % args) + self.print_error_frame_info(elm, expect_elm) + return False def checkNotEqual(self, elm, expect_elm): if elm != expect_elm: diff --git a/tests/system-test/2-query/db.py b/tests/system-test/2-query/db.py index 3408f02e8b..2a63249bcc 100644 --- a/tests/system-test/2-query/db.py +++ b/tests/system-test/2-query/db.py @@ -46,8 +46,8 @@ class TDTestCase: tdSql.checkRows(2) def case2(self): - tdSql.query("show variables") - tdSql.checkRows(87) + tdSql.query("show variables") + tdSql.checkGreater(tdSql.getRows(), 80) for i in range(self.replicaVar): tdSql.query("show dnode %d variables like 'debugFlag'" % (i + 1)) @@ -88,7 +88,7 @@ class TDTestCase: def show_local_variables_like(self): tdSql.query("show local variables") - tdSql.checkRows(85) + tdSql.checkGreater(tdSql.getRows(), 80) tdSql.query("show local variables like 'debugFlag'") tdSql.checkRows(1) @@ -116,7 +116,7 @@ class TDTestCase: for zone in zones: tdLog.info(f"show {zone} variables") tdSql.query(f"show {zone} variables") - tdSql.checkRows(87) + tdSql.checkGreater(tdSql.getRows(), 80) tdLog.info(f"show {zone} variables like 'debugFlag'") #tdSql.query(f"show {zone} variables like 'debugFlag'")