fix issue
This commit is contained in:
parent
baf47844f1
commit
a62b5a3efd
|
@ -378,6 +378,7 @@ typedef struct SStateStore {
|
||||||
int32_t (*streamStateFillGetGroupKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
int32_t (*streamStateFillGetGroupKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
||||||
int32_t (*streamStateGetKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
int32_t (*streamStateGetKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
||||||
|
|
||||||
|
void (*streamStateSetFillInfo)(SStreamState* pState);
|
||||||
void (*streamStateClearExpiredState)(SStreamState* pState);
|
void (*streamStateClearExpiredState)(SStreamState* pState);
|
||||||
|
|
||||||
int32_t (*streamStateSessionAddIfNotExist)(SStreamState* pState, SSessionKey* key, TSKEY gap, void** pVal,
|
int32_t (*streamStateSessionAddIfNotExist)(SStreamState* pState, SSessionKey* key, TSKEY gap, void** pVal,
|
||||||
|
|
|
@ -108,6 +108,7 @@ int32_t streamStateFillGetGroupKVByCur(SStreamStateCur* pCur, SWinKey* pKey, con
|
||||||
int32_t streamStateGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
int32_t streamStateGetKVByCur(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
||||||
|
|
||||||
// twa
|
// twa
|
||||||
|
void streamStateSetFillInfo(SStreamState* pState);
|
||||||
void streamStateClearExpiredState(SStreamState* pState);
|
void streamStateClearExpiredState(SStreamState* pState);
|
||||||
|
|
||||||
void streamStateCurNext(SStreamState* pState, SStreamStateCur* pCur);
|
void streamStateCurNext(SStreamState* pState, SStreamStateCur* pCur);
|
||||||
|
|
|
@ -145,9 +145,12 @@ SSHashObj* getGroupIdCache(SStreamFileState* pFileState);
|
||||||
int fillStateKeyCompare(const void* pWin1, const void* pDatas, int pos);
|
int fillStateKeyCompare(const void* pWin1, const void* pDatas, int pos);
|
||||||
int32_t getRowStatePrevRow(SStreamFileState* pFileState, const SWinKey* pKey, SWinKey* pResKey, void** ppVal,
|
int32_t getRowStatePrevRow(SStreamFileState* pFileState, const SWinKey* pKey, SWinKey* pResKey, void** ppVal,
|
||||||
int32_t* pVLen, int32_t* pWinCode);
|
int32_t* pVLen, int32_t* pWinCode);
|
||||||
|
int32_t addSearchItem(SStreamFileState* pFileState, SArray* pWinStates, const SWinKey* pKey);
|
||||||
|
|
||||||
//twa
|
//twa
|
||||||
|
void setFillInfo(SStreamFileState* pFileState);
|
||||||
void clearExpiredState(SStreamFileState* pFileState);
|
void clearExpiredState(SStreamFileState* pFileState);
|
||||||
|
int32_t addArrayBuffIfNotExist(SSHashObj* pSearchBuff, uint64_t groupId, SArray** ppResStates);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ void initStateStoreAPI(SStateStore* pStore) {
|
||||||
pStore->streamStateFillGetGroupKVByCur = streamStateFillGetGroupKVByCur;
|
pStore->streamStateFillGetGroupKVByCur = streamStateFillGetGroupKVByCur;
|
||||||
pStore->streamStateGetKVByCur = streamStateGetKVByCur;
|
pStore->streamStateGetKVByCur = streamStateGetKVByCur;
|
||||||
|
|
||||||
|
pStore->streamStateSetFillInfo = streamStateSetFillInfo;
|
||||||
pStore->streamStateClearExpiredState = streamStateClearExpiredState;
|
pStore->streamStateClearExpiredState = streamStateClearExpiredState;
|
||||||
|
|
||||||
pStore->streamStateSessionAddIfNotExist = streamStateSessionAddIfNotExist;
|
pStore->streamStateSessionAddIfNotExist = streamStateSessionAddIfNotExist;
|
||||||
|
|
|
@ -183,6 +183,7 @@ void initStateStoreAPI(SStateStore* pStore) {
|
||||||
pStore->streamStateFillGetGroupKVByCur = streamStateFillGetGroupKVByCur;
|
pStore->streamStateFillGetGroupKVByCur = streamStateFillGetGroupKVByCur;
|
||||||
pStore->streamStateGetKVByCur = streamStateGetKVByCur;
|
pStore->streamStateGetKVByCur = streamStateGetKVByCur;
|
||||||
|
|
||||||
|
pStore->streamStateSetFillInfo = streamStateSetFillInfo;
|
||||||
pStore->streamStateClearExpiredState = streamStateClearExpiredState;
|
pStore->streamStateClearExpiredState = streamStateClearExpiredState;
|
||||||
|
|
||||||
pStore->streamStateSessionAddIfNotExist = streamStateSessionAddIfNotExist;
|
pStore->streamStateSessionAddIfNotExist = streamStateSessionAddIfNotExist;
|
||||||
|
|
|
@ -1636,6 +1636,7 @@ int32_t getDownStreamInfo(SOperatorInfo* downstream, int8_t* triggerType, SInter
|
||||||
*pInterval = pInfo->interval;
|
*pInterval = pInfo->interval;
|
||||||
pInfo->hasFill = true;
|
pInfo->hasFill = true;
|
||||||
(*ppAggSup) = &pInfo->streamAggSup;
|
(*ppAggSup) = &pInfo->streamAggSup;
|
||||||
|
pInfo->streamAggSup.stateStore.streamStateSetFillInfo(pInfo->streamAggSup.pState);
|
||||||
} else {
|
} else {
|
||||||
code = TSDB_CODE_STREAM_INTERNAL_ERROR;
|
code = TSDB_CODE_STREAM_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1751,6 +1751,9 @@ static int32_t doStreamTimeSliceNext(SOperatorInfo* pOperator, SSDataBlock** ppR
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_FORCE_WINDOW_CLOSE) {
|
||||||
|
pAggSup->stateStore.streamStateClearExpiredState(pAggSup->pState);
|
||||||
|
}
|
||||||
setStreamOperatorCompleted(pOperator);
|
setStreamOperatorCompleted(pOperator);
|
||||||
resetStreamFillSup(pInfo->pFillSup);
|
resetStreamFillSup(pInfo->pFillSup);
|
||||||
(*ppRes) = NULL;
|
(*ppRes) = NULL;
|
||||||
|
@ -1854,6 +1857,9 @@ static int32_t doStreamTimeSliceNext(SOperatorInfo* pOperator, SSDataBlock** ppR
|
||||||
QUERY_CHECK_CODE(code, lino, _end);
|
QUERY_CHECK_CODE(code, lino, _end);
|
||||||
|
|
||||||
if (!(*ppRes)) {
|
if (!(*ppRes)) {
|
||||||
|
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_FORCE_WINDOW_CLOSE) {
|
||||||
|
pAggSup->stateStore.streamStateClearExpiredState(pAggSup->pState);
|
||||||
|
}
|
||||||
setStreamOperatorCompleted(pOperator);
|
setStreamOperatorCompleted(pOperator);
|
||||||
resetStreamFillSup(pInfo->pFillSup);
|
resetStreamFillSup(pInfo->pFillSup);
|
||||||
}
|
}
|
||||||
|
|
|
@ -237,6 +237,7 @@ typedef struct SElapsedInfo {
|
||||||
} SElapsedInfo;
|
} SElapsedInfo;
|
||||||
|
|
||||||
typedef struct STwaInfo {
|
typedef struct STwaInfo {
|
||||||
|
double dTwaRes;
|
||||||
double dOutput;
|
double dOutput;
|
||||||
int64_t numOfElems;
|
int64_t numOfElems;
|
||||||
SPoint1 p;
|
SPoint1 p;
|
||||||
|
|
|
@ -6201,11 +6201,11 @@ int32_t twaFinalize(struct SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
pResInfo->numOfRes = 0;
|
pResInfo->numOfRes = 0;
|
||||||
} else {
|
} else {
|
||||||
if (pInfo->win.ekey == pInfo->win.skey) {
|
if (pInfo->win.ekey == pInfo->win.skey) {
|
||||||
pInfo->dOutput = pInfo->p.val;
|
pInfo->dTwaRes = pInfo->p.val;
|
||||||
} else if (pInfo->win.ekey == INT64_MAX || pInfo->win.skey == INT64_MIN) { // no data in timewindow
|
} else if (pInfo->win.ekey == INT64_MAX || pInfo->win.skey == INT64_MIN) { // no data in timewindow
|
||||||
pInfo->dOutput = 0;
|
pInfo->dTwaRes = 0;
|
||||||
} else {
|
} else {
|
||||||
pInfo->dOutput = pInfo->dOutput / (pInfo->win.ekey - pInfo->win.skey);
|
pInfo->dTwaRes = pInfo->dOutput / (pInfo->win.ekey - pInfo->win.skey);
|
||||||
}
|
}
|
||||||
|
|
||||||
pResInfo->numOfRes = 1;
|
pResInfo->numOfRes = 1;
|
||||||
|
|
|
@ -33,16 +33,7 @@ int32_t getHashSortRowBuff(SStreamFileState* pFileState, const SWinKey* pKey, vo
|
||||||
|
|
||||||
SArray* pWinStates = NULL;
|
SArray* pWinStates = NULL;
|
||||||
SSHashObj* pSearchBuff = getSearchBuff(pFileState);
|
SSHashObj* pSearchBuff = getSearchBuff(pFileState);
|
||||||
void** ppBuff = tSimpleHashGet(pSearchBuff, &pKey->groupId, sizeof(uint64_t));
|
addArrayBuffIfNotExist(pSearchBuff, pKey->groupId, &pWinStates);
|
||||||
if (ppBuff) {
|
|
||||||
pWinStates = (SArray*)(*ppBuff);
|
|
||||||
} else {
|
|
||||||
pWinStates = taosArrayInit(16, sizeof(SWinKey));
|
|
||||||
QUERY_CHECK_NULL(pWinStates, code, lino, _end, terrno);
|
|
||||||
|
|
||||||
code = tSimpleHashPut(pSearchBuff, &pKey->groupId, sizeof(uint64_t), &pWinStates, POINTER_BYTES);
|
|
||||||
QUERY_CHECK_CODE(code, lino, _end);
|
|
||||||
}
|
|
||||||
|
|
||||||
// recover
|
// recover
|
||||||
if (taosArrayGetSize(pWinStates) == 0 && needClearDiskBuff(pFileState)) {
|
if (taosArrayGetSize(pWinStates) == 0 && needClearDiskBuff(pFileState)) {
|
||||||
|
@ -64,25 +55,7 @@ int32_t getHashSortRowBuff(SStreamFileState* pFileState, const SWinKey* pKey, vo
|
||||||
streamStateFreeCur(pCur);
|
streamStateFreeCur(pCur);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t size = taosArrayGetSize(pWinStates);
|
addSearchItem(pFileState, pWinStates, pKey);
|
||||||
int32_t index = binarySearch(pWinStates, size, pKey, fillStateKeyCompare);
|
|
||||||
if (!isFlushedState(pFileState, pKey->ts, 0)|| index >= 0 || size == 0) {
|
|
||||||
// find the first position which is smaller than the pKey
|
|
||||||
if (index >= 0) {
|
|
||||||
SWinKey* pTmpKey = taosArrayGet(pWinStates, index);
|
|
||||||
if (winKeyCmprImpl(pTmpKey, pKey) == 0) {
|
|
||||||
goto _end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
void* tmp = taosArrayInsert(pWinStates, index, pKey);
|
|
||||||
QUERY_CHECK_NULL(tmp, code, lino, _end, terrno);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size >= MAX_NUM_OF_CACHE_WIN) {
|
|
||||||
int32_t num = size - NUM_OF_CACHE_WIN;
|
|
||||||
taosArrayRemoveBatch(pWinStates, 0, num, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
|
|
@ -229,7 +229,6 @@ int32_t streamStateFillPut(SStreamState* pState, const SWinKey* key, const void*
|
||||||
|
|
||||||
int32_t streamStateFillGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen, int32_t* pWinCode) {
|
int32_t streamStateFillGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen, int32_t* pWinCode) {
|
||||||
if (pState->pFileState) {
|
if (pState->pFileState) {
|
||||||
// todo(liuyao) 改这里
|
|
||||||
return getRowBuff(pState->pFileState, (void*)key, sizeof(SWinKey), pVal, pVLen, pWinCode);
|
return getRowBuff(pState->pFileState, (void*)key, sizeof(SWinKey), pVal, pVLen, pWinCode);
|
||||||
}
|
}
|
||||||
return streamStateFillGet_rocksdb(pState, key, pVal, pVLen);
|
return streamStateFillGet_rocksdb(pState, key, pVal, pVLen);
|
||||||
|
@ -289,7 +288,24 @@ int32_t streamStateGetInfo(SStreamState* pState, void* pKey, int32_t keyLen, voi
|
||||||
|
|
||||||
int32_t streamStateAddIfNotExist(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen,
|
int32_t streamStateAddIfNotExist(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen,
|
||||||
int32_t* pWinCode) {
|
int32_t* pWinCode) {
|
||||||
return streamStateGet(pState, key, pVal, pVLen, pWinCode);
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
|
code = streamStateGet(pState, key, pVal, pVLen, pWinCode);
|
||||||
|
QUERY_CHECK_CODE(code, lino, _end);
|
||||||
|
|
||||||
|
SSHashObj* pSearchBuff = getSearchBuff(pState->pFileState);
|
||||||
|
if (pSearchBuff != NULL) {
|
||||||
|
SArray* pWinStates = NULL;
|
||||||
|
code = addArrayBuffIfNotExist(pSearchBuff, key->groupId, &pWinStates);
|
||||||
|
QUERY_CHECK_CODE(code, lino, _end);
|
||||||
|
code = addSearchItem(pState->pFileState, pWinStates, key);
|
||||||
|
QUERY_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void streamStateReleaseBuf(SStreamState* pState, void* pVal, bool used) {
|
void streamStateReleaseBuf(SStreamState* pState, void* pVal, bool used) {
|
||||||
|
@ -588,6 +604,10 @@ void streamStateClearExpiredState(SStreamState* pState) {
|
||||||
clearExpiredState(pState->pFileState);
|
clearExpiredState(pState->pFileState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void streamStateSetFillInfo(SStreamState* pState) {
|
||||||
|
setFillInfo(pState->pFileState);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t streamStateGetPrev(SStreamState* pState, const SWinKey* pKey, SWinKey* pResKey, void** pVal, int32_t* pVLen,
|
int32_t streamStateGetPrev(SStreamState* pState, const SWinKey* pKey, SWinKey* pResKey, void** pVal, int32_t* pVLen,
|
||||||
int32_t* pWinCode) {
|
int32_t* pWinCode) {
|
||||||
return getRowStatePrevRow(pState->pFileState, pKey, pResKey, pVal, pVLen, pWinCode);
|
return getRowStatePrevRow(pState->pFileState, pKey, pResKey, pVal, pVLen, pWinCode);
|
||||||
|
|
|
@ -56,6 +56,7 @@ struct SStreamFileState {
|
||||||
char* cfName;
|
char* cfName;
|
||||||
void* searchBuff;
|
void* searchBuff;
|
||||||
SSHashObj* pGroupIdMap;
|
SSHashObj* pGroupIdMap;
|
||||||
|
bool hasFillCatch;
|
||||||
|
|
||||||
_state_buff_cleanup_fn stateBuffCleanupFn;
|
_state_buff_cleanup_fn stateBuffCleanupFn;
|
||||||
_state_buff_remove_fn stateBuffRemoveFn;
|
_state_buff_remove_fn stateBuffRemoveFn;
|
||||||
|
@ -253,6 +254,8 @@ int32_t streamFileStateInit(int64_t memSize, uint32_t keySize, uint32_t rowSize,
|
||||||
pFileState->pGroupIdMap = tSimpleHashInit(1024, hashFn);
|
pFileState->pGroupIdMap = tSimpleHashInit(1024, hashFn);
|
||||||
QUERY_CHECK_NULL(pFileState->pGroupIdMap, code, lino, _end, terrno);
|
QUERY_CHECK_NULL(pFileState->pGroupIdMap, code, lino, _end, terrno);
|
||||||
|
|
||||||
|
pFileState->hasFillCatch = true;
|
||||||
|
|
||||||
if (type == STREAM_STATE_BUFF_HASH || type == STREAM_STATE_BUFF_HASH_SEARCH) {
|
if (type == STREAM_STATE_BUFF_HASH || type == STREAM_STATE_BUFF_HASH_SEARCH) {
|
||||||
code = recoverSnapshot(pFileState, checkpointId);
|
code = recoverSnapshot(pFileState, checkpointId);
|
||||||
} else if (type == STREAM_STATE_BUFF_SORT) {
|
} else if (type == STREAM_STATE_BUFF_SORT) {
|
||||||
|
@ -997,6 +1000,7 @@ int32_t recoverSnapshot(SStreamFileState* pFileState, int64_t ckId) {
|
||||||
}
|
}
|
||||||
if (vlen != pFileState->rowSize) {
|
if (vlen != pFileState->rowSize) {
|
||||||
code = TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR;
|
code = TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR;
|
||||||
|
taosMemoryFreeClear(pVal);
|
||||||
QUERY_CHECK_CODE(code, lino, _end);
|
QUERY_CHECK_CODE(code, lino, _end);
|
||||||
}
|
}
|
||||||
memcpy(pNewPos->pRowBuff, pVal, vlen);
|
memcpy(pNewPos->pRowBuff, pVal, vlen);
|
||||||
|
@ -1207,6 +1211,10 @@ SSHashObj* getGroupIdCache(SStreamFileState* pFileState) {
|
||||||
return pFileState->pGroupIdMap;
|
return pFileState->pGroupIdMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setFillInfo(SStreamFileState* pFileState) {
|
||||||
|
pFileState->hasFillCatch = false;
|
||||||
|
}
|
||||||
|
|
||||||
void clearExpiredState(SStreamFileState* pFileState) {
|
void clearExpiredState(SStreamFileState* pFileState) {
|
||||||
SSHashObj* pSearchBuff = pFileState->searchBuff;
|
SSHashObj* pSearchBuff = pFileState->searchBuff;
|
||||||
void* pIte = NULL;
|
void* pIte = NULL;
|
||||||
|
@ -1222,8 +1230,10 @@ void clearExpiredState(SStreamFileState* pFileState) {
|
||||||
int32_t code_file = pFileState->stateFileRemoveFn(pFileState, pKey);
|
int32_t code_file = pFileState->stateFileRemoveFn(pFileState, pKey);
|
||||||
qTrace("%s at line %d res:%d", __func__, __LINE__, code_file);
|
qTrace("%s at line %d res:%d", __func__, __LINE__, code_file);
|
||||||
|
|
||||||
code_file = streamStateFillDel_rocksdb(pFileState->pFileStore, pKey);
|
if (pFileState->hasFillCatch == false || isFlushedState(pFileState, pKey->ts, 0)) {
|
||||||
qTrace("%s at line %d res %d", __func__, __LINE__, code_file);
|
code_file = streamStateFillDel_rocksdb(pFileState->pFileStore, pKey);
|
||||||
|
qTrace("state fill delete.%s at line %d res %d", __func__, __LINE__, code_file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
taosArrayRemoveBatch(pWinStates, 0, size - 1, NULL);
|
taosArrayRemoveBatch(pWinStates, 0, size - 1, NULL);
|
||||||
}
|
}
|
||||||
|
@ -1368,3 +1378,55 @@ _end:
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t addSearchItem(SStreamFileState* pFileState, SArray* pWinStates, const SWinKey* pKey) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
|
int32_t size = taosArrayGetSize(pWinStates);
|
||||||
|
int32_t index = binarySearch(pWinStates, size, pKey, fillStateKeyCompare);
|
||||||
|
if (!isFlushedState(pFileState, pKey->ts, 0) || index >= 0 || size == 0) {
|
||||||
|
if (index >= 0) {
|
||||||
|
SWinKey* pTmpKey = taosArrayGet(pWinStates, index);
|
||||||
|
if (winKeyCmprImpl(pTmpKey, pKey) == 0) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
void* tmp = taosArrayInsert(pWinStates, index, pKey);
|
||||||
|
QUERY_CHECK_NULL(tmp, code, lino, _end, terrno);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size >= MAX_NUM_OF_CACHE_WIN) {
|
||||||
|
int32_t num = size - NUM_OF_CACHE_WIN;
|
||||||
|
taosArrayRemoveBatch(pWinStates, 0, num, NULL);
|
||||||
|
}
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t addArrayBuffIfNotExist(SSHashObj* pSearchBuff, uint64_t groupId, SArray** ppResStates) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
|
SArray* pWinStates = NULL;
|
||||||
|
void** ppBuff = tSimpleHashGet(pSearchBuff, &groupId, sizeof(uint64_t));
|
||||||
|
if (ppBuff) {
|
||||||
|
pWinStates = (SArray*)(*ppBuff);
|
||||||
|
} else {
|
||||||
|
pWinStates = taosArrayInit(16, sizeof(SWinKey));
|
||||||
|
QUERY_CHECK_NULL(pWinStates, code, lino, _end, terrno);
|
||||||
|
|
||||||
|
code = tSimpleHashPut(pSearchBuff, &groupId, sizeof(uint64_t), &pWinStates, POINTER_BYTES);
|
||||||
|
QUERY_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
|
(*ppResStates) = pWinStates;
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue