FormatTokenizationResult IsoSqlFormatTokenizer::CheckIncompatibilities()

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;
}