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 2a8d616852..3ea1dc9abe 100644 --- a/docs/zh/14-reference/03-taos-sql/24-show.md +++ b/docs/zh/14-reference/03-taos-sql/24-show.md @@ -134,10 +134,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 @@ -329,11 +329,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 diff --git a/include/common/tcommon.h b/include/common/tcommon.h index 45f3869b1b..968568d2dc 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 9b834475dd..a068f19175 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -2255,11 +2255,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 9cc6e621d9..50202e1139 100644 --- a/source/client/src/clientMsgHandler.c +++ b/source/client/src/clientMsgHandler.c @@ -630,26 +630,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 d4989bb27d..77c115339c 100644 --- a/source/common/src/msg/tmsg.c +++ b/source/common/src/msg/tmsg.c @@ -5837,7 +5837,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: @@ -5850,6 +5854,37 @@ _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) { + pReq->val = taosMemoryCalloc(1, pReq->valLen + 1); + if (pReq->val == NULL) { + TAOS_CHECK_EXIT(terrno); + } + TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pReq->val)); + } + + 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 62bd5b1791..7ea477821a 100644 --- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c +++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c @@ -690,7 +690,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 1e69ae2b5a..1572b3652e 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 @@ -809,7 +810,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; } @@ -825,6 +826,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) { @@ -891,15 +895,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; @@ -926,7 +938,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/command/src/command.c b/source/libs/command/src/command.c index e0a917ace9..1458164e28 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 (pBlock->info.rows > 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 3ea49e3a33..cb0a8f971e 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 734fe0e58c..7f36e3a1dd 100755 --- a/source/libs/parser/inc/sql.y +++ b/source/libs/parser/inc/sql.y @@ -602,9 +602,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 3bcbc8be7f..20f2ab81e0 100644 --- a/source/libs/parser/src/parAstCreater.c +++ b/source/libs/parser/src/parAstCreater.c @@ -2804,6 +2804,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 332f840017..182c5965ad 100755 --- a/source/libs/parser/src/parTranslater.c +++ b/source/libs/parser/src/parTranslater.c @@ -13325,7 +13325,16 @@ static int32_t translateSplitVgroup(STranslateContext* pCxt, SSplitVgroupStmt* p static int32_t translateShowVariables(STranslateContext* pCxt, SShowStmt* pStmt) { SShowVariablesReq req = {0}; - return buildCmdMsg(pCxt, TDMT_MND_SHOW_VARIABLES, (FSerializeFunc)tSerializeSShowVariablesReq, &req); + 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); + } + } + 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/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; 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 895df852c7..d11fd5a497 100644 --- a/tests/system-test/2-query/db.py +++ b/tests/system-test/2-query/db.py @@ -46,8 +46,9 @@ class TDTestCase: tdSql.checkRows(2) def case2(self): - tdSql.query("show variables") - tdSql.checkRows(88) + + 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)) @@ -85,7 +86,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.checkGreater(tdSql.getRows(), 80) + 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.checkGreater(tdSql.getRows(), 80) + + 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 +180,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()