From af83205032913dba67e3884b10bd6111e184783f Mon Sep 17 00:00:00 2001 From: nagamocha3000 Date: Wed, 2 Jun 2021 21:28:07 +0300 Subject: [PATCH 1/2] Fix percentile overflow error --- executor.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/executor.go b/executor.go index ae63759f8..142033a29 100644 --- a/executor.go +++ b/executor.go @@ -1295,7 +1295,9 @@ func (e *executor) executePercentile(ctx context.Context, qcx *Qcx, index string min, max := minVal.Val, maxVal.Val // estimate nth val, eg median when nth=0.5 for min < max { - possibleNthVal := (max + min) / 2 + // compute average without integer overflow, then correct for division of + // odd numbers by 2 + possibleNthVal := ((max / 2) + (min / 2)) + (((max % 2) + (min % 2)) / 2) // get left count rangeCall.Args[fieldName] = &pql.Condition{ Op: pql.Token(pql.LT), From b1d18a1ba320c5b659814f2e08e6d0dc57ff4831 Mon Sep 17 00:00:00 2001 From: nagamocha3000 Date: Thu, 3 Jun 2021 21:55:11 +0300 Subject: [PATCH 2/2] Make percentile checker in test-case match executor implementation --- executor.go | 1 + executor_test.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/executor.go b/executor.go index 142033a29..15d6fb571 100644 --- a/executor.go +++ b/executor.go @@ -1298,6 +1298,7 @@ func (e *executor) executePercentile(ctx context.Context, qcx *Qcx, index string // compute average without integer overflow, then correct for division of // odd numbers by 2 possibleNthVal := ((max / 2) + (min / 2)) + (((max % 2) + (min % 2)) / 2) + // possibleNthVal = (max + min) / 2 // get left count rangeCall.Args[fieldName] = &pql.Condition{ Op: pql.Token(pql.LT), diff --git a/executor_test.go b/executor_test.go index 2b37c36b2..9427914b2 100644 --- a/executor_test.go +++ b/executor_test.go @@ -6939,7 +6939,7 @@ func variousQueriesOnPercentiles(t *testing.T, c *test.Cluster) { possibleNthVal := int64(0) // bin search for min < max { - possibleNthVal = (max + min) / 2 + possibleNthVal = ((max / 2) + (min / 2)) + (((max % 2) + (min % 2)) / 2) leftCount, rightCount := int64(0), int64(0) for _, num := range nums { if num < possibleNthVal {