From 3642a9508049a9ae7023f0ceea94d2fb9169eda0 Mon Sep 17 00:00:00 2001 From: hjxilinx Date: Fri, 28 Feb 2020 12:29:43 +0800 Subject: [PATCH] fix bugs founded in regression test(reverse scan failed). --- src/client/src/tscSQLParser.c | 13 ++------ src/system/detail/src/vnodeQueryImpl.c | 43 +++++++++++++++++++++----- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index a4909e86fe..2c2f0793e8 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -4623,18 +4623,9 @@ int32_t parseLimitClause(SQueryInfo* pQueryInfo, int32_t clauseIndex, SQuerySQL* return invalidSqlErrMsg(pQueryInfo->msg, msg3); } + // for projection query on super table, all queries are subqueries if (tscNonOrderedProjectionQueryOnSTable(pQueryInfo, 0)) { - // if (pQueryInfo->order.orderColId >= 0) { - // if (pQueryInfo->limit.limit == -1) { - // return invalidSqlErrMsg(pQueryInfo->msg, msg4); - // } else if (pQueryInfo->limit.limit > 10000) { // the result set can not be larger than 10000 - // //todo use global config parameter - // return invalidSqlErrMsg(pQueryInfo->msg, msg5); - // } - // } - - pQueryInfo->type |= - TSDB_QUERY_TYPE_SUBQUERY; // for projection query on super table, all queries are subqueries + pQueryInfo->type |= TSDB_QUERY_TYPE_SUBQUERY; } } } diff --git a/src/system/detail/src/vnodeQueryImpl.c b/src/system/detail/src/vnodeQueryImpl.c index efda4aace2..8ed5623895 100644 --- a/src/system/detail/src/vnodeQueryImpl.c +++ b/src/system/detail/src/vnodeQueryImpl.c @@ -5288,7 +5288,7 @@ static int64_t doScanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) { } // while(1) - if (isIntervalQuery(pQuery)) { + if (isIntervalQuery(pQuery) && IS_MASTER_SCAN(pRuntimeEnv)) { if (Q_STATUS_EQUAL(pQuery->over, QUERY_COMPLETED | QUERY_NO_DATA_TO_CHECK)) { closeAllTimeWindow(&pRuntimeEnv->windowResInfo); } else if (Q_STATUS_EQUAL(pQuery->over, QUERY_RESBUF_FULL)) { // check if window needs to be closed @@ -6219,15 +6219,25 @@ bool needScanDataBlocksAgain(SQueryRuntimeEnv *pRuntimeEnv) { setWindowResOutputBuf(pRuntimeEnv, pResult); for (int32_t j = 0; j < pQuery->numOfOutputCols; ++j) { - aAggs[pQuery->pSelectExpr[j].pBase.functionId].xNextStep(&pRuntimeEnv->pCtx[j]); + int16_t functId = pQuery->pSelectExpr[j].pBase.functionId; + if (functId == TSDB_FUNC_TS) { + continue; + } + + aAggs[functId].xNextStep(&pRuntimeEnv->pCtx[j]); SResultInfo *pResInfo = GET_RES_INFO(&pRuntimeEnv->pCtx[j]); - + toContinue |= (!pResInfo->complete); } } } else { for (int32_t j = 0; j < pQuery->numOfOutputCols; ++j) { - aAggs[pQuery->pSelectExpr[j].pBase.functionId].xNextStep(&pRuntimeEnv->pCtx[j]); + int16_t functId = pQuery->pSelectExpr[j].pBase.functionId; + if (functId == TSDB_FUNC_TS) { + continue; + } + + aAggs[functId].xNextStep(&pRuntimeEnv->pCtx[j]); SResultInfo *pResInfo = GET_RES_INFO(&pRuntimeEnv->pCtx[j]); toContinue |= (!pResInfo->complete); @@ -6243,13 +6253,23 @@ void vnodeScanAllData(SQueryRuntimeEnv *pRuntimeEnv) { /* store the start query position */ savePointPosition(&pRuntimeEnv->startPos, pQuery->fileId, pQuery->slot, pQuery->pos); + int64_t oldSkey = pQuery->skey; + int64_t oldEkey = pQuery->ekey; + int64_t skey = pQuery->lastKey; + int32_t status = pQuery->over; + SET_MASTER_SCAN_FLAG(pRuntimeEnv); + int32_t step = GET_FORWARD_DIRECTION_FACTOR(pQuery->order.order); while (1) { doScanAllDataBlocks(pRuntimeEnv); if (!needScanDataBlocksAgain(pRuntimeEnv)) { + // restore the status + if (pRuntimeEnv->scanFlag == REPEAT_SCAN) { + pQuery->over = status; + } break; } @@ -6260,8 +6280,11 @@ void vnodeScanAllData(SQueryRuntimeEnv *pRuntimeEnv) { TSKEY key = loadRequiredBlockIntoMem(pRuntimeEnv, &pRuntimeEnv->startPos); assert((QUERY_IS_ASC_QUERY(pQuery) && key >= pQuery->skey) || (!QUERY_IS_ASC_QUERY(pQuery) && key <= pQuery->skey)); - setQueryStatus(pQuery, QUERY_NOT_COMPLETED); + status = pQuery->over; + pQuery->ekey = pQuery->lastKey - step; pQuery->lastKey = pQuery->skey; + + setQueryStatus(pQuery, QUERY_NOT_COMPLETED); pRuntimeEnv->scanFlag = REPEAT_SCAN; /* check if query is killed or not */ @@ -6271,13 +6294,17 @@ void vnodeScanAllData(SQueryRuntimeEnv *pRuntimeEnv) { } } - int64_t newSkey = pQuery->skey; + // no need to set the end key + int64_t curLastKey = pQuery->lastKey; pQuery->skey = skey; - + pQuery->ekey = pQuery->lastKey - step; + doSingleMeterSupplementScan(pRuntimeEnv); // update the pQuery->skey/pQuery->ekey to limit the scan scope of sliding query during supplementary scan - pQuery->skey = newSkey; + pQuery->skey = oldSkey; + pQuery->ekey = oldEkey; + pQuery->lastKey = curLastKey; } void doFinalizeResult(SQueryRuntimeEnv *pRuntimeEnv) { -- GitLab