public static boolean valueMatchesType()

in core/src/main/java/org/apache/calcite/rex/RexLiteral.java [312:407]


  public static boolean valueMatchesType(
      @Nullable Comparable value,
      SqlTypeName typeName,
      boolean strict) {
    if (value == null) {
      return true;
    }
    switch (typeName) {
    case UUID:
      return value instanceof UUID;
    case VARIANT:
      return value instanceof VariantValue;
    case BOOLEAN:
      // Unlike SqlLiteral, we do not allow boolean null.
      return value instanceof Boolean;
    case NULL:
      return false; // value should have been null
    case INTEGER: // not allowed -- use Decimal
    case TINYINT:
    case SMALLINT:
      if (strict) {
        throw Util.unexpected(typeName);
      }
      // fall through
    case DECIMAL:
    case BIGINT:
      return value instanceof BigDecimal;
    case DOUBLE:
    case FLOAT:
    case REAL:
      return value instanceof Double;
    case DATE:
      return value instanceof DateString;
    case TIME:
    case TIME_WITH_LOCAL_TIME_ZONE:
      return value instanceof TimeString;
    case TIME_TZ:
      return value instanceof TimeWithTimeZoneString;
    case TIMESTAMP:
    case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
      return value instanceof TimestampString;
    case TIMESTAMP_TZ:
      return value instanceof TimestampWithTimeZoneString;
    case INTERVAL_YEAR:
    case INTERVAL_YEAR_MONTH:
    case INTERVAL_MONTH:
    case INTERVAL_DAY:
    case INTERVAL_DAY_HOUR:
    case INTERVAL_DAY_MINUTE:
    case INTERVAL_DAY_SECOND:
    case INTERVAL_HOUR:
    case INTERVAL_HOUR_MINUTE:
    case INTERVAL_HOUR_SECOND:
    case INTERVAL_MINUTE:
    case INTERVAL_MINUTE_SECOND:
    case INTERVAL_SECOND:
      // The value of a DAY-TIME interval (whatever the start and end units,
      // even say HOUR TO MINUTE) is in milliseconds (perhaps fractional
      // milliseconds). The value of a YEAR-MONTH interval is in months.
      return value instanceof BigDecimal;
    case VARBINARY: // not allowed -- use Binary
      if (strict) {
        throw Util.unexpected(typeName);
      }
      // fall through
    case BINARY:
      return value instanceof ByteString;
    case VARCHAR: // not allowed -- use Char
      if (strict) {
        throw Util.unexpected(typeName);
      }
      // fall through
    case CHAR:
      // A SqlLiteral's charset and collation are optional; not so a
      // RexLiteral.
      return (value instanceof NlsString)
          && (((NlsString) value).getCharset() != null)
          && (((NlsString) value).getCollation() != null);
    case SARG:
      return value instanceof Sarg;
    case SYMBOL:
      return value instanceof Enum;
    case ROW:
    case ARRAY:
    case MULTISET:
      return value instanceof List;
    case GEOMETRY:
      return value instanceof Geometry;
    case ANY:
      // Literal of type ANY is not legal. "CAST(2 AS ANY)" remains
      // an integer literal surrounded by a cast function.
      return false;
    default:
      throw Util.unexpected(typeName);
    }
  }