Merge branch '3.0' of github.com:taosdata/TDengine into szhou/feature/multi-tb-merge-scan
This commit is contained in:
commit
040093bee8
|
@ -52,6 +52,7 @@ extern "C" {
|
||||||
#define TSDB_PERFS_TABLE_OFFSETS "offsets"
|
#define TSDB_PERFS_TABLE_OFFSETS "offsets"
|
||||||
#define TSDB_PERFS_TABLE_TRANS "trans"
|
#define TSDB_PERFS_TABLE_TRANS "trans"
|
||||||
#define TSDB_PERFS_TABLE_STREAMS "streams"
|
#define TSDB_PERFS_TABLE_STREAMS "streams"
|
||||||
|
#define TSDB_PERFS_TABLE_APPS "apps"
|
||||||
|
|
||||||
typedef struct SSysDbTableSchema {
|
typedef struct SSysDbTableSchema {
|
||||||
const char* name;
|
const char* name;
|
||||||
|
|
|
@ -261,54 +261,48 @@ int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgHandleForceUpdate(SCatalog* pCtg, SCtgJob *pJob, const SCatalogReq* pReq) {
|
int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, const SCatalogReq* pReq) {
|
||||||
int32_t dbNum = pJob->dbCfgNum + pJob->dbVgNum + pJob->dbInfoNum;
|
SHashObj* pDb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
if (dbNum > 0) {
|
if (NULL == pDb) {
|
||||||
if (dbNum > pJob->dbCfgNum && dbNum > pJob->dbVgNum && dbNum > pJob->dbInfoNum) {
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
SHashObj* pDb = taosHashInit(dbNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
|
||||||
if (NULL == pDb) {
|
|
||||||
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pJob->dbVgNum; ++i) {
|
|
||||||
char* dbFName = taosArrayGet(pReq->pDbVgroup, i);
|
|
||||||
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pJob->dbCfgNum; ++i) {
|
|
||||||
char* dbFName = taosArrayGet(pReq->pDbCfg, i);
|
|
||||||
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pJob->dbInfoNum; ++i) {
|
|
||||||
char* dbFName = taosArrayGet(pReq->pDbInfo, i);
|
|
||||||
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* dbFName = taosHashIterate(pDb, NULL);
|
|
||||||
while (dbFName) {
|
|
||||||
ctgDropDbVgroupEnqueue(pCtg, dbFName, true);
|
|
||||||
dbFName = taosHashIterate(pDb, dbFName);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosHashCleanup(pDb);
|
|
||||||
} else {
|
|
||||||
for (int32_t i = 0; i < pJob->dbVgNum; ++i) {
|
|
||||||
char* dbFName = taosArrayGet(pReq->pDbVgroup, i);
|
|
||||||
CTG_ERR_RET(ctgDropDbVgroupEnqueue(pCtg, dbFName, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pJob->dbCfgNum; ++i) {
|
|
||||||
char* dbFName = taosArrayGet(pReq->pDbCfg, i);
|
|
||||||
CTG_ERR_RET(ctgDropDbVgroupEnqueue(pCtg, dbFName, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pJob->dbInfoNum; ++i) {
|
|
||||||
char* dbFName = taosArrayGet(pReq->pDbInfo, i);
|
|
||||||
CTG_ERR_RET(ctgDropDbVgroupEnqueue(pCtg, dbFName, true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pJob->dbVgNum; ++i) {
|
||||||
|
char* dbFName = taosArrayGet(pReq->pDbVgroup, i);
|
||||||
|
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pJob->dbCfgNum; ++i) {
|
||||||
|
char* dbFName = taosArrayGet(pReq->pDbCfg, i);
|
||||||
|
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pJob->dbInfoNum; ++i) {
|
||||||
|
char* dbFName = taosArrayGet(pReq->pDbInfo, i);
|
||||||
|
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pJob->tbMetaNum; ++i) {
|
||||||
|
SName* name = taosArrayGet(pReq->pTableMeta, i);
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(name, dbFName);
|
||||||
|
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pJob->tbHashNum; ++i) {
|
||||||
|
SName* name = taosArrayGet(pReq->pTableHash, i);
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(name, dbFName);
|
||||||
|
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* dbFName = taosHashIterate(pDb, NULL);
|
||||||
|
while (dbFName) {
|
||||||
|
ctgDropDbVgroupEnqueue(pCtg, dbFName, true);
|
||||||
|
dbFName = taosHashIterate(pDb, dbFName);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashCleanup(pDb);
|
||||||
|
|
||||||
int32_t tbNum = pJob->tbMetaNum + pJob->tbHashNum;
|
int32_t tbNum = pJob->tbMetaNum + pJob->tbHashNum;
|
||||||
if (tbNum > 0) {
|
if (tbNum > 0) {
|
||||||
|
@ -404,7 +398,7 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint6
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pReq->forceUpdate) {
|
if (pReq->forceUpdate) {
|
||||||
CTG_ERR_JRET(ctgHandleForceUpdate(pCtg, pJob, pReq));
|
CTG_ERR_JRET(ctgHandleForceUpdate(pCtg, *taskNum, pJob, pReq));
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taskIdx = 0;
|
int32_t taskIdx = 0;
|
||||||
|
@ -790,8 +784,7 @@ int32_t ctgHandleGetTbMetaRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
if (dbCache) {
|
if (dbCache) {
|
||||||
ctgRUnlockVgInfo(dbCache);
|
ctgReleaseVgInfoToCache(pCtg, dbCache);
|
||||||
ctgReleaseDBCache(pCtg, dbCache);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctgHandleTaskEnd(pTask, code);
|
ctgHandleTaskEnd(pTask, code);
|
||||||
|
@ -870,7 +863,7 @@ _return:
|
||||||
|
|
||||||
int32_t ctgHandleGetTbIndexRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
|
int32_t ctgHandleGetTbIndexRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
|
CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
|
||||||
|
|
||||||
STableIndex* pOut = (STableIndex*)pTask->msgCtx.out;
|
STableIndex* pOut = (STableIndex*)pTask->msgCtx.out;
|
||||||
SArray* pInfo = NULL;
|
SArray* pInfo = NULL;
|
||||||
|
@ -949,7 +942,6 @@ _return:
|
||||||
|
|
||||||
int32_t ctgHandleGetUserRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
|
int32_t ctgHandleGetUserRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SCtgDBCache *dbCache = NULL;
|
|
||||||
SCtgUserCtx* ctx = (SCtgUserCtx*)pTask->taskCtx;
|
SCtgUserCtx* ctx = (SCtgUserCtx*)pTask->taskCtx;
|
||||||
SCatalog* pCtg = pTask->pJob->pCtg;
|
SCatalog* pCtg = pTask->pJob->pCtg;
|
||||||
bool pass = false;
|
bool pass = false;
|
||||||
|
@ -1018,7 +1010,7 @@ int32_t ctgAsyncRefreshTbMeta(SCtgTask *pTask) {
|
||||||
CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
|
CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
|
||||||
if (dbCache) {
|
if (dbCache) {
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
CTG_ERR_RET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, ctx->pName, &vgInfo));
|
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, ctx->pName, &vgInfo));
|
||||||
|
|
||||||
ctgDebug("will refresh tbmeta, not supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(ctx->pName), ctx->flag);
|
ctgDebug("will refresh tbmeta, not supposed to be stb, tbName:%s, flag:%d", tNameGetTableName(ctx->pName), ctx->flag);
|
||||||
|
|
||||||
|
@ -1067,6 +1059,9 @@ int32_t ctgLaunchGetDbVgTask(SCtgTask *pTask) {
|
||||||
CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, pCtx->dbFName, &dbCache));
|
CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, pCtx->dbFName, &dbCache));
|
||||||
if (NULL != dbCache) {
|
if (NULL != dbCache) {
|
||||||
CTG_ERR_JRET(ctgGenerateVgList(pCtg, dbCache->vgCache.vgInfo->vgHash, (SArray**)&pTask->res));
|
CTG_ERR_JRET(ctgGenerateVgList(pCtg, dbCache->vgCache.vgInfo->vgHash, (SArray**)&pTask->res));
|
||||||
|
|
||||||
|
ctgReleaseVgInfoToCache(pCtg, dbCache);
|
||||||
|
dbCache = NULL;
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgHandleTaskEnd(pTask, 0));
|
CTG_ERR_JRET(ctgHandleTaskEnd(pTask, 0));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1101,6 +1096,9 @@ int32_t ctgLaunchGetTbHashTask(SCtgTask *pTask) {
|
||||||
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pCtx->pName, (SVgroupInfo*)pTask->res));
|
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pCtx->pName, (SVgroupInfo*)pTask->res));
|
||||||
|
|
||||||
|
ctgReleaseVgInfoToCache(pCtg, dbCache);
|
||||||
|
dbCache = NULL;
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgHandleTaskEnd(pTask, 0));
|
CTG_ERR_JRET(ctgHandleTaskEnd(pTask, 0));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1176,6 +1174,9 @@ int32_t ctgLaunchGetDbInfoTask(SCtgTask *pTask) {
|
||||||
pInfo->vgVer = dbCache->vgCache.vgInfo->vgVersion;
|
pInfo->vgVer = dbCache->vgCache.vgInfo->vgVersion;
|
||||||
pInfo->dbId = dbCache->dbId;
|
pInfo->dbId = dbCache->dbId;
|
||||||
pInfo->tbNum = dbCache->vgCache.vgInfo->numOfTable;
|
pInfo->tbNum = dbCache->vgCache.vgInfo->numOfTable;
|
||||||
|
|
||||||
|
ctgReleaseVgInfoToCache(pCtg, dbCache);
|
||||||
|
dbCache = NULL;
|
||||||
} else {
|
} else {
|
||||||
pInfo->vgVer = CTG_DEFAULT_INVALID_VERSION;
|
pInfo->vgVer = CTG_DEFAULT_INVALID_VERSION;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include "catalogInt.h"
|
#include "catalogInt.h"
|
||||||
|
|
||||||
extern SCatalogMgmt gCtgMgmt;
|
extern SCatalogMgmt gCtgMgmt;
|
||||||
SCtgDebug gCTGDebug = {0};
|
SCtgDebug gCTGDebug = {.lockEnable = true, .apiEnable = true};
|
||||||
|
|
||||||
void ctgdUserCallback(SMetaData* pResult, void* param, int32_t code) {
|
void ctgdUserCallback(SMetaData* pResult, void* param, int32_t code) {
|
||||||
ASSERT(*(int32_t*)param == 1);
|
ASSERT(*(int32_t*)param == 1);
|
||||||
|
|
|
@ -675,7 +675,8 @@ int32_t ctgCloneTableIndex(SArray* pIndex, SArray** pRes) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
STableIndexInfo *pInfo = taosArrayGet(pIndex, i);
|
STableIndexInfo *pInfo = taosArrayGet(pIndex, i);
|
||||||
taosArrayPush(*pRes, pInfo);
|
pInfo = taosArrayPush(*pRes, pInfo);
|
||||||
|
pInfo->expr = strdup(pInfo->expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -391,7 +391,9 @@ typedef struct SStreamBlockScanInfo {
|
||||||
void* streamBlockReader;// stream block reader handle
|
void* streamBlockReader;// stream block reader handle
|
||||||
SArray* pColMatchInfo; //
|
SArray* pColMatchInfo; //
|
||||||
SNode* pCondition;
|
SNode* pCondition;
|
||||||
|
int32_t tsArrayIndex;
|
||||||
SArray* tsArray;
|
SArray* tsArray;
|
||||||
|
uint64_t groupId;
|
||||||
SUpdateInfo* pUpdateInfo;
|
SUpdateInfo* pUpdateInfo;
|
||||||
|
|
||||||
SExprInfo* pPseudoExpr;
|
SExprInfo* pPseudoExpr;
|
||||||
|
@ -582,6 +584,7 @@ typedef struct SPartitionOperatorInfo {
|
||||||
int32_t* columnOffset; // start position for each column data
|
int32_t* columnOffset; // start position for each column data
|
||||||
void* pGroupIter; // group iterator
|
void* pGroupIter; // group iterator
|
||||||
int32_t pageIndex; // page index of current group
|
int32_t pageIndex; // page index of current group
|
||||||
|
SSDataBlock* pUpdateRes;
|
||||||
} SPartitionOperatorInfo;
|
} SPartitionOperatorInfo;
|
||||||
|
|
||||||
typedef struct SWindowRowsSup {
|
typedef struct SWindowRowsSup {
|
||||||
|
@ -907,6 +910,7 @@ int32_t compareTimeWindow(const void* p1, const void* p2, const void* param);
|
||||||
int32_t finalizeResultRowIntoResultDataBlock(SDiskbasedBuf* pBuf, SResultRowPosition* resultRowPosition,
|
int32_t finalizeResultRowIntoResultDataBlock(SDiskbasedBuf* pBuf, SResultRowPosition* resultRowPosition,
|
||||||
SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, int32_t numOfExprs, const int32_t* rowCellOffset,
|
SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, int32_t numOfExprs, const int32_t* rowCellOffset,
|
||||||
SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo);
|
SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
int32_t getTableList(void* metaHandle, int32_t tableType, uint64_t tableUid, STableListInfo* pListInfo,
|
int32_t getTableList(void* metaHandle, int32_t tableType, uint64_t tableUid, STableListInfo* pListInfo,
|
||||||
SNode* pTagCond);
|
SNode* pTagCond);
|
||||||
int32_t createMultipleDataReaders(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle,
|
int32_t createMultipleDataReaders(STableScanPhysiNode* pTableScanNode, SReadHandle* pHandle,
|
||||||
|
@ -914,6 +918,9 @@ int32_t createMultipleDataReaders(STableScanPhysiNode* pTableScanNode, SReadHand
|
||||||
uint64_t taskId, SNode* pTagCond);
|
uint64_t taskId, SNode* pTagCond);
|
||||||
SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SArray* dataReaders,
|
SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SArray* dataReaders,
|
||||||
SReadHandle* readHandle, SExecTaskInfo* pTaskInfo);
|
SReadHandle* readHandle, SExecTaskInfo* pTaskInfo);
|
||||||
|
|
||||||
|
void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsColIndex);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -751,16 +751,103 @@ static bool prepareDataScan(SStreamBlockScanInfo* pInfo) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void copyOneRow(SSDataBlock* dest, SSDataBlock* source, int32_t sourceRowId) {
|
||||||
|
for (int32_t j = 0; j < source->info.numOfCols; j++) {
|
||||||
|
SColumnInfoData* pDestCol = (SColumnInfoData*)taosArrayGet(dest->pDataBlock, j);
|
||||||
|
SColumnInfoData* pSourceCol = (SColumnInfoData*)taosArrayGet(source->pDataBlock, j);
|
||||||
|
if (colDataIsNull_s(pSourceCol, sourceRowId)) {
|
||||||
|
colDataAppendNULL(pDestCol, dest->info.rows);
|
||||||
|
} else {
|
||||||
|
colDataAppend(pDestCol, dest->info.rows, colDataGetData(pSourceCol, sourceRowId), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dest->info.rows++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint64_t getGroupId(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t rowId) {
|
||||||
|
uint64_t* groupId = taosHashGet(pOperator->pTaskInfo->tableqinfoList.map, &pBlock->info.uid, sizeof(int64_t));
|
||||||
|
if (groupId) {
|
||||||
|
return *groupId;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
/* Todo(liuyao) for partition by column
|
||||||
|
recordNewGroupKeys(pTableScanInfo->pGroupCols, pTableScanInfo->pGroupColVals, pBlock, rowId);
|
||||||
|
int32_t len = buildGroupKeys(pTableScanInfo->keyBuf, pTableScanInfo->pGroupColVals);
|
||||||
|
uint64_t resId = 0;
|
||||||
|
uint64_t* groupId = taosHashGet(pTableScanInfo->pGroupSet, pTableScanInfo->keyBuf, len);
|
||||||
|
if (groupId) {
|
||||||
|
return *groupId;
|
||||||
|
} else if (len != 0) {
|
||||||
|
resId = calcGroupId(pTableScanInfo->keyBuf, len);
|
||||||
|
taosHashPut(pTableScanInfo->pGroupSet, pTableScanInfo->keyBuf, len, &resId, sizeof(uint64_t));
|
||||||
|
}
|
||||||
|
return resId;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
static SSDataBlock* doDataScan(SStreamBlockScanInfo* pInfo) {
|
static SSDataBlock* doDataScan(SStreamBlockScanInfo* pInfo) {
|
||||||
SSDataBlock* pResult = NULL;
|
while (1) {
|
||||||
pResult = doTableScan(pInfo->pOperatorDumy);
|
SSDataBlock* pResult = NULL;
|
||||||
if (pResult == NULL) {
|
pResult = doTableScan(pInfo->pOperatorDumy);
|
||||||
if (prepareDataScan(pInfo)) {
|
if (pResult == NULL) {
|
||||||
// scan next window data
|
if (prepareDataScan(pInfo)) {
|
||||||
pResult = doTableScan(pInfo->pOperatorDumy);
|
// scan next window data
|
||||||
|
pResult = doTableScan(pInfo->pOperatorDumy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!pResult) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pResult->info.groupId == pInfo->groupId) {
|
||||||
|
return pResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Todo(liuyao) for partition by column
|
||||||
|
SSDataBlock* pBlock = createOneDataBlock(pResult, true);
|
||||||
|
blockDataCleanup(pResult);
|
||||||
|
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
||||||
|
uint64_t id = getGroupId(pInfo->pOperatorDumy, pBlock, i);
|
||||||
|
if (id == pInfo->groupId) {
|
||||||
|
copyOneRow(pResult, pBlock, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pResult;
|
return pResult;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setUpdateData(SStreamBlockScanInfo* pInfo, SSDataBlock* pBlock, SSDataBlock* pUpdateBlock) {
|
||||||
|
blockDataCleanup(pUpdateBlock);
|
||||||
|
int32_t size = taosArrayGetSize(pInfo->tsArray);
|
||||||
|
if (pInfo->tsArrayIndex < size) {
|
||||||
|
SColumnInfoData* pCol = (SColumnInfoData*)taosArrayGet(pUpdateBlock->pDataBlock, pInfo->primaryTsIndex);
|
||||||
|
ASSERT(pCol->info.type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
|
blockDataEnsureCapacity(pUpdateBlock, size);
|
||||||
|
ASSERT(pBlock->info.numOfCols == pUpdateBlock->info.numOfCols);
|
||||||
|
|
||||||
|
int32_t rowId = *(int32_t*)taosArrayGet(pInfo->tsArray, pInfo->tsArrayIndex);
|
||||||
|
pInfo->groupId = getGroupId(pInfo->pOperatorDumy, pBlock, rowId);
|
||||||
|
int32_t i = 0;
|
||||||
|
for ( ; i < size; i++) {
|
||||||
|
rowId = *(int32_t*)taosArrayGet(pInfo->tsArray, i + pInfo->tsArrayIndex);
|
||||||
|
uint64_t id = getGroupId(pInfo->pOperatorDumy, pBlock, rowId);
|
||||||
|
if (pInfo->groupId != id) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
copyOneRow(pUpdateBlock, pBlock, rowId);
|
||||||
|
}
|
||||||
|
pUpdateBlock->info.rows = i;
|
||||||
|
pInfo->tsArrayIndex += i;
|
||||||
|
pUpdateBlock->info.groupId = pInfo->groupId;
|
||||||
|
pUpdateBlock->info.type = STREAM_REPROCESS;
|
||||||
|
blockDataUpdateTsWindow(pUpdateBlock, 0);
|
||||||
|
}
|
||||||
|
// all rows have same group id
|
||||||
|
ASSERT(pInfo->tsArrayIndex >= size);
|
||||||
|
if (size > 0 && pInfo->tsArrayIndex == size) {
|
||||||
|
taosArrayClear(pInfo->tsArray);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getUpdateDataBlock(SStreamBlockScanInfo* pInfo, bool invertible, SSDataBlock* pBlock,
|
static void getUpdateDataBlock(SStreamBlockScanInfo* pInfo, bool invertible, SSDataBlock* pBlock,
|
||||||
|
@ -768,41 +855,21 @@ static void getUpdateDataBlock(SStreamBlockScanInfo* pInfo, bool invertible, SSD
|
||||||
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, pInfo->primaryTsIndex);
|
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, pInfo->primaryTsIndex);
|
||||||
ASSERT(pColDataInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP);
|
ASSERT(pColDataInfo->info.type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
TSKEY* ts = (TSKEY*)pColDataInfo->pData;
|
TSKEY* ts = (TSKEY*)pColDataInfo->pData;
|
||||||
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
for (int32_t rowId = 0; rowId < pBlock->info.rows; rowId++) {
|
||||||
if (updateInfoIsUpdated(pInfo->pUpdateInfo, pBlock->info.uid, ts[i])) {
|
if (updateInfoIsUpdated(pInfo->pUpdateInfo, pBlock->info.uid, ts[rowId])) {
|
||||||
taosArrayPush(pInfo->tsArray, ts + i);
|
taosArrayPush(pInfo->tsArray, &rowId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!pUpdateBlock) {
|
if (!pUpdateBlock) {
|
||||||
taosArrayClear(pInfo->tsArray);
|
taosArrayClear(pInfo->tsArray);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int32_t size = taosArrayGetSize(pInfo->tsArray);
|
setUpdateData(pInfo, pBlock, pUpdateBlock);
|
||||||
if (size > 0 && invertible) {
|
// Todo(liuyao) get from tsdb
|
||||||
// Todo(liuyao) get from tsdb
|
// SSDataBlock* p = createOneDataBlock(pBlock, true);
|
||||||
// SSDataBlock* p = createOneDataBlock(pBlock, true);
|
// p->info.type = STREAM_INVERT;
|
||||||
// p->info.type = STREAM_INVERT;
|
// taosArrayClear(pInfo->tsArray);
|
||||||
// taosArrayClear(pInfo->tsArray);
|
// return p;
|
||||||
// return p;
|
|
||||||
SColumnInfoData* pCol = (SColumnInfoData*)taosArrayGet(pUpdateBlock->pDataBlock, pInfo->primaryTsIndex);
|
|
||||||
ASSERT(pCol->info.type == TSDB_DATA_TYPE_TIMESTAMP);
|
|
||||||
blockDataEnsureCapacity(pUpdateBlock, size);
|
|
||||||
for (int32_t i = 0; i < size; i++) {
|
|
||||||
TSKEY* pTs = (TSKEY*)taosArrayGet(pInfo->tsArray, i);
|
|
||||||
colDataAppend(pCol, i, (char*)pTs, false);
|
|
||||||
}
|
|
||||||
for (int32_t i = 0; i < pUpdateBlock->info.numOfCols; i++) {
|
|
||||||
if (i == pInfo->primaryTsIndex) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SColumnInfoData* pCol = (SColumnInfoData*)taosArrayGet(pUpdateBlock->pDataBlock, i);
|
|
||||||
colDataAppendNNULL(pCol, 0, size);
|
|
||||||
}
|
|
||||||
pUpdateBlock->info.rows = size;
|
|
||||||
pUpdateBlock->info.type = STREAM_REPROCESS;
|
|
||||||
blockDataUpdateTsWindow(pUpdateBlock, 0);
|
|
||||||
taosArrayClear(pInfo->tsArray);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
|
@ -834,7 +901,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
||||||
return pInfo->pRes;
|
return pInfo->pRes;
|
||||||
} else if (pInfo->scanMode == STREAM_SCAN_FROM_UPDATERES) {
|
} else if (pInfo->scanMode == STREAM_SCAN_FROM_UPDATERES) {
|
||||||
blockDataCleanup(pInfo->pRes);
|
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER;
|
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER;
|
||||||
if (!isStateWindow(pInfo)) {
|
if (!isStateWindow(pInfo)) {
|
||||||
prepareDataScan(pInfo);
|
prepareDataScan(pInfo);
|
||||||
|
@ -849,7 +915,15 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
if (pInfo->scanMode == STREAM_SCAN_FROM_DATAREADER) {
|
if (pInfo->scanMode == STREAM_SCAN_FROM_DATAREADER) {
|
||||||
SSDataBlock* pSDB = doDataScan(pInfo);
|
SSDataBlock* pSDB = doDataScan(pInfo);
|
||||||
if (pSDB == NULL) {
|
if (pSDB == NULL) {
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
setUpdateData(pInfo, pInfo->pRes, pInfo->pUpdateRes);
|
||||||
|
if (pInfo->pUpdateRes->info.rows > 0) {
|
||||||
|
if (!isStateWindow(pInfo)) {
|
||||||
|
prepareDataScan(pInfo);
|
||||||
|
}
|
||||||
|
return pInfo->pUpdateRes;
|
||||||
|
} else {
|
||||||
|
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
getUpdateDataBlock(pInfo, true, pSDB, NULL);
|
getUpdateDataBlock(pInfo, true, pSDB, NULL);
|
||||||
return pSDB;
|
return pSDB;
|
||||||
|
@ -942,7 +1016,7 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
if (rows == 0) {
|
if (rows == 0) {
|
||||||
pOperator->status = OP_EXEC_DONE;
|
pOperator->status = OP_EXEC_DONE;
|
||||||
} else if (pInfo->pUpdateInfo) {
|
} else if (pInfo->pUpdateInfo) {
|
||||||
blockDataCleanup(pInfo->pUpdateRes);
|
pInfo->tsArrayIndex = 0;
|
||||||
getUpdateDataBlock(pInfo, true, pInfo->pRes, pInfo->pUpdateRes);
|
getUpdateDataBlock(pInfo, true, pInfo->pRes, pInfo->pUpdateRes);
|
||||||
if (pInfo->pUpdateRes->info.rows > 0) {
|
if (pInfo->pUpdateRes->info.rows > 0) {
|
||||||
if (pInfo->pUpdateRes->info.type == STREAM_REPROCESS) {
|
if (pInfo->pUpdateRes->info.type == STREAM_REPROCESS) {
|
||||||
|
@ -1021,7 +1095,7 @@ SOperatorInfo* createStreamScanOperatorInfo(void* pDataReader, SReadHandle* pHan
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->tsArray = taosArrayInit(4, sizeof(TSKEY));
|
pInfo->tsArray = taosArrayInit(4, sizeof(int32_t));
|
||||||
if (pInfo->tsArray == NULL) {
|
if (pInfo->tsArray == NULL) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
@ -1048,6 +1122,8 @@ SOperatorInfo* createStreamScanOperatorInfo(void* pDataReader, SReadHandle* pHan
|
||||||
pInfo->pOperatorDumy = pTableScanDummy;
|
pInfo->pOperatorDumy = pTableScanDummy;
|
||||||
pInfo->interval = pSTInfo->interval;
|
pInfo->interval = pSTInfo->interval;
|
||||||
pInfo->sessionSup = (SessionWindowSupporter){.pStreamAggSup = NULL, .gap = -1};
|
pInfo->sessionSup = (SessionWindowSupporter){.pStreamAggSup = NULL, .gap = -1};
|
||||||
|
pInfo->groupId = 0;
|
||||||
|
|
||||||
pOperator->name = "StreamBlockScanOperator";
|
pOperator->name = "StreamBlockScanOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN;
|
||||||
pOperator->blocking = false;
|
pOperator->blocking = false;
|
||||||
|
|
|
@ -1985,7 +1985,7 @@ static void clearUpdateDataBlock(SSDataBlock* pBlock) {
|
||||||
blockDataCleanup(pBlock);
|
blockDataCleanup(pBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsColIndex) {
|
void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsColIndex) {
|
||||||
ASSERT(pDest->info.capacity >= pSource->info.rows);
|
ASSERT(pDest->info.capacity >= pSource->info.rows);
|
||||||
clearUpdateDataBlock(pDest);
|
clearUpdateDataBlock(pDest);
|
||||||
SColumnInfoData* pDestCol = taosArrayGet(pDest->pDataBlock, 0);
|
SColumnInfoData* pDestCol = taosArrayGet(pDest->pDataBlock, 0);
|
||||||
|
@ -1997,6 +1997,8 @@ static void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_
|
||||||
colDataAppendNNULL(pCol, 0, pSource->info.rows);
|
colDataAppendNNULL(pCol, 0, pSource->info.rows);
|
||||||
}
|
}
|
||||||
pDest->info.rows = pSource->info.rows;
|
pDest->info.rows = pSource->info.rows;
|
||||||
|
pDest->info.groupId = pSource->info.groupId;
|
||||||
|
pDest->info.type = pSource->info.type;
|
||||||
blockDataUpdateTsWindow(pDest, 0);
|
blockDataUpdateTsWindow(pDest, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2345,14 +2345,7 @@ int32_t apercentileCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx)
|
||||||
SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
|
SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
|
||||||
SAPercentileInfo* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
|
SAPercentileInfo* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
|
||||||
ASSERT(pDBuf->algo == pSBuf->algo);
|
ASSERT(pDBuf->algo == pSBuf->algo);
|
||||||
if (pDBuf->algo == APERCT_ALGO_TDIGEST) {
|
apercentileTransferInfo(pSBuf, pDBuf);
|
||||||
tdigestMerge(pDBuf->pTDigest, pSBuf->pTDigest);
|
|
||||||
} else {
|
|
||||||
SHistogramInfo* pTmp = tHistogramMerge(pDBuf->pHisto, pSBuf->pHisto, MAX_HISTOGRAM_BIN);
|
|
||||||
memcpy(pDBuf->pHisto, pTmp, sizeof(SHistogramInfo) + sizeof(SHistBin) * (MAX_HISTOGRAM_BIN + 1));
|
|
||||||
pDBuf->pHisto->elems = (SHistBin*)((char*)pDBuf->pHisto + sizeof(SHistogramInfo));
|
|
||||||
tHistogramDestroy(&pTmp);
|
|
||||||
}
|
|
||||||
pDResInfo->numOfRes = TMAX(pDResInfo->numOfRes, pSResInfo->numOfRes);
|
pDResInfo->numOfRes = TMAX(pDResInfo->numOfRes, pSResInfo->numOfRes);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4128,12 +4128,14 @@ static const char* getSysDbName(ENodeType type) {
|
||||||
case QUERY_NODE_SHOW_SNODES_STMT:
|
case QUERY_NODE_SHOW_SNODES_STMT:
|
||||||
case QUERY_NODE_SHOW_LICENCE_STMT:
|
case QUERY_NODE_SHOW_LICENCE_STMT:
|
||||||
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
||||||
|
case QUERY_NODE_SHOW_VARIABLE_STMT:
|
||||||
return TSDB_INFORMATION_SCHEMA_DB;
|
return TSDB_INFORMATION_SCHEMA_DB;
|
||||||
case QUERY_NODE_SHOW_CONNECTIONS_STMT:
|
case QUERY_NODE_SHOW_CONNECTIONS_STMT:
|
||||||
case QUERY_NODE_SHOW_QUERIES_STMT:
|
case QUERY_NODE_SHOW_QUERIES_STMT:
|
||||||
case QUERY_NODE_SHOW_TOPICS_STMT:
|
case QUERY_NODE_SHOW_TOPICS_STMT:
|
||||||
case QUERY_NODE_SHOW_STREAMS_STMT:
|
case QUERY_NODE_SHOW_STREAMS_STMT:
|
||||||
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
||||||
|
case QUERY_NODE_SHOW_APPS_STMT:
|
||||||
return TSDB_PERFORMANCE_SCHEMA_DB;
|
return TSDB_PERFORMANCE_SCHEMA_DB;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -4183,6 +4185,10 @@ static const char* getSysTableName(ENodeType type) {
|
||||||
return TSDB_PERFS_TABLE_TOPICS;
|
return TSDB_PERFS_TABLE_TOPICS;
|
||||||
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
||||||
return TSDB_PERFS_TABLE_TRANS;
|
return TSDB_PERFS_TABLE_TRANS;
|
||||||
|
case QUERY_NODE_SHOW_VARIABLE_STMT:
|
||||||
|
return TSDB_INS_TABLE_CONFIGS;
|
||||||
|
case QUERY_NODE_SHOW_APPS_STMT:
|
||||||
|
return TSDB_PERFS_TABLE_APPS;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -5237,6 +5243,8 @@ static int32_t rewriteQuery(STranslateContext* pCxt, SQuery* pQuery) {
|
||||||
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
case QUERY_NODE_SHOW_CLUSTER_STMT:
|
||||||
case QUERY_NODE_SHOW_TOPICS_STMT:
|
case QUERY_NODE_SHOW_TOPICS_STMT:
|
||||||
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
|
||||||
|
case QUERY_NODE_SHOW_VARIABLE_STMT:
|
||||||
|
case QUERY_NODE_SHOW_APPS_STMT:
|
||||||
code = rewriteShow(pCxt, pQuery);
|
code = rewriteShow(pCxt, pQuery);
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_CREATE_TABLE_STMT:
|
case QUERY_NODE_CREATE_TABLE_STMT:
|
||||||
|
|
|
@ -104,10 +104,14 @@ static bool osdMayBeOptimized(SLogicNode* pNode) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (NULL == pNode->pParent || (QUERY_NODE_LOGIC_PLAN_WINDOW != nodeType(pNode->pParent) &&
|
if (NULL == pNode->pParent || (QUERY_NODE_LOGIC_PLAN_WINDOW != nodeType(pNode->pParent) &&
|
||||||
QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pNode->pParent))) {
|
QUERY_NODE_LOGIC_PLAN_AGG != nodeType(pNode->pParent) &&
|
||||||
|
QUERY_NODE_LOGIC_PLAN_PARTITION != nodeType(pNode->pParent))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode->pParent)) {
|
if (QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode->pParent) ||
|
||||||
|
(QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pNode->pParent) &&
|
||||||
|
pNode->pParent->pParent &&
|
||||||
|
QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pNode->pParent->pParent)) ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return !osdHaveNormalCol(((SAggLogicNode*)pNode->pParent)->pGroupKeys);
|
return !osdHaveNormalCol(((SAggLogicNode*)pNode->pParent)->pGroupKeys);
|
||||||
|
@ -217,16 +221,22 @@ static int32_t osdGetDataRequired(SNodeList* pFuncs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setScanWindowInfo(SScanLogicNode* pScan) {
|
static void setScanWindowInfo(SScanLogicNode* pScan) {
|
||||||
if (QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pScan->node.pParent)) {
|
SLogicNode* pParent = pScan->node.pParent;
|
||||||
pScan->interval = ((SWindowLogicNode*)pScan->node.pParent)->interval;
|
if (QUERY_NODE_LOGIC_PLAN_PARTITION == nodeType(pParent) &&
|
||||||
pScan->offset = ((SWindowLogicNode*)pScan->node.pParent)->offset;
|
pParent->pParent &&
|
||||||
pScan->sliding = ((SWindowLogicNode*)pScan->node.pParent)->sliding;
|
QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pParent->pParent)) {
|
||||||
pScan->intervalUnit = ((SWindowLogicNode*)pScan->node.pParent)->intervalUnit;
|
pParent = pParent->pParent;
|
||||||
pScan->slidingUnit = ((SWindowLogicNode*)pScan->node.pParent)->slidingUnit;
|
}
|
||||||
pScan->triggerType = ((SWindowLogicNode*)pScan->node.pParent)->triggerType;
|
if (QUERY_NODE_LOGIC_PLAN_WINDOW == nodeType(pParent)) {
|
||||||
pScan->watermark = ((SWindowLogicNode*)pScan->node.pParent)->watermark;
|
pScan->interval = ((SWindowLogicNode*)pParent)->interval;
|
||||||
pScan->tsColId = ((SColumnNode*)((SWindowLogicNode*)pScan->node.pParent)->pTspk)->colId;
|
pScan->offset = ((SWindowLogicNode*)pParent)->offset;
|
||||||
pScan->filesFactor = ((SWindowLogicNode*)pScan->node.pParent)->filesFactor;
|
pScan->sliding = ((SWindowLogicNode*)pParent)->sliding;
|
||||||
|
pScan->intervalUnit = ((SWindowLogicNode*)pParent)->intervalUnit;
|
||||||
|
pScan->slidingUnit = ((SWindowLogicNode*)pParent)->slidingUnit;
|
||||||
|
pScan->triggerType = ((SWindowLogicNode*)pParent)->triggerType;
|
||||||
|
pScan->watermark = ((SWindowLogicNode*)pParent)->watermark;
|
||||||
|
pScan->tsColId = ((SColumnNode*)((SWindowLogicNode*)pParent)->pTspk)->colId;
|
||||||
|
pScan->filesFactor = ((SWindowLogicNode*)pParent)->filesFactor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -243,9 +243,8 @@ class TDTestCase:
|
||||||
tdSql.checkRows(2)
|
tdSql.checkRows(2)
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag2'!='beijing'")
|
tdSql.query("select * from jsons1 where jtag->'tag2'!='beijing'")
|
||||||
tdSql.checkRows(5)
|
tdSql.checkRows(5)
|
||||||
#open
|
tdSql.query("select * from jsons1 where jtag->'tag2'=''")
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag2'=''")
|
tdSql.checkRows(2)
|
||||||
#tdSql.checkRows(2)
|
|
||||||
#
|
#
|
||||||
# # where json value is int
|
# # where json value is int
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'=5")
|
tdSql.query("select * from jsons1 where jtag->'tag1'=5")
|
||||||
|
@ -253,11 +252,10 @@ class TDTestCase:
|
||||||
tdSql.checkData(0, 1, 2)
|
tdSql.checkData(0, 1, 2)
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'=10")
|
tdSql.query("select * from jsons1 where jtag->'tag1'=10")
|
||||||
tdSql.checkRows(0)
|
tdSql.checkRows(0)
|
||||||
# open
|
tdSql.query("select * from jsons1 where jtag->'tag1'<54")
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'<54")
|
tdSql.checkRows(4)
|
||||||
#tdSql.checkRows(3)
|
tdSql.query("select * from jsons1 where jtag->'tag1'<=11")
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'<=11")
|
tdSql.checkRows(4)
|
||||||
#tdSql.checkRows(3)
|
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'>4")
|
tdSql.query("select * from jsons1 where jtag->'tag1'>4")
|
||||||
tdSql.checkRows(2)
|
tdSql.checkRows(2)
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'>=5")
|
tdSql.query("select * from jsons1 where jtag->'tag1'>=5")
|
||||||
|
@ -270,31 +268,28 @@ class TDTestCase:
|
||||||
# # where json value is double
|
# # where json value is double
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'=1.232")
|
tdSql.query("select * from jsons1 where jtag->'tag1'=1.232")
|
||||||
tdSql.checkRows(1)
|
tdSql.checkRows(1)
|
||||||
# open
|
tdSql.query("select * from jsons1 where jtag->'tag1'<1.232")
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'<1.232")
|
tdSql.checkRows(1)
|
||||||
#tdSql.checkRows(0)
|
tdSql.query("select * from jsons1 where jtag->'tag1'<=1.232")
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'<=1.232")
|
tdSql.checkRows(2)
|
||||||
#tdSql.checkRows(1)
|
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'>1.23")
|
tdSql.query("select * from jsons1 where jtag->'tag1'>1.23")
|
||||||
tdSql.checkRows(3)
|
tdSql.checkRows(3)
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'>=1.232")
|
tdSql.query("select * from jsons1 where jtag->'tag1'>=1.232")
|
||||||
tdSql.checkRows(3)
|
tdSql.checkRows(3)
|
||||||
# open
|
tdSql.query("select * from jsons1 where jtag->'tag1'!=1.232")
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'!=1.232")
|
tdSql.checkRows(6)
|
||||||
#tdSql.checkRows(2)
|
|
||||||
tdSql.query("select * from jsons1 where jtag->'tag1'!=3.232")
|
tdSql.query("select * from jsons1 where jtag->'tag1'!=3.232")
|
||||||
tdSql.checkRows(7)
|
tdSql.checkRows(7)
|
||||||
#tdSql.error("select * from jsons1 where jtag->'tag1'/0=3")
|
#tdSql.error("select * from jsons1 where jtag->'tag1'/0=3")
|
||||||
#tdSql.error("select * from jsons1 where jtag->'tag1'/5=1")
|
#tdSql.error("select * from jsons1 where jtag->'tag1'/5=1")
|
||||||
#
|
#
|
||||||
# # where json value is bool
|
# # where json value is bool
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'=true")
|
tdSql.query("select * from jsons1 where jtag->'tag1'=true")
|
||||||
# open
|
tdSql.checkRows(0)
|
||||||
#tdSql.checkRows(0)
|
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'=false")
|
#tdSql.query("select * from jsons1 where jtag->'tag1'=false")
|
||||||
#tdSql.checkRows(1)
|
#tdSql.checkRows(1)
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1'!=false")
|
tdSql.query("select * from jsons1 where jtag->'tag1'!=false")
|
||||||
#tdSql.checkRows(0)
|
tdSql.checkRows(3)
|
||||||
#tdSql.error("select * from jsons1 where jtag->'tag1'>false")
|
#tdSql.error("select * from jsons1 where jtag->'tag1'>false")
|
||||||
#
|
#
|
||||||
# # where json value is null
|
# # where json value is null
|
||||||
|
@ -303,18 +298,17 @@ class TDTestCase:
|
||||||
#tdSql.checkRows(1)
|
#tdSql.checkRows(1)
|
||||||
#
|
#
|
||||||
# # where json key is null
|
# # where json key is null
|
||||||
# open
|
tdSql.query("select * from jsons1 where jtag->'tag_no_exist'=3")
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag_no_exist'=3")
|
tdSql.checkRows(0)
|
||||||
#tdSql.checkRows(0)
|
|
||||||
#
|
#
|
||||||
# # where json value is not exist
|
# # where json value is not exist
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1' is null")
|
tdSql.query("select * from jsons1 where jtag->'tag1' is null")
|
||||||
#tdSql.checkData(0, 0, 'jsons1_9')
|
tdSql.checkData(0, 0, 'jsons1_9')
|
||||||
#tdSql.checkRows(1)
|
tdSql.checkRows(2)
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag4' is null")
|
tdSql.query("select * from jsons1 where jtag->'tag4' is null")
|
||||||
#tdSql.checkRows(9)
|
tdSql.checkRows(9)
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag3' is not null")
|
tdSql.query("select * from jsons1 where jtag->'tag3' is not null")
|
||||||
#tdSql.checkRows(4)
|
tdSql.checkRows(3)
|
||||||
#
|
#
|
||||||
# # test contains
|
# # test contains
|
||||||
tdSql.query("select * from jsons1 where jtag contains 'tag1'")
|
tdSql.query("select * from jsons1 where jtag contains 'tag1'")
|
||||||
|
@ -344,10 +338,10 @@ class TDTestCase:
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# # test with between and
|
# # test with between and
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1' between 1 and 30")
|
tdSql.query("select * from jsons1 where jtag->'tag1' between 1 and 30")
|
||||||
#tdSql.checkRows(3)
|
tdSql.checkRows(3)
|
||||||
#tdSql.query("select * from jsons1 where jtag->'tag1' between 'femail' and 'beijing'")
|
tdSql.query("select * from jsons1 where jtag->'tag1' between 'femail' and 'beijing'")
|
||||||
#tdSql.checkRows(2)
|
tdSql.checkRows(2)
|
||||||
#
|
#
|
||||||
# # test with tbname/normal column
|
# # test with tbname/normal column
|
||||||
tdSql.query("select * from jsons1 where tbname = 'jsons1_1'")
|
tdSql.query("select * from jsons1 where tbname = 'jsons1_1'")
|
||||||
|
@ -362,6 +356,7 @@ class TDTestCase:
|
||||||
#
|
#
|
||||||
# # test where condition like
|
# # test where condition like
|
||||||
# open
|
# open
|
||||||
|
# syntax error
|
||||||
#tdSql.query("select *,tbname from jsons1 where jtag->'tag2' like 'bei%'")
|
#tdSql.query("select *,tbname from jsons1 where jtag->'tag2' like 'bei%'")
|
||||||
#tdSql.checkRows(2)
|
#tdSql.checkRows(2)
|
||||||
#tdSql.query("select *,tbname from jsons1 where jtag->'tag1' like 'fe%' and jtag->'tag2' is not null")
|
#tdSql.query("select *,tbname from jsons1 where jtag->'tag1' like 'fe%' and jtag->'tag2' is not null")
|
||||||
|
|
Loading…
Reference in New Issue