diff --git a/src/query/inc/qHistogram.h b/src/query/inc/qHistogram.h index 3b5c2b4cfb9bac638c7d86988f8ac14d7419f83c..ba32d4dfc871651e6db904b243bbb3ba233a8ca4 100644 --- a/src/query/inc/qHistogram.h +++ b/src/query/inc/qHistogram.h @@ -67,7 +67,7 @@ void tHistogramDestroy(SHistogramInfo** pHisto); void tHistogramPrint(SHistogramInfo* pHisto); -int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val); +int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val, int32_t maxEntries); SHeapEntry* tHeapCreate(int32_t numOfEntries); void tHeapSort(SHeapEntry* pEntry, int32_t len); diff --git a/src/query/src/qHistogram.c b/src/query/src/qHistogram.c index 9a23ccad4b4e9e5909d4065495e5706d05a78330..8544224a647c0497677814ef448498bbf73fab04 100644 --- a/src/query/src/qHistogram.c +++ b/src/query/src/qHistogram.c @@ -161,8 +161,7 @@ int32_t tHistogramAdd(SHistogramInfo** pHisto, double val) { } #if defined(USE_ARRAYLIST) - int32_t idx = histoBinarySearch((*pHisto)->elems, (*pHisto)->numOfEntries, val); - if(idx >= (*pHisto)->maxEntries) idx = (*pHisto)->maxEntries - 1; + int32_t idx = histoBinarySearch((*pHisto)->elems, (*pHisto)->numOfEntries, val, (*pHisto)->maxEntries); assert(idx >= 0 && idx < (*pHisto)->maxEntries && (*pHisto)->elems != NULL); if ((*pHisto)->elems[idx].val == val && idx >= 0) { @@ -360,7 +359,7 @@ int32_t tHistogramAdd(SHistogramInfo** pHisto, double val) { return 0; } -int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val) { +int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val, int32_t maxEntries) { int32_t end = len - 1; int32_t start = 0; @@ -378,6 +377,7 @@ int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val) { } int32_t ret = start > end ? start : end; + if(ret >= maxEntries) ret = maxEntries - 1; if (ret < 0) { return 0; } else { @@ -470,7 +470,7 @@ void tHistogramPrint(SHistogramInfo* pHisto) { */ int64_t tHistogramSum(SHistogramInfo* pHisto, double v) { #if defined(USE_ARRAYLIST) - int32_t slotIdx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, v); + int32_t slotIdx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, v, pHisto->maxEntries); if (pHisto->elems[slotIdx].val != v) { slotIdx -= 1; diff --git a/src/query/tests/histogramTest.cpp b/src/query/tests/histogramTest.cpp index 0266ecffc11348dcd0184030584ed7b721d39aff..70c334631c39eed88913b58edf06d9d5520b6f2c 100644 --- a/src/query/tests/histogramTest.cpp +++ b/src/query/tests/histogramTest.cpp @@ -98,19 +98,19 @@ TEST(testCase, histogram_binary_search) { pHisto->elems[i].val = i; } - int32_t idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 1); + int32_t idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 1, pHisto->maxEntries); assert(idx == 1); - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 9); + idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 9, pHisto->maxEntries); assert(idx == 9); - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 20); + idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 20, pHisto->maxEntries); assert(idx == 10); - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, -1); + idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, -1, pHisto->maxEntries); assert(idx == 0); - idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 3.9); + idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 3.9, pHisto->maxEntries); assert(idx == 4); free(pHisto);