diff options
author | Henning Baldersheim <balder@oath.com> | 2019-04-04 05:23:46 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@oath.com> | 2019-04-04 05:24:50 +0000 |
commit | cddc9b3316798a7b39fa83c0305273a613fea104 (patch) | |
tree | a81a1b4ba545352513b8dbdc23c01fbd9d6d46f5 | |
parent | 8f1aed25a611903966c97e4c2b50f00b99070590 (diff) |
Ensure that we do not end up with a nullptr when accidentally averaging over a string field.
-rw-r--r-- | searchlib/src/tests/aggregator/perdocexpr.cpp | 32 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/aggregation/aggregation.cpp | 10 |
2 files changed, 40 insertions, 2 deletions
diff --git a/searchlib/src/tests/aggregator/perdocexpr.cpp b/searchlib/src/tests/aggregator/perdocexpr.cpp index 66d2e48194d..c3667c36f8e 100644 --- a/searchlib/src/tests/aggregator/perdocexpr.cpp +++ b/searchlib/src/tests/aggregator/perdocexpr.cpp @@ -1325,6 +1325,38 @@ TEST("testAggregationResults") { FloatResultNode(15.54)); } +TEST("test Average over integer") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarInt(I4)).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(I4, avg.getAverage().getInteger()); +} + +TEST("test Average over float") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarFloat(I4)).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(I4, avg.getAverage().getInteger()); +} + +TEST("test Average over numeric string") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarString("7.8")).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(7.8, avg.getAverage().getFloat()); +} + +TEST("test Average over non-numeric string") { + AggregationResult::Configure conf; + AverageAggregationResult avg; + avg.setExpression(createScalarString("ABC")).select(conf, conf); + avg.aggregate(0, 0); + EXPECT_EQUAL(0, avg.getAverage().getInteger()); +} + TEST("testGrouping") { AttributeGuard attr1 = createInt64Attribute(); ExpressionNode::UP result1(new CountAggregationResult()); diff --git a/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp b/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp index 0b8ed669874..006d26a53b0 100644 --- a/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp +++ b/searchlib/src/vespa/searchlib/aggregation/aggregation.cpp @@ -155,7 +155,13 @@ AverageAggregationResult::onPrepare(const ResultNode & result, bool useForInit) if (isReady(_sum.get(), result)) { return; } - _sum.reset(dynamic_cast<NumericResultNode *>(result.createBaseType().release())); + + ResultNode::UP tmp = result.createBaseType(); + if (dynamic_cast<NumericResultNode *>(tmp.get())) { + _sum.reset(static_cast<NumericResultNode *>(tmp.release())); + } else { + _sum.reset(new FloatResultNode()); + } if ( useForInit ) { _sum->set(result); } @@ -546,7 +552,7 @@ ExpressionCountAggregationResult::ExpressionCountAggregationResult() = default; ExpressionCountAggregationResult::~ExpressionCountAggregationResult() = default; StandardDeviationAggregationResult::StandardDeviationAggregationResult() - : AggregationResult(), _count(), _sum(), _sumOfSquared(), _stdDevScratchPad() + : AggregationResult(), _count(), _sum(), _sumOfSquared(), _stdDevScratchPad() { _stdDevScratchPad.reset(new expression::FloatResultNode()); } |