{"record":{"id":"d51a9651089751d9","repo":"apache/cassandra","slug":"unknown-duration-symbol-s","errorCode":null,"errorMessage":"Unknown duration symbol '%s'","messagePattern":"Unknown duration symbol '(.+?)'","errorType":"validation","errorClass":"MarshalException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/Duration.java","lineNumber":269,"sourceCode":"    }\n\n    private static Builder add(Builder builder, long number, String symbol)\n    {\n        switch (toLowerCaseLocalized(symbol))\n        {\n            case \"y\": return builder.addYears(number);\n            case \"mo\": return builder.addMonths(number);\n            case \"w\": return builder.addWeeks(number);\n            case \"d\": return builder.addDays(number);\n            case \"h\": return builder.addHours(number);\n            case \"m\": return builder.addMinutes(number);\n            case \"s\": return builder.addSeconds(number);\n            case \"ms\": return builder.addMillis(number);\n            case \"us\":\n            case \"µs\": return builder.addMicros(number);\n            case \"ns\": return builder.addNanos(number);\n        }\n        throw new MarshalException(String.format(\"Unknown duration symbol '%s'\", symbol));\n    }\n\n    public int getMonths()\n    {\n        return months;\n    }\n\n    public int getDays()\n    {\n        return days;\n    }\n\n    public long getNanoseconds()\n    {\n        return nanoseconds;\n    }\n\n    /**","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/Duration.java#L251-L287","documentation":"Duration.add throws this MarshalException when parsing a CQL duration string (standard format like '1h30m') and the unit suffix following a number is not one of the recognized symbols (y/mo/w/d/h/s/ms/us/µs/ns). Cassandra cannot map the suffix to a time period, so the duration value is rejected.","triggerScenarios":"Inserting/updating a duration column with a value like '1x', '5sec', or '2mth' via prepared statement bind, string literal, or Duration.from parsing; any path reaching parseStandardFormat with an unrecognized trailing symbol.","commonSituations":"Confusing duration units with ISO-8601 (P1Y2M) or human units like 'sec'/'min'; typos in unit suffixes; users expecting 'm' to mean minutes (it means months).","solutions":["Use only valid symbols: y, mo, w, d, h, s, ms, us (or µs), ns","Replace 'sec' with 's', 'min' with 'm' (minutes don't exist as a symbol; use '60s')","Remember 'm' = months, not minutes; express minutes as seconds (e.g. '90s')","Use ISO-8601 alternative format (P...T...) if preferred"],"exampleFix":"// before\nINSERT INTO t (k, d) VALUES (1, '90min');\n// after\nINSERT INTO t (k, d) VALUES (1, '1h30m');","handlingStrategy":"validation","validationCode":"private static final java.util.regex.Pattern DURATION = java.util.regex.Pattern.compile(\"^\\\\d+(y|mo|w|d|h|s|ms|us|µs|ns)+$\");\nboolean validDuration(String s) { return s != null && DURATION.matcher(s).matches(); }","typeGuard":null,"tryCatchPattern":"try { insertDuration(value); } catch (InvalidRequestException | MarshalException e) { throw new IllegalArgumentException(\"Bad duration: \" + value, e); }","preventionTips":["Only use symbols y, mo, w, d, h, s, ms, us, ns","Express minutes as seconds (e.g. 90s) since 'm' means months","Prefer ISO-8601 format (P...T...) for clarity","Unit-test duration parsing for all user-facing inputs"],"tags":["duration","cql","marshal"],"backgroundTag":"invalid-duration-format","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}