From 7bd492a5bef0b0a08a56b74b8ef1011ccfbf0a89 Mon Sep 17 00:00:00 2001 From: Alex Duan <417921451@qq.com> Date: Tue, 27 Sep 2022 17:30:17 +0800 Subject: [PATCH] feat(query): support quadric operation return always --- src/query/src/qAggMain.c | 6 +++--- src/query/src/qExecutor.c | 2 +- src/query/src/queryMain.c | 26 +++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 0d13e5365a..ae47c34ebb 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -937,12 +937,12 @@ static void count_function(SQLFunctionCtx *pCtx) { } } - if (numOfElem > 0 || tsAggAlways) { + if (numOfElem > 0) { GET_RES_INFO(pCtx)->hasResult = DATA_SET_FLAG; - *((int64_t *)pCtx->pOutput) += numOfElem; - pCtx->resultInfo->numOfRes = 1; } + *((int64_t *)pCtx->pOutput) += numOfElem; + SET_VAL(pCtx, numOfElem, 1); } static void count_func_merge(SQLFunctionCtx *pCtx) { diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index dca79babce..95e6f506de 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -6623,7 +6623,7 @@ static SSDataBlock* doProjectOperation(void* param, bool* newgroup) { } copyTsColoum(pRes, pInfo->pCtx, pOperator->numOfOutput); clearNumOfRes(pInfo->pCtx, pOperator->numOfOutput); - return (pInfo->pRes->info.rows > 0) ? pInfo->pRes : NULL; + return pInfo->pRes; } static SSDataBlock* doLimit(void* param, bool* newgroup) { diff --git a/src/query/src/queryMain.c b/src/query/src/queryMain.c index bca63fdf44..cb89649c3c 100644 --- a/src/query/src/queryMain.c +++ b/src/query/src/queryMain.c @@ -359,6 +359,24 @@ bool qFitAlwaysValue(SQInfo * pQInfo) { return true; } +bool doFillResultWithNull(SQInfo* pQInfo, char * data, size_t numOfRows) { + SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv; + SQueryAttr* pQueryAttr = pRuntimeEnv->pQueryAttr; + SSDataBlock* pRes = pRuntimeEnv->outputBuf; + + int32_t numOfCols = pQueryAttr->numOfOutput; + for (int32_t i = 0; i < numOfCols; ++i) { + int16_t functionId = pQueryAttr->pExpr1[i].base.functionId; + // col + SColumnInfoData* pCol = taosArrayGet(pRes->pDataBlock, i); + if (functionId != TSDB_FUNC_COUNT) + setNull(data, pCol->info.type, pCol->info.bytes); + data += pCol->info.bytes * numOfRows; + } + + return true; +} + int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *contLen, bool* continueExec) { SQInfo *pQInfo = (SQInfo *)qinfo; int32_t compLen = 0; @@ -371,9 +389,12 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv; int32_t s = GET_NUM_OF_RESULTS(pRuntimeEnv); + bool fillNull = false; if (s == 0 && tsAggAlways) { - if (qFitAlwaysValue(pQInfo)) + if (qFitAlwaysValue(pQInfo)) { s = 1; + fillNull = true; + } } size_t size = pQueryAttr->resultRowSize * s; @@ -404,6 +425,9 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co if (GET_NUM_OF_RESULTS(&(pQInfo->runtimeEnv)) > 0 && pQInfo->code == TSDB_CODE_SUCCESS) { doDumpQueryResult(pQInfo, (*pRsp)->data, (*pRsp)->compressed, &compLen); } else { + if (fillNull) { + doFillResultWithNull(pQInfo, (*pRsp)->data, 1); + } setQueryStatus(pRuntimeEnv, QUERY_OVER); } -- GitLab