{"record":{"id":"3bbc058831be76cd","repo":"prestodb/presto","slug":"invalid-year-month-interval-qualifier-to","errorCode":null,"errorMessage":"Invalid year month interval qualifier:  to ","messagePattern":"Invalid year month interval qualifier:  to ","errorType":"error_code","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/util/DateTimeUtils.java","lineNumber":524,"sourceCode":"    }\n\n    public static long parseYearMonthInterval(String value, IntervalField startField, Optional<IntervalField> endField)\n    {\n        IntervalField end = endField.orElse(startField);\n\n        if (startField == IntervalField.YEAR && end == IntervalField.MONTH) {\n            PeriodFormatter periodFormatter = INTERVAL_YEAR_MONTH_FORMATTER;\n            return parsePeriodMonths(value, periodFormatter, startField, end);\n        }\n        if (startField == IntervalField.YEAR && end == IntervalField.YEAR) {\n            return parsePeriodMonths(value, INTERVAL_YEAR_FORMATTER, startField, end);\n        }\n\n        if (startField == IntervalField.MONTH && end == IntervalField.MONTH) {\n            return parsePeriodMonths(value, INTERVAL_MONTH_FORMATTER, startField, end);\n        }\n\n        throw new IllegalArgumentException(\"Invalid year month interval qualifier: \" + startField + \" to \" + end);\n    }\n\n    private static long parsePeriodMonths(String value, PeriodFormatter periodFormatter, IntervalField startField, IntervalField endField)\n    {\n        try {\n            Period period = parsePeriod(periodFormatter, value);\n            return IntervalYearMonth.toMonths(\n                    period.getValue(YEAR_FIELD),\n                    period.getValue(MONTH_FIELD));\n        }\n        catch (IllegalArgumentException e) {\n            throw invalidInterval(e, value, startField, endField);\n        }\n    }\n\n    private static Period parsePeriod(PeriodFormatter periodFormatter, String value)\n    {\n        boolean negative = value.startsWith(\"-\");","sourceCodeStart":506,"sourceCodeEnd":542,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/util/DateTimeUtils.java#L506-L542","documentation":"DateTimeUtils.parseYearMonthInterval parses YEAR–MONTH range interval literals (e.g. INTERVAL '2-6' YEAR TO MONTH). Only YEAR, YEAR TO MONTH, and MONTH qualifiers are legal; any other start/end combination throws this IllegalArgumentException naming the invalid qualifier pair.","triggerScenarios":"Calling parseYearMonthInterval with day/time fields (e.g. startField=DAY or end=SECOND), which belong to the DAY–SECOND parser, or a nonsensical combination like MONTH TO YEAR.","commonSituations":"Routing mistakes where a DAY TO SECOND literal is sent to the year-month parser; user SQL like INTERVAL '1-2' DAY TO HOUR incorrectly typed; code building interval qualifiers dynamically from config without validation.","solutions":["Ensure the qualifier is YEAR, YEAR TO MONTH, or MONTH and the value matches (e.g. '2-6')","Route DAY/HOUR/MINUTE/SECOND combinations to parseDayTimeInterval instead","Validate the qualifier string against the allowed set before invoking the parser","Fix reversed fields such as MONTH TO YEAR — Presto requires start <= end in the field hierarchy"],"exampleFix":"-- before\nINTERVAL '1-2' MONTH TO YEAR\n-- after\nINTERVAL '1-2' YEAR TO MONTH","handlingStrategy":"validation","validationCode":"boolean valid = (start == IntervalField.YEAR && (end == IntervalField.YEAR || end == IntervalField.MONTH)) || (start == IntervalField.MONTH && end == IntervalField.MONTH);","typeGuard":null,"tryCatchPattern":"try { return parseYearMonthInterval(value, start, end); } catch (IllegalArgumentException e) { return parseDayTimeInterval(value, start, end); }","preventionTips":["Only YEAR, YEAR TO MONTH, MONTH qualifiers belong here","Never pass DAY/HOUR/MINUTE/SECOND fields to this parser","Reject reversed qualifiers like MONTH TO YEAR at the grammar/config layer"],"tags":["presto","interval","parsing","datetime"],"backgroundTag":"invalid-interval-qualifier","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}