Merge branch '3.0' of https://github.com/taosdata/TDengine into enh/tsdb_optimize
This commit is contained in:
commit
13229b0ee1
|
@ -248,6 +248,7 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq2** pReq, const SSDataBlock* pData
|
||||||
tb_uid_t suid);
|
tb_uid_t suid);
|
||||||
|
|
||||||
char* buildCtbNameByGroupId(const char* stbName, uint64_t groupId);
|
char* buildCtbNameByGroupId(const char* stbName, uint64_t groupId);
|
||||||
|
int32_t buildCtbNameByGroupIdImpl(const char* stbName, uint64_t groupId, char* pBuf);
|
||||||
|
|
||||||
static FORCE_INLINE int32_t blockGetEncodeSize(const SSDataBlock* pBlock) {
|
static FORCE_INLINE int32_t blockGetEncodeSize(const SSDataBlock* pBlock) {
|
||||||
return blockDataGetSerialMetaSize(taosArrayGetSize(pBlock->pDataBlock)) + blockDataGetSize(pBlock);
|
return blockDataGetSerialMetaSize(taosArrayGetSize(pBlock->pDataBlock)) + blockDataGetSize(pBlock);
|
||||||
|
|
|
@ -327,6 +327,7 @@ struct SStreamTask {
|
||||||
int64_t checkpointingId;
|
int64_t checkpointingId;
|
||||||
int32_t checkpointAlignCnt;
|
int32_t checkpointAlignCnt;
|
||||||
struct SStreamMeta* pMeta;
|
struct SStreamMeta* pMeta;
|
||||||
|
SSHashObj* pNameMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
// meta
|
// meta
|
||||||
|
|
|
@ -2465,19 +2465,31 @@ _end:
|
||||||
}
|
}
|
||||||
|
|
||||||
char* buildCtbNameByGroupId(const char* stbFullName, uint64_t groupId) {
|
char* buildCtbNameByGroupId(const char* stbFullName, uint64_t groupId) {
|
||||||
if (stbFullName[0] == 0) {
|
char* pBuf = taosMemoryCalloc(1, TSDB_TABLE_NAME_LEN + 1);
|
||||||
|
if (!pBuf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
int32_t code = buildCtbNameByGroupIdImpl(stbFullName, groupId, pBuf);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
taosMemoryFree(pBuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return pBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t buildCtbNameByGroupIdImpl(const char* stbFullName, uint64_t groupId, char* cname) {
|
||||||
|
if (stbFullName[0] == 0) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
SArray* tags = taosArrayInit(0, sizeof(SSmlKv));
|
SArray* tags = taosArrayInit(0, sizeof(SSmlKv));
|
||||||
if (tags == NULL) {
|
if (tags == NULL) {
|
||||||
return NULL;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* cname = taosMemoryCalloc(1, TSDB_TABLE_NAME_LEN + 1);
|
|
||||||
if (cname == NULL) {
|
if (cname == NULL) {
|
||||||
taosArrayDestroy(tags);
|
taosArrayDestroy(tags);
|
||||||
return NULL;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSmlKv pTag = {.key = "group_id",
|
SSmlKv pTag = {.key = "group_id",
|
||||||
|
@ -2499,9 +2511,9 @@ char* buildCtbNameByGroupId(const char* stbFullName, uint64_t groupId) {
|
||||||
taosArrayDestroy(tags);
|
taosArrayDestroy(tags);
|
||||||
|
|
||||||
if ((rname.ctbShortName && rname.ctbShortName[0]) == 0) {
|
if ((rname.ctbShortName && rname.ctbShortName[0]) == 0) {
|
||||||
return NULL;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
return rname.ctbShortName;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t blockEncode(const SSDataBlock* pBlock, char* data, int32_t numOfCols) {
|
int32_t blockEncode(const SSDataBlock* pBlock, char* data, int32_t numOfCols) {
|
||||||
|
|
|
@ -298,10 +298,8 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
|
||||||
if (res == TSDB_CODE_SUCCESS) {
|
if (res == TSDB_CODE_SUCCESS) {
|
||||||
memcpy(ctbName, pTableSinkInfo->tbName, strlen(pTableSinkInfo->tbName));
|
memcpy(ctbName, pTableSinkInfo->tbName, strlen(pTableSinkInfo->tbName));
|
||||||
} else {
|
} else {
|
||||||
char* tmp = buildCtbNameByGroupId(stbFullName, pDataBlock->info.id.groupId);
|
buildCtbNameByGroupIdImpl(stbFullName, pDataBlock->info.id.groupId, ctbName);
|
||||||
memcpy(ctbName, tmp, strlen(tmp));
|
memcpy(pTableSinkInfo->tbName, ctbName, strlen(ctbName));
|
||||||
memcpy(pTableSinkInfo->tbName, tmp, strlen(tmp));
|
|
||||||
taosMemoryFree(tmp);
|
|
||||||
tqDebug("vgId:%d, gropuId:%" PRIu64 " datablock table name is null", TD_VID(pVnode),
|
tqDebug("vgId:%d, gropuId:%" PRIu64 " datablock table name is null", TD_VID(pVnode),
|
||||||
pDataBlock->info.id.groupId);
|
pDataBlock->info.id.groupId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,7 +257,8 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
||||||
|
|
||||||
|
|
||||||
// output the result
|
// output the result
|
||||||
bool hasInterp = true;
|
int32_t fillColIndex = 0;
|
||||||
|
bool hasInterp = true;
|
||||||
for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) {
|
for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) {
|
||||||
SExprInfo* pExprInfo = &pExprSup->pExprInfo[j];
|
SExprInfo* pExprInfo = &pExprSup->pExprInfo[j];
|
||||||
|
|
||||||
|
@ -307,7 +308,7 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
||||||
|
|
||||||
case TSDB_FILL_SET_VALUE:
|
case TSDB_FILL_SET_VALUE:
|
||||||
case TSDB_FILL_SET_VALUE_F: {
|
case TSDB_FILL_SET_VALUE_F: {
|
||||||
SVariant* pVar = &pSliceInfo->pFillColInfo[j].fillVal;
|
SVariant* pVar = &pSliceInfo->pFillColInfo[fillColIndex].fillVal;
|
||||||
|
|
||||||
if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) {
|
if (pDst->info.type == TSDB_DATA_TYPE_FLOAT) {
|
||||||
float v = 0;
|
float v = 0;
|
||||||
|
@ -342,6 +343,8 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
||||||
}
|
}
|
||||||
colDataSetVal(pDst, rows, (char*)&v, false);
|
colDataSetVal(pDst, rows, (char*)&v, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
++fillColIndex;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -707,6 +707,10 @@ static bool isWindowPseudoColumnFunc(const SNode* pNode) {
|
||||||
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsWindowPseudoColumnFunc(((SFunctionNode*)pNode)->funcId));
|
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsWindowPseudoColumnFunc(((SFunctionNode*)pNode)->funcId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isInterpFunc(const SNode* pNode) {
|
||||||
|
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsInterpFunc(((SFunctionNode*)pNode)->funcId));
|
||||||
|
}
|
||||||
|
|
||||||
static bool isInterpPseudoColumnFunc(const SNode* pNode) {
|
static bool isInterpPseudoColumnFunc(const SNode* pNode) {
|
||||||
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsInterpPseudoColumnFunc(((SFunctionNode*)pNode)->funcId));
|
return (QUERY_NODE_FUNCTION == nodeType(pNode) && fmIsInterpPseudoColumnFunc(((SFunctionNode*)pNode)->funcId));
|
||||||
}
|
}
|
||||||
|
@ -3030,7 +3034,7 @@ static int32_t translateOrderBy(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static EDealRes needFillImpl(SNode* pNode, void* pContext) {
|
static EDealRes needFillImpl(SNode* pNode, void* pContext) {
|
||||||
if (isAggFunc(pNode) && FUNCTION_TYPE_GROUP_KEY != ((SFunctionNode*)pNode)->funcType) {
|
if ((isAggFunc(pNode) || isInterpFunc(pNode)) && FUNCTION_TYPE_GROUP_KEY != ((SFunctionNode*)pNode)->funcType) {
|
||||||
*(bool*)pContext = true;
|
*(bool*)pContext = true;
|
||||||
return DEAL_RES_END;
|
return DEAL_RES_END;
|
||||||
}
|
}
|
||||||
|
@ -3054,7 +3058,7 @@ static int32_t convertFillValue(STranslateContext* pCxt, SDataType dt, SNodeList
|
||||||
code = scalarCalculateConstants(pCaseFunc, &pCell->pNode);
|
code = scalarCalculateConstants(pCaseFunc, &pCell->pNode);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code && QUERY_NODE_VALUE != nodeType(pCell->pNode)) {
|
if (TSDB_CODE_SUCCESS == code && QUERY_NODE_VALUE != nodeType(pCell->pNode)) {
|
||||||
code = generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Fill value is just a constant");
|
code = generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Fill value can only accept constant");
|
||||||
} else if (TSDB_CODE_SUCCESS != code) {
|
} else if (TSDB_CODE_SUCCESS != code) {
|
||||||
code = generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Filled data type mismatch");
|
code = generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Filled data type mismatch");
|
||||||
}
|
}
|
||||||
|
@ -3078,6 +3082,7 @@ static int32_t checkFillValues(STranslateContext* pCxt, SFillNode* pFill, SNodeL
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
++fillNo;
|
++fillNo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3562,6 +3567,9 @@ static int32_t translateInterpFill(STranslateContext* pCxt, SSelectStmt* pSelect
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = checkFill(pCxt, (SFillNode*)pSelect->pFill, (SValueNode*)pSelect->pEvery, true);
|
code = checkFill(pCxt, (SFillNode*)pSelect->pFill, (SValueNode*)pSelect->pEvery, true);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = checkFillValues(pCxt, (SFillNode*)pSelect->pFill, pSelect->pProjectionList);
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,13 @@
|
||||||
|
|
||||||
#include "streamInc.h"
|
#include "streamInc.h"
|
||||||
|
|
||||||
|
#define MAX_BLOCK_NAME_NUM 1024
|
||||||
|
|
||||||
|
typedef struct SBlockName {
|
||||||
|
uint32_t hashValue;
|
||||||
|
char parTbName[TSDB_TABLE_NAME_LEN];
|
||||||
|
} SBlockName;
|
||||||
|
|
||||||
int32_t tEncodeStreamDispatchReq(SEncoder* pEncoder, const SStreamDispatchReq* pReq) {
|
int32_t tEncodeStreamDispatchReq(SEncoder* pEncoder, const SStreamDispatchReq* pReq) {
|
||||||
if (tStartEncode(pEncoder) < 0) return -1;
|
if (tStartEncode(pEncoder) < 0) return -1;
|
||||||
if (tEncodeI64(pEncoder, pReq->streamId) < 0) return -1;
|
if (tEncodeI64(pEncoder, pReq->streamId) < 0) return -1;
|
||||||
|
@ -331,26 +338,46 @@ FAIL:
|
||||||
|
|
||||||
int32_t streamSearchAndAddBlock(SStreamTask* pTask, SStreamDispatchReq* pReqs, SSDataBlock* pDataBlock, int32_t vgSz,
|
int32_t streamSearchAndAddBlock(SStreamTask* pTask, SStreamDispatchReq* pReqs, SSDataBlock* pDataBlock, int32_t vgSz,
|
||||||
int64_t groupId) {
|
int64_t groupId) {
|
||||||
char* ctbName = taosMemoryCalloc(1, TSDB_TABLE_FNAME_LEN);
|
uint32_t hashValue = 0;
|
||||||
if (ctbName == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pDataBlock->info.parTbName[0]) {
|
|
||||||
snprintf(ctbName, TSDB_TABLE_NAME_LEN, "%s.%s", pTask->shuffleDispatcher.dbInfo.db, pDataBlock->info.parTbName);
|
|
||||||
} else {
|
|
||||||
char* ctbShortName = buildCtbNameByGroupId(pTask->shuffleDispatcher.stbFullName, groupId);
|
|
||||||
snprintf(ctbName, TSDB_TABLE_NAME_LEN, "%s.%s", pTask->shuffleDispatcher.dbInfo.db, ctbShortName);
|
|
||||||
taosMemoryFree(ctbShortName);
|
|
||||||
}
|
|
||||||
|
|
||||||
SArray* vgInfo = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
SArray* vgInfo = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
||||||
|
if (pTask->pNameMap == NULL) {
|
||||||
|
pTask->pNameMap = tSimpleHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT));
|
||||||
|
}
|
||||||
|
|
||||||
/*uint32_t hashValue = MurmurHash3_32(ctbName, strlen(ctbName));*/
|
void* pVal = tSimpleHashGet(pTask->pNameMap, &groupId, sizeof(int64_t));
|
||||||
SUseDbRsp* pDbInfo = &pTask->shuffleDispatcher.dbInfo;
|
if (pVal) {
|
||||||
uint32_t hashValue =
|
SBlockName* pBln = (SBlockName*)pVal;
|
||||||
taosGetTbHashVal(ctbName, strlen(ctbName), pDbInfo->hashMethod, pDbInfo->hashPrefix, pDbInfo->hashSuffix);
|
hashValue = pBln->hashValue;
|
||||||
taosMemoryFree(ctbName);
|
if (!pDataBlock->info.parTbName[0]) {
|
||||||
|
memcpy(pDataBlock->info.parTbName, pBln->parTbName, strlen(pBln->parTbName));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
char* ctbName = taosMemoryCalloc(1, TSDB_TABLE_FNAME_LEN);
|
||||||
|
if (ctbName == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDataBlock->info.parTbName[0]) {
|
||||||
|
snprintf(ctbName, TSDB_TABLE_NAME_LEN, "%s.%s", pTask->shuffleDispatcher.dbInfo.db, pDataBlock->info.parTbName);
|
||||||
|
} else {
|
||||||
|
buildCtbNameByGroupIdImpl(pTask->shuffleDispatcher.stbFullName, groupId, pDataBlock->info.parTbName);
|
||||||
|
snprintf(ctbName, TSDB_TABLE_NAME_LEN, "%s.%s", pTask->shuffleDispatcher.dbInfo.db, pDataBlock->info.parTbName);
|
||||||
|
}
|
||||||
|
|
||||||
|
SArray* vgInfo = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
||||||
|
|
||||||
|
/*uint32_t hashValue = MurmurHash3_32(ctbName, strlen(ctbName));*/
|
||||||
|
SUseDbRsp* pDbInfo = &pTask->shuffleDispatcher.dbInfo;
|
||||||
|
hashValue =
|
||||||
|
taosGetTbHashVal(ctbName, strlen(ctbName), pDbInfo->hashMethod, pDbInfo->hashPrefix, pDbInfo->hashSuffix);
|
||||||
|
taosMemoryFree(ctbName);
|
||||||
|
SBlockName bln = {0};
|
||||||
|
bln.hashValue = hashValue;
|
||||||
|
memcpy(bln.parTbName, pDataBlock->info.parTbName, strlen(pDataBlock->info.parTbName));
|
||||||
|
if (tSimpleHashGetSize(pTask->pNameMap) < MAX_BLOCK_NAME_NUM) {
|
||||||
|
tSimpleHashPut(pTask->pNameMap, &groupId, sizeof(int64_t), &bln, sizeof(SBlockName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
// TODO: optimize search
|
// TODO: optimize search
|
||||||
|
|
|
@ -224,5 +224,9 @@ void tFreeStreamTask(SStreamTask* pTask) {
|
||||||
taosMemoryFree((void*)pTask->id.idStr);
|
taosMemoryFree((void*)pTask->id.idStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pTask->pNameMap) {
|
||||||
|
tSimpleHashCleanup(pTask->pNameMap);
|
||||||
|
}
|
||||||
|
|
||||||
taosMemoryFree(pTask);
|
taosMemoryFree(pTask);
|
||||||
}
|
}
|
||||||
|
|
|
@ -225,6 +225,56 @@ class TDTestCase:
|
||||||
tdSql.checkData(2, 0, 12)
|
tdSql.checkData(2, 0, 12)
|
||||||
tdSql.checkData(3, 0, 12)
|
tdSql.checkData(3, 0, 12)
|
||||||
|
|
||||||
|
## test fill value with scalar expression
|
||||||
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(value, 1 + 2)")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, 3)
|
||||||
|
tdSql.checkData(1, 0, 3)
|
||||||
|
tdSql.checkData(2, 0, 3)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
|
||||||
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(value, 1.0 + 2.0)")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, 3)
|
||||||
|
tdSql.checkData(1, 0, 3)
|
||||||
|
tdSql.checkData(2, 0, 3)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
|
||||||
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(value, 1 + 2.5)")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, 3)
|
||||||
|
tdSql.checkData(1, 0, 3)
|
||||||
|
tdSql.checkData(2, 0, 3)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
|
||||||
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(value, 1 + '2')")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, 3)
|
||||||
|
tdSql.checkData(1, 0, 3)
|
||||||
|
tdSql.checkData(2, 0, 3)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
|
||||||
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(value, 1 + '2.0')")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, 3)
|
||||||
|
tdSql.checkData(1, 0, 3)
|
||||||
|
tdSql.checkData(2, 0, 3)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
|
||||||
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(value, '3' + 'abc')")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, 3)
|
||||||
|
tdSql.checkData(1, 0, 3)
|
||||||
|
tdSql.checkData(2, 0, 3)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
|
||||||
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(value, '2' + '1abc')")
|
||||||
|
tdSql.checkRows(4)
|
||||||
|
tdSql.checkData(0, 0, 3)
|
||||||
|
tdSql.checkData(1, 0, 3)
|
||||||
|
tdSql.checkData(2, 0, 3)
|
||||||
|
tdSql.checkData(3, 0, 3)
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step5:fill prev")
|
tdLog.printNoPrefix("==========step5:fill prev")
|
||||||
|
|
||||||
## {. . .}
|
## {. . .}
|
||||||
|
@ -1765,47 +1815,10 @@ class TDTestCase:
|
||||||
tdSql.checkData(60, 1, 60) #
|
tdSql.checkData(60, 1, 60) #
|
||||||
|
|
||||||
# test fill value
|
# test fill value
|
||||||
tdSql.query(f"select interp(c0),interp(c1) from {dbname}.{tbname1} range('2020-02-02 00:00:00', '2020-02-02 00:01:00') every(1s) fill(value, 123)")
|
tdSql.query(f"select _irowts, interp(c0), _irowts, interp(c1), _irowts from {dbname}.{tbname1} range('2020-02-02 00:00:00', '2020-02-02 00:01:00') every(1s) fill(value, 123, 456)")
|
||||||
tdSql.checkRows(61)
|
tdSql.checkRows(61)
|
||||||
tdSql.checkCols(2)
|
tdSql.checkCols(5)
|
||||||
tdSql.checkData(0, 0, 0) #
|
tdSql.checkData(0, 1, 0) #
|
||||||
tdSql.checkData(1, 0, 123)
|
|
||||||
tdSql.checkData(4, 0, 123)
|
|
||||||
tdSql.checkData(5, 0, None) #
|
|
||||||
tdSql.checkData(6, 0, 123)
|
|
||||||
tdSql.checkData(9, 0, 123)
|
|
||||||
tdSql.checkData(10, 0, 10) #
|
|
||||||
tdSql.checkData(11, 0, 123)
|
|
||||||
tdSql.checkData(14, 0, 123)
|
|
||||||
tdSql.checkData(15, 0, None) #
|
|
||||||
tdSql.checkData(16, 0, 123)
|
|
||||||
tdSql.checkData(19, 0, 123)
|
|
||||||
tdSql.checkData(20, 0, 20) #
|
|
||||||
tdSql.checkData(21, 0, 123)
|
|
||||||
tdSql.checkData(24, 0, 123)
|
|
||||||
tdSql.checkData(25, 0, None) #
|
|
||||||
tdSql.checkData(26, 0, 123)
|
|
||||||
tdSql.checkData(29, 0, 123)
|
|
||||||
tdSql.checkData(30, 0, 30) #
|
|
||||||
tdSql.checkData(31, 0, 123)
|
|
||||||
tdSql.checkData(34, 0, 123)
|
|
||||||
tdSql.checkData(35, 0, 35) #
|
|
||||||
tdSql.checkData(36, 0, 123)
|
|
||||||
tdSql.checkData(39, 0, 123)
|
|
||||||
tdSql.checkData(40, 0, 40) #
|
|
||||||
tdSql.checkData(41, 0, 123)
|
|
||||||
tdSql.checkData(44, 0, 123)
|
|
||||||
tdSql.checkData(45, 0, None) #
|
|
||||||
tdSql.checkData(46, 0, 123)
|
|
||||||
tdSql.checkData(49, 0, 123)
|
|
||||||
tdSql.checkData(50, 0, 50) #
|
|
||||||
tdSql.checkData(51, 0, 123)
|
|
||||||
tdSql.checkData(54, 0, 123)
|
|
||||||
tdSql.checkData(55, 0, None) #
|
|
||||||
tdSql.checkData(59, 0, 123)
|
|
||||||
tdSql.checkData(60, 0, 55) #
|
|
||||||
|
|
||||||
tdSql.checkData(0, 1, None) #
|
|
||||||
tdSql.checkData(1, 1, 123)
|
tdSql.checkData(1, 1, 123)
|
||||||
tdSql.checkData(4, 1, 123)
|
tdSql.checkData(4, 1, 123)
|
||||||
tdSql.checkData(5, 1, None) #
|
tdSql.checkData(5, 1, None) #
|
||||||
|
@ -1817,7 +1830,7 @@ class TDTestCase:
|
||||||
tdSql.checkData(15, 1, None) #
|
tdSql.checkData(15, 1, None) #
|
||||||
tdSql.checkData(16, 1, 123)
|
tdSql.checkData(16, 1, 123)
|
||||||
tdSql.checkData(19, 1, 123)
|
tdSql.checkData(19, 1, 123)
|
||||||
tdSql.checkData(20, 1, None) #
|
tdSql.checkData(20, 1, 20) #
|
||||||
tdSql.checkData(21, 1, 123)
|
tdSql.checkData(21, 1, 123)
|
||||||
tdSql.checkData(24, 1, 123)
|
tdSql.checkData(24, 1, 123)
|
||||||
tdSql.checkData(25, 1, None) #
|
tdSql.checkData(25, 1, None) #
|
||||||
|
@ -1826,22 +1839,137 @@ class TDTestCase:
|
||||||
tdSql.checkData(30, 1, 30) #
|
tdSql.checkData(30, 1, 30) #
|
||||||
tdSql.checkData(31, 1, 123)
|
tdSql.checkData(31, 1, 123)
|
||||||
tdSql.checkData(34, 1, 123)
|
tdSql.checkData(34, 1, 123)
|
||||||
tdSql.checkData(35, 1, None) #
|
tdSql.checkData(35, 1, 35) #
|
||||||
tdSql.checkData(36, 1, 123)
|
tdSql.checkData(36, 1, 123)
|
||||||
tdSql.checkData(39, 1, 123)
|
tdSql.checkData(39, 1, 123)
|
||||||
tdSql.checkData(40, 1, 40) #
|
tdSql.checkData(40, 1, 40) #
|
||||||
tdSql.checkData(41, 1, 123)
|
tdSql.checkData(41, 1, 123)
|
||||||
tdSql.checkData(44, 1, 123)
|
tdSql.checkData(44, 1, 123)
|
||||||
tdSql.checkData(45, 1, 45) #
|
tdSql.checkData(45, 1, None) #
|
||||||
tdSql.checkData(46, 1, 123)
|
tdSql.checkData(46, 1, 123)
|
||||||
tdSql.checkData(49, 1, 123)
|
tdSql.checkData(49, 1, 123)
|
||||||
tdSql.checkData(50, 1, None) #
|
tdSql.checkData(50, 1, 50) #
|
||||||
tdSql.checkData(51, 1, 123)
|
tdSql.checkData(51, 1, 123)
|
||||||
tdSql.checkData(54, 1, 123)
|
tdSql.checkData(54, 1, 123)
|
||||||
tdSql.checkData(55, 1, None) #
|
tdSql.checkData(55, 1, None) #
|
||||||
tdSql.checkData(56, 1, 123)
|
|
||||||
tdSql.checkData(59, 1, 123)
|
tdSql.checkData(59, 1, 123)
|
||||||
tdSql.checkData(60, 1, 60) #
|
tdSql.checkData(60, 1, 55) #
|
||||||
|
|
||||||
|
tdSql.checkData(0, 3, None) #
|
||||||
|
tdSql.checkData(1, 3, 456)
|
||||||
|
tdSql.checkData(4, 3, 456)
|
||||||
|
tdSql.checkData(5, 3, None) #
|
||||||
|
tdSql.checkData(6, 3, 456)
|
||||||
|
tdSql.checkData(9, 3, 456)
|
||||||
|
tdSql.checkData(10, 3, 10) #
|
||||||
|
tdSql.checkData(11, 3, 456)
|
||||||
|
tdSql.checkData(14, 3, 456)
|
||||||
|
tdSql.checkData(15, 3, None) #
|
||||||
|
tdSql.checkData(16, 3, 456)
|
||||||
|
tdSql.checkData(19, 3, 456)
|
||||||
|
tdSql.checkData(20, 3, None) #
|
||||||
|
tdSql.checkData(21, 3, 456)
|
||||||
|
tdSql.checkData(24, 3, 456)
|
||||||
|
tdSql.checkData(25, 3, None) #
|
||||||
|
tdSql.checkData(26, 3, 456)
|
||||||
|
tdSql.checkData(29, 3, 456)
|
||||||
|
tdSql.checkData(30, 3, 30) #
|
||||||
|
tdSql.checkData(31, 3, 456)
|
||||||
|
tdSql.checkData(34, 3, 456)
|
||||||
|
tdSql.checkData(35, 3, None) #
|
||||||
|
tdSql.checkData(36, 3, 456)
|
||||||
|
tdSql.checkData(39, 3, 456)
|
||||||
|
tdSql.checkData(40, 3, 40) #
|
||||||
|
tdSql.checkData(41, 3, 456)
|
||||||
|
tdSql.checkData(44, 3, 456)
|
||||||
|
tdSql.checkData(45, 3, 45) #
|
||||||
|
tdSql.checkData(46, 3, 456)
|
||||||
|
tdSql.checkData(49, 3, 456)
|
||||||
|
tdSql.checkData(50, 3, None) #
|
||||||
|
tdSql.checkData(51, 3, 456)
|
||||||
|
tdSql.checkData(54, 3, 456)
|
||||||
|
tdSql.checkData(55, 3, None) #
|
||||||
|
tdSql.checkData(56, 3, 456)
|
||||||
|
tdSql.checkData(59, 3, 456)
|
||||||
|
tdSql.checkData(60, 3, 60) #
|
||||||
|
|
||||||
|
tdSql.query(f"select _isfilled, interp(c0), _isfilled, interp(c1), _isfilled from {dbname}.{tbname1} range('2020-02-02 00:00:00', '2020-02-02 00:01:00') every(1s) fill(value, 123 + 123, 234 + 234)")
|
||||||
|
tdSql.checkRows(61)
|
||||||
|
tdSql.checkCols(5)
|
||||||
|
tdSql.checkData(0, 1, 0) #
|
||||||
|
tdSql.checkData(1, 1, 246)
|
||||||
|
tdSql.checkData(4, 1, 246)
|
||||||
|
tdSql.checkData(5, 1, None) #
|
||||||
|
tdSql.checkData(6, 1, 246)
|
||||||
|
tdSql.checkData(9, 1, 246)
|
||||||
|
tdSql.checkData(10, 1, 10) #
|
||||||
|
tdSql.checkData(11, 1, 246)
|
||||||
|
tdSql.checkData(14, 1, 246)
|
||||||
|
tdSql.checkData(15, 1, None) #
|
||||||
|
tdSql.checkData(16, 1, 246)
|
||||||
|
tdSql.checkData(19, 1, 246)
|
||||||
|
tdSql.checkData(20, 1, 20) #
|
||||||
|
tdSql.checkData(21, 1, 246)
|
||||||
|
tdSql.checkData(24, 1, 246)
|
||||||
|
tdSql.checkData(25, 1, None) #
|
||||||
|
tdSql.checkData(26, 1, 246)
|
||||||
|
tdSql.checkData(29, 1, 246)
|
||||||
|
tdSql.checkData(30, 1, 30) #
|
||||||
|
tdSql.checkData(31, 1, 246)
|
||||||
|
tdSql.checkData(34, 1, 246)
|
||||||
|
tdSql.checkData(35, 1, 35) #
|
||||||
|
tdSql.checkData(36, 1, 246)
|
||||||
|
tdSql.checkData(39, 1, 246)
|
||||||
|
tdSql.checkData(40, 1, 40) #
|
||||||
|
tdSql.checkData(41, 1, 246)
|
||||||
|
tdSql.checkData(44, 1, 246)
|
||||||
|
tdSql.checkData(45, 1, None) #
|
||||||
|
tdSql.checkData(46, 1, 246)
|
||||||
|
tdSql.checkData(49, 1, 246)
|
||||||
|
tdSql.checkData(50, 1, 50) #
|
||||||
|
tdSql.checkData(51, 1, 246)
|
||||||
|
tdSql.checkData(54, 1, 246)
|
||||||
|
tdSql.checkData(55, 1, None) #
|
||||||
|
tdSql.checkData(59, 1, 246)
|
||||||
|
tdSql.checkData(60, 1, 55) #
|
||||||
|
|
||||||
|
tdSql.checkData(0, 3, None) #
|
||||||
|
tdSql.checkData(1, 3, 468)
|
||||||
|
tdSql.checkData(4, 3, 468)
|
||||||
|
tdSql.checkData(5, 3, None) #
|
||||||
|
tdSql.checkData(6, 3, 468)
|
||||||
|
tdSql.checkData(9, 3, 468)
|
||||||
|
tdSql.checkData(10, 3, 10) #
|
||||||
|
tdSql.checkData(11, 3, 468)
|
||||||
|
tdSql.checkData(14, 3, 468)
|
||||||
|
tdSql.checkData(15, 3, None) #
|
||||||
|
tdSql.checkData(16, 3, 468)
|
||||||
|
tdSql.checkData(19, 3, 468)
|
||||||
|
tdSql.checkData(20, 3, None) #
|
||||||
|
tdSql.checkData(21, 3, 468)
|
||||||
|
tdSql.checkData(24, 3, 468)
|
||||||
|
tdSql.checkData(25, 3, None) #
|
||||||
|
tdSql.checkData(26, 3, 468)
|
||||||
|
tdSql.checkData(29, 3, 468)
|
||||||
|
tdSql.checkData(30, 3, 30) #
|
||||||
|
tdSql.checkData(31, 3, 468)
|
||||||
|
tdSql.checkData(34, 3, 468)
|
||||||
|
tdSql.checkData(35, 3, None) #
|
||||||
|
tdSql.checkData(36, 3, 468)
|
||||||
|
tdSql.checkData(39, 3, 468)
|
||||||
|
tdSql.checkData(40, 3, 40) #
|
||||||
|
tdSql.checkData(41, 3, 468)
|
||||||
|
tdSql.checkData(44, 3, 468)
|
||||||
|
tdSql.checkData(45, 3, 45) #
|
||||||
|
tdSql.checkData(46, 3, 468)
|
||||||
|
tdSql.checkData(49, 3, 468)
|
||||||
|
tdSql.checkData(50, 3, None) #
|
||||||
|
tdSql.checkData(51, 3, 468)
|
||||||
|
tdSql.checkData(54, 3, 468)
|
||||||
|
tdSql.checkData(55, 3, None) #
|
||||||
|
tdSql.checkData(56, 3, 468)
|
||||||
|
tdSql.checkData(59, 3, 468)
|
||||||
|
tdSql.checkData(60, 3, 60) #
|
||||||
|
|
||||||
# test fill prev
|
# test fill prev
|
||||||
tdSql.query(f"select interp(c0),interp(c1) from {dbname}.{tbname1} range('2020-02-02 00:00:00', '2020-02-02 00:01:00') every(1s) fill(prev)")
|
tdSql.query(f"select interp(c0),interp(c1) from {dbname}.{tbname1} range('2020-02-02 00:00:00', '2020-02-02 00:01:00') every(1s) fill(prev)")
|
||||||
|
@ -2016,7 +2144,7 @@ class TDTestCase:
|
||||||
tdSql.checkData(3, i, None)
|
tdSql.checkData(3, i, None)
|
||||||
tdSql.checkData(4, i, None)
|
tdSql.checkData(4, i, None)
|
||||||
|
|
||||||
tdSql.query(f"select interp(c0),interp(c1),interp(c2),interp(c3) from {dbname}.{tbname} range('2020-02-09 00:00:05', '2020-02-13 00:00:05') every(1d) fill(value, 1)")
|
tdSql.query(f"select interp(c0),interp(c1),interp(c2),interp(c3) from {dbname}.{tbname} range('2020-02-09 00:00:05', '2020-02-13 00:00:05') every(1d) fill(value, 1, 1, 1, 1)")
|
||||||
tdSql.checkRows(5)
|
tdSql.checkRows(5)
|
||||||
tdSql.checkCols(4)
|
tdSql.checkCols(4)
|
||||||
|
|
||||||
|
@ -2442,6 +2570,10 @@ class TDTestCase:
|
||||||
tdSql.error(f"select interp(c0) from {dbname}.{tbname} where _isfilled = true range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
tdSql.error(f"select interp(c0) from {dbname}.{tbname} where _isfilled = true range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
||||||
tdSql.error(f"select interp(c0) from {dbname}.{tbname} where _irowts > 0 range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
tdSql.error(f"select interp(c0) from {dbname}.{tbname} where _irowts > 0 range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
||||||
|
|
||||||
|
# fill value number mismatch
|
||||||
|
tdSql.error(f"select interp(c0) from {dbname}.{tbname} range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(value, 1, 2)")
|
||||||
|
tdSql.error(f"select interp(c0), interp(c1) from {dbname}.{tbname} range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(value, 1)")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue