Skip to content

Commit b052d7f

Browse files
yuandagitsjp-sivaprasad
authored andcommitted
Fix approx_percentile to have constant pct for input rows (prestodb#24600)
1 parent d1f9ef4 commit b052d7f

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

presto-main/src/main/java/com/facebook/presto/operator/aggregation/ApproximateLongPercentileAggregations.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,15 @@ private static void addInput(
9292
checkAccuracy(accuracy);
9393
digest = new QuantileDigest(accuracy);
9494
state.setDigest(digest);
95+
state.setPercentile(percentile);
9596
}
9697
else {
9798
state.addMemoryUsage(-digest.estimatedInMemorySizeInBytes());
9899
}
99100

101+
checkPercentile(percentile, state.getPercentile());
100102
digest.add(value, weight);
101103
state.addMemoryUsage(digest.estimatedInMemorySizeInBytes());
102-
103-
// use last percentile
104-
state.setPercentile(percentile);
105104
}
106105

107106
@CombineFunction
@@ -137,6 +136,11 @@ public static void output(@AggregationState DigestAndPercentileState state, Bloc
137136
}
138137
}
139138

139+
static void checkPercentile(double percentile, double statePercentile)
140+
{
141+
checkCondition(percentile == statePercentile, INVALID_FUNCTION_ARGUMENT, "Percentile argument must be constant for all input rows: %s vs. %s", percentile, statePercentile);
142+
}
143+
140144
static void checkAccuracy(double accuracy)
141145
{
142146
checkCondition(0 < accuracy && accuracy < 1, INVALID_FUNCTION_ARGUMENT, "Percentile accuracy must be strictly between 0 and 1");

presto-main/src/test/java/com/facebook/presto/operator/aggregation/TestApproximatePercentileAggregation.java

+11
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.facebook.presto.common.type.Type;
2020
import com.facebook.presto.metadata.FunctionAndTypeManager;
2121
import com.facebook.presto.metadata.MetadataManager;
22+
import com.facebook.presto.spi.PrestoException;
2223
import com.facebook.presto.spi.function.JavaAggregationFunctionImplementation;
2324
import com.google.common.collect.ImmutableList;
2425
import org.testng.annotations.Test;
@@ -495,6 +496,16 @@ public void testDoublePartialStep()
495496
createRLEBlock(ImmutableList.of(0.5, 0.8), 3));
496497
}
497498

499+
@Test(expectedExceptions = PrestoException.class, expectedExceptionsMessageRegExp = "Percentile argument must be constant for all input rows: 0.3 vs. 0.1")
500+
public void testNonConstantPercentile()
501+
{
502+
assertAggregation(
503+
DOUBLE_APPROXIMATE_PERCENTILE_AGGREGATION,
504+
null,
505+
createDoublesBlock(1.0, 2.0, 3.0),
506+
createDoublesBlock(0.1, 0.3, 0.5));
507+
}
508+
498509
private static JavaAggregationFunctionImplementation getAggregation(Type... arguments)
499510
{
500511
return FUNCTION_AND_TYPE_MANAGER.getJavaAggregateFunctionImplementation(FUNCTION_AND_TYPE_MANAGER.lookupFunction("approx_percentile", fromTypes(arguments)));

0 commit comments

Comments
 (0)