From 6b8b293c44b1b33d0ff7e8894693f20bdbfd17b9 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Fri, 25 Dec 2020 16:43:47 +0800 Subject: [PATCH] [TD-2512] --- src/tsdb/src/tsdbRead.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index ed0ad76b1e..7e2e135c4b 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -111,7 +111,6 @@ typedef struct STsdbQueryHandle { int32_t activeIndex; bool checkFiles; // check file stage bool cachelastrow; // check if last row cached - SArray* cachedRows; // cached last rows void* qinfo; // query info handle, for debug purpose int32_t type; // query type: retrieve all data blocks, 2. retrieve only last row, 3. retrieve direct prev|next rows SFileGroup* pFileGroup; @@ -136,7 +135,7 @@ typedef struct STableGroupSupporter { } STableGroupSupporter; static STimeWindow updateLastrowForEachGroup(STableGroupInfo *groupList); -static int32_t extractCachedLastRow(STsdbQueryHandle* pQueryHandle, STableGroupInfo *groupList); +static int32_t checkForCachedLastRow(STsdbQueryHandle* pQueryHandle, STableGroupInfo *groupList); static int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastKey); static void changeQueryHandleForInterpQuery(TsdbQueryHandleT pHandle); @@ -382,13 +381,14 @@ TsdbQueryHandleT tsdbQueryLastRow(TSDB_REPO_T *tsdb, STsdbQueryCond *pCond, STab } STsdbQueryHandle *pQueryHandle = (STsdbQueryHandle*) tsdbQueryTables(tsdb, pCond, groupList, qinfo, pMemRef); - int32_t code = extractCachedLastRow(pQueryHandle, groupList); + int32_t code = checkForCachedLastRow(pQueryHandle, groupList); if (code != TSDB_CODE_SUCCESS) { // set the numOfTables to be 0 terrno = code; return NULL; } assert(pCond->order == TSDB_ORDER_ASC && pCond->twindow.skey <= pCond->twindow.ekey); + pQueryHandle->type = TSDB_QUERY_TYPE_LAST; return pQueryHandle; } @@ -2155,15 +2155,15 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) { return ret; } else if (pQueryHandle->type == TSDB_QUERY_TYPE_LAST && pQueryHandle->cachelastrow) { // the last row is cached in buffer, return it directly. - // here note that the pQueryHandle->window may need to be updated. - int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle)); + // here note that the pQueryHandle->window must be the TS_INITIALIZER + int32_t numOfCols = (int32_t)(QH_GET_NUM_OF_COLS(pQueryHandle)); SQueryFilePos* cur = &pQueryHandle->cur; SDataRow pRow = NULL; TSKEY key = TSKEY_INITIAL_VAL; int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1:-1; - while (pQueryHandle->activeIndex < numOfTables) { + if (++pQueryHandle->activeIndex < numOfTables) { STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, pQueryHandle->activeIndex); int32_t ret = tsdbGetCachedLastRow(pCheckInfo->pTableObj, &pRow, &key); if (ret != TSDB_CODE_SUCCESS) { @@ -2179,8 +2179,8 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) { cur->rows = 1; // only one row cur->lastKey = key + step; cur->mixBlock = true; - - pQueryHandle->activeIndex += 1; + cur->win.skey = key; + cur->win.ekey = key; return true; } @@ -2239,7 +2239,7 @@ int32_t tsdbGetCachedLastRow(STable* pTable, SDataRow* pRes, TSKEY* lastKey) { return TSDB_CODE_SUCCESS; } -int32_t extractCachedLastRow(STsdbQueryHandle* pQueryHandle, STableGroupInfo *groupList) { +int32_t checkForCachedLastRow(STsdbQueryHandle* pQueryHandle, STableGroupInfo *groupList) { assert(pQueryHandle != NULL && groupList != NULL); SDataRow pRow = NULL; @@ -2257,6 +2257,13 @@ int32_t extractCachedLastRow(STsdbQueryHandle* pQueryHandle, STableGroupInfo *gr pQueryHandle->cachelastrow = (pRow != NULL); } + // update the tsdb query time range + if (pQueryHandle->cachelastrow) { + pQueryHandle->window = TSWINDOW_INITIALIZER; + pQueryHandle->checkFiles = false; + pQueryHandle->activeIndex = -1; // start from -1 + } + tfree(pRow); return code; } -- GitLab