{"record":{"id":"0388b40d97ee8747","repo":"prestodb/presto","slug":"invalid-day-second-interval-qualifier-to","errorCode":null,"errorMessage":"Invalid day second interval qualifier:  to ","messagePattern":"Invalid day second 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":489,"sourceCode":"        if (startField == IntervalField.HOUR && end == IntervalField.MINUTE) {\n            return parsePeriodMillis(INTERVAL_HOUR_MINUTE_FORMATTER, value, startField, end);\n        }\n        if (startField == IntervalField.HOUR && end == IntervalField.HOUR) {\n            return parsePeriodMillis(INTERVAL_HOUR_FORMATTER, value, startField, end);\n        }\n\n        if (startField == IntervalField.MINUTE && end == IntervalField.SECOND) {\n            return parsePeriodMillis(INTERVAL_MINUTE_SECOND_FORMATTER, value, startField, end);\n        }\n        if (startField == IntervalField.MINUTE && end == IntervalField.MINUTE) {\n            return parsePeriodMillis(INTERVAL_MINUTE_FORMATTER, value, startField, end);\n        }\n\n        if (startField == IntervalField.SECOND && end == IntervalField.SECOND) {\n            return parsePeriodMillis(INTERVAL_SECOND_FORMATTER, value, startField, end);\n        }\n\n        throw new IllegalArgumentException(\"Invalid day second interval qualifier: \" + startField + \" to \" + end);\n    }\n\n    public static long parsePeriodMillis(PeriodFormatter periodFormatter, String value, IntervalField startField, IntervalField endField)\n    {\n        try {\n            Period period = parsePeriod(periodFormatter, value);\n            return IntervalDayTime.toMillis(\n                    period.getValue(DAY_FIELD),\n                    period.getValue(HOUR_FIELD),\n                    period.getValue(MINUTE_FIELD),\n                    period.getValue(SECOND_FIELD),\n                    period.getValue(MILLIS_FIELD));\n        }\n        catch (IllegalArgumentException e) {\n            throw invalidInterval(e, value, startField, endField);\n        }\n    }\n","sourceCodeStart":471,"sourceCodeEnd":507,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/util/DateTimeUtils.java#L471-L507","documentation":"DateTimeUtils.parseDayTimeInterval parses DAY–SECOND range interval literals (e.g. INTERVAL '1 02:03:04' DAY TO SECOND). It only accepts specific start/end field combinations (DAY, DAY TO HOUR, DAY TO MINUTE, DAY TO SECOND, HOUR..., MINUTE..., SECOND TO SECOND). Any other qualifier pair falls through to this IllegalArgumentException; note the message renders the (already printed) enum values so it may read ' to ' oddly when nulls are involved.","triggerScenarios":"Calling parseDayTimeInterval with a start/end IntervalField combination that is not a legal DAY-SECOND qualifier, e.g. startField=YEAR or MONTH on this code path, or end field that precedes/doesn't follow start (such as SECOND to DAY).","commonSituations":"Programmatic construction of interval literals from user input without validating field ranges; grammar/AST changes routing YEAR-MONTH intervals into the day-second parser by mistake; user SQL like INTERVAL '3' YEAR TO MONTH hitting the wrong parser.","solutions":["Validate that startField is one of DAY/HOUR/MINUTE/SECOND and end is the same field or a valid subsequent sub-field before calling","Route YEAR/MONTH combinations to parseYearMonthInterval instead","Fix the SQL literal so its qualifier matches its content, e.g. INTERVAL '1 02:03' DAY TO MINUTE","Check call sites for swapped start/end arguments"],"exampleFix":"// before\nparseDayTimeInterval(value, IntervalField.SECOND, IntervalField.DAY); // invalid: reversed\n// after\nparseDayTimeInterval(value, IntervalField.DAY, IntervalField.SECOND);","handlingStrategy":"validation","validationCode":"boolean valid = start == IntervalField.DAY || start == IntervalField.HOUR || start == IntervalField.MINUTE || start == IntervalField.SECOND;\nboolean ordered = valid && end.ordinal() >= start.ordinal() && end != IntervalField.YEAR && end != IntervalField.MONTH;","typeGuard":null,"tryCatchPattern":"try { return parseDayTimeInterval(value, start, end); } catch (IllegalArgumentException e) { throw new InvalidInputException(\"Unsupported DAY-SECOND qualifier: \" + start + \" to \" + end); }","preventionTips":["Route YEAR/MONTH qualifiers to parseYearMonthInterval instead","Enforce start field <= end field in the DAY<HH<MM<SS hierarchy","Validate user-supplied interval qualifiers against the allowed list before parsing"],"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"}