diff --git a/include/util/tdef.h b/include/util/tdef.h index ebfb7b696aa5d156dbfa1f07f74470c37c4c63f9..f6169af1aae0429d3793f4b6e0dcc7783f5a3545 100644 --- a/include/util/tdef.h +++ b/include/util/tdef.h @@ -32,7 +32,7 @@ extern "C" { #define TD_VER_MAX UINT64_MAX // TODO: use the real max version from query handle // Bytes for each type. -extern const int32_t TYPE_BYTES[15]; +extern const int32_t TYPE_BYTES[16]; // TODO: replace and remove code below #define CHAR_BYTES sizeof(char) diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c index 62026dd577a608d6a5595cf508ba62de6b7aa177..58c31548b05c104e9185c7658db67235b4fc6691 100644 --- a/source/client/src/clientImpl.c +++ b/source/client/src/clientImpl.c @@ -1280,8 +1280,7 @@ static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int int32_t length = taosUcs4ToMbs((TdUcs4*)varDataVal(jsonInnerData), varDataLen(jsonInnerData), varDataVal(dst) + CHAR_BYTES); if (length <= 0) { - tscError("charset:%s to %s. val:%s convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, - varDataVal(jsonInnerData)); + tscError("charset:%s to %s. convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset); length = 0; } varDataSetLen(dst, length + CHAR_BYTES * 2); diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c index 160756d981f9390889841bf8100be214757e4c63..9dbede61989a1697074c4f5c3686ac268aadc5ab 100644 --- a/source/common/src/tdatablock.c +++ b/source/common/src/tdatablock.c @@ -1271,12 +1271,12 @@ size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize) { void colDataDestroy(SColumnInfoData* pColData) { if (IS_VAR_DATA_TYPE(pColData->info.type)) { - taosMemoryFree(pColData->varmeta.offset); + taosMemoryFreeClear(pColData->varmeta.offset); } else { - taosMemoryFree(pColData->nullbitmap); + taosMemoryFreeClear(pColData->nullbitmap); } - taosMemoryFree(pColData->pData); + taosMemoryFreeClear(pColData->pData); } static void doShiftBitmap(char* nullBitmap, size_t n, size_t total) { diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c index e77c462e5ae0fe81521f34cbd1475669747e0ee6..91b740fc96049f6ee05713aba20264d7bfb79a3a 100644 --- a/source/common/src/tglobal.c +++ b/source/common/src/tglobal.c @@ -332,7 +332,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) { if (cfgAddBool(pCfg, "keepColumnName", tsKeepOriginalColumnName, 1) != 0) return -1; if (cfgAddInt32(pCfg, "queryPolicy", tsQueryPolicy, 1, 3, 1) != 0) return -1; if (cfgAddString(pCfg, "smlChildTableName", "", 1) != 0) return -1; - if (cfgAddString(pCfg, "smlTagNullName", tsSmlTagName, 1) != 0) return -1; + if (cfgAddString(pCfg, "smlTagName", tsSmlTagName, 1) != 0) return -1; if (cfgAddBool(pCfg, "smlDataFormat", tsSmlDataFormat, 1) != 0) return -1; tsNumOfTaskQueueThreads = tsNumOfCores / 4; @@ -532,7 +532,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) { } tstrncpy(tsSmlChildTableName, cfgGetItem(pCfg, "smlChildTableName")->str, TSDB_TABLE_NAME_LEN); - tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagNullName")->str, TSDB_COL_NAME_LEN); + tstrncpy(tsSmlTagName, cfgGetItem(pCfg, "smlTagName")->str, TSDB_COL_NAME_LEN); tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval; tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32; diff --git a/source/common/src/ttypes.c b/source/common/src/ttypes.c index b3999a49e7462e27582907b4f12aef1b24e2b35c..156b66ae865e8a1f4b1f7562961d9f45afb688c6 100644 --- a/source/common/src/ttypes.c +++ b/source/common/src/ttypes.c @@ -18,7 +18,7 @@ #include "tcompression.h" #include "trow.h" -const int32_t TYPE_BYTES[15] = { +const int32_t TYPE_BYTES[16] = { -1, // TSDB_DATA_TYPE_NULL CHAR_BYTES, // TSDB_DATA_TYPE_BOOL CHAR_BYTES, // TSDB_DATA_TYPE_TINYINT @@ -34,6 +34,7 @@ const int32_t TYPE_BYTES[15] = { SHORT_BYTES, // TSDB_DATA_TYPE_USMALLINT INT_BYTES, // TSDB_DATA_TYPE_UINT sizeof(uint64_t), // TSDB_DATA_TYPE_UBIGINT + TSDB_MAX_JSON_TAG_LEN, // TSDB_DATA_TYPE_JSON }; #define DO_STATICS(__sum, __min, __max, __minIndex, __maxIndex, _list, _index) \ diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c index c6a6dd81473d75a319fb19ebc6bfa906eebbf6b0..8d4762a656519f6c2c7e14a9580f9b71799b1e12 100644 --- a/source/dnode/vnode/src/meta/metaTable.c +++ b/source/dnode/vnode/src/meta/metaTable.c @@ -61,14 +61,14 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const if (tTagToValArray((const STag *)data, &pTagVals) != 0) { return -1; } - char key[512] = {0}; SIndexMultiTerm *terms = indexMultiTermCreate(); int16_t nCols = taosArrayGetSize(pTagVals); for (int i = 0; i < nCols; i++) { STagVal *pTagVal = (STagVal *)taosArrayGet(pTagVals, i); char type = pTagVal->type; - sprintf(key, "%s_%s", tagName, pTagVal->pKey); + + char * key = pTagVal->pKey; int32_t nKey = strlen(key); SIndexTerm *term = NULL; @@ -93,12 +93,11 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const } else if (type == TSDB_DATA_TYPE_BOOL) { int val = *(int *)(&pTagVal->i64); int len = 0; - term = indexTermCreate(suid, ADD_VALUE, type, key, nKey, (const char *)&val, len); + term = indexTermCreate(suid, ADD_VALUE, TSDB_DATA_TYPE_INT, key, nKey, (const char *)&val, len); } if (term != NULL) { indexMultiTermAdd(terms, term); } - memset(key, 0, sizeof(key)); } tIndexJsonPut(pMeta->pTagIvtIdx, terms, tuid); indexMultiTermDestroy(terms); diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h index 9b8b9dca2690015599f700358e976dfcfbe75d5f..327bd1131921152d71892f6be2d7908759d0cc3b 100644 --- a/source/libs/executor/inc/executorimpl.h +++ b/source/libs/executor/inc/executorimpl.h @@ -353,6 +353,7 @@ typedef struct STagScanInfo { int32_t curPos; SReadHandle readHandle; STableListInfo *pTableList; + SNode* pFilterNode; // filter info, } STagScanInfo; typedef enum EStreamScanMode { @@ -747,7 +748,7 @@ int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t *order, int32_t* scan int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz); void doSetOperatorCompleted(SOperatorInfo* pOperator); -void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock); +void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, bool needFree); SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput, int32_t** rowCellInfoOffset); void relocateColumnData(SSDataBlock* pBlock, const SArray* pColMatchInfo, SArray* pCols); void initExecTimeWindowInfo(SColumnInfoData* pColData, STimeWindow* pQueryWindow); @@ -777,7 +778,8 @@ SResultRow* doSetResultOutBufByKey(SDiskbasedBuf* pResultBuf, SResultRowInfo* pR SOperatorInfo* createExchangeOperatorInfo(void* pTransporter, SExchangePhysiNode* pExNode, SExecTaskInfo* pTaskInfo); SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode, tsdbReaderT pDataReader, SReadHandle* pHandle, SArray* groupKyes, SExecTaskInfo* pTaskInfo); -SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysiNode* pPhyNode, STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo); +SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysiNode* pPhyNode, + STableListInfo* pTableListInfo, SExecTaskInfo* pTaskInfo); SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScanPhysiNode *pScanPhyNode, SExecTaskInfo* pTaskInfo); SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SSDataBlock* pResultBlock, SExprInfo* pScalarExprInfo, diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c index 464fb5c957a5279eaf8faca3d95fac063c10d9d1..19d6cb56ae9351ca9ce1e4028b50af98f3cbe7c9 100644 --- a/source/libs/executor/src/executorimpl.c +++ b/source/libs/executor/src/executorimpl.c @@ -1818,9 +1818,9 @@ void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numO } } -static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep); +static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep, bool needFree); -void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock) { +void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, bool needFree) { if (pFilterNode == NULL) { return; } @@ -1839,11 +1839,11 @@ void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock) { bool keep = filterExecute(filter, pBlock, &rowRes, NULL, param1.numOfCols); filterFreeInfo(filter); - extractQualifiedTupleByFilterResult(pBlock, rowRes, keep); + extractQualifiedTupleByFilterResult(pBlock, rowRes, keep, needFree); blockDataUpdateTsWindow(pBlock, 0); } -void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep) { +void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowRes, bool keep, bool needFree) { if (keep) { return; } @@ -1883,8 +1883,20 @@ void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const int8_t* rowR ASSERT(pBlock->info.rows == numOfRows); } + SColumnInfoData tmp = *pSrc; *pSrc = *pDst; + *pDst = tmp; + + if (!needFree) { + if (IS_VAR_DATA_TYPE(pDst->info.type)) { // this elements do not need free + pDst->varmeta.offset = NULL; + } else { + pDst->nullbitmap = NULL; + } + pDst->pData = NULL; + } } + blockDataDestroy(px); // fix memory leak } else { // do nothing pBlock->info.rows = 0; @@ -3640,7 +3652,7 @@ static SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) { longjmp(pTaskInfo->env, code); } - doFilter(pProjectInfo->pFilterNode, pBlock); + doFilter(pProjectInfo->pFilterNode, pBlock, true); setInputDataBlock(pOperator, pInfo->pCtx, pBlock, order, scanFlag, false); blockDataEnsureCapacity(pInfo->pRes, pInfo->pRes->info.rows + pBlock->info.rows); @@ -4522,7 +4534,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo SScanPhysiNode* pScanPhyNode = (SScanPhysiNode*)pPhyNode; // simple child table. STableScanPhysiNode* pTableScanNode = (STableScanPhysiNode*)pPhyNode; STimeWindowAggSupp twSup = { - .waterMark = pTableScanNode->watermark, .calTrigger = pTableScanNode->triggerType, .maxTs = INT64_MIN}; + .waterMark = pTableScanNode->watermark, .calTrigger = pTableScanNode->triggerType, .maxTs = INT64_MIN}; tsdbReaderT pDataReader = NULL; if (pHandle->vnode) { pDataReader = doCreateDataReader(pTableScanNode, pHandle, pTableListInfo, (uint64_t)queryId, taskId, pTagCond); diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c index 132f93a6a533caa2f676009a47afdea8ee6ee869..5965f5d7adb6bfacbc2ca24ff78776dc9221c88c 100644 --- a/source/libs/executor/src/groupoperator.c +++ b/source/libs/executor/src/groupoperator.c @@ -359,7 +359,7 @@ static SSDataBlock* hashGroupbyAggregate(SOperatorInfo* pOperator) { while(1) { doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf); - doFilter(pInfo->pCondition, pRes); + doFilter(pInfo->pCondition, pRes, true); bool hasRemain = hashRemainDataInGroupInfo(&pInfo->groupResInfo); if (!hasRemain) { diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c index 3d580f250561c719122cba4b072bb620e201d1be..cc76cc29e4afdbf40c9f2293c6066b5cdb63af2b 100644 --- a/source/libs/executor/src/scanoperator.c +++ b/source/libs/executor/src/scanoperator.c @@ -267,7 +267,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanInfo* pTableSca } int64_t st = taosGetTimestampMs(); - doFilter(pTableScanInfo->pFilterNode, pBlock); + doFilter(pTableScanInfo->pFilterNode, pBlock, false); int64_t et = taosGetTimestampMs(); pTableScanInfo->readRecorder.filterTime += (et - st); @@ -737,8 +737,8 @@ static bool isStateWindow(SStreamBlockScanInfo* pInfo) { static bool prepareDataScan(SStreamBlockScanInfo* pInfo) { SSDataBlock* pSDB = pInfo->pUpdateRes; STimeWindow win = { - .skey = INT64_MIN, - .ekey = INT64_MAX, + .skey = INT64_MIN, + .ekey = INT64_MAX, }; bool needRead = false; if (!isStateWindow(pInfo) && pInfo->updateResIndex < pSDB->info.rows) { @@ -950,7 +950,7 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) { addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes); } - doFilter(pInfo->pCondition, pInfo->pRes); + doFilter(pInfo->pCondition, pInfo->pRes, false); blockDataUpdateTsWindow(pInfo->pRes, 0); break; } @@ -1722,7 +1722,9 @@ static SSDataBlock* doTagScan(SOperatorInfo* pOperator) { } pRes->info.rows = count; - pOperator->resultInfo.totalRows += count; + doFilter(pInfo->pFilterNode, pRes, true); + + pOperator->resultInfo.totalRows += pRes->info.rows; return (pRes->info.rows == 0) ? NULL : pInfo->pRes; } diff --git a/source/libs/index/inc/indexComm.h b/source/libs/index/inc/indexComm.h index c338300b57d1c5d2d570130f596303503ee30187..4b23ccabb9eb0160c2822482bcedb2f20088dbd9 100644 --- a/source/libs/index/inc/indexComm.h +++ b/source/libs/index/inc/indexComm.h @@ -28,6 +28,7 @@ extern char JSON_VALUE_DELIM; char* indexPackJsonData(SIndexTerm* itm); char* indexPackJsonDataPrefix(SIndexTerm* itm, int32_t* skip); +char* indexPackJsonDataPrefixNoType(SIndexTerm* itm, int32_t* skip); typedef enum { MATCH, CONTINUE, BREAK } TExeCond; diff --git a/source/libs/index/inc/indexInt.h b/source/libs/index/inc/indexInt.h index e3f9cb89ecd6eeb524061a7735df6161b30e195b..f556a738dd3ad624c3fc247f1bfd351bf7fffa09 100644 --- a/source/libs/index/inc/indexInt.h +++ b/source/libs/index/inc/indexInt.h @@ -43,7 +43,7 @@ extern "C" { #define indexTrace(...) do { if (idxDebugFlag & DEBUG_TRACE) { taosPrintLog("IDX", DEBUG_TRACE, idxDebugFlag, __VA_ARGS__);} } while (0) // clang-format on -typedef enum { LT, LE, GT, GE, CONTAINS } RangeType; +typedef enum { LT, LE, GT, GE, CONTAINS, EQ } RangeType; typedef enum { kTypeValue, kTypeDeletion } STermValueType; typedef struct SIndexStat { diff --git a/source/libs/index/src/indexCache.c b/source/libs/index/src/indexCache.c index c1fb086fa098a03e8ad28fa0ee43f72caba3f207..1e80d9c68d3eeb49abe4d2e1d1be9b6b94eff7d4 100644 --- a/source/libs/index/src/indexCache.c +++ b/source/libs/index/src/indexCache.c @@ -48,6 +48,7 @@ static int32_t cacheSearchRange(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STer /*comm func of compare, used in (LE/LT/GE/GT compare)*/ static int32_t cacheSearchCompareFunc(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STermValueType* s, RangeType type); static int32_t cacheSearchTerm_JSON(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STermValueType* s); +static int32_t cacheSearchEqual_JSON(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STermValueType* s); static int32_t cacheSearchPrefix_JSON(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STermValueType* s); static int32_t cacheSearchSuffix_JSON(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STermValueType* s); static int32_t cacheSearchRegex_JSON(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STermValueType* s); @@ -63,7 +64,7 @@ static int32_t cacheSearchCompareFunc_JSON(void* cache, SIndexTerm* term, SIdxTR static int32_t (*cacheSearch[][QUERY_MAX])(void* cache, SIndexTerm* ct, SIdxTRslt* tr, STermValueType* s) = { {cacheSearchTerm, cacheSearchPrefix, cacheSearchSuffix, cacheSearchRegex, cacheSearchLessThan, cacheSearchLessEqual, cacheSearchGreaterThan, cacheSearchGreaterEqual, cacheSearchRange}, - {cacheSearchTerm_JSON, cacheSearchPrefix_JSON, cacheSearchSuffix_JSON, cacheSearchRegex_JSON, + {cacheSearchEqual_JSON, cacheSearchPrefix_JSON, cacheSearchSuffix_JSON, cacheSearchRegex_JSON, cacheSearchLessThan_JSON, cacheSearchLessEqual_JSON, cacheSearchGreaterThan_JSON, cacheSearchGreaterEqual_JSON, cacheSearchRange_JSON}}; @@ -123,12 +124,11 @@ static int32_t cacheSearchCompareFunc(void* cache, SIndexTerm* term, SIdxTRslt* if (cache == NULL) { return 0; } - - _cache_range_compare cmpFn = indexGetCompare(type); - MemTable* mem = cache; IndexCache* pCache = mem->pCache; + _cache_range_compare cmpFn = indexGetCompare(type); + CacheTerm* pCt = taosMemoryCalloc(1, sizeof(CacheTerm)); pCt->colVal = term->colVal; pCt->colType = term->colType; @@ -221,15 +221,18 @@ static int32_t cacheSearchTerm_JSON(void* cache, SIndexTerm* term, SIdxTRslt* tr return TSDB_CODE_SUCCESS; } -static int32_t cacheSearchPrefix_JSON(void* cache, SIndexTerm* term, SIdxTRslt* tr, STermValueType* s) { - return cacheSearchCompareFunc_JSON(cache, term, tr, s, CONTAINS); -} static int32_t cacheSearchSuffix_JSON(void* cache, SIndexTerm* term, SIdxTRslt* tr, STermValueType* s) { return TSDB_CODE_SUCCESS; } static int32_t cacheSearchRegex_JSON(void* cache, SIndexTerm* term, SIdxTRslt* tr, STermValueType* s) { return TSDB_CODE_SUCCESS; } +static int32_t cacheSearchEqual_JSON(void* cache, SIndexTerm* term, SIdxTRslt* tr, STermValueType* s) { + return cacheSearchCompareFunc_JSON(cache, term, tr, s, EQ); +} +static int32_t cacheSearchPrefix_JSON(void* cache, SIndexTerm* term, SIdxTRslt* tr, STermValueType* s) { + return cacheSearchCompareFunc_JSON(cache, term, tr, s, CONTAINS); +} static int32_t cacheSearchLessThan_JSON(void* cache, SIndexTerm* term, SIdxTRslt* tr, STermValueType* s) { return cacheSearchCompareFunc_JSON(cache, term, tr, s, LT); } @@ -267,13 +270,20 @@ static int32_t cacheSearchCompareFunc_JSON(void* cache, SIndexTerm* term, SIdxTR int skip = 0; char* exBuf = NULL; - if (INDEX_TYPE_CONTAIN_EXTERN_TYPE(term->colType, TSDB_DATA_TYPE_JSON)) { + if (type == CONTAINS) { + SIndexTerm tm = {.suid = term->suid, + .operType = term->operType, + .colType = term->colType, + .colName = term->colVal, + .nColName = term->nColVal}; + exBuf = indexPackJsonDataPrefixNoType(&tm, &skip); + pCt->colVal = exBuf; + } else { exBuf = indexPackJsonDataPrefix(term, &skip); pCt->colVal = exBuf; } char* key = indexCacheTermGet(pCt); - // SSkipListIterator* iter = tSkipListCreateIter(mem->mem); SSkipListIterator* iter = tSkipListCreateIterFromVal(mem->mem, key, TSDB_DATA_TYPE_BINARY, TSDB_ORDER_ASC); while (tSkipListIterNext(iter)) { SSkipListNode* node = tSkipListIterGet(iter); @@ -281,14 +291,22 @@ static int32_t cacheSearchCompareFunc_JSON(void* cache, SIndexTerm* term, SIdxTR break; } CacheTerm* c = (CacheTerm*)SL_GET_NODE_DATA(node); - // printf("json val: %s\n", c->colVal); - if (0 != strncmp(c->colVal, pCt->colVal, skip)) { - break; + TExeCond cond = CONTINUE; + if (type == CONTAINS) { + if (0 == strncmp(c->colVal, pCt->colVal, skip)) { + cond = MATCH; + } + } else { + if (0 != strncmp(c->colVal, pCt->colVal, skip - 1)) { + break; + } else if (0 != strncmp(c->colVal, pCt->colVal, skip)) { + continue; + } else { + char* p = taosMemoryCalloc(1, strlen(c->colVal) + 1); + memcpy(p, c->colVal, strlen(c->colVal)); + cond = cmpFn(p + skip, term->colVal, dType); + } } - char* p = taosMemoryCalloc(1, strlen(c->colVal) + 1); - memcpy(p, c->colVal, strlen(c->colVal)); - - TExeCond cond = cmpFn(p + skip, term->colVal, dType); if (cond == MATCH) { if (c->operaType == ADD_VALUE) { INDEX_MERGE_ADD_DEL(tr->del, tr->add, c->uid) @@ -302,7 +320,6 @@ static int32_t cacheSearchCompareFunc_JSON(void* cache, SIndexTerm* term, SIdxTR } else if (cond == BREAK) { break; } - taosMemoryFree(p); } taosMemoryFree(pCt); diff --git a/source/libs/index/src/indexComm.c b/source/libs/index/src/indexComm.c index d30147d70f03949fa04617d747687594d1edbb89..85c6bb46d7a6dd10e8be0bab473ab1732423daa8 100644 --- a/source/libs/index/src/indexComm.c +++ b/source/libs/index/src/indexComm.c @@ -102,6 +102,10 @@ static TExeCond tCompareContains(void* a, void* b, int8_t type) { __compar_fn_t func = indexGetCompar(type); return tCompare(func, QUERY_TERM, a, b, type); } +static TExeCond tCompareEqual(void* a, void* b, int8_t type) { + __compar_fn_t func = indexGetCompar(type); + return tCompare(func, QUERY_TERM, a, b, type); +} TExeCond tCompare(__compar_fn_t func, int8_t cmptype, void* a, void* b, int8_t dtype) { if (dtype == TSDB_DATA_TYPE_BINARY || dtype == TSDB_DATA_TYPE_NCHAR || dtype == TSDB_DATA_TYPE_VARBINARY) { return tDoCompare(func, cmptype, a, b); @@ -186,9 +190,11 @@ TExeCond tDoCompare(__compar_fn_t func, int8_t comparType, void* a, void* b) { } case QUERY_GREATER_EQUAL: { if (ret >= 0) return MATCH; + break; } case QUERY_TERM: { if (ret == 0) return MATCH; + break; } default: return BREAK; @@ -197,7 +203,7 @@ TExeCond tDoCompare(__compar_fn_t func, int8_t comparType, void* a, void* b) { } static TExeCond (*rangeCompare[])(void* a, void* b, int8_t type) = { - tCompareLessThan, tCompareLessEqual, tCompareGreaterThan, tCompareGreaterEqual, tCompareContains}; + tCompareLessThan, tCompareLessEqual, tCompareGreaterThan, tCompareGreaterEqual, tCompareContains, tCompareEqual}; _cache_range_compare indexGetCompare(RangeType ty) { return rangeCompare[ty]; } @@ -256,6 +262,26 @@ char* indexPackJsonDataPrefix(SIndexTerm* itm, int32_t* skip) { return buf; } +char* indexPackJsonDataPrefixNoType(SIndexTerm* itm, int32_t* skip) { + /* + * |<-----colname---->|<-----dataType---->|<--------colVal---------->| + * |<-----string----->|<-----uint8_t----->|<----depend on dataType-->| + */ + uint8_t ty = INDEX_TYPE_GET_TYPE(itm->colType); + + int32_t sz = itm->nColName + itm->nColVal + sizeof(uint8_t) + sizeof(JSON_VALUE_DELIM) * 2 + 1; + char* buf = (char*)taosMemoryCalloc(1, sz); + char* p = buf; + + memcpy(p, itm->colName, itm->nColName); + p += itm->nColName; + + memcpy(p, &JSON_VALUE_DELIM, sizeof(JSON_VALUE_DELIM)); + p += sizeof(JSON_VALUE_DELIM); + *skip = p - buf; + + return buf; +} int32_t indexConvertData(void* src, int8_t type, void** dst) { int tlen = -1; diff --git a/source/libs/index/src/indexFilter.c b/source/libs/index/src/indexFilter.c index fd2d6a5c8b7ace1b8859680796b29fb5069b3920..f3aa30018bf7b6f2c76f85834bdfff1e4a29c94b 100644 --- a/source/libs/index/src/indexFilter.c +++ b/source/libs/index/src/indexFilter.c @@ -173,10 +173,8 @@ static int32_t sifInitJsonParam(SNode *node, SIFParam *param, SIFCtx *ctx) { param->colId = l->colId; param->colValType = l->node.resType.type; memcpy(param->dbName, l->dbName, sizeof(l->dbName)); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-overflow" - sprintf(param->colName, "%s_%s", l->colName, r->literal); -#pragma GCC diagnostic pop + memcpy(param->colName, r->literal, strlen(r->literal)); + // sprintf(param->colName, "%s_%s", l->colName, r->literal); param->colValType = r->typeData; return 0; // memcpy(param->colName, l->colName, sizeof(l->colName)); @@ -188,6 +186,9 @@ static int32_t sifInitParam(SNode *node, SIFParam *param, SIFCtx *ctx) { SIF_ERR_RET(sifGetValueFromNode(node, ¶m->condValue)); param->colId = -1; param->colValType = (uint8_t)(vn->node.resType.type); + if (vn->literal == NULL || strlen(vn->literal) == 0) { + return TSDB_CODE_QRY_INVALID_INPUT; + } memcpy(param->colName, vn->literal, strlen(vn->literal)); break; } @@ -340,9 +341,9 @@ static Filter sifGetFilterFunc(EIndexQueryType type, bool *reverse) { return NULL; } static int32_t sifDoIndex(SIFParam *left, SIFParam *right, int8_t operType, SIFParam *output) { - SIndexMetaArg *arg = &output->arg; - int ret = 0; + int ret = 0; + SIndexMetaArg * arg = &output->arg; EIndexQueryType qtype = 0; SIF_ERR_RET(sifGetFuncFromSql(operType, &qtype)); if (left->colValType == TSDB_DATA_TYPE_JSON) { @@ -506,7 +507,6 @@ static int32_t sifExecOper(SOperatorNode *node, SIFCtx *ctx, SIFParam *output) { if (nParam <= 1) { output->status = SFLT_NOT_INDEX; return code; - // SIF_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT); } if (node->opType == OP_TYPE_JSON_GET_VALUE) { return code; diff --git a/source/libs/index/src/indexJson.c b/source/libs/index/src/indexJson.c index a2f0563d470f30cf989f71bf068c16e38b236ce4..a4f3be382984ce2c4359b79a2bd96b6df204bbe8 100644 --- a/source/libs/index/src/indexJson.c +++ b/source/libs/index/src/indexJson.c @@ -22,6 +22,14 @@ int tIndexJsonOpen(SIndexJsonOpts *opts, const char *path, SIndexJson **index) { int tIndexJsonPut(SIndexJson *index, SIndexJsonMultiTerm *terms, uint64_t uid) { for (int i = 0; i < taosArrayGetSize(terms); i++) { SIndexJsonTerm *p = taosArrayGetP(terms, i); + if (p->colType == TSDB_DATA_TYPE_BOOL) { + p->colType = TSDB_DATA_TYPE_INT; + } else if (p->colType == TSDB_DATA_TYPE_VARCHAR || p->colType == TSDB_DATA_TYPE_NCHAR || + p->colType == TSDB_DATA_TYPE_BINARY) { + // p->colType = TSDB_DATA_TYPE_NCHAR; + } else { + p->colType = TSDB_DATA_TYPE_DOUBLE; + } INDEX_TYPE_ADD_EXTERN_TYPE(p->colType, TSDB_DATA_TYPE_JSON); } // handle put @@ -32,6 +40,14 @@ int tIndexJsonSearch(SIndexJson *index, SIndexJsonMultiTermQuery *tq, SArray *re SArray *terms = tq->query; for (int i = 0; i < taosArrayGetSize(terms); i++) { SIndexJsonTerm *p = taosArrayGetP(terms, i); + if (p->colType == TSDB_DATA_TYPE_BOOL) { + p->colType = TSDB_DATA_TYPE_INT; + } else if (p->colType == TSDB_DATA_TYPE_VARCHAR || p->colType == TSDB_DATA_TYPE_NCHAR || + p->colType == TSDB_DATA_TYPE_BINARY) { + // p->colType = TSDB_DATA_TYPE_NCHAR; + } else { + p->colType = TSDB_DATA_TYPE_DOUBLE; + } INDEX_TYPE_ADD_EXTERN_TYPE(p->colType, TSDB_DATA_TYPE_JSON); } // handle search diff --git a/source/libs/index/src/indexTfile.c b/source/libs/index/src/indexTfile.c index 0145df4676d9431e2f2bd62b4352db7da292e8c3..c2747a7e3032767d2f19e0337b70ae7f6b2ffeef 100644 --- a/source/libs/index/src/indexTfile.c +++ b/source/libs/index/src/indexTfile.c @@ -73,6 +73,7 @@ static int32_t tfSearchRange(void* reader, SIndexTerm* tem, SIdxTRslt* tr); static int32_t tfSearchCompareFunc(void* reader, SIndexTerm* tem, SIdxTRslt* tr, RangeType ctype); static int32_t tfSearchTerm_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr); +static int32_t tfSearchEqual_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr); static int32_t tfSearchPrefix_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr); static int32_t tfSearchSuffix_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr); static int32_t tfSearchRegex_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr); @@ -87,7 +88,7 @@ static int32_t tfSearchCompareFunc_JSON(void* reader, SIndexTerm* tem, SIdxTRslt static int32_t (*tfSearch[][QUERY_MAX])(void* reader, SIndexTerm* tem, SIdxTRslt* tr) = { {tfSearchTerm, tfSearchPrefix, tfSearchSuffix, tfSearchRegex, tfSearchLessThan, tfSearchLessEqual, tfSearchGreaterThan, tfSearchGreaterEqual, tfSearchRange}, - {tfSearchTerm_JSON, tfSearchPrefix_JSON, tfSearchSuffix_JSON, tfSearchRegex_JSON, tfSearchLessThan_JSON, + {tfSearchEqual_JSON, tfSearchPrefix_JSON, tfSearchSuffix_JSON, tfSearchRegex_JSON, tfSearchLessThan_JSON, tfSearchLessEqual_JSON, tfSearchGreaterThan_JSON, tfSearchGreaterEqual_JSON, tfSearchRange_JSON}}; TFileCache* tfileCacheCreate(const char* path) { @@ -424,6 +425,9 @@ static int32_t tfSearchTerm_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr) { // deprecate api return TSDB_CODE_SUCCESS; } +static int32_t tfSearchEqual_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr) { + return tfSearchCompareFunc_JSON(reader, tem, tr, EQ); +} static int32_t tfSearchPrefix_JSON(void* reader, SIndexTerm* tem, SIdxTRslt* tr) { return tfSearchCompareFunc_JSON(reader, tem, tr, CONTAINS); } @@ -456,7 +460,17 @@ static int32_t tfSearchCompareFunc_JSON(void* reader, SIndexTerm* tem, SIdxTRslt int ret = 0; int skip = 0; - char* p = indexPackJsonDataPrefix(tem, &skip); + char* p = NULL; + if (ctype == CONTAINS) { + SIndexTerm tm = {.suid = tem->suid, + .operType = tem->operType, + .colType = tem->colType, + .colName = tem->colVal, + .nColName = tem->nColVal}; + p = indexPackJsonDataPrefixNoType(&tm, &skip); + } else { + p = indexPackJsonDataPrefix(tem, &skip); + } _cache_range_compare cmpFn = indexGetCompare(ctype); @@ -470,18 +484,22 @@ static int32_t tfSearchCompareFunc_JSON(void* reader, SIndexTerm* tem, SIdxTRslt while ((rt = streamWithStateNextWith(st, NULL)) != NULL) { FstSlice* s = &rt->data; - int32_t sz = 0; - char* ch = (char*)fstSliceData(s, &sz); - char* tmp = taosMemoryCalloc(1, sz + 1); - memcpy(tmp, ch, sz); - - if (0 != strncmp(tmp, p, skip)) { - swsResultDestroy(rt); - taosMemoryFree(tmp); - break; + int32_t sz = 0; + char* ch = (char*)fstSliceData(s, &sz); + TExeCond cond = CONTINUE; + if (ctype == CONTAINS) { + if (0 == strncmp(ch, p, skip)) { + cond = MATCH; + } + } else { + if (0 != strncmp(ch, p, skip - 1)) { + swsResultDestroy(rt); + break; + } else if (0 != strncmp(ch, p, skip)) { + continue; + } + cond = cmpFn(ch + skip, tem->colVal, INDEX_TYPE_GET_TYPE(tem->colType)); } - - TExeCond cond = cmpFn(tmp + skip, tem->colVal, INDEX_TYPE_GET_TYPE(tem->colType)); if (MATCH == cond) { tfileReaderLoadTableIds((TFileReader*)reader, rt->out.out, tr->total); } else if (CONTINUE == cond) { @@ -489,7 +507,6 @@ static int32_t tfSearchCompareFunc_JSON(void* reader, SIndexTerm* tem, SIdxTRslt swsResultDestroy(rt); break; } - taosMemoryFree(tmp); swsResultDestroy(rt); } streamWithStateDestroy(st); diff --git a/source/libs/index/test/jsonUT.cc b/source/libs/index/test/jsonUT.cc index f795fbad01df5aa076b83d2770bed936efcd446f..d6bc31a8017c36fb9e6a6cbf535b3c00360c9179 100644 --- a/source/libs/index/test/jsonUT.cc +++ b/source/libs/index/test/jsonUT.cc @@ -107,41 +107,40 @@ TEST_F(JsonEnv, testWrite) { { std::string colName("test"); std::string colVal("ab"); - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - colVal.c_str(), colVal.size()); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); - for (size_t i = 0; i < 100; i++) { + for (int i = 0; i < 100; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("voltage"); std::string colVal("ab1"); - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - colVal.c_str(), colVal.size()); + for (int i = 0; i < 100; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); - for (size_t i = 0; i < 100; i++) { + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("voltage"); std::string colVal("123"); - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - colVal.c_str(), colVal.size()); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 100; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test"); @@ -154,7 +153,7 @@ TEST_F(JsonEnv, testWrite) { SArray* result = taosArrayInit(1, sizeof(uint64_t)); indexMultiTermQueryAdd(mq, q, QUERY_TERM); tIndexJsonSearch(index, mq, result); - assert(100 == taosArrayGetSize(result)); + EXPECT_EQ(100, taosArrayGetSize(result)); indexMultiTermQueryDestroy(mq); } } @@ -162,44 +161,44 @@ TEST_F(JsonEnv, testWriteMillonData) { { std::string colName("test"); std::string colVal("ab"); - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - colVal.c_str(), colVal.size()); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 10; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("voltagefdadfa"); std::string colVal("abxxxxxxxxxxxx"); for (int i = 0; i < 10; i++) { colVal[i % colVal.size()] = '0' + i % 128; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - colVal.c_str(), colVal.size()); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 100; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } } { std::string colName("voltagefdadfa"); std::string colVal("abxxxxxxxxxxxx"); - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - colVal.c_str(), colVal.size()); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test"); @@ -227,7 +226,7 @@ TEST_F(JsonEnv, testWriteMillonData) { SArray* result = taosArrayInit(1, sizeof(uint64_t)); indexMultiTermQueryAdd(mq, q, QUERY_GREATER_THAN); tIndexJsonSearch(index, mq, result); - assert(0 == taosArrayGetSize(result)); + EXPECT_EQ(0, taosArrayGetSize(result)); indexMultiTermQueryDestroy(mq); } { @@ -252,55 +251,55 @@ TEST_F(JsonEnv, testWriteJsonNumberData) { { std::string colName("test"); // std::string colVal("10"); - int val = 10; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), - (const char*)&val, sizeof(val)); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); + int val = 10; for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), + (const char*)&val, sizeof(val)); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test2"); int val = 20; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), - (const char*)&val, sizeof(val)); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), + (const char*)&val, sizeof(val)); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test"); int val = 15; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), - (const char*)&val, sizeof(val)); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), + (const char*)&val, sizeof(val)); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test2"); const char* val = "test"; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - (const char*)val, strlen(val)); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + (const char*)val, strlen(val)); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test"); @@ -380,28 +379,28 @@ TEST_F(JsonEnv, testWriteJsonTfileAndCache_INT) { { std::string colName("test1"); int val = 10; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), - (const char*)&val, sizeof(val)); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), + (const char*)&val, sizeof(val)); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test"); std::string colVal("xxxxxxxxxxxxxxxxxxx"); - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), - colVal.c_str(), colVal.size()); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(), + colVal.c_str(), colVal.size()); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test1"); @@ -478,15 +477,15 @@ TEST_F(JsonEnv, testWriteJsonTfileAndCache_INT) { std::string colName("other_column"); int val = 100; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), - (const char*)&val, sizeof(val)); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), + (const char*)&val, sizeof(val)); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test1"); @@ -506,15 +505,15 @@ TEST_F(JsonEnv, testWriteJsonTfileAndCache_INT) { { std::string colName("test1"); int val = 15; - SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), - (const char*)&val, sizeof(val)); - - SIndexMultiTerm* terms = indexMultiTermCreate(); - indexMultiTermAdd(terms, term); for (size_t i = 0; i < 1000; i++) { + SIndexTerm* term = indexTermCreateT(1, ADD_VALUE, TSDB_DATA_TYPE_INT, colName.c_str(), colName.size(), + (const char*)&val, sizeof(val)); + + SIndexMultiTerm* terms = indexMultiTermCreate(); + indexMultiTermAdd(terms, term); tIndexJsonPut(index, terms, i + 1000); + indexMultiTermDestroy(terms); } - indexMultiTermDestroy(terms); } { std::string colName("test1"); diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c index 0090701ba567378c4e2aab0869a757663b9d289e..e62a73b7fa2e4b8de3c89956ad3956231a6e92cb 100644 --- a/source/libs/transport/src/transCli.c +++ b/source/libs/transport/src/transCli.c @@ -338,8 +338,7 @@ void cliHandleResp(SCliConn* conn) { return; } - int ret = cliAppCb(conn, &transMsg, pMsg); - if (ret != 0) { + if (cliAppCb(conn, &transMsg, pMsg) != 0) { tTrace("try to send req to next node"); return; } @@ -403,15 +402,13 @@ void cliHandleExcept(SCliConn* pConn) { continue; } } - int ret = cliAppCb(pConn, &transMsg, pMsg); - if (ret != 0) { + if (cliAppCb(pConn, &transMsg, pMsg) != 0) { tTrace("try to send req to next node"); return; } destroyCmsg(pMsg); tTrace("%s cli conn %p start to destroy", CONN_GET_INST_LABEL(pConn), pConn); } while (!transQueueEmpty(&pConn->cliMsgs)); - transUnrefCliHandle(pConn); } @@ -976,7 +973,7 @@ int cliAppCb(SCliConn* pConn, STransMsg* pResp, SCliMsg* pMsg) { arg->param1 = pMsg; arg->param2 = pThrd; transDQSched(pThrd->delayQueue, doDelayTask, arg, TRANS_RETRY_INTERVAL); - cliDestroyConn(pConn, true); + transUnrefCliHandle(pConn); return -1; } } else if (pCtx->retryCount < TRANS_RETRY_COUNT_LIMIT) {