diff options
Diffstat (limited to 'src/mongo/db/exec/sbe')
25 files changed, 148 insertions, 174 deletions
diff --git a/src/mongo/db/exec/sbe/expressions/expression.h b/src/mongo/db/exec/sbe/expressions/expression.h index 4e811337cc3..f52acef32ca 100644 --- a/src/mongo/db/exec/sbe/expressions/expression.h +++ b/src/mongo/db/exec/sbe/expressions/expression.h @@ -317,7 +317,7 @@ auto makeSV(Args&&... args) { class EConstant final : public EExpression { public: EConstant(value::TypeTags tag, value::Value val) : _tag(tag), _val(val) {} - EConstant(std::string_view str) { + EConstant(StringData str) { // Views are non-owning so we have to make a copy. std::tie(_tag, _val) = value::makeNewString(str); } @@ -448,7 +448,7 @@ private: */ class EFunction final : public EExpression { public: - EFunction(std::string_view name, std::vector<std::unique_ptr<EExpression>> args) : _name(name) { + EFunction(StringData name, std::vector<std::unique_ptr<EExpression>> args) : _name(name) { _nodes = std::move(args); validateNodes(); } @@ -513,7 +513,7 @@ private: */ class EFail final : public EExpression { public: - EFail(ErrorCodes::Error code, std::string_view message) : _code(code) { + EFail(ErrorCodes::Error code, StringData message) : _code(code) { std::tie(_messageTag, _messageVal) = value::makeNewString(message); } diff --git a/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp b/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp index 857704fb5b5..4275ae03eee 100644 --- a/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp +++ b/src/mongo/db/exec/sbe/expressions/sbe_concat_test.cpp @@ -33,8 +33,7 @@ namespace mongo::sbe { class SBEConcatTest : public EExpressionTestFixture { protected: - void runAndAssertExpression(const vm::CodeFragment* compiledExpr, - std::string_view expectedVal) { + void runAndAssertExpression(const vm::CodeFragment* compiledExpr, StringData expectedVal) { auto [tag, val] = runCompiledExpression(compiledExpr); value::ValueGuard guard(tag, val); diff --git a/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp b/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp index 2e3c87789cb..8486a7c65f8 100644 --- a/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp +++ b/src/mongo/db/exec/sbe/expressions/sbe_regex_test.cpp @@ -32,8 +32,7 @@ namespace mongo::sbe { class SBERegexTest : public EExpressionTestFixture { protected: - void runAndAssertRegexCompile(const vm::CodeFragment* compiledExpr, - std::string_view regexString) { + void runAndAssertRegexCompile(const vm::CodeFragment* compiledExpr, StringData regexString) { auto [tag, val] = runCompiledExpression(compiledExpr); value::ValueGuard guard(tag, val); @@ -53,7 +52,7 @@ protected: } void runAndAssertFindExpression(const vm::CodeFragment* compiledExpr, - std::string_view expectedMatch, + StringData expectedMatch, int idx) { auto [tag, val] = runCompiledExpression(compiledExpr); value::ValueGuard guard(tag, val); @@ -72,7 +71,7 @@ protected: ASSERT_EQUALS(value::numericCast<int32_t>(idxTag, idxVal), idx); } - void addMatchResult(value::Array* arrayPtr, std::string_view matchStr, int32_t idx) { + void addMatchResult(value::Array* arrayPtr, StringData matchStr, int32_t idx) { auto [objTag, objVal] = value::makeNewObject(); value::ValueGuard objGuard{objTag, objVal}; auto obj = value::getObjectView(objVal); diff --git a/src/mongo/db/exec/sbe/parser/parser.cpp b/src/mongo/db/exec/sbe/parser/parser.cpp index 19fe41378ef..a426b9d9a8d 100644 --- a/src/mongo/db/exec/sbe/parser/parser.cpp +++ b/src/mongo/db/exec/sbe/parser/parser.cpp @@ -1161,7 +1161,7 @@ std::unique_ptr<PlanStage> Parser::walkPathValue(AstQuery& ast, std::move(inputStage), getCurrentPlanNodeId(), outputSlot, - makeE<EFunction>("getField"sv, + makeE<EFunction>("getField"_sd, makeEs(makeE<EVariable>(inputSlot), makeE<EConstant>(ast.nodes[0]->identifier)))); } @@ -1172,7 +1172,7 @@ std::unique_ptr<PlanStage> Parser::walkPathValue(AstQuery& ast, makeProjectStage(std::move(inputStage), getCurrentPlanNodeId(), traverseIn, - makeE<EFunction>("getField"sv, + makeE<EFunction>("getField"_sd, makeEs(makeE<EVariable>(inputSlot), makeE<EConstant>(ast.nodes[0]->identifier)))); auto in = makeS<LimitSkipStage>( diff --git a/src/mongo/db/exec/sbe/sbe_filter_test.cpp b/src/mongo/db/exec/sbe/sbe_filter_test.cpp index eb7c7c05214..15a34975c9f 100644 --- a/src/mongo/db/exec/sbe/sbe_filter_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_filter_test.cpp @@ -33,7 +33,6 @@ #include "mongo/platform/basic.h" -#include <string_view> #include "mongo/db/exec/sbe/sbe_plan_stage_test.h" #include "mongo/db/exec/sbe/stages/filter.h" @@ -148,7 +147,7 @@ TEST_F(FilterStageTest, FilterIsNumberTest) { // Build a FilterStage whose filter expression is "isNumber(scanSlot)". auto filter = makeS<FilterStage<false>>( std::move(scanStage), - makeE<EFunction>("isNumber"sv, makeEs(makeE<EVariable>(scanSlot))), + makeE<EFunction>("isNumber"_sd, makeEs(makeE<EVariable>(scanSlot))), kEmptyPlanNodeId); return std::make_pair(scanSlot, std::move(filter)); diff --git a/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp b/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp index 281a7cf0684..2c3bd3d335d 100644 --- a/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_hash_agg_test.cpp @@ -33,7 +33,6 @@ #include "mongo/platform/basic.h" -#include <string_view> #include "mongo/db/exec/sbe/sbe_plan_stage_test.h" #include "mongo/db/exec/sbe/stages/hash_agg.h" @@ -115,7 +114,7 @@ TEST_F(HashAggStageTest, HashAggAddToSetTest) { auto [expectedTag, expectedVal] = value::makeNewArray(); value::ValueGuard expectedGuard{expectedTag, expectedVal}; - for (auto&& sv : std::array<std::string_view, 4>{"Aa", "BB", "cc", "dD"}) { + for (auto&& sv : std::array<StringData, 4>{"Aa", "BB", "cc", "dD"}) { auto [tag, val] = value::makeNewString(sv); value::getArrayView(expectedVal)->push_back(tag, val); } diff --git a/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp b/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp index 956831cc8e0..fc9b18a2fdc 100644 --- a/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_hash_join_test.cpp @@ -33,7 +33,6 @@ #include "mongo/platform/basic.h" -#include <string_view> #include "mongo/db/exec/sbe/sbe_plan_stage_test.h" #include "mongo/db/exec/sbe/stages/hash_join.h" diff --git a/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp b/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp index 473ffbe5510..0782f0bdc42 100644 --- a/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_plan_stage_test.cpp @@ -36,7 +36,6 @@ #include "mongo/db/exec/sbe/sbe_plan_stage_test.h" -#include <string_view> #include "mongo/logv2/log.h" diff --git a/src/mongo/db/exec/sbe/sbe_sort_test.cpp b/src/mongo/db/exec/sbe/sbe_sort_test.cpp index 1d4574f2d50..83b59daa535 100644 --- a/src/mongo/db/exec/sbe/sbe_sort_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_sort_test.cpp @@ -29,7 +29,6 @@ #include "mongo/platform/basic.h" -#include <string_view> #include "mongo/db/exec/sbe/sbe_plan_stage_test.h" #include "mongo/db/exec/sbe/stages/sort.h" diff --git a/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp b/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp index 37cad8d4532..009106f8c59 100644 --- a/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_sorted_merge_test.cpp @@ -29,7 +29,6 @@ #include "mongo/platform/basic.h" -#include <string_view> #include "mongo/db/exec/sbe/sbe_plan_stage_test.h" #include "mongo/db/exec/sbe/stages/sorted_merge.h" diff --git a/src/mongo/db/exec/sbe/sbe_test.cpp b/src/mongo/db/exec/sbe/sbe_test.cpp index 74460db8e2c..ad7529e96bd 100644 --- a/src/mongo/db/exec/sbe/sbe_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_test.cpp @@ -35,16 +35,15 @@ namespace mongo::sbe { TEST(SBEValues, Basic) { - using namespace std::literals; { - const auto [tag, val] = value::makeNewString("small"sv); + const auto [tag, val] = value::makeNewString("small"_sd); ASSERT_EQUALS(tag, value::TypeTags::StringSmall); value::releaseValue(tag, val); } { - const auto [tag, val] = value::makeNewString("not so small string"sv); + const auto [tag, val] = value::makeNewString("not so small string"_sd); ASSERT_EQUALS(tag, value::TypeTags::StringBig); value::releaseValue(tag, val); @@ -53,11 +52,11 @@ TEST(SBEValues, Basic) { const auto [tag, val] = value::makeNewObject(); auto obj = value::getObjectView(val); - const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"sv); - obj->push_back("field"sv, fieldTag, fieldVal); + const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"_sd); + obj->push_back("field"_sd, fieldTag, fieldVal); ASSERT_EQUALS(obj->size(), 1); - const auto [checkTag, checkVal] = obj->getField("field"sv); + const auto [checkTag, checkVal] = obj->getField("field"_sd); ASSERT_EQUALS(fieldTag, checkTag); ASSERT_EQUALS(fieldVal, checkVal); @@ -68,7 +67,7 @@ TEST(SBEValues, Basic) { const auto [tag, val] = value::makeNewArray(); auto obj = value::getArrayView(val); - const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"sv); + const auto [fieldTag, fieldVal] = value::makeNewString("not so small string"_sd); obj->push_back(fieldTag, fieldVal); ASSERT_EQUALS(obj->size(), 1); @@ -198,15 +197,15 @@ TEST(SBEValues, HashCompound) { { auto [tag1, val1] = value::makeNewObject(); auto obj1 = value::getObjectView(val1); - obj1->push_back("a"sv, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-5)); - obj1->push_back("b"sv, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-6)); - obj1->push_back("c"sv, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-7)); + obj1->push_back("a"_sd, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-5)); + obj1->push_back("b"_sd, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-6)); + obj1->push_back("c"_sd, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-7)); auto [tag2, val2] = value::makeNewObject(); auto obj2 = value::getObjectView(val2); - obj2->push_back("a"sv, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-5.0)); - obj2->push_back("b"sv, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-6.0)); - obj2->push_back("c"sv, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-7.0)); + obj2->push_back("a"_sd, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-5.0)); + obj2->push_back("b"_sd, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-6.0)); + obj2->push_back("c"_sd, value::TypeTags::NumberDouble, value::bitcastFrom<double>(-7.0)); ASSERT_EQUALS(value::hashValue(tag1, val1), value::hashValue(tag2, val2)); diff --git a/src/mongo/db/exec/sbe/sbe_unique_test.cpp b/src/mongo/db/exec/sbe/sbe_unique_test.cpp index 08ed98c1723..812b7383b1e 100644 --- a/src/mongo/db/exec/sbe/sbe_unique_test.cpp +++ b/src/mongo/db/exec/sbe/sbe_unique_test.cpp @@ -29,7 +29,6 @@ #include "mongo/platform/basic.h" -#include <string_view> #include "mongo/db/exec/sbe/sbe_plan_stage_test.h" #include "mongo/db/exec/sbe/stages/unique.h" diff --git a/src/mongo/db/exec/sbe/stages/ix_scan.cpp b/src/mongo/db/exec/sbe/stages/ix_scan.cpp index 854af856cd2..8e70ccd2004 100644 --- a/src/mongo/db/exec/sbe/stages/ix_scan.cpp +++ b/src/mongo/db/exec/sbe/stages/ix_scan.cpp @@ -39,7 +39,7 @@ namespace mongo::sbe { IndexScanStage::IndexScanStage(CollectionUUID collUuid, - std::string_view indexName, + StringData indexName, bool forward, boost::optional<value::SlotId> recordSlot, boost::optional<value::SlotId> recordIdSlot, diff --git a/src/mongo/db/exec/sbe/stages/ix_scan.h b/src/mongo/db/exec/sbe/stages/ix_scan.h index da10c9bf126..63c583764ab 100644 --- a/src/mongo/db/exec/sbe/stages/ix_scan.h +++ b/src/mongo/db/exec/sbe/stages/ix_scan.h @@ -60,7 +60,7 @@ namespace mongo::sbe { class IndexScanStage final : public PlanStage { public: IndexScanStage(CollectionUUID collUuid, - std::string_view indexName, + StringData indexName, bool forward, boost::optional<value::SlotId> recordSlot, boost::optional<value::SlotId> recordIdSlot, diff --git a/src/mongo/db/exec/sbe/util/debug_print.cpp b/src/mongo/db/exec/sbe/util/debug_print.cpp index 939779be8de..e3d831b5ab5 100644 --- a/src/mongo/db/exec/sbe/util/debug_print.cpp +++ b/src/mongo/db/exec/sbe/util/debug_print.cpp @@ -92,20 +92,20 @@ std::string DebugPrinter::print(const std::vector<Block>& blocks) { break; } - std::string_view sv(b.str); + StringData sv(b.str); if (!sv.empty()) { - if (sv.front() == '`') { - sv.remove_prefix(1); + if (*sv.begin() == '`') { + sv = sv.substr(1); if (!ret.empty() && ret.back() == ' ') { ret.resize(ret.size() - 1, 0); } } - if (!sv.empty() && sv.back() == '`') { - sv.remove_suffix(1); + if (!sv.empty() && *(sv.end() - 1) == '`') { + sv = sv.substr(0, sv.size() - 1); addSpace = false; } if (!sv.empty()) { - ret.append(sv); + ret.append(sv.begin(), sv.end()); if (addSpace) { ret.append(" "); } diff --git a/src/mongo/db/exec/sbe/util/debug_print.h b/src/mongo/db/exec/sbe/util/debug_print.h index 19e29d7bdf4..a11bb24c75c 100644 --- a/src/mongo/db/exec/sbe/util/debug_print.h +++ b/src/mongo/db/exec/sbe/util/debug_print.h @@ -60,16 +60,16 @@ public: Command cmd; std::string str; - Block(std::string_view s) : cmd(cmdNone), str(s) {} + Block(StringData s) : cmd(cmdNone), str(s) {} - Block(Command c, std::string_view s) : cmd(c), str(s) {} + Block(Command c, StringData s) : cmd(c), str(s) {} Block(Command c) : cmd(c) {} }; DebugPrinter(bool colorConsole = false) : _colorConsole(colorConsole) {} - static void addKeyword(std::vector<Block>& ret, std::string_view k) { + static void addKeyword(std::vector<Block>& ret, StringData k) { ret.emplace_back(Block::cmdColorCyan); ret.emplace_back(Block{Block::cmdNoneNoSpace, k}); ret.emplace_back(Block::cmdColorNone); @@ -92,7 +92,7 @@ public: ret.emplace_back(Block{Block::cmdNoneNoSpace, " "}); } - static void addIdentifier(std::vector<Block>& ret, std::string_view k) { + static void addIdentifier(std::vector<Block>& ret, StringData k) { ret.emplace_back(Block::cmdColorGreen); ret.emplace_back(Block{Block::cmdNoneNoSpace, k}); ret.emplace_back(Block::cmdColorNone); diff --git a/src/mongo/db/exec/sbe/values/bson.cpp b/src/mongo/db/exec/sbe/values/bson.cpp index ea5f50b7e58..6a67127bd6f 100644 --- a/src/mongo/db/exec/sbe/values/bson.cpp +++ b/src/mongo/db/exec/sbe/values/bson.cpp @@ -290,8 +290,7 @@ void convertToBsonObj(ArrayBuilder& builder, value::ArrayEnumerator arr) { case value::TypeTags::StringSmall: case value::TypeTags::StringBig: case value::TypeTags::bsonString: { - auto sv = value::getStringView(tag, val); - builder.append(StringData{sv.data(), sv.size()}); + builder.append(value::getStringView(tag, val)); break; } case value::TypeTags::Array: { @@ -385,11 +384,9 @@ template void convertToBsonObj<UniqueBSONObjBuilder>(UniqueBSONObjBuilder& build template <class ObjBuilder> void appendValueToBsonObj(ObjBuilder& builder, - std::string_view nameSV, + StringData name, value::TypeTags tag, value::Value val) { - StringData name{nameSV.data(), nameSV.size()}; - switch (tag) { case value::TypeTags::Nothing: break; @@ -421,8 +418,7 @@ void appendValueToBsonObj(ObjBuilder& builder, case value::TypeTags::StringSmall: case value::TypeTags::StringBig: case value::TypeTags::bsonString: { - auto sv = value::getStringView(tag, val); - builder.append(name, StringData{sv.data(), sv.size()}); + builder.append(name, value::getStringView(tag, val)); break; } case value::TypeTags::Array: { @@ -485,11 +481,11 @@ void appendValueToBsonObj(ObjBuilder& builder, } template void appendValueToBsonObj<BSONObjBuilder>(BSONObjBuilder& builder, - std::string_view name, + StringData name, value::TypeTags tag, value::Value val); template void appendValueToBsonObj<UniqueBSONObjBuilder>(UniqueBSONObjBuilder& builder, - std::string_view name, + StringData name, value::TypeTags tag, value::Value val); } // namespace bson diff --git a/src/mongo/db/exec/sbe/values/bson.h b/src/mongo/db/exec/sbe/values/bson.h index a8839d511fa..af37f80f76b 100644 --- a/src/mongo/db/exec/sbe/values/bson.h +++ b/src/mongo/db/exec/sbe/values/bson.h @@ -42,7 +42,7 @@ std::pair<value::TypeTags, value::Value> convertFrom(bool view, const char* advance(const char* be, size_t fieldNameSize); inline auto fieldNameView(const char* be) noexcept { - return std::string_view{be + 1}; + return StringData{be + 1}; } template <class ArrayBuilder> @@ -53,7 +53,7 @@ void convertToBsonObj(ObjBuilder& builder, value::Object* obj); template <class ObjBuilder> void appendValueToBsonObj(ObjBuilder& builder, - std::string_view name, + StringData name, value::TypeTags tag, value::Value val); } // namespace bson diff --git a/src/mongo/db/exec/sbe/values/slot.h b/src/mongo/db/exec/sbe/values/slot.h index fbfc7239d3b..44fcde13d1d 100644 --- a/src/mongo/db/exec/sbe/values/slot.h +++ b/src/mongo/db/exec/sbe/values/slot.h @@ -633,7 +633,7 @@ void readKeyStringValueIntoAccessors( template <typename T> using SlotMap = absl::flat_hash_map<SlotId, T>; using SlotAccessorMap = SlotMap<SlotAccessor*>; -using FieldAccessorMap = absl::flat_hash_map<std::string, std::unique_ptr<ViewOfValueAccessor>>; +using FieldAccessorMap = StringMap<std::unique_ptr<ViewOfValueAccessor>>; using SlotSet = absl::flat_hash_set<SlotId>; using SlotVector = std::vector<SlotId>; diff --git a/src/mongo/db/exec/sbe/values/value.cpp b/src/mongo/db/exec/sbe/values/value.cpp index 3522679d78f..9fd512ea9d0 100644 --- a/src/mongo/db/exec/sbe/values/value.cpp +++ b/src/mongo/db/exec/sbe/values/value.cpp @@ -44,21 +44,32 @@ namespace mongo { namespace sbe { namespace value { +namespace { +template <typename T> +auto abslHash(const T& val) { + if constexpr (std::is_same_v<T, StringData>) { + return absl::Hash<absl::string_view>{}(absl::string_view{val.rawData(), val.size()}); + } else { + return absl::Hash<T>{}(val); + } +} +} // namespace + std::pair<TypeTags, Value> makeCopyBsonRegex(const BsonRegex& regex) { auto buffer = std::make_unique<char[]>(regex.byteSize()); memcpy(buffer.get(), regex.data(), regex.byteSize()); return {TypeTags::bsonRegex, bitcastFrom<char*>(buffer.release())}; } -std::pair<TypeTags, Value> makeNewBsonRegex(std::string_view pattern, std::string_view flags) { +std::pair<TypeTags, Value> makeNewBsonRegex(StringData pattern, StringData flags) { // Add 2 to account NULL bytes after pattern and flags. auto totalSize = pattern.size() + flags.size() + 2; auto buffer = std::make_unique<char[]>(totalSize); auto rawBuffer = buffer.get(); // Copy pattern first and flags after it. - memcpy(rawBuffer, pattern.data(), pattern.size()); - memcpy(rawBuffer + pattern.size() + 1, flags.data(), flags.size()); + memcpy(rawBuffer, pattern.rawData(), pattern.size()); + memcpy(rawBuffer + pattern.size() + 1, flags.rawData(), flags.size()); // Ensure NULL byte is placed after each part. rawBuffer[pattern.size()] = '\0'; @@ -66,7 +77,7 @@ std::pair<TypeTags, Value> makeNewBsonRegex(std::string_view pattern, std::strin return {TypeTags::bsonRegex, bitcastFrom<char*>(buffer.release())}; } -std::pair<TypeTags, Value> makeCopyBsonJavascript(std::string_view code) { +std::pair<TypeTags, Value> makeCopyBsonJavascript(StringData code) { auto [_, strVal] = makeBigString(code); return {TypeTags::bsonJavascript, strVal}; } @@ -76,7 +87,7 @@ std::pair<TypeTags, Value> makeCopyKeyString(const KeyString::Value& inKey) { return {TypeTags::ksValue, bitcastFrom<KeyString::Value*>(k)}; } -std::pair<TypeTags, Value> makeNewPcreRegex(std::string_view pattern, std::string_view options) { +std::pair<TypeTags, Value> makeNewPcreRegex(StringData pattern, StringData options) { auto regex = std::make_unique<PcreRegex>(pattern, options); return {TypeTags::pcreRegex, bitcastFrom<PcreRegex*>(regex.release())}; } @@ -94,11 +105,11 @@ void PcreRegex::_compile() { uassert(5073402, str::stream() << "Invalid Regex: " << compile_error, _pcrePtr != nullptr); } -int PcreRegex::execute(std::string_view stringView, int startPos, std::vector<int>& buf) { +int PcreRegex::execute(StringData stringView, int startPos, std::vector<int>& buf) { return pcre_exec(_pcrePtr, nullptr, - stringView.data(), - stringView.length(), + stringView.rawData(), + stringView.size(), startPos, 0, &(buf.front()), @@ -417,11 +428,11 @@ void writeValueToStream(T& stream, TypeTags tag, Value val) { case TypeTags::StringBig: case TypeTags::bsonString: { auto sv = getStringView(tag, val); - if (sv.length() <= kStringMaxDisplayLength) { - stream << '"' << StringData{sv.data(), sv.size()} << '"'; + if (sv.size() <= kStringMaxDisplayLength) { + stream << '"' << sv << '"'; } else { auto sub = sv.substr(0, kStringMaxDisplayLength); - stream << '"' << StringData{sub.data(), sub.size()} << '"' << "..."; + stream << '"' << sub << '"' << "..."; } break; } @@ -595,36 +606,35 @@ BSONType tagToType(TypeTags tag) noexcept { std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator) noexcept { switch (tag) { case TypeTags::NumberInt32: - return absl::Hash<int32_t>{}(bitcastTo<int32_t>(val)); + return abslHash(bitcastTo<int32_t>(val)); case TypeTags::RecordId: case TypeTags::NumberInt64: - return absl::Hash<int64_t>{}(bitcastTo<int64_t>(val)); + return abslHash(bitcastTo<int64_t>(val)); case TypeTags::NumberDouble: { // Force doubles to integers for hashing. auto dbl = bitcastTo<double>(val); if (auto asInt = representAs<int64_t>(dbl); asInt) { - return absl::Hash<int64_t>{}(*asInt); + return abslHash(*asInt); } else { // Doubles not representable as int64_t will hash as doubles. - return absl::Hash<double>{}(dbl); + return abslHash(dbl); } } case TypeTags::NumberDecimal: { // Force decimals to integers for hashing. auto dec = bitcastTo<Decimal128>(val); if (auto asInt = representAs<int64_t>(dec); asInt) { - return absl::Hash<int64_t>{}(*asInt); + return abslHash(*asInt); } else if (auto asDbl = representAs<double>(dec); asDbl) { - return absl::Hash<double>{}(*asDbl); + return abslHash(*asDbl); } else { - return absl::Hash<uint64_t>{}(dec.getValue().low64) ^ - absl::Hash<uint64_t>{}(dec.getValue().high64); + return abslHash(dec.getValue().low64) ^ abslHash(dec.getValue().high64); } } case TypeTags::Date: - return absl::Hash<int64_t>{}(bitcastTo<int64_t>(val)); + return abslHash(bitcastTo<int64_t>(val)); case TypeTags::Timestamp: - return absl::Hash<uint64_t>{}(bitcastTo<uint64_t>(val)); + return abslHash(bitcastTo<uint64_t>(val)); case TypeTags::Boolean: return bitcastTo<bool>(val); case TypeTags::Null: @@ -637,18 +647,15 @@ std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator case TypeTags::bsonString: { auto sv = getStringView(tag, val); if (collator) { - auto key = collator->getComparisonKey(StringData{sv.data(), sv.size()}); - auto keyData = key.getKeyData(); - return absl::Hash<std::string_view>{}( - std::string_view{keyData.rawData(), keyData.size()}); + return abslHash(collator->getComparisonKey(sv).getKeyData()); } else { - return absl::Hash<std::string_view>{}(sv); + return abslHash(sv); } } case TypeTags::ObjectId: { auto id = getObjectIdView(val); - return absl::Hash<uint64_t>{}(readFromMemory<uint64_t>(id->data())) ^ - absl::Hash<uint32_t>{}(readFromMemory<uint32_t>(id->data() + 8)); + return abslHash(readFromMemory<uint64_t>(id->data())) ^ + abslHash(readFromMemory<uint32_t>(id->data() + 8)); } case TypeTags::ksValue: { return getKeyStringView(val)->hash(); @@ -690,19 +697,19 @@ std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator memcpy(buffer, getRawPointerView(val), size); // Hash as if it is 64bit integer. - return absl::Hash<uint64_t>{}(readFromMemory<uint64_t>(buffer)); + return abslHash(readFromMemory<uint64_t>(buffer)); } else { // Hash only the first 8 bytes. It should be enough. - return absl::Hash<uint64_t>{}( + return abslHash( readFromMemory<uint64_t>(getRawPointerView(val) + sizeof(uint32_t))); } } case TypeTags::bsonRegex: { auto regex = getBsonRegexView(val); - return absl::Hash<std::string_view>{}(regex.dataView()); + return abslHash(regex.dataView()); } case TypeTags::bsonJavascript: - return absl::Hash<std::string_view>{}(getBsonJavascriptView(val)); + return abslHash(getBsonJavascriptView(val)); default: break; } @@ -715,7 +722,7 @@ std::size_t hashValue(TypeTags tag, Value val, const CollatorInterface* collator * guarantees that the result will be exactlty -1, 0, or 1, which is important, because not all * comparison functions make that guarantee. * - * The std::string_view::compare(basic_string_view s) function, for example, only promises that it + * The StringData::compare(basic_string_view s) function, for example, only promises that it * will return a value less than 0 in the case that 'this' is less than 's,' whereas we want to * return exactly -1. */ @@ -761,9 +768,7 @@ std::pair<TypeTags, Value> compareValue(TypeTags lhsTag, auto lhsStr = getStringView(lhsTag, lhsValue); auto rhsStr = getStringView(rhsTag, rhsValue); - auto result = comparator ? comparator->compare(StringData{lhsStr.data(), lhsStr.size()}, - StringData{rhsStr.data(), rhsStr.size()}) - : lhsStr.compare(rhsStr); + auto result = comparator ? comparator->compare(lhsStr, rhsStr) : lhsStr.compare(rhsStr); return {TypeTags::NumberInt32, bitcastFrom<int32_t>(compareHelper(result, 0))}; } else if (lhsTag == TypeTags::Date && rhsTag == TypeTags::Date) { @@ -969,19 +974,19 @@ bool ObjectEnumerator::advance() { } } -std::string_view ObjectEnumerator::getFieldName() const { +StringData ObjectEnumerator::getFieldName() const { using namespace std::literals; if (_object) { if (_index < _object->size()) { return _object->field(_index); } else { - return ""sv; + return ""_sd; } } else { if (*_objectCurrent != 0) { return bson::fieldNameView(_objectCurrent); } else { - return ""sv; + return ""_sd; } } } diff --git a/src/mongo/db/exec/sbe/values/value.h b/src/mongo/db/exec/sbe/values/value.h index 31ade47676d..a70a48bbbee 100644 --- a/src/mongo/db/exec/sbe/values/value.h +++ b/src/mongo/db/exec/sbe/values/value.h @@ -422,7 +422,7 @@ public: } } - void push_back(std::string_view name, TypeTags tag, Value val) { + void push_back(StringData name, TypeTags tag, Value val) { if (tag != TypeTags::Nothing) { ValueGuard guard{tag, val}; // Reserve space in all vectors, they are the same size. We arbitrarily picked _typeTags @@ -437,7 +437,7 @@ public: } } - std::pair<TypeTags, Value> getField(std::string_view field) { + std::pair<TypeTags, Value> getField(StringData field) { for (size_t idx = 0; idx < _typeTags.size(); ++idx) { if (_names[idx] == field) { return {_typeTags[idx], _values[idx]}; @@ -597,12 +597,11 @@ private: */ class PcreRegex { public: - PcreRegex(std::string_view pattern, std::string_view options) - : _pattern(pattern), _options(options) { + PcreRegex(StringData pattern, StringData options) : _pattern(pattern), _options(options) { _compile(); } - PcreRegex(std::string_view pattern) : PcreRegex(pattern, "") {} + PcreRegex(StringData pattern) : PcreRegex(pattern, "") {} PcreRegex(const PcreRegex& other) : PcreRegex(other._pattern, other._options) {} @@ -639,7 +638,7 @@ public: * = 0 there was a match, but not enough space in the buffer * > 0 the number of matches */ - int execute(std::string_view input, int startPos, std::vector<int>& buf); + int execute(StringData input, int startPos, std::vector<int>& buf); size_t getNumberCaptures() const; @@ -715,7 +714,7 @@ inline size_t getStringLength(TypeTags tag, const Value& val) noexcept { /** * getStringView() should be preferred over getRawStringView() where possible. */ -inline std::string_view getStringView(TypeTags tag, const Value& val) noexcept { +inline StringData getStringView(TypeTags tag, const Value& val) noexcept { return {getRawStringView(tag, val), getStringLength(tag, val)}; } @@ -776,9 +775,9 @@ inline uint8_t* getBSONBinDataCompat(TypeTags tag, Value val) { } } -inline bool canUseSmallString(std::string_view input) { +inline bool canUseSmallString(StringData input) { auto length = input.size(); - auto ptr = input.data(); + auto ptr = input.rawData(); auto end = ptr + length; return length <= kSmallStringMaxLength && std::find(ptr, end, '\0') == end; } @@ -787,18 +786,18 @@ inline bool canUseSmallString(std::string_view input) { * Callers must check that canUseSmallString() returns true before calling this function. * makeNewString() should be preferred over makeSmallString() where possible. */ -inline std::pair<TypeTags, Value> makeSmallString(std::string_view input) { +inline std::pair<TypeTags, Value> makeSmallString(StringData input) { dassert(canUseSmallString(input)); Value smallString{0}; auto buf = getRawStringView(TypeTags::StringSmall, smallString); - memcpy(buf, input.data(), input.size()); + memcpy(buf, input.rawData(), input.size()); return {TypeTags::StringSmall, smallString}; } -inline std::pair<TypeTags, Value> makeBigString(std::string_view input) { +inline std::pair<TypeTags, Value> makeBigString(StringData input) { auto len = input.size(); - auto ptr = input.data(); + auto ptr = input.rawData(); invariant(len < static_cast<uint32_t>(std::numeric_limits<int32_t>::max())); @@ -810,7 +809,7 @@ inline std::pair<TypeTags, Value> makeBigString(std::string_view input) { return {TypeTags::StringBig, reinterpret_cast<Value>(buf)}; } -inline std::pair<TypeTags, Value> makeNewString(std::string_view input) { +inline std::pair<TypeTags, Value> makeNewString(StringData input) { if (canUseSmallString(input)) { return makeSmallString(input); } else { @@ -886,7 +885,7 @@ inline KeyString::Value* getKeyStringView(Value val) noexcept { return reinterpret_cast<KeyString::Value*>(val); } -std::pair<TypeTags, Value> makeNewPcreRegex(std::string_view pattern, std::string_view options); +std::pair<TypeTags, Value> makeNewPcreRegex(StringData pattern, StringData options); std::pair<TypeTags, Value> makeCopyPcreRegex(const PcreRegex& regex); @@ -923,13 +922,13 @@ struct BsonRegex { BsonRegex(const char* rawValue) { pattern = rawValue; // We add 1 to account NULL byte after pattern. - flags = pattern.data() + pattern.size() + 1; + flags = pattern.rawData() + pattern.size() + 1; } - BsonRegex(std::string_view pattern, std::string_view flags) : pattern(pattern), flags(flags) { + BsonRegex(StringData pattern, StringData flags) : pattern(pattern), flags(flags) { // Ensure that flags follow right after pattern in memory. Otherwise 'dataView()' may return - // invalid 'std::string_view' object. - invariant(pattern.data() + pattern.size() + 1 == flags.data()); + // invalid 'StringData' object. + invariant(pattern.rawData() + pattern.size() + 1 == flags.rawData()); } size_t byteSize() const { @@ -938,15 +937,15 @@ struct BsonRegex { } const char* data() const { - return pattern.data(); + return pattern.rawData(); } - std::string_view dataView() const { + StringData dataView() const { return {data(), byteSize()}; } - std::string_view pattern; - std::string_view flags; + StringData pattern; + StringData flags; }; inline BsonRegex getBsonRegexView(Value val) noexcept { @@ -955,13 +954,13 @@ inline BsonRegex getBsonRegexView(Value val) noexcept { std::pair<TypeTags, Value> makeCopyBsonRegex(const BsonRegex& regex); -std::pair<TypeTags, Value> makeNewBsonRegex(std::string_view pattern, std::string_view flags); +std::pair<TypeTags, Value> makeNewBsonRegex(StringData pattern, StringData flags); -inline std::string_view getBsonJavascriptView(Value val) noexcept { +inline StringData getBsonJavascriptView(Value val) noexcept { return getStringView(TypeTags::StringBig, val); } -std::pair<TypeTags, Value> makeCopyBsonJavascript(std::string_view code); +std::pair<TypeTags, Value> makeCopyBsonJavascript(StringData code); std::pair<TypeTags, Value> makeCopyKeyString(const KeyString::Value& inKey); @@ -1146,7 +1145,7 @@ public: } } std::pair<TypeTags, Value> getViewOfValue() const; - std::string_view getFieldName() const; + StringData getFieldName() const; bool atEnd() const { if (_object) { diff --git a/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp b/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp index 766bdac983a..3eedbc5dfbb 100644 --- a/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp +++ b/src/mongo/db/exec/sbe/values/value_serialize_for_sorter_test.cpp @@ -58,16 +58,16 @@ TEST(ValueSerializeForSorter, Serialize) { testData->push_back(value::TypeTags::MaxKey, 0); testData->push_back(value::TypeTags::bsonUndefined, 0); - std::string_view smallString = "perfect"; + StringData smallString = "perfect"; invariant(sbe::value::canUseSmallString(smallString)); - std::string_view bigString = "too big string to fit into value"; + StringData bigString = "too big string to fit into value"; invariant(!sbe::value::canUseSmallString(bigString)); - std::string_view smallStringWithNull = "a\0b"; + StringData smallStringWithNull = "a\0b"; invariant(smallStringWithNull.size() <= sbe::value::kSmallStringMaxLength); - std::string_view bigStringWithNull = "too big string \0 to fit into value"; + StringData bigStringWithNull = "too big string \0 to fit into value"; invariant(bigStringWithNull.size() > sbe::value::kSmallStringMaxLength); - std::vector<std::string_view> stringCases = { + std::vector<StringData> stringCases = { smallString, smallStringWithNull, bigString, diff --git a/src/mongo/db/exec/sbe/vm/datetime.cpp b/src/mongo/db/exec/sbe/vm/datetime.cpp index 09c4188ea17..84839a4a2d4 100644 --- a/src/mongo/db/exec/sbe/vm/datetime.cpp +++ b/src/mongo/db/exec/sbe/vm/datetime.cpp @@ -45,9 +45,7 @@ bool isValidTimezone(value::TypeTags timezoneTag, return false; } auto timezoneStringView = value::getStringView(timezoneTag, timezoneValue); - return timezoneStringView.empty() || - timezoneDB->isTimeZoneIdentifier( - StringData{timezoneStringView.data(), timezoneStringView.size()}); + return timezoneStringView.empty() || timezoneDB->isTimeZoneIdentifier(timezoneStringView); } TimeZone getTimezone(value::TypeTags timezoneTag, @@ -57,7 +55,7 @@ TimeZone getTimezone(value::TypeTags timezoneTag, if (timezoneStr.empty()) { return timezoneDB->utcZone(); } else { - return timezoneDB->getTimeZone(StringData{timezoneStr.data(), timezoneStr.size()}); + return timezoneDB->getTimeZone(timezoneStr); } } diff --git a/src/mongo/db/exec/sbe/vm/vm.cpp b/src/mongo/db/exec/sbe/vm/vm.cpp index dd207101ee6..09361aaea04 100644 --- a/src/mongo/db/exec/sbe/vm/vm.cpp +++ b/src/mongo/db/exec/sbe/vm/vm.cpp @@ -750,12 +750,9 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::aggLast(value::TypeTag } -bool hasSeparatorAt(size_t idx, std::string_view input, std::string_view separator) { - if (separator.size() + idx > input.size()) { - return false; - } - - return input.compare(idx, separator.size(), separator) == 0; +bool hasSeparatorAt(size_t idx, StringData input, StringData separator) { + return (idx + separator.size() <= input.size()) && + input.substr(idx, separator.size()) == separator; } std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinSplit(ArityType arity) { @@ -775,7 +772,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinSplit(ArityType size_t splitStart = 0; size_t splitPos; - while ((splitPos = input.find(separator, splitStart)) != std::string_view::npos) { + while ((splitPos = input.find(separator, splitStart)) != std::string::npos) { auto [tag, val] = value::makeNewString(input.substr(splitStart, splitPos - splitStart)); arr->push_back(tag, val); @@ -835,7 +832,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinDropFields(Arit } else if (tagInObj == value::TypeTags::Object) { auto objRoot = value::getObjectView(valInObj); for (size_t idx = 0; idx < objRoot->size(); ++idx) { - std::string_view sv(objRoot->field(idx)); + StringData sv(objRoot->field(idx)); if (restrictFieldsSet.count(sv) == 0) { @@ -947,7 +944,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinNewKeyString(Ar kb.appendNumberLong(num); } else if (value::isString(tag)) { auto str = value::getStringView(tag, val); - kb.appendString(StringData{str.data(), str.length()}); + kb.appendString(str); } else { uasserted(4822802, "unsuppored key string type"); } @@ -1154,20 +1151,16 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinReplaceOne(Arit return {false, value::TypeTags::Nothing, 0}; } - auto inputStrView = value::getStringView(typeTagInputStr, valueInputStr); - auto findStrView = value::getStringView(typeTagFindStr, valueFindStr); - auto replacementStrView = value::getStringView(typeTagReplacementStr, valueReplacementStr); + auto input = value::getStringView(typeTagInputStr, valueInputStr); + auto find = value::getStringView(typeTagFindStr, valueFindStr); + auto replacement = value::getStringView(typeTagReplacementStr, valueReplacementStr); // If find string is empty, return nothing, since an empty find will match every position in a // string. - if (findStrView.empty()) { + if (find.empty()) { return {false, value::TypeTags::Nothing, 0}; } - auto input = StringData(inputStrView.data(), inputStrView.length()); - auto find = StringData(findStrView.data(), findStrView.length()); - auto replacement = StringData(replacementStrView.data(), replacementStrView.length()); - // If find string is not found, return the original string. size_t startIndex = input.find(find); if (startIndex == std::string::npos) { @@ -1182,8 +1175,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinReplaceOne(Arit output << input.substr(endIndex); auto strData = output.stringData(); - auto [outputStrTypeTag, outputStrValue] = - sbe::value::makeNewString({strData.rawData(), strData.size()}); + auto [outputStrTypeTag, outputStrValue] = sbe::value::makeNewString(strData); return {true, outputStrTypeTag, outputStrValue}; } @@ -1321,9 +1313,7 @@ std::tuple<bool, value::TypeTags, value::Value> builtinDateHelper( invariant(timeZoneDB); auto tzString = value::getStringView(typeTagTz, valueTz); - const auto tz = tzString == "" - ? timeZoneDB->utcZone() - : timeZoneDB->getTimeZone(StringData{tzString.data(), tzString.size()}); + const auto tz = tzString == "" ? timeZoneDB->utcZone() : timeZoneDB->getTimeZone(tzString); auto date = computeDateFn(tz, @@ -1858,8 +1848,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinConcat(ArityTyp if (!value::isString(tag)) { return {false, value::TypeTags::Nothing, 0}; } - auto sv = sbe::value::getStringView(tag, value); - result << StringData{sv.data(), sv.size()}; + result << sbe::value::getStringView(tag, value); } auto [strTag, strValue] = sbe::value::makeNewString(result.str()); @@ -1956,7 +1945,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIndexOfBytes(Ar return {false, value::TypeTags::Nothing, 0}; } // Check for valid bounds. - if (static_cast<size_t>(startIndex) > str.length()) { + if (static_cast<size_t>(startIndex) > str.size()) { return {false, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-1)}; } } @@ -2003,7 +1992,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIndexOfCP(Arity return {false, value::TypeTags::Nothing, 0}; } // Check for valid bounds. - if (static_cast<size_t>(startCodePointIndex) > str.length()) { + if (static_cast<size_t>(startCodePointIndex) > str.size()) { return {false, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(-1)}; } } @@ -2044,7 +2033,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIndexOfCP(Arity byteIndex = startByteIndex; for (codePointIndex = startCodePointIndex; codePointIndex < endCodePointIndex; ++codePointIndex) { - if (str.compare(byteIndex, substr.size(), substr) == 0) { + if (str.substr(byteIndex, substr.size()).compare(substr) == 0) { return { false, value::TypeTags::NumberInt32, value::bitcastFrom<int32_t>(codePointIndex)}; } @@ -2088,7 +2077,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIsTimezone(Arit return {false, value::TypeTags::Boolean, false}; } auto timezoneStr = value::getStringView(timezoneTag, timezoneVal); - if (timezoneDB->isTimeZoneIdentifier((StringData{timezoneStr.data(), timezoneStr.size()}))) { + if (timezoneDB->isTimeZoneIdentifier(timezoneStr)) { return {false, value::TypeTags::Boolean, true}; } return {false, value::TypeTags::Boolean, false}; @@ -2322,7 +2311,7 @@ namespace { * ...} from the result of pcre_exec(). */ std::tuple<bool, value::TypeTags, value::Value> buildRegexMatchResultObject( - std::string_view inputString, + StringData inputString, const std::vector<int>& capturesBuffer, size_t numCaptures, uint32_t& startBytePos, @@ -2419,7 +2408,7 @@ std::tuple<bool, value::TypeTags, value::Value> buildRegexMatchResultObject( * returned is true/false. */ std::tuple<bool, value::TypeTags, value::Value> pcreNextMatch(value::PcreRegex* pcre, - std::string_view inputString, + StringData inputString, std::vector<int>& capturesBuffer, uint32_t& startBytePos, uint32_t& codePointPos, @@ -2454,7 +2443,7 @@ std::tuple<bool, value::TypeTags, value::Value> pcreNextMatch(value::PcreRegex* */ std::tuple<bool, value::TypeTags, value::Value> pcreFirstMatch( value::PcreRegex* pcre, - std::string_view inputString, + StringData inputString, bool isMatch = false, std::vector<int>* capturesBuffer = nullptr, uint32_t* startBytePos = nullptr, @@ -2507,16 +2496,15 @@ std::pair<value::TypeTags, value::Value> collComparisonKey(value::TypeTags tag, // For strings, call CollatorInterface::getComparisonKey() to obtain the comparison key. if (value::isString(tag)) { - auto sv = value::getStringView(tag, val); - auto compKey = collator->getComparisonKey(StringData{sv.data(), sv.size()}); + auto compKey = collator->getComparisonKey(value::getStringView(tag, val)); auto keyData = compKey.getKeyData(); - return value::makeNewString(std::string_view{keyData.rawData(), keyData.size()}); + return value::makeNewString(keyData); } // For collatable types other than strings (such as arrays and objects), we take the slow // path and round-trip the value through BSON. BSONObjBuilder input; - bson::appendValueToBsonObj<BSONObjBuilder>(input, ""sv, tag, val); + bson::appendValueToBsonObj<BSONObjBuilder>(input, ""_sd, tag, val); BSONObjBuilder output; CollationIndexKey::collationAwareIndexKeyAppend(input.obj().firstElement(), collator, &output); @@ -2625,8 +2613,8 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinRegexFindAll(Ar startBytePos += str::getCodePointLength(inputString[startBytePos]); ++codePointPos; } else { - startBytePos += matchString.length(); - for (size_t byteIdx = 0; byteIdx < matchString.length(); ++codePointPos) { + startBytePos += matchString.size(); + for (size_t byteIdx = 0; byteIdx < matchString.size(); ++codePointPos) { byteIdx += str::getCodePointLength(matchString[byteIdx]); } } @@ -2801,7 +2789,7 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinHasNullBytes(Ar } auto stringView = value::getStringView(strType, strValue); - auto hasNullBytes = stringView.find('\0') != std::string_view::npos; + auto hasNullBytes = stringView.find('\0') != std::string::npos; return {false, value::TypeTags::Boolean, value::bitcastFrom<bool>(hasNullBytes)}; } diff --git a/src/mongo/db/exec/sbe/vm/vm.h b/src/mongo/db/exec/sbe/vm/vm.h index b98f3261d12..1d11e835858 100644 --- a/src/mongo/db/exec/sbe/vm/vm.h +++ b/src/mongo/db/exec/sbe/vm/vm.h @@ -79,10 +79,8 @@ std::pair<value::TypeTags, value::Value> genericCompare( auto lhsStr = getStringView(lhsTag, lhsValue); auto rhsStr = getStringView(rhsTag, rhsValue); - auto result = op(comparator ? comparator->compare(StringData{lhsStr.data(), lhsStr.size()}, - StringData{rhsStr.data(), rhsStr.size()}) - : lhsStr.compare(rhsStr), - 0); + auto result = + op(comparator ? comparator->compare(lhsStr, rhsStr) : lhsStr.compare(rhsStr), 0); return {value::TypeTags::Boolean, value::bitcastFrom<bool>(result)}; } else if (lhsTag == value::TypeTags::Date && rhsTag == value::TypeTags::Date) { |