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