diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index a50e2ad899aa7b317869daa946a3e8626631ad13..33d85252630882834b95c4ba45840d7d58384b7c 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -3007,6 +3007,12 @@ static void col_project_function(SQLFunctionCtx *pCtx) { memcpy(pCtx->pOutput, pData, (size_t) numOfRows * pCtx->inputBytes); } else { // DESC + if (pCtx->param[0].i64 == 1) { + // only output one row, copy first row to output + memcpy(pCtx->pOutput, pData, (size_t)pCtx->inputBytes); + return ; + } + for(int32_t i = 0; i < pCtx->size; ++i) { char* dst = pCtx->pOutput + (pCtx->size - 1 - i) * pCtx->inputBytes; char* src = pData + i * pCtx->inputBytes; diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 08cdd8821868e9a9c4e5e9e3fd93c4608d51a495..d35214dc5238e79f4006ff657fca7ce51b1eba4c 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -942,8 +942,6 @@ void doInvokeUdf(SUdfInfo* pUdfInfo, SQLFunctionCtx *pCtx, int32_t idx, int32_t static void doApplyFunctions(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, STimeWindow* pWin, int32_t offset, int32_t forwardStep, TSKEY* tsCol, int32_t numOfTotal, int32_t numOfOutput) { - SQueryAttr *pQueryAttr = pRuntimeEnv->pQueryAttr; - for (int32_t k = 0; k < numOfOutput; ++k) { bool hasAggregates = pCtx[k].preAggVals.isSet; @@ -953,13 +951,13 @@ static void doApplyFunctions(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx // keep it temporarialy char* start = pCtx[k].pInput; - int32_t pos = (QUERY_IS_ASC_QUERY(pQueryAttr)) ? offset : offset - (forwardStep - 1); + // deal order by in aAggs.xFunction, not here if (pCtx[k].pInput != NULL) { - pCtx[k].pInput = (char *)pCtx[k].pInput + pos * pCtx[k].inputBytes; + pCtx[k].pInput = (char *)pCtx[k].pInput + offset * pCtx[k].inputBytes; } if (tsCol != NULL) { - pCtx[k].ptsList = &tsCol[pos]; + pCtx[k].ptsList = &tsCol[offset]; } // not a whole block involved in query processing, statistics data can not be used