Merge pull request #24053 from taosdata/enh/3.0/TD-26813
enh: support group by tag/tbname to list empty groups
This commit is contained in:
commit
670317ccd7
|
@ -1,4 +1,4 @@
|
|||
build/
|
||||
*build/
|
||||
compile_commands.json
|
||||
CMakeSettings.json
|
||||
.cache
|
||||
|
@ -132,3 +132,5 @@ tools/taos-tools
|
|||
tools/taosws-rs
|
||||
tags
|
||||
.clangd
|
||||
*CMakeCache*
|
||||
*CMakeFiles*
|
||||
|
|
|
@ -119,6 +119,7 @@ typedef struct SScanLogicNode {
|
|||
bool groupOrderScan;
|
||||
bool onlyMetaCtbIdx; // for tag scan with no tbname
|
||||
bool filesetDelimited; // returned blocks delimited by fileset
|
||||
bool isCountByTag; // true if selectstmt hasCountFunc & part by tag/tbname
|
||||
} SScanLogicNode;
|
||||
|
||||
typedef struct SJoinLogicNode {
|
||||
|
@ -434,6 +435,7 @@ typedef struct STableScanPhysiNode {
|
|||
bool assignBlockUid;
|
||||
int8_t igCheckUpdate;
|
||||
bool filesetDelimited;
|
||||
bool needCountEmptyTable;
|
||||
} STableScanPhysiNode;
|
||||
|
||||
typedef STableScanPhysiNode STableSeqScanPhysiNode;
|
||||
|
|
|
@ -363,6 +363,7 @@ typedef struct SSelectStmt {
|
|||
bool hasLastRowFunc;
|
||||
bool hasLastFunc;
|
||||
bool hasTimeLineFunc;
|
||||
bool hasCountFunc;
|
||||
bool hasUdaf;
|
||||
bool hasStateKey;
|
||||
bool onlyHasKeepOrderFunc;
|
||||
|
|
|
@ -750,6 +750,7 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSma
|
|||
}
|
||||
tDestroySubmitReq(pReq, TSDB_MSG_FLG_ENCODE);
|
||||
taosMemoryFree(pReq);
|
||||
pReq = NULL;
|
||||
TSDB_CHECK_CODE(code, lino, _exit);
|
||||
}
|
||||
|
||||
|
|
|
@ -105,6 +105,7 @@ typedef struct STableListInfo {
|
|||
int32_t* groupOffset; // keep the offset value for each group in the tableList
|
||||
SArray* pTableList;
|
||||
SHashObj* map; // speedup acquire the tableQueryInfo by table uid
|
||||
SHashObj* remainGroups; // remaining group has not yet processed the empty group
|
||||
STableListIdInfo idInfo; // this maybe the super table or ordinary table
|
||||
} STableListInfo;
|
||||
|
||||
|
|
|
@ -217,6 +217,13 @@ enum {
|
|||
TABLE_SCAN__BLOCK_ORDER = 2,
|
||||
};
|
||||
|
||||
typedef enum ETableCountState {
|
||||
TABLE_COUNT_STATE_NONE = 0, // before start scan
|
||||
TABLE_COUNT_STATE_SCAN = 1, // cur group scanning
|
||||
TABLE_COUNT_STATE_PROCESSED = 2, // cur group processed
|
||||
TABLE_COUNT_STATE_END = 3, // finish or noneed to process
|
||||
} ETableCountState;
|
||||
|
||||
typedef struct SAggSupporter {
|
||||
SSHashObj* pResultRowHashTable; // quick locate the window object for each result
|
||||
char* keyBuf; // window key buffer
|
||||
|
@ -263,14 +270,16 @@ typedef struct STableScanInfo {
|
|||
SSDataBlock* pResBlock;
|
||||
SHashObj* pIgnoreTables;
|
||||
SSampleExecInfo sample; // sample execution info
|
||||
int32_t currentGroupId;
|
||||
int32_t currentTable;
|
||||
int32_t tableStartIndex; // current group scan start
|
||||
int32_t tableEndIndex; // current group scan end
|
||||
int32_t currentGroupIndex; // current group index of groupOffset
|
||||
int8_t scanMode;
|
||||
int8_t assignBlockUid;
|
||||
uint8_t countState; // empty table count state
|
||||
bool hasGroupByTag;
|
||||
bool countOnly;
|
||||
// TsdReader readerAPI;
|
||||
bool filesetDelimited;
|
||||
bool needCountEmptyTable;
|
||||
} STableScanInfo;
|
||||
|
||||
typedef struct STableMergeScanInfo {
|
||||
|
@ -298,7 +307,8 @@ typedef struct STableMergeScanInfo {
|
|||
SHashObj* mSkipTables;
|
||||
int64_t mergeLimit;
|
||||
SSortExecInfo sortExecInfo;
|
||||
|
||||
bool needCountEmptyTable;
|
||||
bool bGroupProcessed; // the group return data means processed
|
||||
bool filesetDelimited;
|
||||
bool bNewFilesetEvent;
|
||||
bool bNextDurationBlockEvent;
|
||||
|
|
|
@ -456,7 +456,7 @@ static void genTbGroupDigest(const SNode* pGroup, uint8_t* filterDigest, T_MD5_C
|
|||
}
|
||||
|
||||
int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInfo* pTableListInfo, uint8_t* digest,
|
||||
SStorageAPI* pAPI) {
|
||||
SStorageAPI* pAPI, bool initRemainGroups) {
|
||||
int32_t code = TSDB_CODE_SUCCESS;
|
||||
SArray* pBlockList = NULL;
|
||||
SSDataBlock* pResBlock = NULL;
|
||||
|
@ -590,6 +590,15 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf
|
|||
goto end;
|
||||
}
|
||||
|
||||
if (initRemainGroups) {
|
||||
pTableListInfo->remainGroups =
|
||||
taosHashInit(rows, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
||||
if (pTableListInfo->remainGroups == NULL) {
|
||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < rows; i++) {
|
||||
STableKeyInfo* info = taosArrayGet(pTableListInfo->pTableList, i);
|
||||
|
||||
|
@ -631,6 +640,14 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf
|
|||
|
||||
int32_t len = (int32_t)(pStart - (char*)keyBuf);
|
||||
info->groupId = calcGroupId(keyBuf, len);
|
||||
if (initRemainGroups) {
|
||||
// groupId ~ table uid
|
||||
taosHashPut(pTableListInfo->remainGroups, &(info->groupId), sizeof(info->groupId), &(info->uid), sizeof(info->uid));
|
||||
}
|
||||
}
|
||||
|
||||
if (initRemainGroups) {
|
||||
pTableListInfo->numOfOuputGroups = taosHashGetSize(pTableListInfo->remainGroups);
|
||||
}
|
||||
|
||||
if (tsTagFilterCache) {
|
||||
|
@ -2025,6 +2042,7 @@ STableListInfo* tableListCreate() {
|
|||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||
return NULL;
|
||||
}
|
||||
pListInfo->remainGroups = NULL;
|
||||
|
||||
pListInfo->pTableList = taosArrayInit(4, sizeof(STableKeyInfo));
|
||||
if (pListInfo->pTableList == NULL) {
|
||||
|
@ -2054,7 +2072,7 @@ void* tableListDestroy(STableListInfo* pTableListInfo) {
|
|||
taosMemoryFreeClear(pTableListInfo->groupOffset);
|
||||
|
||||
taosHashCleanup(pTableListInfo->map);
|
||||
|
||||
taosHashCleanup(pTableListInfo->remainGroups);
|
||||
pTableListInfo->pTableList = NULL;
|
||||
pTableListInfo->map = NULL;
|
||||
taosMemoryFree(pTableListInfo);
|
||||
|
@ -2068,6 +2086,7 @@ void tableListClear(STableListInfo* pTableListInfo) {
|
|||
|
||||
taosArrayClear(pTableListInfo->pTableList);
|
||||
taosHashClear(pTableListInfo->map);
|
||||
taosHashClear(pTableListInfo->remainGroups);
|
||||
taosMemoryFree(pTableListInfo->groupOffset);
|
||||
pTableListInfo->numOfOuputGroups = 1;
|
||||
pTableListInfo->oneTableForEachGroup = false;
|
||||
|
@ -2122,6 +2141,9 @@ int32_t buildGroupIdMapForAllTables(STableListInfo* pTableListInfo, SReadHandle*
|
|||
|
||||
bool groupByTbname = groupbyTbname(group);
|
||||
size_t numOfTables = taosArrayGetSize(pTableListInfo->pTableList);
|
||||
if (!numOfTables) {
|
||||
return code;
|
||||
}
|
||||
if (group == NULL || groupByTbname) {
|
||||
for (int32_t i = 0; i < numOfTables; i++) {
|
||||
STableKeyInfo* info = taosArrayGet(pTableListInfo->pTableList, i);
|
||||
|
@ -2139,11 +2161,18 @@ int32_t buildGroupIdMapForAllTables(STableListInfo* pTableListInfo, SReadHandle*
|
|||
pTableListInfo->numOfOuputGroups = 1;
|
||||
}
|
||||
} else {
|
||||
code = getColInfoResultForGroupby(pHandle->vnode, group, pTableListInfo, digest, pAPI);
|
||||
bool initRemainGroups = false;
|
||||
if (QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN == nodeType(pScanNode)) {
|
||||
STableScanPhysiNode* pTableScanNode = (STableScanPhysiNode*)pScanNode;
|
||||
if (tsCountAlwaysReturnValue && pTableScanNode->needCountEmptyTable && !(groupSort || pScanNode->groupOrderScan)) {
|
||||
initRemainGroups = true;
|
||||
}
|
||||
}
|
||||
|
||||
code = getColInfoResultForGroupby(pHandle->vnode, group, pTableListInfo, digest, pAPI, initRemainGroups);
|
||||
if (code != TSDB_CODE_SUCCESS) {
|
||||
return code;
|
||||
}
|
||||
if (pScanNode->groupOrderScan) pTableListInfo->numOfOuputGroups = taosArrayGetSize(pTableListInfo->pTableList);
|
||||
|
||||
if (groupSort || pScanNode->groupOrderScan) {
|
||||
code = sortTableGroup(pTableListInfo);
|
||||
|
|
|
@ -1209,7 +1209,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
|||
STableKeyInfo* pTableInfo = tableListGetInfo(pTableListInfo, 0);
|
||||
uid = pTableInfo->uid;
|
||||
ts = INT64_MIN;
|
||||
pScanInfo->currentTable = 0;
|
||||
pScanInfo->tableEndIndex = 0;
|
||||
} else {
|
||||
taosRUnLockLatch(&pTaskInfo->lock);
|
||||
qError("no table in table list, %s", id);
|
||||
|
@ -1223,16 +1223,16 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
|||
pInfo->pTableScanOp->resultInfo.totalRows = 0;
|
||||
|
||||
// start from current accessed position
|
||||
// we cannot start from the pScanInfo->currentTable, since the commit offset may cause the rollback of the start
|
||||
// we cannot start from the pScanInfo->tableEndIndex, since the commit offset may cause the rollback of the start
|
||||
// position, let's find it from the beginning.
|
||||
index = tableListFind(pTableListInfo, uid, 0);
|
||||
taosRUnLockLatch(&pTaskInfo->lock);
|
||||
|
||||
if (index >= 0) {
|
||||
pScanInfo->currentTable = index;
|
||||
pScanInfo->tableEndIndex = index;
|
||||
} else {
|
||||
qError("vgId:%d uid:%" PRIu64 " not found in table list, total:%d, index:%d %s", pTaskInfo->id.vgId, uid,
|
||||
numOfTables, pScanInfo->currentTable, id);
|
||||
numOfTables, pScanInfo->tableEndIndex, id);
|
||||
terrno = TSDB_CODE_PAR_INTERNAL_ERROR;
|
||||
return -1;
|
||||
}
|
||||
|
@ -1255,12 +1255,12 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
|||
}
|
||||
|
||||
qDebug("tsdb reader created with offset(snapshot) uid:%" PRId64 " ts:%" PRId64 " table index:%d, total:%d, %s",
|
||||
uid, pScanBaseInfo->cond.twindows.skey, pScanInfo->currentTable, numOfTables, id);
|
||||
uid, pScanBaseInfo->cond.twindows.skey, pScanInfo->tableEndIndex, numOfTables, id);
|
||||
} else {
|
||||
pTaskInfo->storageAPI.tsdReader.tsdSetQueryTableList(pScanBaseInfo->dataReader, &keyInfo, 1);
|
||||
pTaskInfo->storageAPI.tsdReader.tsdReaderResetStatus(pScanBaseInfo->dataReader, &pScanBaseInfo->cond);
|
||||
qDebug("tsdb reader offset seek snapshot to uid:%" PRId64 " ts %" PRId64 " table index:%d numOfTable:%d, %s",
|
||||
uid, pScanBaseInfo->cond.twindows.skey, pScanInfo->currentTable, numOfTables, id);
|
||||
uid, pScanBaseInfo->cond.twindows.skey, pScanInfo->tableEndIndex, numOfTables, id);
|
||||
}
|
||||
|
||||
// restore the key value
|
||||
|
|
|
@ -655,6 +655,76 @@ void setTbNameColData(const SSDataBlock* pBlock, SColumnInfoData* pColInfoData,
|
|||
colDataDestroy(&infoData);
|
||||
}
|
||||
|
||||
|
||||
static void initNextGroupScan(STableScanInfo* pInfo, STableKeyInfo** pKeyInfo, int32_t* size) {
|
||||
pInfo->tableStartIndex = pInfo->tableEndIndex + 1;
|
||||
|
||||
STableListInfo* pTableListInfo = pInfo->base.pTableListInfo;
|
||||
int32_t numOfTables = tableListGetSize(pTableListInfo);
|
||||
STableKeyInfo* pStart = (STableKeyInfo*)tableListGetInfo(pTableListInfo, pInfo->tableStartIndex);
|
||||
|
||||
if (pTableListInfo->oneTableForEachGroup) {
|
||||
pInfo->tableEndIndex = pInfo->tableStartIndex;
|
||||
} else if (pTableListInfo->groupOffset) {
|
||||
pInfo->currentGroupIndex++;
|
||||
if (pInfo->currentGroupIndex + 1 < pTableListInfo->numOfOuputGroups) {
|
||||
pInfo->tableEndIndex = pTableListInfo->groupOffset[pInfo->currentGroupIndex + 1] - 1;
|
||||
} else {
|
||||
pInfo->tableEndIndex = numOfTables - 1;
|
||||
}
|
||||
} else {
|
||||
pInfo->tableEndIndex = numOfTables - 1;
|
||||
}
|
||||
|
||||
if (!pInfo->needCountEmptyTable) {
|
||||
pInfo->countState = TABLE_COUNT_STATE_END;
|
||||
} else {
|
||||
pInfo->countState = TABLE_COUNT_STATE_SCAN;
|
||||
}
|
||||
|
||||
*pKeyInfo = pStart;
|
||||
*size = pInfo->tableEndIndex - pInfo->tableStartIndex + 1;
|
||||
}
|
||||
|
||||
void markGroupProcessed(STableScanInfo* pInfo, uint64_t groupId) {
|
||||
if (pInfo->countState == TABLE_COUNT_STATE_END) {
|
||||
return;
|
||||
}
|
||||
if (pInfo->base.pTableListInfo->oneTableForEachGroup || pInfo->base.pTableListInfo->groupOffset) {
|
||||
pInfo->countState = TABLE_COUNT_STATE_PROCESSED;
|
||||
} else {
|
||||
taosHashRemove(pInfo->base.pTableListInfo->remainGroups, &groupId, sizeof(groupId));
|
||||
}
|
||||
}
|
||||
|
||||
static SSDataBlock* getOneRowResultBlock(SExecTaskInfo* pTaskInfo, STableScanBase* pBase, SSDataBlock* pBlock,
|
||||
const STableKeyInfo* tbInfo) {
|
||||
blockDataEmpty(pBlock);
|
||||
pBlock->info.rows = 1;
|
||||
pBlock->info.id.uid = tbInfo->uid;
|
||||
pBlock->info.id.groupId = tbInfo->groupId;
|
||||
|
||||
// only one row: set all col data to null & hasNull
|
||||
int32_t col_num = blockDataGetNumOfCols(pBlock);
|
||||
for (int32_t i = 0; i < col_num; ++i) {
|
||||
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
|
||||
colDataSetNULL(pColInfoData, 0);
|
||||
}
|
||||
|
||||
// set tag/tbname
|
||||
doSetTagColumnData(pBase, pBlock, pTaskInfo, pBlock->info.rows);
|
||||
return pBlock;
|
||||
}
|
||||
|
||||
static SSDataBlock* getBlockForEmptyTable(SOperatorInfo* pOperator, const STableKeyInfo* tbInfo) {
|
||||
STableScanInfo* pTableScanInfo = pOperator->info;
|
||||
SSDataBlock* pBlock =
|
||||
getOneRowResultBlock(pOperator->pTaskInfo, &pTableScanInfo->base, pTableScanInfo->pResBlock, tbInfo);
|
||||
|
||||
pOperator->resultInfo.totalRows++;
|
||||
return pBlock;
|
||||
}
|
||||
|
||||
static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
|
||||
STableScanInfo* pTableScanInfo = pOperator->info;
|
||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||
|
@ -736,6 +806,7 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
|
|||
while (pTableScanInfo->scanTimes < pTableScanInfo->scanInfo.numOfAsc) {
|
||||
SSDataBlock* p = doTableScanImpl(pOperator);
|
||||
if (p != NULL) {
|
||||
markGroupProcessed(pTableScanInfo, p->info.id.groupId);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
@ -764,6 +835,7 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
|
|||
while (pTableScanInfo->scanTimes < total) {
|
||||
SSDataBlock* p = doTableScanImpl(pOperator);
|
||||
if (p != NULL) {
|
||||
markGroupProcessed(pTableScanInfo, p->info.id.groupId);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
@ -780,6 +852,33 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
|
|||
}
|
||||
}
|
||||
|
||||
if (pTableScanInfo->countState < TABLE_COUNT_STATE_END) {
|
||||
STableListInfo* pTableListInfo = pTableScanInfo->base.pTableListInfo;
|
||||
if (pTableListInfo->oneTableForEachGroup || pTableListInfo->groupOffset) { // group by tbname, group by tag + sort
|
||||
if (pTableScanInfo->countState < TABLE_COUNT_STATE_PROCESSED) {
|
||||
pTableScanInfo->countState = TABLE_COUNT_STATE_PROCESSED;
|
||||
STableKeyInfo* pStart =
|
||||
(STableKeyInfo*)tableListGetInfo(pTableScanInfo->base.pTableListInfo, pTableScanInfo->tableStartIndex);
|
||||
return getBlockForEmptyTable(pOperator, pStart);
|
||||
}
|
||||
} else { // group by tag + no sort
|
||||
int32_t numOfTables = tableListGetSize(pTableListInfo);
|
||||
if (pTableScanInfo->tableEndIndex + 1 >= numOfTables) {
|
||||
// get empty group, mark processed & rm from hash
|
||||
void* pIte = taosHashIterate(pTableListInfo->remainGroups, NULL);
|
||||
if (pIte != NULL) {
|
||||
size_t keySize = 0;
|
||||
uint64_t* pGroupId = taosHashGetKey(pIte, &keySize);
|
||||
STableKeyInfo info = {.uid = *(uint64_t*)pIte, .groupId = *pGroupId};
|
||||
taosHashCancelIterate(pTableListInfo->remainGroups, pIte);
|
||||
markGroupProcessed(pTableScanInfo, *pGroupId);
|
||||
return getBlockForEmptyTable(pOperator, &info);
|
||||
}
|
||||
}
|
||||
}
|
||||
pTableScanInfo->countState = TABLE_COUNT_STATE_END;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -839,8 +938,8 @@ static SSDataBlock* startNextGroupScan(SOperatorInfo* pOperator) {
|
|||
STableScanInfo* pInfo = pOperator->info;
|
||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||
|
||||
if ((++pInfo->currentGroupId) >= tableListGetOutputGroups(pInfo->base.pTableListInfo)) {
|
||||
int32_t numOfTables = tableListGetSize(pInfo->base.pTableListInfo);
|
||||
if (pInfo->tableEndIndex + 1 >= numOfTables) {
|
||||
setOperatorCompleted(pOperator);
|
||||
if (pOperator->dynamicTask) {
|
||||
taosArrayClear(pInfo->base.pTableListInfo->pTableList);
|
||||
|
@ -855,7 +954,7 @@ static SSDataBlock* startNextGroupScan(SOperatorInfo* pOperator) {
|
|||
|
||||
int32_t num = 0;
|
||||
STableKeyInfo* pList = NULL;
|
||||
tableListGetGroupList(pInfo->base.pTableListInfo, pInfo->currentGroupId, &pList, &num);
|
||||
initNextGroupScan(pInfo, &pList, &num);
|
||||
|
||||
pAPI->tsdReader.tsdSetQueryTableList(pInfo->base.dataReader, pList, num);
|
||||
pAPI->tsdReader.tsdReaderResetStatus(pInfo->base.dataReader, &pInfo->base.cond);
|
||||
|
@ -876,16 +975,17 @@ static SSDataBlock* groupSeqTableScan(SOperatorInfo* pOperator) {
|
|||
STableScanInfo* pInfo = pOperator->info;
|
||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||
int32_t num = 0;
|
||||
STableKeyInfo* pList = NULL;
|
||||
|
||||
if (pInfo->currentGroupId == -1) {
|
||||
if ((++pInfo->currentGroupId) >= tableListGetOutputGroups(pInfo->base.pTableListInfo)) {
|
||||
if (pInfo->tableEndIndex == -1) {
|
||||
int32_t numOfTables = tableListGetSize(pInfo->base.pTableListInfo);
|
||||
if (pInfo->tableEndIndex + 1 == numOfTables) {
|
||||
setOperatorCompleted(pOperator);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int32_t num = 0;
|
||||
STableKeyInfo* pList = NULL;
|
||||
tableListGetGroupList(pInfo->base.pTableListInfo, pInfo->currentGroupId, &pList, &num);
|
||||
initNextGroupScan(pInfo, &pList, &num);
|
||||
ASSERT(pInfo->base.dataReader == NULL);
|
||||
|
||||
int32_t code = pAPI->tsdReader.tsdReaderOpen(pInfo->base.readHandle.vnode, &pInfo->base.cond, pList, num, pInfo->pResBlock,
|
||||
|
@ -934,7 +1034,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
|||
T_LONG_JMP(pTaskInfo->env, code);
|
||||
}
|
||||
if (pOperator->status == OP_EXEC_DONE) {
|
||||
pInfo->currentGroupId = -1;
|
||||
pInfo->tableEndIndex = -1;
|
||||
pOperator->status = OP_OPENED;
|
||||
SSDataBlock* result = NULL;
|
||||
while (true) {
|
||||
|
@ -950,6 +1050,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
|||
if (pInfo->scanMode == TABLE_SCAN__TABLE_ORDER) {
|
||||
int32_t numOfTables = 0; // tableListGetSize(pTaskInfo->pTableListInfo);
|
||||
STableKeyInfo tInfo = {0};
|
||||
pInfo->countState = TABLE_COUNT_STATE_END;
|
||||
|
||||
while (1) {
|
||||
SSDataBlock* result = doGroupedTableScan(pOperator);
|
||||
|
@ -958,23 +1059,23 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
|||
}
|
||||
|
||||
// if no data, switch to next table and continue scan
|
||||
pInfo->currentTable++;
|
||||
pInfo->tableEndIndex++;
|
||||
|
||||
taosRLockLatch(&pTaskInfo->lock);
|
||||
numOfTables = tableListGetSize(pInfo->base.pTableListInfo);
|
||||
|
||||
if (pInfo->currentTable >= numOfTables) {
|
||||
if (pInfo->tableEndIndex >= numOfTables) {
|
||||
qDebug("all table checked in table list, total:%d, return NULL, %s", numOfTables, GET_TASKID(pTaskInfo));
|
||||
taosRUnLockLatch(&pTaskInfo->lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tInfo = *(STableKeyInfo*)tableListGetInfo(pInfo->base.pTableListInfo, pInfo->currentTable);
|
||||
tInfo = *(STableKeyInfo*)tableListGetInfo(pInfo->base.pTableListInfo, pInfo->tableEndIndex);
|
||||
taosRUnLockLatch(&pTaskInfo->lock);
|
||||
|
||||
pAPI->tsdReader.tsdSetQueryTableList(pInfo->base.dataReader, &tInfo, 1);
|
||||
qDebug("set uid:%" PRIu64 " into scanner, total tables:%d, index:%d/%d %s", tInfo.uid, numOfTables,
|
||||
pInfo->currentTable, numOfTables, GET_TASKID(pTaskInfo));
|
||||
pInfo->tableEndIndex, numOfTables, GET_TASKID(pTaskInfo));
|
||||
|
||||
pAPI->tsdReader.tsdReaderResetStatus(pInfo->base.dataReader, &pInfo->base.cond);
|
||||
pInfo->scanTimes = 0;
|
||||
|
@ -1067,7 +1168,8 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
|
|||
goto _error;
|
||||
}
|
||||
|
||||
pInfo->currentGroupId = -1;
|
||||
pInfo->tableEndIndex = -1;
|
||||
pInfo->currentGroupIndex = -1;
|
||||
pInfo->assignBlockUid = pTableScanNode->assignBlockUid;
|
||||
pInfo->hasGroupByTag = pTableScanNode->pGroupTags ? true : false;
|
||||
|
||||
|
@ -1075,6 +1177,8 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
|
|||
pTaskInfo);
|
||||
pOperator->exprSupp.numOfExprs = numOfCols;
|
||||
|
||||
pInfo->needCountEmptyTable = tsCountAlwaysReturnValue && pTableScanNode->needCountEmptyTable;
|
||||
|
||||
pInfo->base.pTableListInfo = pTableListInfo;
|
||||
pInfo->base.metaCache.pTableMetaEntryCache = taosLRUCacheInit(1024 * 128, -1, .5);
|
||||
if (pInfo->base.metaCache.pTableMetaEntryCache == NULL) {
|
||||
|
@ -1160,7 +1264,7 @@ void resetTableScanInfo(STableScanInfo* pTableScanInfo, STimeWindow* pWin, uint6
|
|||
pTableScanInfo->base.cond.startVersion = 0;
|
||||
pTableScanInfo->base.cond.endVersion = ver;
|
||||
pTableScanInfo->scanTimes = 0;
|
||||
pTableScanInfo->currentGroupId = -1;
|
||||
pTableScanInfo->tableEndIndex = -1;
|
||||
pTableScanInfo->base.readerAPI.tsdReaderClose(pTableScanInfo->base.dataReader);
|
||||
pTableScanInfo->base.dataReader = NULL;
|
||||
}
|
||||
|
@ -2063,7 +2167,7 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
|||
pInfo->pTableScanOp->status = OP_OPENED;
|
||||
|
||||
pTSInfo->scanTimes = 0;
|
||||
pTSInfo->currentGroupId = -1;
|
||||
pTSInfo->tableEndIndex = -1;
|
||||
}
|
||||
|
||||
if (pStreamInfo->recoverStep == STREAM_RECOVER_STEP__SCAN1) {
|
||||
|
@ -3479,7 +3583,7 @@ int32_t startGroupTableMergeScan(SOperatorInfo* pOperator) {
|
|||
}
|
||||
pInfo->tableEndIndex = i - 1;
|
||||
}
|
||||
|
||||
pInfo->bGroupProcessed = false;
|
||||
int32_t tableStartIdx = pInfo->tableStartIndex;
|
||||
int32_t tableEndIdx = pInfo->tableEndIndex;
|
||||
|
||||
|
@ -3601,9 +3705,14 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
|
|||
|
||||
pBlock = getSortedTableMergeScanBlockData(pInfo->pSortHandle, pInfo->pResBlock, pOperator->resultInfo.capacity,
|
||||
pOperator);
|
||||
if (pBlock == NULL && !pInfo->bGroupProcessed && pInfo->needCountEmptyTable) {
|
||||
STableKeyInfo* tbInfo = tableListGetInfo(pInfo->base.pTableListInfo, pInfo->tableStartIndex);
|
||||
pBlock = getOneRowResultBlock(pTaskInfo, &pInfo->base, pInfo->pResBlock, tbInfo);
|
||||
}
|
||||
if (pBlock != NULL) {
|
||||
pBlock->info.id.groupId = pInfo->groupId;
|
||||
pOperator->resultInfo.totalRows += pBlock->info.rows;
|
||||
pInfo->bGroupProcessed = true;
|
||||
return pBlock;
|
||||
} else {
|
||||
if (pInfo->bNewFilesetEvent) {
|
||||
|
@ -3758,6 +3867,8 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN
|
|||
} else {
|
||||
pInfo->filesetDelimited = pTableScanNode->filesetDelimited;
|
||||
}
|
||||
pInfo->needCountEmptyTable = tsCountAlwaysReturnValue && pTableScanNode->needCountEmptyTable;
|
||||
|
||||
setOperatorInfo(pOperator, "TableMergeScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN, false, OP_NOT_OPENED,
|
||||
pInfo, pTaskInfo);
|
||||
pOperator->exprSupp.numOfExprs = numOfCols;
|
||||
|
|
|
@ -424,6 +424,7 @@ static int32_t logicScanCopy(const SScanLogicNode* pSrc, SScanLogicNode* pDst) {
|
|||
COPY_SCALAR_FIELD(groupOrderScan);
|
||||
COPY_SCALAR_FIELD(onlyMetaCtbIdx);
|
||||
COPY_SCALAR_FIELD(filesetDelimited);
|
||||
COPY_SCALAR_FIELD(isCountByTag);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -652,6 +653,7 @@ static int32_t physiTableScanCopy(const STableScanPhysiNode* pSrc, STableScanPhy
|
|||
COPY_SCALAR_FIELD(watermark);
|
||||
COPY_SCALAR_FIELD(igExpired);
|
||||
COPY_SCALAR_FIELD(filesetDelimited);
|
||||
COPY_SCALAR_FIELD(needCountEmptyTable);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -1841,6 +1841,7 @@ static const char* jkTableScanPhysiPlanSubtable = "Subtable";
|
|||
static const char* jkTableScanPhysiPlanAssignBlockUid = "AssignBlockUid";
|
||||
static const char* jkTableScanPhysiPlanIgnoreUpdate = "IgnoreUpdate";
|
||||
static const char* jkTableScanPhysiPlanFilesetDelimited = "FilesetDelimited";
|
||||
static const char* jkTableScanPhysiPlanNeedCountEmptyTable = "NeedCountEmptyTable";
|
||||
|
||||
static int32_t physiTableScanNodeToJson(const void* pObj, SJson* pJson) {
|
||||
const STableScanPhysiNode* pNode = (const STableScanPhysiNode*)pObj;
|
||||
|
@ -1912,7 +1913,9 @@ static int32_t physiTableScanNodeToJson(const void* pObj, SJson* pJson) {
|
|||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tjsonAddBoolToObject(pJson, jkTableScanPhysiPlanFilesetDelimited, pNode->filesetDelimited);
|
||||
}
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tjsonAddBoolToObject(pJson, jkTableScanPhysiPlanNeedCountEmptyTable, pNode->needCountEmptyTable);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
|
@ -1986,7 +1989,9 @@ static int32_t jsonToPhysiTableScanNode(const SJson* pJson, void* pObj) {
|
|||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tjsonGetBoolValue(pJson, jkTableScanPhysiPlanFilesetDelimited, &pNode->filesetDelimited);
|
||||
}
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tjsonGetBoolValue(pJson, jkTableScanPhysiPlanNeedCountEmptyTable, &pNode->needCountEmptyTable);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
|
|
|
@ -2170,6 +2170,9 @@ static int32_t physiTableScanNodeInlineToMsg(const void* pObj, STlvEncoder* pEnc
|
|||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tlvEncodeValueBool(pEncoder, pNode->filesetDelimited);
|
||||
}
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tlvEncodeValueBool(pEncoder, pNode->needCountEmptyTable);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
|
@ -2251,7 +2254,9 @@ static int32_t msgToPhysiTableScanNodeInline(STlvDecoder* pDecoder, void* pObj)
|
|||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tlvDecodeValueBool(pDecoder, &pNode->filesetDelimited);
|
||||
}
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
code = tlvDecodeValueBool(pDecoder, &pNode->needCountEmptyTable);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
|
|
|
@ -2083,6 +2083,7 @@ static void setFuncClassification(SNode* pCurrStmt, SFunctionNode* pFunc) {
|
|||
if (NULL != pCurrStmt && QUERY_NODE_SELECT_STMT == nodeType(pCurrStmt)) {
|
||||
SSelectStmt* pSelect = (SSelectStmt*)pCurrStmt;
|
||||
pSelect->hasAggFuncs = pSelect->hasAggFuncs ? true : fmIsAggFunc(pFunc->funcId);
|
||||
pSelect->hasCountFunc = pSelect->hasCountFunc ? true : (FUNCTION_TYPE_COUNT == pFunc->funcType);
|
||||
pSelect->hasRepeatScanFuncs = pSelect->hasRepeatScanFuncs ? true : fmIsRepeatScanFunc(pFunc->funcId);
|
||||
|
||||
if (fmIsIndefiniteRowsFunc(pFunc->funcId)) {
|
||||
|
|
|
@ -486,6 +486,16 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
|
|||
code = tagScanSetExecutionMode(pScan);
|
||||
}
|
||||
|
||||
bool isCountByTag = false;
|
||||
if (pSelect->hasCountFunc && NULL == pSelect->pWindow) {
|
||||
if (pSelect->pGroupByList) {
|
||||
isCountByTag = !keysHasCol(pSelect->pGroupByList);
|
||||
} else if (pSelect->pPartitionByList) {
|
||||
isCountByTag = !keysHasCol(pSelect->pPartitionByList);
|
||||
}
|
||||
}
|
||||
pScan->isCountByTag = isCountByTag;
|
||||
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
*pLogicNode = (SLogicNode*)pScan;
|
||||
} else {
|
||||
|
|
|
@ -623,6 +623,7 @@ static int32_t createTableScanPhysiNode(SPhysiPlanContext* pCxt, SSubplan* pSubp
|
|||
pTableScan->igCheckUpdate = pScanLogicNode->igCheckUpdate;
|
||||
pTableScan->assignBlockUid = pCxt->pPlanCxt->rSmaQuery ? true : false;
|
||||
pTableScan->filesetDelimited = pScanLogicNode->filesetDelimited;
|
||||
pTableScan->needCountEmptyTable = pScanLogicNode->isCountByTag;
|
||||
|
||||
int32_t code = createScanPhysiNodeFinalize(pCxt, pSubplan, pScanLogicNode, (SScanPhysiNode*)pTableScan, pPhyNode);
|
||||
if (TSDB_CODE_SUCCESS == code) {
|
||||
|
|
|
@ -360,6 +360,11 @@ e
|
|||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat_ws2.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/cos.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 2
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 3
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/group_partition.py -Q 4
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count_partition.py -R
|
||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/count.py
|
||||
|
|
|
@ -447,44 +447,44 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step17
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step18
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
|
|
|
@ -619,56 +619,56 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step22
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step23
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
|
|
|
@ -824,117 +824,117 @@ if $data00 != 25 then
|
|||
endi
|
||||
|
||||
print =============== step28
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol3
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol3 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol4
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol4 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol5
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol5 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol6
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt group by tgcol6 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step29
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 and tbcol6 = 1 group by tgcol1
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 and tbcol6 = 1 group by tgcol1 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step30
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 and tbcol6 = 1 group by tgcol2
|
||||
sql select count(tbcol1), avg(tbcol1), sum(tbcol1), min(tbcol1), max(tbcol1), first(tbcol1), last(tbcol1) from $mt where ts < 1626739440001 and tbcol1 = 1 and tbcol2 = 1 and tbcol3 = 1 and tbcol4 = 1 and tbcol5 = 1 and tbcol6 = 1 group by tgcol2 order by count(tbcol1) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
|
|
|
@ -127,7 +127,7 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step6
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
print $data10 $data11 $data12 $data13 $data14 $data15 $data16
|
||||
if $data00 != 100 then
|
||||
|
@ -136,7 +136,7 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step7
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
|
|
|
@ -127,14 +127,14 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step6
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step7
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
|
|
|
@ -128,14 +128,14 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step6
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 100 then
|
||||
return -1
|
||||
endi
|
||||
|
||||
print =============== step7
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
|
|
|
@ -131,7 +131,7 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step6
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
print $data10 $data11 $data12 $data13 $data14 $data15 $data16
|
||||
if $data00 != 100 then
|
||||
|
@ -140,7 +140,7 @@ if $data00 != 100 then
|
|||
endi
|
||||
|
||||
print =============== step7
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol
|
||||
sql select count(tbcol), avg(tbcol), sum(tbcol), min(tbcol), max(tbcol), first(tbcol), last(tbcol) from $mt where ts < 1626739440001 and tbcol = 1 group by tgcol order by count(tbcol) desc
|
||||
print $data00 $data01 $data02 $data03 $data04 $data05 $data06
|
||||
if $data00 != 25 then
|
||||
return -1
|
||||
|
|
|
@ -100,7 +100,8 @@ if $data05 != 1 then
|
|||
endi
|
||||
|
||||
sql select max(c1), min(c1), sum(c1), avg(c1), count(c1), t1 from $stb where c1 > 0 group by t1
|
||||
if $rows != 1 then
|
||||
if $rows != 2 then
|
||||
print === rows $rows
|
||||
return -1
|
||||
endi
|
||||
if $data00 != 319 then
|
||||
|
|
|
@ -57,8 +57,11 @@ class TDTestCase:
|
|||
tdSql.query(f'select count(*) from {self.stbname}')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 0)
|
||||
rows = [2, 0]
|
||||
function_names = ['count', 'hyperloglog']
|
||||
for function_name in function_names:
|
||||
for i in range(2):
|
||||
function_name = function_names[i]
|
||||
row = rows[i]
|
||||
tdSql.query(f'select {function_name}(tbname) from {self.stbname}')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 0)
|
||||
|
@ -93,17 +96,17 @@ class TDTestCase:
|
|||
tdSql.query(f'select sum(1),max(c2),min(1),leastsquares(c1,1,1) from {self.stbname}')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.stbname} group by tbname')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.checkRows(row)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.stbname} group by c1')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.stbname} group by t0')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.checkRows(row)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.stbname} partition by tbname')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.checkRows(row)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.stbname} partition by c1')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.stbname} partition by t0')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.checkRows(row)
|
||||
tdSql.query(f'select {function_name}(1) from (select {function_name}(c1),sum(c1) from {self.stbname} group by c1)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 0)
|
||||
|
@ -113,17 +116,24 @@ class TDTestCase:
|
|||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.stbname} partition by c1 interval(1s)')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(1),sum(1) from (select {function_name}(1) from {self.stbname} group by tbname)')
|
||||
tdSql.query(f'select {function_name}(1),sum(1) from (select {function_name}(1) from {self.stbname} group by tbname order by tbname)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 0)
|
||||
tdSql.checkData(0, 1, None)
|
||||
if 'count' == function_name:
|
||||
tdSql.checkData(0, 0, 2)
|
||||
tdSql.checkData(0, 1, 2)
|
||||
elif 'hyperloglog' == function_name:
|
||||
tdSql.checkData(0, 0, 0)
|
||||
tdSql.checkData(0, 1, None)
|
||||
|
||||
def query_empty_ntb(self):
|
||||
tdSql.query(f'select count(*) from {self.ntbname}')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 0)
|
||||
rows = [1, 0]
|
||||
function_names = ['count', 'hyperloglog']
|
||||
for function_name in function_names:
|
||||
for i in range(2):
|
||||
function_name = function_names[i]
|
||||
row = rows[i]
|
||||
tdSql.query(f'select {function_name}(tbname) from {self.ntbname}')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 0)
|
||||
|
@ -158,7 +168,7 @@ class TDTestCase:
|
|||
tdSql.query(f'select sum(1),max(c2),min(1),leastsquares(c1,1,1) from {self.ntbname}')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.ntbname} group by tbname')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.checkRows(row)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.ntbname} group by c1')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(1) from (select {function_name}(c1),sum(c1) from {self.ntbname} group by c1)')
|
||||
|
@ -170,10 +180,11 @@ class TDTestCase:
|
|||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select {function_name}(c1),sum(c1) from {self.ntbname} partition by c1 interval(1s)')
|
||||
tdSql.checkRows(0)
|
||||
tdSql.query(f'select count(1),sum(1) from (select count(1) from {self.ntbname} group by tbname)')
|
||||
tdSql.query(f'select count(1),sum(1) from (select count(1) from {self.ntbname} group by tbname order by tbname)')
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 0, 0)
|
||||
tdSql.checkData(0, 1, None)
|
||||
tdSql.checkData(0, 0, 1)
|
||||
tdSql.checkData(0, 1, 1)
|
||||
|
||||
def count_query_stb(self,column_dict,tag_dict,stbname,tbnum,rownum):
|
||||
tdSql.query(f'select count(tbname) from {stbname}')
|
||||
tdSql.checkEqual(tdSql.queryResult[0][0],tbnum*rownum)
|
||||
|
|
|
@ -66,9 +66,9 @@ class TDTestCase:
|
|||
tdSql.checkRows(self.row_nums+1)
|
||||
|
||||
tdSql.query(f"select count(c1) , count(t2) from {dbname}.stb where abs(c1+t2)=1 partition by tbname")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(10)
|
||||
tdSql.query(f"select count(c1) from {dbname}.stb where abs(c1+t2)=1 partition by tbname")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(10)
|
||||
|
||||
tdSql.query(f"select tbname , count(c1) from {dbname}.stb partition by tbname order by tbname")
|
||||
tdSql.checkRows(self.tb_nums)
|
||||
|
|
|
@ -0,0 +1,215 @@
|
|||
# author : bobliu
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
|
||||
class TDTestCase:
|
||||
def init(self, conn, logSql, replicaVar=1):
|
||||
self.replicaVar = int(replicaVar)
|
||||
tdLog.debug("start to execute %s" % __file__)
|
||||
tdSql.init(conn.cursor())
|
||||
|
||||
self.row_nums = 10
|
||||
self.tb_nums = 10
|
||||
self.ts = 1537146000000
|
||||
self.dbname = "db"
|
||||
self.stable = "stb"
|
||||
|
||||
def prepare_db(self):
|
||||
tdSql.execute(f" use {self.dbname} ")
|
||||
tdSql.execute(f" create stable {self.dbname}.{self.stable} (ts timestamp , c1 int , c2 bigint , c3 float , c4 double , c5 smallint , c6 tinyint , c7 bool , c8 binary(36) , c9 nchar(36) , uc1 int unsigned,\
|
||||
uc2 bigint unsigned ,uc3 smallint unsigned , uc4 tinyint unsigned ) tags(t1 timestamp , t2 int , t3 bigint , t4 float , t5 double , t6 smallint , t7 tinyint , t8 bool , t9 binary(36)\
|
||||
, t10 nchar(36) , t11 int unsigned , t12 bigint unsigned ,t13 smallint unsigned , t14 tinyint unsigned ) ")
|
||||
|
||||
for i in range(self.tb_nums):
|
||||
tbname = f"{self.dbname}.sub_{self.stable}_{i}"
|
||||
ts = self.ts + i*10000
|
||||
tdSql.execute(f"create table {tbname} using {self.dbname}.{self.stable} tags ({ts} , {i} , {i}*10 ,{i}*1.0,{i}*1.0 , 1 , 2, 'true', 'binary_{i}' ,'nchar_{i}',{i},{i},10,20 )")
|
||||
|
||||
def insert_db(self, tb_nums, row_nums):
|
||||
for i in range(tb_nums):
|
||||
tbname = f"{self.dbname}.sub_{self.stable}_{i}"
|
||||
ts_base = self.ts + i*10000
|
||||
for row in range(row_nums):
|
||||
ts = ts_base + row*1000
|
||||
tdSql.execute(f"insert into {tbname} values({ts} , {row} , {row} , {row} , {row} , 1 , 2 , 'true' , 'binary_{row}' , 'nchar_{row}' , {row} , {row} , 1 ,2 )")
|
||||
|
||||
|
||||
def test_groupby(self, keyword, check_num, nonempty_tb_num):
|
||||
####### by tbname
|
||||
tdSql.query(f"select count(*), count(1), count(c1) from {self.dbname}.{self.stable} {keyword} by tbname ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select tbname, count(*) from {self.dbname}.{self.stable} {keyword} by tbname ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select tbname from {self.dbname}.{self.stable} {keyword} by tbname order by count(*)")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
# last
|
||||
tdSql.query(f"select last(ts), count(*) from {self.dbname}.{self.stable} {keyword} by tbname order by last(ts)")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select tbname from {self.dbname}.{self.stable} {keyword} by tbname having count(*)>=0")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
# having filter out empty
|
||||
tdSql.query(f"select tbname, count(*) from {self.dbname}.{self.stable} {keyword} by tbname having count(*) <= 0")
|
||||
tdSql.checkRows(check_num - nonempty_tb_num)
|
||||
|
||||
####### by tag
|
||||
tdSql.query(f"select t2, count(*), count(1), count(c1) from {self.dbname}.{self.stable} {keyword} by t2 ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select t2, count(*) from {self.dbname}.{self.stable} {keyword} by t2 having count(*) <= 0")
|
||||
tdSql.checkRows(check_num - nonempty_tb_num)
|
||||
|
||||
# where
|
||||
tdSql.query(f"select t2, count(*) from {self.dbname}.{self.stable} where ts < now {keyword} by t2 ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select t2, count(*) from {self.dbname}.{self.stable} where ts > 1737146000000 {keyword} by t2 ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select t2, count(*) from {self.dbname}.{self.stable} where c1 = 1 {keyword} by t2 ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
####### by col
|
||||
tdSql.query(f"select c1, count(*), count(1), count(c1) from {self.dbname}.{self.stable} {keyword} by c1 ")
|
||||
num = 0
|
||||
if nonempty_tb_num > 0:
|
||||
num = self.row_nums
|
||||
tdSql.checkRows(num)
|
||||
|
||||
tdSql.query(f"select ts, count(*) from {self.dbname}.{self.stable} {keyword} by ts ")
|
||||
tdSql.checkRows(nonempty_tb_num * self.row_nums)
|
||||
|
||||
# col + tag
|
||||
tdSql.query(f"select t2, c1, count(*) from {self.dbname}.{self.stable} {keyword} by t2, c1 ")
|
||||
tdSql.checkRows(nonempty_tb_num * self.row_nums)
|
||||
|
||||
tdSql.query(f"select t2, t3, c1, count(*) from {self.dbname}.{self.stable} {keyword} by t2, t3, c1 ")
|
||||
tdSql.checkRows(nonempty_tb_num * self.row_nums)
|
||||
|
||||
|
||||
def test_multi_group_key(self, check_num, nonempty_tb_num):
|
||||
# multi tag/tbname
|
||||
tdSql.query(f"select t2, t3, tbname, count(*) from {self.dbname}.{self.stable} group by t2, t3, tbname")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select t2, t3, tbname, count(*) from {self.dbname}.{self.stable} partition by t2, t3, tbname")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
# multi tag + col
|
||||
tdSql.query(f"select t1, t2, c1, count(*) from {self.dbname}.{self.stable} partition by t1, t2, c1 ")
|
||||
tdSql.checkRows(nonempty_tb_num * self.row_nums)
|
||||
|
||||
# tag + multi col
|
||||
tdSql.query(f"select t2, c1, c2, count(*) from {self.dbname}.{self.stable} partition by t2, c1, c2 ")
|
||||
tdSql.checkRows(nonempty_tb_num * self.row_nums)
|
||||
|
||||
|
||||
def test_multi_agg(self, all_tb_num, nonempty_tb_num):
|
||||
tdSql.query(f"select count(*), sum(c1) from {self.dbname}.{self.stable} group by tbname ")
|
||||
tdSql.checkRows(all_tb_num)
|
||||
|
||||
tdSql.query(f"select count(1), sum(1), avg(c1), apercentile(c1, 50), spread(ts) from {self.dbname}.{self.stable} group by tbname ")
|
||||
tdSql.checkRows(all_tb_num)
|
||||
|
||||
tdSql.query(f"select count(c1), sum(c1), min(c1), mode(c1), stddev(c1), spread(c1) from {self.dbname}.{self.stable} partition by tbname ")
|
||||
tdSql.checkRows(all_tb_num)
|
||||
|
||||
# elapsed: continuous duration in a statistical period, table merge scan
|
||||
tdSql.query(f" select count(c1), max(c5), last_row(c5), elapsed(ts), spread(c1) from {self.dbname}.{self.stable} group by tbname")
|
||||
tdSql.checkRows(all_tb_num)
|
||||
|
||||
tdSql.query(f" select count(c1), min(c1), avg(c1), elapsed(ts), mode(c1) from {self.dbname}.{self.stable} partition by tbname")
|
||||
tdSql.checkRows(all_tb_num)
|
||||
|
||||
tdSql.query(f" select count(c1), elapsed(ts), twa(c1), irate(c1), leastsquares(c1,1,1) from {self.dbname}.{self.stable} partition by tbname")
|
||||
tdSql.checkRows(all_tb_num)
|
||||
|
||||
tdSql.query(f" select avg(c1), elapsed(ts), twa(c1), irate(c1) from {self.dbname}.{self.stable} partition by tbname")
|
||||
tdSql.checkRows(nonempty_tb_num)
|
||||
|
||||
# if nonempty_tb_num > 0:
|
||||
# tdSql.query(f" select avg(c1), percentile(c1, 50) from {self.dbname}.sub_{self.stable}_1")
|
||||
# tdSql.checkRows(1)
|
||||
|
||||
def test_innerSelect(self, check_num):
|
||||
tdSql.query(f"select * from (select count(c1) from {self.dbname}.{self.stable} group by tbname) ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select * from (select count(c1) from {self.dbname}.{self.stable} partition by tbname) ")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
tdSql.query(f"select t1, c from (select t1, sum(c1) as s, count(*) as c from {self.dbname}.{self.stable} partition by t1)")
|
||||
tdSql.checkRows(check_num)
|
||||
|
||||
|
||||
def test_window(self, nonempty_tb_num):
|
||||
# empty group optimization condition is not met
|
||||
# time window
|
||||
tdSql.query(f"select count(c1) from {self.dbname}.{self.stable} partition by tbname interval(1d)")
|
||||
tdSql.checkRows(nonempty_tb_num)
|
||||
|
||||
tdSql.query(f"select _wstart, _wend, count(c1), max(c1), apercentile(c1, 50) from {self.dbname}.{self.stable} partition by tbname interval(1d)")
|
||||
tdSql.checkRows(nonempty_tb_num)
|
||||
|
||||
# state window
|
||||
tdSql.query(f"select tbname, count(*), c1 from {self.dbname}.{self.stable} partition by tbname state_window(c1)")
|
||||
tdSql.checkRows(nonempty_tb_num * self.row_nums)
|
||||
|
||||
# session window
|
||||
tdSql.query(f"select count(c1) from {self.dbname}.{self.stable} partition by tbname session(ts, 5s)")
|
||||
tdSql.checkRows(nonempty_tb_num)
|
||||
|
||||
# event window
|
||||
tdSql.query(f"select tbname, count(*) from {self.dbname}.{self.stable} partition by tbname event_window start with c1 >= 0 end with c2 = 9;")
|
||||
tdSql.checkRows(nonempty_tb_num)
|
||||
|
||||
|
||||
|
||||
def test_error(self):
|
||||
tdSql.error(f"select * from {self.dbname}.{self.stable} group by t2")
|
||||
tdSql.error(f"select t2, count(*) from {self.dbname}.{self.stable} group by t2 where t2 = 1")
|
||||
tdSql.error(f"select t2, count(*) from {self.dbname}.{self.stable} group by t2 interval(1d)")
|
||||
|
||||
|
||||
def run(self):
|
||||
tdSql.prepare()
|
||||
self.prepare_db()
|
||||
# empty table only
|
||||
self.test_groupby('group', self.tb_nums, 0)
|
||||
self.test_groupby('partition', self.tb_nums, 0)
|
||||
self.test_innerSelect(self.tb_nums)
|
||||
self.test_multi_group_key(self.tb_nums, 0)
|
||||
self.test_multi_agg(self.tb_nums, 0)
|
||||
self.test_window(0)
|
||||
|
||||
# insert data to 5 tables
|
||||
nonempty_tb_num = 5
|
||||
self.insert_db(nonempty_tb_num, self.row_nums)
|
||||
|
||||
self.test_groupby('group', self.tb_nums, nonempty_tb_num)
|
||||
self.test_groupby('partition', self.tb_nums, nonempty_tb_num)
|
||||
self.test_innerSelect(self.tb_nums)
|
||||
self.test_multi_group_key(self.tb_nums, nonempty_tb_num)
|
||||
self.test_multi_agg(self.tb_nums, nonempty_tb_num)
|
||||
self.test_window(nonempty_tb_num)
|
||||
|
||||
## test old version before changed
|
||||
# self.test_groupby('group', 0, 0)
|
||||
# self.insert_db(5, self.row_nums)
|
||||
# self.test_groupby('group', 5, 5)
|
||||
|
||||
self.test_error()
|
||||
|
||||
|
||||
def stop(self):
|
||||
tdSql.close()
|
||||
tdLog.success("%s successfully executed" % __file__)
|
||||
|
||||
|
||||
tdCases.addWindows(__file__, TDTestCase())
|
||||
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -209,7 +209,7 @@ class TDTestCase:
|
|||
tdSql.error(f"select irate(c1), abs(c1) from {dbname}.ct4 ")
|
||||
|
||||
# agg functions mix with agg functions
|
||||
tdSql.query(f"select irate(c1), count(c5) from {dbname}.stb1 partition by tbname order by tbname")
|
||||
tdSql.query(f"select irate(c1), count(c5) from {dbname}.stb1 partition by tbname having count(c5)>0 order by tbname")
|
||||
tdSql.checkData(0, 0, 0.000000000)
|
||||
tdSql.checkData(1, 0, 0.000000000)
|
||||
tdSql.checkData(0, 1, 13)
|
||||
|
|
|
@ -435,7 +435,7 @@ class TDTestCase:
|
|||
tdSql.checkData(1,0,'ct4')
|
||||
tdSql.checkData(1,1,None)
|
||||
|
||||
tdSql.query(f"select t1 ,count(c1) from {dbname}.stb1 partition by t1 ")
|
||||
tdSql.query(f"select t1 ,count(c1) from {dbname}.stb1 partition by t1 having count(c1)>0")
|
||||
tdSql.checkRows(2)
|
||||
|
||||
# filter by tbname
|
||||
|
|
|
@ -5,6 +5,8 @@ import socket
|
|||
import os
|
||||
import threading
|
||||
|
||||
from datetime import timezone, datetime
|
||||
|
||||
from util.log import *
|
||||
from util.sql import *
|
||||
from util.cases import *
|
||||
|
@ -1111,14 +1113,14 @@ class TDTestCase:
|
|||
|
||||
def TS_3932(self):
|
||||
tdLog.debug("test insert data into stable")
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname having count(*)>0 order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkData(0, 1, 100)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
tdSql.query(f"insert into nested.stable_1 (ts,tbname) values(now,'stable_1_1');")
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 101)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
|
@ -1127,7 +1129,7 @@ class TDTestCase:
|
|||
coulmn_name = qlist[i]
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_1_1',1);")
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;",queryTimes=5)
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 111)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
|
@ -1136,7 +1138,7 @@ class TDTestCase:
|
|||
coulmn_name = q_null_list[i]
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_1_1',1);")
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;",queryTimes=5)
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 121)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
|
@ -1184,7 +1186,7 @@ class TDTestCase:
|
|||
def TS_3932_flushdb(self):
|
||||
tdLog.debug("test flush db and insert data into stable")
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 121)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
|
@ -1192,106 +1194,120 @@ class TDTestCase:
|
|||
q_null_list = ['q_int_null', 'q_bigint_null', 'q_smallint_null', 'q_tinyint_null', 'q_float_null', 'q_double_null', 'q_bool_null', 'q_binary_null', 'q_nchar_null', 'q_ts_null']
|
||||
tdSql.query(f"insert into nested.stable_1 (ts,tbname) values(now,'stable_1_1');")
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 122)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
pd = datetime.datetime.now()
|
||||
ts = int(datetime.datetime.timestamp(pd)*1000 - 10000)
|
||||
print(f"start time {ts}")
|
||||
|
||||
for i in range(10):
|
||||
coulmn_name = qlist[i]
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_1_1',1);")
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts, tbname, {coulmn_name}) values({ts+i},'stable_1_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 132)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
for i in range(10):
|
||||
coulmn_name = q_null_list[i]
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_1_1',1);")
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts, tbname, {coulmn_name}) values({ts+i},'stable_1_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 142)
|
||||
tdSql.checkData(1, 1, 200)
|
||||
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts,tbname,q_int) values(now,'stable_1_1',1) \
|
||||
nested.stable_1 (ts,tbname,q_bigint) values(now+1a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_smallint) values(now+2a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_tinyint) values(now+3a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_float) values(now+4a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_double) values(now+5a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_bool) values(now+6a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_binary) values(now+7a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_nchar) values(now+8a,'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_ts) values(now+9a,'stable_1_1',1);")
|
||||
tdSql.execute(f"insert into nested.stable_1 (ts,tbname,q_int) values({ts},'stable_1_1',1) \
|
||||
nested.stable_1 (ts,tbname,q_bigint) values({ts+1},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_smallint) values({ts+2},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_tinyint) values({ts+3},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_float) values({ts+4},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_double) values({ts+5},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_bool) values({ts+6},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_binary) values({ts+7},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_nchar) values({ts+8},'stable_1_1',1)\
|
||||
nested.stable_1 (ts,tbname,q_ts) values({ts+9},'stable_1_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 152);
|
||||
tdSql.checkData(1, 1, 200);
|
||||
|
||||
tdSql.query(f"insert into nested.stable_null_data (ts,tbname) values(now,'stable_null_data_1');")
|
||||
tdSql.query(f"insert into nested.stable_null_data (ts,tbname) values({ts},'stable_null_data_1');")
|
||||
ts = ts + 1
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_data_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 22);
|
||||
|
||||
for i in range(10):
|
||||
coulmn_name = qlist[i]
|
||||
tdSql.execute(f"insert into nested.stable_null_data (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_null_data_1',1);")
|
||||
tdSql.execute(f"insert into nested.stable_null_data (ts, tbname, {coulmn_name}) values({ts+i},'stable_null_data_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_data group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 32)
|
||||
|
||||
for i in range(10):
|
||||
coulmn_name = q_null_list[i]
|
||||
tdSql.execute(f"insert into nested.stable_null_data (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_null_data_1',1);")
|
||||
|
||||
tdSql.execute(f"insert into nested.stable_null_data (ts, tbname, {coulmn_name}) values({ts+i},'stable_null_data_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_data group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 42)
|
||||
|
||||
tdSql.query(f"insert into nested.stable_null_data (ts,tbname,q_int) values(now,'stable_null_data_1',1) \
|
||||
nested.stable_null_data (ts,tbname,q_bigint) values(now+1a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_smallint) values(now+2a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_tinyint) values(now+3a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_float) values(now+4a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_double) values(now+5a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_bool) values(now+6a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_binary) values(now+7a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_nchar) values(now+8a,'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_ts) values(now+9a,'stable_null_data_1',1);")
|
||||
tdSql.query(f"insert into nested.stable_null_data (ts,tbname,q_int) values({ts},'stable_null_data_1',1) \
|
||||
nested.stable_null_data (ts,tbname,q_bigint) values({ts+1},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_smallint) values({ts+2},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_tinyint) values({ts+3},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_float) values({ts+4},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_double) values({ts+5},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_bool) values({ts+6},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_binary) values({ts+7},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_nchar) values({ts+8},'stable_null_data_1',1)\
|
||||
nested.stable_null_data (ts,tbname,q_ts) values({ts+9},'stable_null_data_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_data group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 52);
|
||||
|
||||
|
||||
|
||||
tdSql.query(f"insert into nested.stable_null_childtable (ts,tbname) values(now,'stable_null_childtable_1');")
|
||||
tdSql.query(f"insert into nested.stable_null_childtable (ts,tbname) values({ts},'stable_null_childtable_1');")
|
||||
ts = ts + 1
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_childtable group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 22)
|
||||
|
||||
for i in range(10):
|
||||
coulmn_name = qlist[i]
|
||||
tdSql.execute(f"insert into nested.stable_null_childtable (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_null_childtable_1',1);")
|
||||
tdSql.execute(f"insert into nested.stable_null_childtable (ts, tbname, {coulmn_name}) values({ts+i},'stable_null_childtable_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_childtable group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 32)
|
||||
|
||||
for i in range(10):
|
||||
coulmn_name = q_null_list[i]
|
||||
tdSql.execute(f"insert into nested.stable_null_childtable (ts, tbname, {coulmn_name}) values(now+{i}s,'stable_null_childtable_1',1);")
|
||||
tdSql.execute(f"insert into nested.stable_null_childtable (ts, tbname, {coulmn_name}) values({ts+i},'stable_null_childtable_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_childtable group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 42);
|
||||
|
||||
tdSql.query(f"insert into nested.stable_null_childtable (ts,tbname,q_int) values(now,'stable_null_childtable_1',1) \
|
||||
nested.stable_null_childtable (ts,tbname,q_bigint) values(now+1a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_smallint) values(now+2a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_tinyint) values(now+3a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_float) values(now+4a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_double) values(now+5a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_bool) values(now+6a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_binary) values(now+7a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_nchar) values(now+8a,'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_ts) values(now+9a,'stable_null_childtable_1',1);")
|
||||
tdSql.query(f"insert into nested.stable_null_childtable (ts,tbname,q_int) values({ts},'stable_null_childtable_1',1) \
|
||||
nested.stable_null_childtable (ts,tbname,q_bigint) values({ts+1},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_smallint) values({ts+2},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_tinyint) values({ts+3},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_float) values({ts+4},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_double) values({ts+5},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_bool) values({ts+6},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_binary) values({ts+7},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_nchar) values({ts+8},'stable_null_childtable_1',1)\
|
||||
nested.stable_null_childtable (ts,tbname,q_ts) values({ts+9},'stable_null_childtable_1',1);")
|
||||
ts = ts + 20
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_null_childtable group by tbname order by tbname;")
|
||||
tdSql.checkRows(1)
|
||||
tdSql.checkData(0, 1, 52);
|
||||
|
@ -1330,7 +1346,7 @@ class TDTestCase:
|
|||
nested.stable_null_childtable (ts,tbname,q_ts) values(now+9a,'stable_null_childtable_1',1);")
|
||||
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(2)
|
||||
tdSql.checkRows(6)
|
||||
tdSql.checkData(0, 1, 162);
|
||||
tdSql.checkData(1, 1, 200);
|
||||
|
||||
|
@ -1344,12 +1360,12 @@ class TDTestCase:
|
|||
|
||||
#test special character
|
||||
|
||||
tdSql.query(f"insert into nested.stable_1 (ts,tbname,q_int) values(now,'!@!@$$^$',1) \
|
||||
nested.stable_null_data (ts,tbname,q_int) values(now,'%^$^&^&',1) \
|
||||
nested.stable_null_childtable (ts,tbname,q_int) values(now,'$^%$%^&',1);")
|
||||
tdSql.query(f"insert into nested.stable_1 (ts,tbname,q_int) values(now+10a,'!@!@$$^$',1) \
|
||||
nested.stable_null_data (ts,tbname,q_int) values(now+10a,'%^$^&^&',1) \
|
||||
nested.stable_null_childtable (ts,tbname,q_int) values(now+10a,'$^%$%^&',1);")
|
||||
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkRows(7)
|
||||
tdSql.checkData(0, 1, 1);
|
||||
tdSql.checkData(1, 1, 162);
|
||||
tdSql.checkData(2, 1, 200);
|
||||
|
@ -1387,7 +1403,7 @@ class TDTestCase:
|
|||
nested.stable_null_childtable(tbname,ts,q_int,q_binary) file '{self.testcasePath}/stable_null_childtable.csv';")
|
||||
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkRows(7)
|
||||
tdSql.checkData(0, 1, 1);
|
||||
tdSql.checkData(1, 1, 162);
|
||||
tdSql.checkData(2, 1, 200);
|
||||
|
@ -1423,7 +1439,7 @@ class TDTestCase:
|
|||
tdSql.query(f"insert into nested.stable_null_childtable(tbname,ts,q_int,q_binary) file '{self.testcasePath}/stable_null_childtable.csv';")
|
||||
|
||||
tdSql.query(f"select tbname,count(*) from nested.stable_1 group by tbname order by tbname;")
|
||||
tdSql.checkRows(3)
|
||||
tdSql.checkRows(7)
|
||||
tdSql.checkData(0, 1, 1);
|
||||
tdSql.checkData(1, 1, 162);
|
||||
tdSql.checkData(2, 1, 200);
|
||||
|
|
Loading…
Reference in New Issue