summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@oath.com>2019-04-04 05:23:46 +0000
committerHenning Baldersheim <balder@oath.com>2019-04-04 05:24:50 +0000
commitcddc9b3316798a7b39fa83c0305273a613fea104 (patch)
treea81a1b4ba545352513b8dbdc23c01fbd9d6d46f5 /searchlib
parent8f1aed25a611903966c97e4c2b50f00b99070590 (diff)
Ensure that we do not end up with a nullptr when accidentally averaging over a string field.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/aggregator/perdocexpr.cpp32
-rw-r--r--searchlib/src/vespa/searchlib/aggregation/aggregation.cpp10
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());
}