apache/cassandra · error · InvalidRequestException
Only CUSTOM indexes can be created without specifying a…
Error message
Only CUSTOM indexes can be created without specifying a target column
What it means
CreateIndexStatement.apply validation: CREATE INDEX without a target column is only legal for custom index implementations (which manage their own targets); a plain composite index requires an explicit column target.
Solutions
- Specify the column to index, e.g. CREATE INDEX ON tbl(col).
- Add USING with a custom index class if a columnless custom index is intended.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java:191 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/5810c2ced92b7690.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java:191
if (table.isView())
throw ire(MATERIALIZED_VIEWS_NOT_SUPPORTED);
if (keyspace.replicationStrategy.hasTransientReplicas())
throw new InvalidRequestException(TRANSIENTLY_REPLICATED_KEYSPACE_NOT_SUPPORTED);
// guardrails to limit number of secondary indexes per table.
Guardrails.secondaryIndexesPerTable.guard(table.indexes.size() + 1,
Strings.isNullOrEmpty(indexName)
? String.format("on table %s", table.name)
: String.format("%s on table %s", indexName, table.name),
false,
state);
List<IndexTarget> indexTargets = Lists.newArrayList(transform(rawIndexTargets, t -> t.prepare(table)));
if (indexTargets.isEmpty() && !attrs.isCustom)
throw ire(CUSTOM_CREATE_WITHOUT_COLUMN);
if (indexTargets.size() > 1)
{
if (!attrs.isCustom)
throw ire(CUSTOM_MULTIPLE_COLUMNS);
Set<ColumnIdentifier> columns = new HashSet<>();
for (IndexTarget target : indexTargets)
if (!columns.add(target.column))
throw ire(DUPLICATE_TARGET_COLUMN, target.column);
}
IndexMetadata.Kind kind = attrs.isCustom ? IndexMetadata.Kind.CUSTOM : IndexMetadata.Kind.COMPOSITES;
indexTargets.forEach(t -> validateIndexTarget(table, kind, t, attrs));
String name = null == indexName ? generateIndexName(keyspace, indexTargets) : indexName;
View on GitHub (pinned to 88fd0f6a0e)