diff --git a/src/inc/tsdb.h b/src/inc/tsdb.h index 5b4c54f306e77a7b4fe1ff48182555c9e2694189..7c8a7af5706fe46bec88d23ee3b4e48595779486 100644 --- a/src/inc/tsdb.h +++ b/src/inc/tsdb.h @@ -208,6 +208,14 @@ TsdbQueryHandleT tsdbQueryLastRow(TSDB_REPO_T *tsdb, STsdbQueryCond *pCond, STab */ SArray* tsdbGetQueriedTableList(TsdbQueryHandleT *pHandle); +/** + * get the group list according to table id from client + * @param tsdb + * @param pCond + * @param groupList + * @param qinfo + * @return + */ TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TSDB_REPO_T *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList, void *qinfo); @@ -276,6 +284,15 @@ void tsdbDestoryTableGroup(STableGroupInfo *pGroupList); */ int32_t tsdbGetOneTableGroup(TSDB_REPO_T *tsdb, uint64_t uid, STableGroupInfo *pGroupInfo); +/** + * + * @param tsdb + * @param pTableIdList + * @param pGroupInfo + * @return + */ +int32_t tsdbGetTableGroupFromIdList(TSDB_REPO_T* tsdb, SArray* pTableIdList, STableGroupInfo* pGroupInfo); + /** * clean up the query handle * @param queryHandle diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index ccf3a84e132034b20487efd31f2ee009aaeb225b..be0953115c4fe5af54d66d1869a0f6035c2bcfb3 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -5495,7 +5495,7 @@ static int compareTableIdInfo(const void* a, const void* b) { } static SQInfo *createQInfoImpl(SQueryTableMsg *pQueryMsg, SArray* pTableIdList, SSqlGroupbyExpr *pGroupbyExpr, SExprInfo *pExprs, - STableGroupInfo *tableqinfoGroupInfo, SColumnInfo* pTagCols) { + STableGroupInfo *pTableGroupInfo, SColumnInfo* pTagCols) { SQInfo *pQInfo = (SQInfo *)calloc(1, sizeof(SQInfo)); if (pQInfo == NULL) { return NULL; @@ -5581,18 +5581,18 @@ static SQInfo *createQInfoImpl(SQueryTableMsg *pQueryMsg, SArray* pTableIdList, // to make sure third party won't overwrite this structure pQInfo->signature = pQInfo; - pQInfo->tableGroupInfo = *tableqinfoGroupInfo; - size_t numOfGroups = taosArrayGetSize(tableqinfoGroupInfo->pGroupList); + pQInfo->tableGroupInfo = *pTableGroupInfo; + size_t numOfGroups = taosArrayGetSize(pTableGroupInfo->pGroupList); pQInfo->tableqinfoGroupInfo.pGroupList = taosArrayInit(numOfGroups, POINTER_BYTES); - pQInfo->tableqinfoGroupInfo.numOfTables = tableqinfoGroupInfo->numOfTables; + pQInfo->tableqinfoGroupInfo.numOfTables = pTableGroupInfo->numOfTables; int tableIndex = 0; STimeWindow window = pQueryMsg->window; taosArraySort(pTableIdList, compareTableIdInfo); for(int32_t i = 0; i < numOfGroups; ++i) { - SArray* pa = taosArrayGetP(tableqinfoGroupInfo->pGroupList, i); + SArray* pa = taosArrayGetP(pTableGroupInfo->pGroupList, i); size_t s = taosArrayGetSize(pa); SArray* p1 = taosArrayInit(s, POINTER_BYTES); @@ -5898,13 +5898,13 @@ int32_t qCreateQueryInfo(void *tsdb, int32_t vgId, SQueryTableMsg *pQueryMsg, qi } bool isSTableQuery = false; - STableGroupInfo tableqinfoGroupInfo = {0}; + STableGroupInfo tableGroupInfo = {0}; if (TSDB_QUERY_HAS_TYPE(pQueryMsg->queryType, TSDB_QUERY_TYPE_TABLE_QUERY)) { STableIdInfo *id = taosArrayGet(pTableIdList, 0); qTrace("qmsg:%p query normal table, uid:%"PRId64", tid:%d", pQueryMsg, id->uid, id->tid); - if ((code = tsdbGetOneTableGroup(tsdb, id->uid, &tableqinfoGroupInfo)) != TSDB_CODE_SUCCESS) { + if ((code = tsdbGetOneTableGroup(tsdb, id->uid, &tableGroupInfo)) != TSDB_CODE_SUCCESS) { goto _over; } } else if (TSDB_QUERY_HAS_TYPE(pQueryMsg->queryType, TSDB_QUERY_TYPE_MULTITABLE_QUERY|TSDB_QUERY_TYPE_STABLE_QUERY)) { @@ -5921,25 +5921,24 @@ int32_t qCreateQueryInfo(void *tsdb, int32_t vgId, SQueryTableMsg *pQueryMsg, qi numOfGroupByCols = 0; } - code = tsdbQuerySTableByTagCond(tsdb, id->uid, tagCond, pQueryMsg->tagCondLen, pQueryMsg->tagNameRelType, tbnameCond, &tableqinfoGroupInfo, pGroupColIndex, + code = tsdbQuerySTableByTagCond(tsdb, id->uid, tagCond, pQueryMsg->tagCondLen, pQueryMsg->tagNameRelType, tbnameCond, &tableGroupInfo, pGroupColIndex, numOfGroupByCols); if (code != TSDB_CODE_SUCCESS) { goto _over; } } else { - tableqinfoGroupInfo.pGroupList = taosArrayInit(1, POINTER_BYTES); - tableqinfoGroupInfo.numOfTables = taosArrayGetSize(pTableIdList); - - SArray* p = taosArrayClone(pTableIdList); - taosArrayPush(tableqinfoGroupInfo.pGroupList, &p); + code = tsdbGetTableGroupFromIdList(tsdb, pTableIdList, &tableGroupInfo); + if (code != TSDB_CODE_SUCCESS) { + goto _over; + } - qTrace("qmsg:%p query on %zu tables in one group from client", pQueryMsg, tableqinfoGroupInfo.numOfTables); + qTrace("qmsg:%p query on %zu tables in one group from client", pQueryMsg, tableGroupInfo.numOfTables); } } else { assert(0); } - (*pQInfo) = createQInfoImpl(pQueryMsg, pTableIdList, pGroupbyExpr, pExprs, &tableqinfoGroupInfo, pTagColumnInfo); + (*pQInfo) = createQInfoImpl(pQueryMsg, pTableIdList, pGroupbyExpr, pExprs, &tableGroupInfo, pTagColumnInfo); if ((*pQInfo) == NULL) { code = TSDB_CODE_QRY_OUT_OF_MEMORY; goto _over; @@ -6162,7 +6161,7 @@ static void buildTagQueryResult(SQInfo* pQInfo) { while(pQInfo->tableIndex < num && count < pQuery->rec.capacity) { int32_t i = pQInfo->tableIndex++; - STableQueryInfo *item = taosArrayGet(pa, i); + STableQueryInfo *item = taosArrayGetP(pa, i); char *output = pQuery->sdata[0]->data + i * rsize; varDataSetLen(output, rsize - VARSTR_HEADER_SIZE); diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index cdddbc537c62f391cfde311d9865eccca95ab78f..78576f80f7a7138848902f6bbcf70049ddbf0982 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -2254,6 +2254,44 @@ int32_t tsdbGetOneTableGroup(TSDB_REPO_T* tsdb, uint64_t uid, STableGroupInfo* p return terrno; } +int32_t tsdbGetTableGroupFromIdList(TSDB_REPO_T* tsdb, SArray* pTableIdList, STableGroupInfo* pGroupInfo) { + if (tsdbRLockRepoMeta(tsdb) < 0) goto _error; + + assert(pTableIdList != NULL); + size_t size = taosArrayGetSize(pTableIdList); + pGroupInfo->pGroupList = taosArrayInit(1, POINTER_BYTES); + SArray* group = taosArrayInit(1, POINTER_BYTES); + + int32_t i = 0; + for(; i < size; ++i) { + STableIdInfo *id = taosArrayGet(pTableIdList, i); + + STable* pTable = tsdbGetTableByUid(tsdbGetMeta(tsdb), id->uid); + if (pTable == NULL) { + tsdbWarn("table uid:%"PRIu64", tid:%d has been drop already", id->uid, id->tid); + continue; + } + + if (pTable->type == TSDB_SUPER_TABLE) { + tsdbError("direct query on super tale is not allowed, table uid:%"PRIu64", tid:%d", id->uid, id->tid); + terrno = TSDB_CODE_QRY_INVALID_MSG; + } + + tsdbRefTable(pTable); + taosArrayPush(group, &pTable); + } + + if (tsdbUnlockRepoMeta(tsdb) < 0) goto _error; + + pGroupInfo->numOfTables = i; + taosArrayPush(pGroupInfo->pGroupList, &group); + + return TSDB_CODE_SUCCESS; + + _error: + return terrno; +} + void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) { STsdbQueryHandle* pQueryHandle = (STsdbQueryHandle*)queryHandle; if (pQueryHandle == NULL) {