in be/src/runtime/datetime-iso-sql-format-tokenizer.cc [201:300]
FormatTokenizationResult IsoSqlFormatTokenizer::CheckIncompatibilities() const {
DCHECK(dt_ctx_ != nullptr);
if (!dt_ctx_->has_date_toks && !dt_ctx_->has_time_toks) return NO_DATETIME_TOKENS_ERROR;
if (cast_mode_ == FORMAT) {
if (IsUsedToken("TZH") || IsUsedToken("TZM")) {
return TIMEZONE_OFFSET_NOT_ALLOWED_ERROR;
}
return SUCCESS;
}
DCHECK(cast_mode_ == PARSE);
if(!dt_ctx_->has_date_toks) return NO_DATE_TOKENS_ERROR;
short provided_year_count = IsUsedToken("YYYY") + IsUsedToken("YYY") +
IsUsedToken("YY") + IsUsedToken("Y");
short provided_round_year_count = IsUsedToken("RRRR") + IsUsedToken("RR");
short provided_iso8601_week_numbering_year_count = IsUsedToken("IYYY") +
IsUsedToken("IYY") + IsUsedToken("IY") + IsUsedToken("I");
if (provided_year_count > 1 || provided_round_year_count > 1 ||
provided_iso8601_week_numbering_year_count > 1) {
return CONFLICTING_YEAR_TOKENS_ERROR;
}
if (provided_year_count == 1 && provided_round_year_count == 1) {
return YEAR_WITH_ROUNDED_YEAR_ERROR;
}
if (IsUsedToken("Q")) return QUARTER_NOT_ALLOWED_FOR_PARSING;
if (IsUsedToken("WW") || IsUsedToken("W")) return WEEK_NUMBER_NOT_ALLOWED_FOR_PARSING;
short provided_month_count = IsUsedToken("MM") + IsUsedToken("MONTH")
+ IsUsedToken("MON");
if (provided_month_count > 1) return CONFLICTING_MONTH_TOKENS_ERROR;
bool is_used_day_of_year = IsUsedToken("DDD");
bool is_used_day_of_month = IsUsedToken("DD");
if (is_used_day_of_year && (is_used_day_of_month || provided_month_count == 1)) {
return DAY_OF_YEAR_TOKEN_CONFLICT;
}
if (IsUsedToken("D")) return DAY_OF_WEEK_NOT_ALLOWED_FOR_PARSING;
short provided_hour_tokens = IsUsedToken("HH") + IsUsedToken("HH12") +
IsUsedToken("HH24");
if (provided_hour_tokens > 1) {
return CONFLICTING_HOUR_TOKENS_ERROR;
}
short provided_median_tokens = IsUsedToken("AM") + IsUsedToken("A.M.") +
IsUsedToken("PM") + IsUsedToken("P.M.");
if (provided_median_tokens > 1) return CONFLICTING_MERIDIEM_TOKENS_ERROR;
if (IsMeridiemIndicatorProvided() && IsUsedToken("HH24")) {
return MERIDIEM_CONFLICTS_WITH_HOUR_ERROR;
}
if (IsMeridiemIndicatorProvided() && !IsUsedToken("HH") && !IsUsedToken("HH12")) {
return MISSING_HOUR_TOKEN_ERROR;
}
if (IsUsedToken("SSSSS") &&
(IsUsedToken("HH") || IsUsedToken("HH12") || IsUsedToken("HH24") ||
IsUsedToken("MI") || IsUsedToken("SS") || IsMeridiemIndicatorProvided())) {
return SECOND_IN_DAY_CONFLICT;
}
if (IsUsedToken("TZM") && !IsUsedToken("TZH")) return MISSING_TZH_TOKEN_ERROR;
short provided_fractional_second_count = IsUsedToken("FF") + IsUsedToken("FF1") +
IsUsedToken("FF2") + IsUsedToken("FF3") + IsUsedToken("FF4") + IsUsedToken("FF5") +
IsUsedToken("FF6") + IsUsedToken("FF7") + IsUsedToken("FF8") + IsUsedToken("FF9");
if (provided_fractional_second_count > 1) {
return CONFLICTING_FRACTIONAL_SECOND_TOKENS_ERROR;
}
short provided_day_of_week_count = IsUsedToken("ID") + IsUsedToken("DAY") +
IsUsedToken("DY");
if (provided_day_of_week_count > 1) return CONFLICTING_DAY_OF_WEEK_TOKENS_ERROR;
bool is_used_iso8601_week_of_year = IsUsedToken("IW");
if (provided_iso8601_week_numbering_year_count == 1 || is_used_iso8601_week_of_year ||
provided_day_of_week_count == 1) {
if (provided_year_count == 1 || provided_round_year_count == 1 ||
provided_month_count == 1 || is_used_day_of_year || is_used_day_of_month) {
if (IsUsedToken("DAY") || IsUsedToken("DY")) {
return DAY_NAME_NOT_ALLOWED_FOR_PARSING;
}
return CONFLICTING_DATE_TOKENS_ERROR;
}
if (provided_iso8601_week_numbering_year_count == 0 ||
!is_used_iso8601_week_of_year || provided_day_of_week_count == 0) {
return MISSING_ISO8601_WEEK_BASED_TOKEN_ERROR;
}
}
return SUCCESS;
}