summaryrefslogtreecommitdiff
path: root/src/mongo/db/exec/sbe/vm/vm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/exec/sbe/vm/vm.cpp')
-rw-r--r--src/mongo/db/exec/sbe/vm/vm.cpp72
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: