{"record":{"id":"e2c01ce2280ee712","repo":"apache/cassandra","slug":"sasi-indexes-are-disabled-enable-in-cassandra-yam","errorCode":null,"errorMessage":"SASI indexes are disabled. Enable in cassandra.yaml to use.","messagePattern":"SASI indexes are disabled\\. Enable in cassandra\\.yaml to use\\.","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java","lineNumber":152,"sourceCode":"        // save the query state to use it for guardrails validation in #apply\n        this.state = state;\n    }\n\n    @Override\n    public boolean compatibleWith(ClusterMetadata metadata)\n    {\n        return metadata.directory.commonSerializationVersion.isAtLeast(Version.V0);\n    }\n\n    @Override\n    public Keyspaces apply(ClusterMetadata metadata)\n    {\n        attrs.validate();\n\n        Guardrails.createSecondaryIndexesEnabled.ensureEnabled(\"Creating secondary indexes\", state);\n\n        if (attrs.isCustom && attrs.customClass.equals(SASIIndex.class.getName()) && !DatabaseDescriptor.getSASIIndexesEnabled())\n            throw new InvalidRequestException(SASI_INDEX_DISABLED);\n\n        Keyspaces schema = metadata.schema.getKeyspaces();\n        KeyspaceMetadata keyspace = schema.getNullable(keyspaceName);\n        if (null == keyspace)\n            throw ire(KEYSPACE_DOES_NOT_EXIST, keyspaceName);\n\n        TableMetadata table = keyspace.getTableOrViewNullable(tableName);\n        if (null == table)\n            throw ire(TABLE_DOES_NOT_EXIST, tableName);\n\n        if (null != indexName && keyspace.hasIndex(indexName))\n        {\n            if (ifNotExists)\n                return schema;\n\n            throw ire(INDEX_ALREADY_EXISTS, indexName);\n        }\n","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java#L134-L170","documentation":"SASI (SSTable-Attached Secondary Index) indexes are gated behind a server configuration flag `sasi_indexes_enabled` in cassandra.yaml (default disabled since SASI is not fully supported). Creating a `CREATE CUSTOM INDEX ... USING 'org.apache.cassandra.index.sasi.SASIIndex'` is rejected with an InvalidRequestException when the flag is off.","triggerScenarios":"Executing `CREATE CUSTOM INDEX ... USING 'org.apache.cassandra.index.sasi.SASIIndex'` while `DatabaseDescriptor.getSASIIndexesEnabled()` returns false, i.e. `sasi_indexes_enabled: false` (or absent) in cassandra.yaml.","commonSituations":"Copying legacy SASI DDL onto a newer Cassandra install where SASI is disabled by default; migration scripts from 3.x that still create SASI indexes; cluster hardening where SASI was turned off for supportability.","solutions":["Set `sasi_indexes_enabled: true` in cassandra.yaml on all nodes and restart, if you intentionally want SASI.","Prefer migrating the index to Storage-Attached Indexing (SAI) or a standard secondary index instead of enabling SASI.","If the SASI DDL is incidental, remove/rewrite the `CREATE CUSTOM INDEX ... USING '...SASIIndex'` statement."],"exampleFix":"// cassandra.yaml\n// before\nsasi_indexes_enabled: false\n// after\nsasi_indexes_enabled: true\n\n-- or before\nCREATE CUSTOM INDEX i ON t (col) USING 'org.apache.cassandra.index.sasi.SASIIndex';\n-- after (SAI on 5.x)\nCREATE CUSTOM INDEX i ON t (col) USING 'StorageAttachedIndex';","handlingStrategy":"validation","validationCode":"boolean sasiEnabled = conf.getBoolean(\"sasi_indexes_enabled\", false);\nif (ddl.contains(\"SASIIndex\") && !sasiEnabled)\n    throw new IllegalStateException(\"SASI disabled in cassandra.yaml; enable sasi_indexes_enabled or rewrite DDL\");","typeGuard":null,"tryCatchPattern":"try { session.execute(createIndexDdl); }\ncatch (InvalidQueryException e) {\n  if (e.getMessage().contains(\"SASI indexes are disabled\"))\n      throw new ConfigurationException(\"set sasi_indexes_enabled: true (or migrate to SAI)\", e);\n  throw e;\n}","preventionTips":["Check cassandra.yaml's sasi_indexes_enabled before shipping SASI DDL","Prefer SAI or built-in 2i over SASI on modern versions since SASI is unsupported","Keep DDL scripts environment-aware: gate SASI statements behind a feature flag"],"tags":["cassandra","sasi","index","config"],"backgroundTag":"feature-not-enabled","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"}