diff options
Diffstat (limited to 'src/mongo/db/exec/sbe/vm/vm.cpp')
-rw-r--r-- | src/mongo/db/exec/sbe/vm/vm.cpp | 72 |
1 files changed, 37 insertions, 35 deletions
diff --git a/src/mongo/db/exec/sbe/vm/vm.cpp b/src/mongo/db/exec/sbe/vm/vm.cpp index 8848c87227e..4b2a0f9ce18 100644 --- a/src/mongo/db/exec/sbe/vm/vm.cpp +++ b/src/mongo/db/exec/sbe/vm/vm.cpp @@ -38,6 +38,7 @@ #include "mongo/bson/oid.h" #include "mongo/db/exec/sbe/values/bson.h" #include "mongo/db/exec/sbe/values/value.h" +#include "mongo/db/exec/sbe/vm/datetime.h" #include "mongo/db/query/datetime/date_time_support.h" #include "mongo/db/storage/key_string.h" #include "mongo/util/fail_point.h" @@ -1193,41 +1194,6 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinDateWeekYear(ui timezoneTuple); } -TimeZone getTimezone(value::TypeTags timezoneTag, - value::Value timezoneVal, - TimeZoneDatabase* timezoneDB) { - auto timezoneStr = value::getStringView(timezoneTag, timezoneVal); - if (timezoneStr == "") { - return timezoneDB->utcZone(); - } else { - return timezoneDB->getTimeZone(StringData{timezoneStr.data(), timezoneStr.size()}); - } -} - -Date_t getDate(value::TypeTags dateTag, value::Value dateVal) { - switch (dateTag) { - case value::TypeTags::Date: { - return Date_t::fromMillisSinceEpoch(value::bitcastTo<int64_t>(dateVal)); - } - case value::TypeTags::Timestamp: { - return Date_t::fromMillisSinceEpoch( - Timestamp(value::bitcastTo<uint64_t>(dateVal)).getSecs() * 1000LL); - } - case value::TypeTags::ObjectId: { - auto objIdBuf = value::getObjectIdView(dateVal); - auto objId = OID::from(objIdBuf); - return objId.asDateT(); - } - case value::TypeTags::bsonObjectId: { - auto objIdBuf = value::getRawPointerView(dateVal); - auto objId = OID::from(objIdBuf); - return objId.asDateT(); - } - default: - MONGO_UNREACHABLE; - } -} - std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinDateToParts(uint8_t arity) { auto [timezoneDBOwn, timezoneDBTag, timezoneDBVal] = getFromStack(0); if (timezoneDBTag != value::TypeTags::timeZoneDB) { @@ -1304,6 +1270,36 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinIsoDateToParts( return {true, dateObjTag, dateObjVal}; } +std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinDayOfYear(uint8_t arity) { + invariant(arity == 3); + + auto [timezoneDBOwn, timezoneDBTag, timezoneDBValue] = getFromStack(0); + auto [dateOwn, dateTag, dateValue] = getFromStack(1); + auto [timezoneOwn, timezoneTag, timezoneValue] = getFromStack(2); + return genericDayOfYear( + timezoneDBTag, timezoneDBValue, dateTag, dateValue, timezoneTag, timezoneValue); +} + +std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinDayOfMonth(uint8_t arity) { + invariant(arity == 3); + + auto [timezoneDBOwn, timezoneDBTag, timezoneDBValue] = getFromStack(0); + auto [dateOwn, dateTag, dateValue] = getFromStack(1); + auto [timezoneOwn, timezoneTag, timezoneValue] = getFromStack(2); + return genericDayOfMonth( + timezoneDBTag, timezoneDBValue, dateTag, dateValue, timezoneTag, timezoneValue); +} + +std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinDayOfWeek(uint8_t arity) { + invariant(arity == 3); + + auto [timezoneDBOwn, timezoneDBTag, timezoneDBValue] = getFromStack(0); + auto [dateOwn, dateTag, dateValue] = getFromStack(1); + auto [timezoneOwn, timezoneTag, timezoneValue] = getFromStack(2); + return genericDayOfWeek( + timezoneDBTag, timezoneDBValue, dateTag, dateValue, timezoneTag, timezoneValue); +} + std::tuple<bool, value::TypeTags, value::Value> ByteCode::builtinBitTestPosition(uint8_t arity) { invariant(arity == 3); @@ -1906,6 +1902,12 @@ std::tuple<bool, value::TypeTags, value::Value> ByteCode::dispatchBuiltin(Builti return builtinDateToParts(arity); case Builtin::isoDateToParts: return builtinIsoDateToParts(arity); + case Builtin::dayOfYear: + return builtinDayOfYear(arity); + case Builtin::dayOfMonth: + return builtinDayOfMonth(arity); + case Builtin::dayOfWeek: + return builtinDayOfWeek(arity); case Builtin::split: return builtinSplit(arity); case Builtin::regexMatch: |