{"record":{"id":"7579e87714361099","repo":"apache/cassandra","slug":"only-custom-indexes-support-multiple-columns","errorCode":null,"errorMessage":"Only CUSTOM indexes support multiple columns","messagePattern":"Only CUSTOM indexes support multiple columns","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java","lineNumber":196,"sourceCode":"            throw new InvalidRequestException(TRANSIENTLY_REPLICATED_KEYSPACE_NOT_SUPPORTED);\n\n        // guardrails to limit number of secondary indexes per table.\n        Guardrails.secondaryIndexesPerTable.guard(table.indexes.size() + 1,\n                                                  Strings.isNullOrEmpty(indexName)\n                                                  ? String.format(\"on table %s\", table.name)\n                                                  : String.format(\"%s on table %s\", indexName, table.name),\n                                                  false,\n                                                  state);\n\n        List<IndexTarget> indexTargets = Lists.newArrayList(transform(rawIndexTargets, t -> t.prepare(table)));\n\n        if (indexTargets.isEmpty() && !attrs.isCustom)\n            throw ire(CUSTOM_CREATE_WITHOUT_COLUMN);\n\n        if (indexTargets.size() > 1)\n        {\n            if (!attrs.isCustom)\n                throw ire(CUSTOM_MULTIPLE_COLUMNS);\n\n            Set<ColumnIdentifier> columns = new HashSet<>();\n            for (IndexTarget target : indexTargets)\n                if (!columns.add(target.column))\n                    throw ire(DUPLICATE_TARGET_COLUMN, target.column);\n        }\n\n        IndexMetadata.Kind kind = attrs.isCustom ? IndexMetadata.Kind.CUSTOM : IndexMetadata.Kind.COMPOSITES;\n\n        indexTargets.forEach(t -> validateIndexTarget(table, kind, t, attrs));\n\n        String name = null == indexName ? generateIndexName(keyspace, indexTargets) : indexName;\n\n        Map<String, String> options = attrs.isCustom ? attrs.getOptions() : Collections.emptyMap();\n\n        IndexMetadata index = IndexMetadata.fromIndexTargets(indexTargets, name, kind, options);\n\n        // check to disallow creation of an index which duplicates an existing one in all but name","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java#L178-L214","documentation":"Thrown while applying CREATE INDEX when more than one index target column is supplied (indexTargets.size() > 1) but the index is not a CUSTOM index. Only custom index implementations may span multiple columns; built-in index types are limited to a single target column, so the multi-column target list is rejected.","triggerScenarios":"Thrown at src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java:196 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Create one index per column, or declare the index as CUSTOM with an implementation that supports multiple targets."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}