{"record":{"id":"c9db9f29a19ac019","repo":"apache/cassandra","slug":"secondary-indexes-are-not-supported-on-duration-co","errorCode":null,"errorMessage":"Secondary indexes are not supported on duration columns","messagePattern":"Secondary indexes are not supported on duration columns","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java","lineNumber":276,"sourceCode":"\n        boolean isNonSAIIndex = !isSAIIndex(attrs);\n\n        // TODO: this check needs to be removed with CASSANDRA-20235\n        if ((kind == IndexMetadata.Kind.CUSTOM))\n            validateCustomIndexColumnName(target.column.toString());\n\n        if (column.type.referencesDuration())\n        {\n            if (column.type.isCollection())\n                throw ire(COLLECTIONS_WITH_DURATIONS_NOT_SUPPORTED);\n\n            if (column.type.isTuple())\n                throw ire(TUPLES_WITH_DURATIONS_NOT_SUPPORTED);\n\n            if (column.type.isUDT())\n                throw  ire(UDTS_WITH_DURATIONS_NOT_SUPPORTED);\n\n            throw ire(DURATIONS_NOT_SUPPORTED);\n        }\n\n        if (table.isCompactTable())\n        {\n            TableMetadata.CompactTableMetadata compactTable = (TableMetadata.CompactTableMetadata) table;\n            if (column.isPrimaryKeyColumn())\n                throw new InvalidRequestException(PRIMARY_KEY_IN_COMPACT_STORAGE);\n            if (compactTable.compactValueColumn.equals(column))\n                throw new InvalidRequestException(COMPACT_COLUMN_IN_COMPACT_STORAGE);\n        }\n\n        if (column.isPartitionKey() && table.partitionKeyColumns().size() == 1)\n            throw ire(ONLY_PARTITION_KEY, column);\n\n        if (target.type == Type.FULL && isNonSAIIndex && (!baseType.isCollection() || column.type.isMultiCell()))\n            throw ire(FULL_ON_FROZEN_COLLECTIONS);\n\n        if (!baseType.isCollection() && target.type != Type.SIMPLE)","sourceCodeStart":258,"sourceCodeEnd":294,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java#L258-L294","documentation":"Cassandra does not allow secondary indexes on columns of type `duration` at all. Duration lacks the comparison semantics index backends rely on for equality/range matching. This is the fallback branch of the duration check in validateIndexTarget after collection/tuple/UDT cases.","triggerScenarios":"`CREATE INDEX ON t (dur_col)` where dur_col is a plain duration column (regular, static, or even key columns), via any index kind including custom/SAI.","commonSituations":"Tracking SLA/elapsed-time with duration then trying to find rows by duration range; writing generic schema tooling that blindly indexes all columns.","solutions":["Change the column type to bigint (store milliseconds) or timestamp and index that.","Filter by duration in application code or via ALLOW FILTERING on a scan (with care).","Denormalize into buckets (e.g. duration_class text) that can be indexed."],"exampleFix":"// before\nCREATE INDEX ON jobs (elapsed); // elapsed duration\n// after\nALTER TABLE jobs ADD elapsed_ms bigint;\nCREATE INDEX ON jobs (elapsed_ms);","handlingStrategy":"validation","validationCode":"if (column.type.toString() === 'duration') throw new Error('duration columns cannot be secondary-indexed');","typeGuard":"const isIndexableScalar = (t) => !t.referencesDuration();","tryCatchPattern":"try { session.execute(ddl); } catch (e) { if (/not supported on duration columns/.test(e.message)) { /* switch to bigint/timestamp */ } else throw e; }","preventionTips":["Store durations as bigint milliseconds when range queries are planned","Exclude duration from auto-index tooling column lists"],"tags":["cassandra","cql","secondary-index","duration"],"backgroundTag":"schema-validation-failed","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"}