summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-12-09 15:38:23 +0100
committerGitHub <noreply@github.com>2022-12-09 15:38:23 +0100
commitc21de34754d5dcdd2db84ece9144beab7b961d81 (patch)
tree90b0ef0497086740eac8b05d7ddb957691948e5f /searchlib
parent4648c034fbefadaee788b5012f5864445250c1cf (diff)
parentae4dad202a3adee29d5d2537314d0b3aa0e2fb35 (diff)
Merge pull request #25195 from vespa-engine/balder/avoid-refering-an-empty-vector
Avoid refering an empty vector.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/expression/rawresultnode.h5
-rw-r--r--searchlib/src/vespa/searchlib/expression/resultnodes.cpp28
2 files changed, 25 insertions, 8 deletions
diff --git a/searchlib/src/vespa/searchlib/expression/rawresultnode.h b/searchlib/src/vespa/searchlib/expression/rawresultnode.h
index 7e4071abf81..e6712144831 100644
--- a/searchlib/src/vespa/searchlib/expression/rawresultnode.h
+++ b/searchlib/src/vespa/searchlib/expression/rawresultnode.h
@@ -3,8 +3,7 @@
#include "singleresultnode.h"
-namespace search {
-namespace expression {
+namespace search::expression {
class RawResultNode : public SingleResultNode
{
@@ -50,5 +49,3 @@ private:
};
}
-}
-
diff --git a/searchlib/src/vespa/searchlib/expression/resultnodes.cpp b/searchlib/src/vespa/searchlib/expression/resultnodes.cpp
index bc0ea85575d..a315e5d0818 100644
--- a/searchlib/src/vespa/searchlib/expression/resultnodes.cpp
+++ b/searchlib/src/vespa/searchlib/expression/resultnodes.cpp
@@ -213,7 +213,12 @@ RawResultNode::min(const ResultNode & b)
char buf[32];
ConstBufferRef s(b.getString(BufferRef(buf, sizeof(buf))));
- if (memcmp(&_value[0], s.data(), std::min(s.size(), _value.size())) > 0) {
+ size_t min_sz = std::min(s.size(), _value.size());
+ if (min_sz == 0) {
+ if ( ! _value.empty()) {
+ setBuffer("", 0);
+ }
+ } else if (memcmp(_value.data(), s.data(), std::min(s.size(), _value.size())) > 0) {
setBuffer(s.data(), s.size());
}
}
@@ -224,7 +229,13 @@ RawResultNode::max(const ResultNode & b)
char buf[32];
ConstBufferRef s(b.getString(BufferRef(buf, sizeof(buf))));
- if (memcmp(&_value[0], s.data(), std::min(s.size(), _value.size())) < 0) {
+ size_t min_sz = std::min(s.size(), _value.size());
+ if (min_sz == 0) {
+ if (s.size() > _value.size()) {
+ setBuffer(s.data(), s.size());
+ }
+
+ } else if (memcmp(&_value[0], s.data(), std::min(s.size(), _value.size())) < 0) {
setBuffer(s.data(), s.size());
}
}
@@ -329,6 +340,11 @@ size_t hashBuf(const void *s, size_t sz)
return result;
}
+template <typename T>
+int cmpNum(T a, T b) {
+ return a < b ? -1 : a > b ? 1 : 0;
+}
+
}
size_t StringResultNode::hash() const { return hashBuf(_value.c_str(), _value.size()); }
@@ -382,9 +398,13 @@ int RawResultNode::onCmp(const Identifiable & b) const
return -1;
} else {
const RawResultNode & rb( static_cast<const RawResultNode &>(b) );
- int result = memcmp(&_value[0], &rb._value[0], std::min(_value.size(), rb._value.size()));
+ size_t min_sz = std::min(_value.size(), rb._value.size());
+ if (min_sz == 0) {
+ return cmpNum(_value.size(), rb._value.size());
+ }
+ int result = memcmp(_value.data(), rb._value.data(), min_sz);
if (result == 0) {
- result = _value.size() < rb._value.size() ? -1 : _value.size() > rb._value.size() ? 1 : 0;
+ return cmpNum(_value.size(), rb._value.size());
}
return result;
}