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/8] 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/8] 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/8] 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/8] 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 22be5e642e9aa7d9d558455fd7d4a649fc837086 Mon Sep 17 00:00:00 2001
From: dmchen