From c15904c04c1c23cc1c80a43e87c27feab49f3f2d Mon Sep 17 00:00:00 2001 From: Tpt Date: Tue, 27 Dec 2022 17:36:22 +0100 Subject: [PATCH] SPARQL eval: Makes sure to avoid overflow when estimating result size upper bound --- lib/src/sparql/eval.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/src/sparql/eval.rs b/lib/src/sparql/eval.rs index 06cd4302..134b2c9a 100644 --- a/lib/src/sparql/eval.rs +++ b/lib/src/sparql/eval.rs @@ -3582,7 +3582,10 @@ impl Iterator for CartesianProductJoinIterator { fn size_hint(&self) -> (usize, Option) { let (min, max) = self.left_iter.size_hint(); - (min * self.right.len(), max.map(|v| v * self.right.len())) + ( + min.saturating_mul(self.right.len()), + max.map(|v| v.saturating_mul(self.right.len())), + ) } } @@ -3616,7 +3619,10 @@ impl Iterator for HashJoinIterator { fn size_hint(&self) -> (usize, Option) { ( 0, - self.left_iter.size_hint().1.map(|v| v * self.right.len()), + self.left_iter + .size_hint() + .1 + .map(|v| v.saturating_mul(self.right.len())), ) } } @@ -3662,7 +3668,10 @@ impl Iterator for HashLeftJoinIterator { fn size_hint(&self) -> (usize, Option) { ( 0, - self.left_iter.size_hint().1.map(|v| v * self.right.len()), + self.left_iter + .size_hint() + .1 + .map(|v| v.saturating_mul(self.right.len())), ) } } @@ -3849,8 +3858,8 @@ impl Iterator for ConstructIterator { fn size_hint(&self) -> (usize, Option) { let (min, max) = self.iter.size_hint(); ( - min * self.template.len(), - max.map(|v| v * self.template.len()), + min.saturating_mul(self.template.len()), + max.map(|v| v.saturating_mul(self.template.len())), ) } }