diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c index e163526d24ba3f8dee0ea39915f80fbdbe77d96d..ef4c00503f337feb02a334e94e357a363a82e694 100644 --- a/source/libs/function/src/builtinsimpl.c +++ b/source/libs/function/src/builtinsimpl.c @@ -1986,10 +1986,14 @@ static int8_t getApercentileAlgo(char *algoStr) { } static void buildHistogramInfo(SAPercentileInfo* pInfo) { - pInfo->pHisto = (SHistogramInfo*) ((char*) pInfo + sizeof(SAPercentileInfo)); + pInfo->pHisto = (SHistogramInfo*) ((char*)pInfo + sizeof(SAPercentileInfo)); pInfo->pHisto->elems = (SHistBin*) ((char*)pInfo->pHisto + sizeof(SHistogramInfo)); } +static void buildTDigestInfo(SAPercentileInfo* pInfo) { + pInfo->pTDigest = (TDigest*)((char*)pInfo + sizeof(SAPercentileInfo)); +} + bool apercentileFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) { if (!functionSetup(pCtx, pResultInfo)) { return false; @@ -2090,6 +2094,22 @@ int32_t apercentileFunctionMerge(SqlFunctionCtx* pCtx) { pInfo->percent = pInputInfo->percent; pInfo->algo = pInputInfo->algo; if (pInfo->algo == APERCT_ALGO_TDIGEST) { + buildTDigestInfo(pInputInfo); + tdigestAutoFill(pInputInfo->pTDigest, COMPRESSION); + + if(pInputInfo->pTDigest->num_centroids == 0 && pInputInfo->pTDigest->num_buffered_pts == 0) { + return TSDB_CODE_SUCCESS; + } + + buildTDigestInfo(pInfo); + TDigest *pTDigest = pInfo->pTDigest; + + if(pTDigest->num_centroids <= 0) { + memcpy(pTDigest, pInputInfo->pTDigest, (size_t)TDIGEST_SIZE(COMPRESSION)); + tdigestAutoFill(pTDigest, COMPRESSION); + } else { + tdigestMerge(pTDigest, pInputInfo->pTDigest); + } } else { buildHistogramInfo(pInputInfo); if (pInputInfo->pHisto->numOfElems <= 0) {