diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-18 17:02:53 -0300 |
| commit | 959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch) | |
| tree | acc8d60aedb12b70048e676e8a7349deb0010db8 /src/mongo/db/exec/sbe/values | |
| parent | 76588293975fc059cf076779e4283e6ffaf8afff (diff) | |
New upstream version 6.0.20upstream
Diffstat (limited to 'src/mongo/db/exec/sbe/values')
| -rw-r--r-- | src/mongo/db/exec/sbe/values/slot.cpp | 24 | ||||
| -rw-r--r-- | src/mongo/db/exec/sbe/values/value_builder.h | 14 | ||||
| -rw-r--r-- | src/mongo/db/exec/sbe/values/value_serialization_test.cpp | 13 |
3 files changed, 30 insertions, 21 deletions
diff --git a/src/mongo/db/exec/sbe/values/slot.cpp b/src/mongo/db/exec/sbe/values/slot.cpp index 2dd622fcecb..cb53de849ac 100644 --- a/src/mongo/db/exec/sbe/values/slot.cpp +++ b/src/mongo/db/exec/sbe/values/slot.cpp @@ -271,7 +271,7 @@ static void serializeValue(BufBuilder& buf, TypeTags tag, Value val) { case TypeTags::StringSmall: { // Small strings cannot contain null bytes, so it is safe to serialize them as plain // C-strings with a null terminator. - buf.appendStr(getStringView(tag, val), true /* includeEndingNull */); + buf.appendCStr(getStringView(tag, val)); break; } case TypeTags::StringBig: @@ -279,7 +279,7 @@ static void serializeValue(BufBuilder& buf, TypeTags tag, Value val) { case TypeTags::bsonSymbol: { auto sv = getStringOrSymbolView(tag, val); buf.appendNum(static_cast<uint32_t>(sv.size())); - buf.appendStr(sv, false /* includeEndingNull */); + buf.appendStrBytes(sv); break; } case TypeTags::Array: { @@ -309,7 +309,7 @@ static void serializeValue(BufBuilder& buf, TypeTags tag, Value val) { auto obj = getObjectView(val); buf.appendNum(obj->size()); for (size_t idx = 0; idx < obj->size(); ++idx) { - buf.appendStr(obj->field(idx), true /* includeEndingNull */); + buf.appendCStr(obj->field(idx)); auto [tag, val] = obj->getAt(idx); serializeValue(buf, tag, val); } @@ -352,27 +352,27 @@ static void serializeValue(BufBuilder& buf, TypeTags tag, Value val) { } case TypeTags::bsonRegex: { auto regex = getBsonRegexView(val); - buf.appendStr(regex.pattern, true /* includeEndingNull */); - buf.appendStr(regex.flags, true /* includeEndingNull */); + buf.appendCStr(regex.pattern); + buf.appendCStr(regex.flags); break; } case TypeTags::bsonJavascript: { auto javascriptCode = getBsonJavascriptView(val); buf.appendNum(static_cast<uint32_t>(javascriptCode.size())); - buf.appendStr(javascriptCode, false /* includeEndingNull */); + buf.appendStrBytes(javascriptCode); break; } case TypeTags::bsonDBPointer: { auto dbptr = getBsonDBPointerView(val); buf.appendNum(static_cast<uint32_t>(dbptr.ns.size())); - buf.appendStr(dbptr.ns, false /* includeEndingNull */); + buf.appendStrBytes(dbptr.ns); buf.appendBuf(dbptr.id, sizeof(ObjectIdType)); break; } case TypeTags::bsonCodeWScope: { auto cws = getBsonCodeWScopeView(val); buf.appendNum(static_cast<uint32_t>(cws.code.size())); - buf.appendStr(cws.code, false /* includeEndingNull */); + buf.appendStrBytes(cws.code); auto scopeLen = ConstDataView(cws.scope).read<LittleEndian<uint32_t>>(); buf.appendBuf(cws.scope, scopeLen); break; @@ -507,9 +507,10 @@ static void serializeValueIntoKeyString(KeyString::Builder& buf, } break; } + case TypeTags::bsonObjectId: case TypeTags::ObjectId: { buf.appendBool(true); - buf.appendBytes(getObjectIdView(val), sizeof(ObjectIdType)); + buf.appendOID(OID::from(getRawPointerView(val))); break; } case TypeTags::bsonObject: { @@ -532,11 +533,6 @@ static void serializeValueIntoKeyString(KeyString::Builder& buf, } break; } - case TypeTags::bsonObjectId: { - buf.appendBool(true); - buf.appendOID(OID::from(getRawPointerView(val))); - break; - } case TypeTags::bsonBinData: { BufBuilder innerBinDataBuf; innerBinDataBuf.appendUChar(static_cast<uint8_t>(tag)); diff --git a/src/mongo/db/exec/sbe/values/value_builder.h b/src/mongo/db/exec/sbe/values/value_builder.h index 00333e9f824..53748519723 100644 --- a/src/mongo/db/exec/sbe/values/value_builder.h +++ b/src/mongo/db/exec/sbe/values/value_builder.h @@ -112,21 +112,21 @@ public: } else { appendValueBufferOffset(TypeTags::StringBig); _valueBufferBuilder->appendNum(static_cast<int32_t>(in.size() + 1)); - _valueBufferBuilder->appendStr(in, true /* includeEndingNull */); + _valueBufferBuilder->appendStrBytesAndNul(in); } } void append(const BSONSymbol& in) { appendValueBufferOffset(TypeTags::bsonSymbol); _valueBufferBuilder->appendNum(static_cast<int32_t>(in.symbol.size() + 1)); - _valueBufferBuilder->appendStr(in.symbol, true /* includeEndingNull */); + _valueBufferBuilder->appendStrBytesAndNul(in.symbol); } void append(const BSONCode& in) { appendValueBufferOffset(TypeTags::bsonJavascript); // Add one to account null byte at the end. _valueBufferBuilder->appendNum(static_cast<uint32_t>(in.code.size() + 1)); - _valueBufferBuilder->appendStr(in.code, true /* includeEndingNull */); + _valueBufferBuilder->appendStrBytesAndNul(in.code); } void append(const BSONCodeWScope& in) { @@ -134,7 +134,7 @@ public: _valueBufferBuilder->appendNum( static_cast<uint32_t>(4 + in.code.size() + 1 + in.scope.objsize())); _valueBufferBuilder->appendNum(static_cast<int32_t>(in.code.size() + 1)); - _valueBufferBuilder->appendStr(in.code, true /* includeEndingNull */); + _valueBufferBuilder->appendStrBytesAndNul(in.code); _valueBufferBuilder->appendBuf(in.scope.objdata(), in.scope.objsize()); } @@ -147,14 +147,14 @@ public: void append(const BSONRegEx& in) { appendValueBufferOffset(TypeTags::bsonRegex); - _valueBufferBuilder->appendStr(in.pattern, true /* includeEndingNull */); - _valueBufferBuilder->appendStr(in.flags, true /* includeEndingNull */); + _valueBufferBuilder->appendCStr(in.pattern); + _valueBufferBuilder->appendCStr(in.flags); } void append(const BSONDBRef& in) { appendValueBufferOffset(TypeTags::bsonDBPointer); _valueBufferBuilder->appendNum(static_cast<int32_t>(in.ns.size() + 1)); - _valueBufferBuilder->appendStr(in.ns, true /* includeEndingNull */); + _valueBufferBuilder->appendStrBytesAndNul(in.ns); _valueBufferBuilder->appendBuf(in.oid.view().view(), OID::kOIDSize); } diff --git a/src/mongo/db/exec/sbe/values/value_serialization_test.cpp b/src/mongo/db/exec/sbe/values/value_serialization_test.cpp index 3be3212c627..ceacf610a4a 100644 --- a/src/mongo/db/exec/sbe/values/value_serialization_test.cpp +++ b/src/mongo/db/exec/sbe/values/value_serialization_test.cpp @@ -467,4 +467,17 @@ TEST_F(ValueSerializeForKeyString, RoundtripWideRow) { } runTest(row); } + +// Test that roundtripping through KeyString works for ObjectIdType: ObjectId; bsonObjectId. +TEST_F(ValueSerializeForKeyString, RoundtripObjectIdType) { + auto [objectIdTag, objectIdVal] = value::makeNewObjectId(); + + auto oid = OID::gen(); + auto obj = BSON("" << oid); + auto oidStorage = obj.firstElement().value(); + + sbe::value::ValueGuard testDataGuard{objectIdTag, objectIdVal}; + runTest({{objectIdTag, objectIdVal}, + {value::TypeTags::bsonObjectId, value::bitcastFrom<const char*>(oidStorage)}}); +} } // namespace mongo::sbe |
