Github user hakanmemisoglu commented on a diff in the pull request: https://github.com/apache/incubator-quickstep/pull/98#discussion_r77751465 --- Diff: types/DatetimeLit.hpp --- @@ -51,53 +54,70 @@ struct DateLit { + 1 // - + 2; // Day + // Years should be between [-kMaxYear, +kMaxYear] inclusive both end. + static constexpr std::int32_t kMaxYear = 99999; + static constexpr std::uint8_t kBitsNeededForDay = 5u; + static constexpr std::uint8_t kBitsNeededForMonth = 4u; + static DateLit Create(const std::int32_t _year, const std::uint8_t _month, const std::uint8_t _day) { DateLit date; - date.year = _year; - date.month = _month; - date.day = _day; + // Normalize year by adding kMaxYear value, because we try to + // encode signed year value into an unsigned integer. --- End diff -- **L125** `std::int32_t result_year = lhs.yearField() + (rhs.months / 12);` **L126** `std::uint8_t result_month = static_cast<std::uint8_t>(lhs.monthField()) + (rhs.months % 12);` **L134** `ClampDayOfMonth(result_year, result_month, lhs.dayField()));` - Access to the struct happens via these methods (yearField(), monthField() etc...) that decodes from representation (normalized and shifted) to the year value (which is -2000 in your example). - After the operation + is done, and the check is applied. - The result year, month, day is calculated and given to `DateLit::Create()` - `DateLit::Create()`encodes the real values to the unified representation. I might be missing something, but does the execution above make sense?
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---