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

  1. Normalize the string to ISO format YYYY-MM-DD before casting (date_parse/substr/regexp).
  2. Use TRY_CAST(varchar_col AS DATE) to get NULL for bad rows and audit them.
  3. Use parse_datetime with an explicit format specifier matching the source data.
  4. 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

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


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/27dd719221463718. Report an issue: GitHub.