{"record":{"id":"f5c34fe83d543e30","repo":"apache/cassandra","slug":"index-kind-is-null-for-index-name","errorCode":null,"errorMessage":"Index kind is null for index ${name}","messagePattern":"Index kind is null for index (.+?)","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/schema/IndexMetadata.java","lineNumber":140,"sourceCode":"\n    public static String generateDefaultIndexName(String table, ColumnIdentifier column)\n    {\n        return PATTERN_NON_WORD_CHAR.matcher(table + '_' + column.toString() + \"_idx\").replaceAll(\"\");\n    }\n\n    public static String generateDefaultIndexName(String table)\n    {\n        return PATTERN_NON_WORD_CHAR.matcher(table + \"_idx\").replaceAll(\"\");\n    }\n\n    public void validate(TableMetadata table)\n    {\n        // TODO: address validating the length by CASSANDRA-20445\n        if (!isValidCharsName(name))\n            throw new ConfigurationException(\"Illegal index name \" + name);\n\n        if (kind == null)\n            throw new ConfigurationException(\"Index kind is null for index \" + name);\n\n        if (kind == Kind.CUSTOM)\n        {\n            if (options == null || !options.containsKey(IndexTarget.CUSTOM_INDEX_OPTION_NAME))\n                throw new ConfigurationException(String.format(\"Required option missing for index %s : %s\",\n                                                               name, IndexTarget.CUSTOM_INDEX_OPTION_NAME));\n\n            // Get the fully qualified class name:\n            String className = getIndexClassName();\n\n            Class<? extends Index> indexerClass = FBUtilities.classForNameWithoutInitialization(className, \"custom indexer\", Index.class);\n            validateCustomIndexOptions(table, indexerClass, options);\n        }\n    }\n\n    public String getIndexClassName()\n    {\n        if (isCustom())","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/schema/IndexMetadata.java#L122-L158","documentation":"IndexMetadata.validate requires a non-null kind; every index must declare how it is implemented (e.g. Keys/Composites/CUSTOM). A null kind means the metadata was constructed incompletely or deserialized incorrectly.","triggerScenarios":"Building an IndexMetadata (e.g. via builder or deserialization) without setting kind, then calling validate(TableMetadata); exercised by testRejectsNonCustomIndexWithoutInitializing paths.","commonSituations":"Custom schema-management tooling constructing IndexMetadata manually and forgetting kind; corrupted/badly migrated system_schema rows where the kind column is null.","solutions":["Set the index kind explicitly (IndexMetadata.Kind.KEYS/COMPOSITES/CUSTOM) when constructing metadata","Use IndexMetadata.raw/fromIndexTargets factory methods that derive the kind automatically","Repair system_schema.indexes rows if they were corrupted by external editing"],"exampleFix":"// before\nIndexMetadata.builder().name(\"idx\").target(\"col\").build() // kind unset\n// after\nIndexMetadata.raw(\"idx\", IndexTarget.fromTarget(\"col\"), TableMetadata.Kind.KEYS, Collections.emptyMap())","handlingStrategy":"validation","validationCode":"if (index.getKind() == null) throw new IllegalArgumentException(\"index kind must be set before validating \" + index.name);","typeGuard":null,"tryCatchPattern":"try { index.validate(table); } catch (ConfigurationException e) { log.error(\"index kind missing for \" + index.name, e); }","preventionTips":["Always use factory methods (raw/fromIndexTargets) that set kind","Never construct IndexMetadata directly in tooling without setting kind","Never hand-edit system_schema.indexes rows"],"tags":["index","schema","validation"],"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"}