From 1040c746da55b24f02f3f9715e91c57aeeccc8e6 Mon Sep 17 00:00:00 2001 From: Davis Haupt Date: Mon, 5 Dec 2022 22:25:27 +0000 Subject: SERVER-25823 add bitwise AND, OR, XOR to the agg language --- src/mongo/db/exec/document_value/value.cpp | 21 +++++++++++++++++++++ src/mongo/db/exec/document_value/value.h | 4 ++++ 2 files changed, 25 insertions(+) (limited to 'src/mongo/db/exec') diff --git a/src/mongo/db/exec/document_value/value.cpp b/src/mongo/db/exec/document_value/value.cpp index 97573281dbb..ccb612032f1 100644 --- a/src/mongo/db/exec/document_value/value.cpp +++ b/src/mongo/db/exec/document_value/value.cpp @@ -285,6 +285,27 @@ Value::Value(const vector& vec) : _storage(Array) { _storage.putVector(std::move(storageVec)); } +Value::Value(const SafeNum& value) : _storage(value.type()) { + switch (value.type()) { + case EOO: + break; + case NumberInt: + _storage.intValue = value._value.int32Val; + break; + case NumberLong: + _storage.longValue = value._value.int64Val; + break; + case NumberDouble: + _storage.doubleValue = value._value.doubleVal; + break; + case NumberDecimal: + _storage.putDecimal(Decimal128(value._value.decimalVal)); + break; + default: + MONGO_UNREACHABLE; + } +} + Value Value::createIntOrLong(long long longValue) { int intValue = longValue; if (intValue != longValue) { diff --git a/src/mongo/db/exec/document_value/value.h b/src/mongo/db/exec/document_value/value.h index 7da4b971c34..ab2e2c02934 100644 --- a/src/mongo/db/exec/document_value/value.h +++ b/src/mongo/db/exec/document_value/value.h @@ -33,6 +33,7 @@ #include "mongo/base/string_data.h" #include "mongo/db/exec/document_value/value_internal.h" #include "mongo/util/concepts.h" +#include "mongo/util/safe_num.h" #include "mongo/util/uuid.h" namespace mongo { @@ -146,6 +147,9 @@ public: /// Deep-convert from BSONElement to Value explicit Value(const BSONElement& elem); + /// Create a value from a SafeNum. + explicit Value(const SafeNum& value); + /** Construct a long or integer-valued Value. * -- cgit v1.2.1