summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/sbe/values
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-18 17:02:53 -0300
commit959575a5ca598bf5f37fb5cebe7ed1d80d3d71f7 (patch)
treeacc8d60aedb12b70048e676e8a7349deb0010db8 /src/mongo/db/exec/sbe/values
parent76588293975fc059cf076779e4283e6ffaf8afff (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.cpp24
-rw-r--r--src/mongo/db/exec/sbe/values/value_builder.h14
-rw-r--r--src/mongo/db/exec/sbe/values/value_serialization_test.cpp13
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