diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-12-09 15:38:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-09 15:38:23 +0100 |
commit | c21de34754d5dcdd2db84ece9144beab7b961d81 (patch) | |
tree | 90b0ef0497086740eac8b05d7ddb957691948e5f /searchlib | |
parent | 4648c034fbefadaee788b5012f5864445250c1cf (diff) | |
parent | ae4dad202a3adee29d5d2537314d0b3aa0e2fb35 (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.h | 5 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/expression/resultnodes.cpp | 28 |
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; } |