diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 42e649be10a9eec75cc1ec610cba86586a0f27c0..fc36974c9b969091564a93551117378207980c2b 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -3347,6 +3347,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 f8a1871f53309799d58aa4266c0fb5d737fa8ce7..492bf5241c4f8e4caae11b1553d5579fc00b2398 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -1713,7 +1713,8 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SGroupbyOperatorInfo *pIn longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_APP_ERROR); } - doApplyFunctions(pRuntimeEnv, pInfo->binfo.pCtx, &w, j - num, num, tsList, pSDataBlock->info.rows, pOperator->numOfOutput); + int32_t offset = QUERY_IS_ASC_QUERY(pQueryAttr) ? j - num : j - 1; + doApplyFunctions(pRuntimeEnv, pInfo->binfo.pCtx, &w, offset, num, tsList, pSDataBlock->info.rows, pOperator->numOfOutput); num = 1; @@ -1733,7 +1734,8 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SGroupbyOperatorInfo *pIn if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_APP_ERROR); } - doApplyFunctions(pRuntimeEnv, pInfo->binfo.pCtx, &w, pSDataBlock->info.rows - num, num, tsList, pSDataBlock->info.rows, pOperator->numOfOutput); + int32_t offset = QUERY_IS_ASC_QUERY(pQueryAttr) ? pSDataBlock->info.rows - num : pSDataBlock->info.rows - 1; + doApplyFunctions(pRuntimeEnv, pInfo->binfo.pCtx, &w, offset, num, tsList, pSDataBlock->info.rows, pOperator->numOfOutput); } }