Merge pull request #5613 from taosdata/hotfix/TD-3590
[TD-3590]stddev with group by column fail issue
This commit is contained in:
commit
fac6dfc22a
|
@ -200,6 +200,7 @@ static bool isPointInterpoQuery(SQuery *pQuery);
|
|||
static void setResultBufSize(SQuery* pQuery, SRspResultInfo* pResultInfo);
|
||||
static void setCtxTagForJoin(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, SExprInfo* pExprInfo, void* pTable);
|
||||
static void setParamForStableStddev(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, int32_t numOfOutput, SExprInfo* pExpr);
|
||||
static void setParamForStableStddevByColData(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, int32_t numOfOutput, SExprInfo* pExpr, char* val, int16_t bytes);
|
||||
static void doSetTableGroupOutputBuf(SQueryRuntimeEnv* pRuntimeEnv, SResultRowInfo* pResultRowInfo,
|
||||
SQLFunctionCtx* pCtx, int32_t* rowCellInfoOffset, int32_t numOfOutput,
|
||||
int32_t groupIndex);
|
||||
|
@ -1330,6 +1331,7 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SGroupbyOperatorInfo *pIn
|
|||
SColumnInfoData* pColInfoData = taosArrayGet(pSDataBlock->pDataBlock, pInfo->colIndex);
|
||||
int16_t bytes = pColInfoData->info.bytes;
|
||||
int16_t type = pColInfoData->info.type;
|
||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||
|
||||
if (type == TSDB_DATA_TYPE_FLOAT || type == TSDB_DATA_TYPE_DOUBLE) {
|
||||
qError("QInfo:%"PRIu64" group by not supported on double/float columns, abort", GET_QID(pRuntimeEnv));
|
||||
|
@ -1350,6 +1352,10 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SGroupbyOperatorInfo *pIn
|
|||
|
||||
memcpy(pInfo->prevData, val, bytes);
|
||||
|
||||
if (pQuery->stableQuery && pQuery->stabledev && (pRuntimeEnv->prevResult != NULL)) {
|
||||
setParamForStableStddevByColData(pRuntimeEnv, pInfo->binfo.pCtx, pOperator->numOfOutput, pOperator->pExpr, val, bytes);
|
||||
}
|
||||
|
||||
int32_t ret =
|
||||
setGroupResultOutputBuf(pRuntimeEnv, pInfo, pOperator->numOfOutput, val, type, bytes, item->groupIndex);
|
||||
if (ret != TSDB_CODE_SUCCESS) { // null data, too many state code
|
||||
|
@ -3396,6 +3402,42 @@ void setParamForStableStddev(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx
|
|||
|
||||
}
|
||||
|
||||
void setParamForStableStddevByColData(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, int32_t numOfOutput, SExprInfo* pExpr, char* val, int16_t bytes) {
|
||||
SQuery* pQuery = pRuntimeEnv->pQuery;
|
||||
|
||||
int32_t numOfExprs = pQuery->numOfOutput;
|
||||
for(int32_t i = 0; i < numOfExprs; ++i) {
|
||||
SExprInfo* pExprInfo = &(pExpr[i]);
|
||||
if (pExprInfo->base.functionId != TSDB_FUNC_STDDEV_DST) {
|
||||
continue;
|
||||
}
|
||||
|
||||
SSqlFuncMsg* pFuncMsg = &pExprInfo->base;
|
||||
|
||||
pCtx[i].param[0].arr = NULL;
|
||||
pCtx[i].param[0].nType = TSDB_DATA_TYPE_INT; // avoid freeing the memory by setting the type to be int
|
||||
|
||||
// TODO use hash to speedup this loop
|
||||
int32_t numOfGroup = (int32_t)taosArrayGetSize(pRuntimeEnv->prevResult);
|
||||
for (int32_t j = 0; j < numOfGroup; ++j) {
|
||||
SInterResult* p = taosArrayGet(pRuntimeEnv->prevResult, j);
|
||||
if (bytes == 0 || memcmp(p->tags, val, bytes) == 0) {
|
||||
int32_t numOfCols = (int32_t)taosArrayGetSize(p->pResult);
|
||||
for (int32_t k = 0; k < numOfCols; ++k) {
|
||||
SStddevInterResult* pres = taosArrayGet(p->pResult, k);
|
||||
if (pres->colId == pFuncMsg->colInfo.colId) {
|
||||
pCtx[i].param[0].arr = pres->pResult;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* There are two cases to handle:
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue