diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 0d13e5365a6aa7a4deff318b422bfb430b4617fa..ae47c34ebbdd3d699355183609320baefa92d292 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 dca79babce9388d7f2d1750db2c9b8410b23c8d1..95e6f506deb8d8f342b60161b90abd8af72153ce 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 bca63fdf44f44063d492dde6b2e1dd8b136fee02..cb89649c3cc93f00021bd9a1c747d44b5e699a23 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); }