prestodb/presto · error · PrestoException
INVALID_CAST_ARGUMENT
INVALID_CAST_ARGUMENT
Error message
Value cannot be cast to date:
What it means
Thrown when casting a VARCHAR value to DATE: castFromSlice parses the trimmed string with parseDate and wraps IllegalArgumentException in INVALID_CAST_ARGUMENT. It means the text is not in a recognized date format (e.g. not YYYY-MM-DD) or represents an invalid calendar date.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/type/DateOperators.java:161
@ScalarOperator(CAST)
@LiteralParameters("x")
@SqlType("varchar(x)")
public static Slice castToSlice(@SqlType(StandardTypes.DATE) long value)
{
return utf8Slice(printDate((int) value));
}
@ScalarFunction("date")
@ScalarOperator(CAST)
@LiteralParameters("x")
@SqlType(StandardTypes.DATE)
public static long castFromSlice(@SqlType("varchar(x)") Slice value)
{
try {
return parseDate(trim(value).toStringUtf8());
}
catch (IllegalArgumentException e) {
throw new PrestoException(INVALID_CAST_ARGUMENT, "Value cannot be cast to date: " + value.toStringUtf8(), e);
}
}
@ScalarOperator(HASH_CODE)
@SqlType(StandardTypes.BIGINT)
public static long hashCode(@SqlType(StandardTypes.DATE) long value)
{
return AbstractIntType.hash((int) value);
}
@ScalarOperator(IS_DISTINCT_FROM)
public static class DateDistinctFromOperator
{
@SqlType(StandardTypes.BOOLEAN)
public static boolean isDistinctFrom(
@SqlType(StandardTypes.DATE) long left,
@IsNull boolean leftNull,
@SqlType(StandardTypes.DATE) long right,View on GitHub (pinned to 55bb57d202)
Solutions
- Normalize the string to ISO format YYYY-MM-DD before casting (date_parse/substr/regexp).
- Use TRY_CAST(varchar_col AS DATE) to get NULL for bad rows and audit them.
- Use parse_datetime with an explicit format specifier matching the source data.
- Trim/strip time components if values look like '2026-09-04 12:00:00'.
Example fix
// before SELECT CAST(date_str AS DATE) FROM t; // after SELECT TRY_CAST(date_parse(date_str, '%Y/%m/%d') AS DATE) FROM t;
Defensive patterns
Strategy: validation
Validate before calling
-- pre-validate before casting
SELECT * FROM t
WHERE NOT regexp_like(trim(date_str), '^\d{4}-\d{2}-\d{2}$'); Type guard
boolean isIsoDate(String s) { return s != null && s.trim().matches("\\d{4}-\\d{2}-\\d{2}"); } Try / catch
try { long d = DateOperators.castFromSlice(slice); } catch (PrestoException e) { /* INVALID_CAST_ARGUMENT: route row to quarantine */ } Prevention
- Standardize date storage on ISO YYYY-MM-DD.
- Use TRY_CAST plus a NULL audit for mixed-format sources.
- Prefer parse_datetime with explicit format for non-ISO inputs.
When it happens
Trigger: CAST(varchar_col AS DATE) where the string is empty, wrongly formatted ('2026/09/04', 'Sep 4 2026', '2026-13-40'), or contains extra characters.
Common situations: CSV/text-borne date columns with mixed formats, locale-formatted dates, or dates stored with timestamps appended.
Related errors
- INVALID_CAST_ARGUMENT
- INVALID_CAST_ARGUMENT
- INVALID_CAST_ARGUMENT
- INVALID_FUNCTION_ARGUMENT
- INVALID_CAST_ARGUMENT
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/27dd719221463718.
Report an issue: GitHub.