diff options
author | Nikita Lapkov <nikita.lapkov@mongodb.com> | 2021-02-15 19:09:57 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-02-22 13:08:24 +0000 |
commit | 7ac3e9f1eb151aced254814767c965ea468a7f74 (patch) | |
tree | 2ba813994d66c753636fe515c9b7a5f8033a0356 /src/mongo/db/exec/sbe/values/slot.cpp | |
parent | 042dfa405eea58ff735e338688ffa9f3fd8bbaf0 (diff) | |
download | mongo-7ac3e9f1eb151aced254814767c965ea468a7f74.tar.gz |
SERVER-54492 Support BSONType::Code in SBE
Diffstat (limited to 'src/mongo/db/exec/sbe/values/slot.cpp')
-rw-r--r-- | src/mongo/db/exec/sbe/values/slot.cpp | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/src/mongo/db/exec/sbe/values/slot.cpp b/src/mongo/db/exec/sbe/values/slot.cpp index 73dd4ee9564..e11727d8cf0 100644 --- a/src/mongo/db/exec/sbe/values/slot.cpp +++ b/src/mongo/db/exec/sbe/values/slot.cpp @@ -72,13 +72,15 @@ static std::pair<TypeTags, Value> deserializeTagVal(BufReader& buf) { case TypeTags::bsonUndefined: val = 0; break; - case TypeTags::StringSmall: + case TypeTags::StringSmall: { + std::tie(tag, val) = makeNewString(buf.readCStr()); + break; + } case TypeTags::StringBig: case TypeTags::bsonString: { - auto str = buf.readCStr(); - auto [strTag, strVal] = makeNewString({str.rawData(), str.size()}); - tag = strTag; - val = strVal; + auto stringLength = buf.read<LittleEndian<uint32_t>>(); + auto stringStart = reinterpret_cast<const char*>(buf.skip(stringLength)); + std::tie(tag, val) = makeNewString({stringStart, stringLength}); break; } case TypeTags::Array: { @@ -156,9 +158,13 @@ static std::pair<TypeTags, Value> deserializeTagVal(BufReader& buf) { case TypeTags::bsonRegex: { auto pattern = buf.readCStr(); auto flags = buf.readCStr(); - BsonRegex bsonRegex{pattern, flags}; - auto [_, strVal] = makeBigString(bsonRegex.dataView()); - val = strVal; + std::tie(tag, val) = value::makeCopyBsonRegex({pattern, flags}); + break; + } + case TypeTags::bsonJavascript: { + auto codeLength = buf.read<LittleEndian<uint32_t>>(); + auto codeStart = reinterpret_cast<const char*>(buf.skip(codeLength)); + std::tie(tag, val) = makeCopyBsonJavascript({codeStart, codeLength}); break; } default: @@ -217,11 +223,17 @@ static void serializeTagValue(BufBuilder& buf, TypeTags tag, Value val) { break; case TypeTags::bsonUndefined: break; - case TypeTags::StringSmall: + case TypeTags::StringSmall: { + // Small strings cannot contain null bytes, so it is safe to serialize them as plain + // C-strings. Null byte is implicitly added at the end by 'buf.appendStr'. + buf.appendStr(getStringView(tag, val)); + break; + } case TypeTags::StringBig: case TypeTags::bsonString: { auto sv = getStringView(tag, val); - buf.appendStr({sv.data(), sv.size()}); + buf.appendNum(static_cast<uint32_t>(sv.size())); + buf.appendStr(sv, false /* includeEndingNull */); break; } case TypeTags::Array: { @@ -292,6 +304,12 @@ static void serializeTagValue(BufBuilder& buf, TypeTags tag, Value val) { buf.appendStr(regex.flags); break; } + case TypeTags::bsonJavascript: { + auto javascriptCode = getBsonJavascriptView(val); + buf.appendNum(static_cast<uint32_t>(javascriptCode.size())); + buf.appendStr(javascriptCode, false /* includeEndingNull */); + break; + } default: MONGO_UNREACHABLE; } @@ -385,6 +403,11 @@ int getApproximateSize(TypeTags tag, Value val) { result += regex.byteSize(); break; } + case TypeTags::bsonJavascript: { + auto code = getBsonJavascriptView(val); + result += sizeof(uint32_t) + code.size() + sizeof(char); + break; + } default: MONGO_UNREACHABLE; } |