apache/cassandra · error · InvalidRequestException
Conditions on counters are not supported
Error message
Conditions on counters are not supported
What it means
Guard raised when preparing a LWT condition whose target column is a counter. Lightweight transactions are incompatible with counters, so any conditional UPDATE/DELETE (or INSERT IF NOT EXISTS) on a counter column is rejected at statement preparation time.
Solutions
- Remove the IF condition from counter updates.
- If compare-and-set behavior is required, model the value as a regular column with CAS semantics instead of a counter.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java:554 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/63aa1f3f8abba742.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java:554
public static Raw udtFieldCondition(ColumnIdentifier column, FieldIdentifier udtField, Operator op, Terms.Raw values)
{
return new Raw(ColumnsExpression.Raw.udtField(column, udtField), op, values);
}
public ColumnsExpression.Raw columnExpression()
{
return rawExpressions;
}
public ColumnCondition prepare(TableMetadata table)
{
ColumnsExpression expression = rawExpressions.prepare(table);
ColumnSpecification receiver = expression.columnSpecification();
checkFalse(expression.columnsKind().isPrimaryKeyKind(), "PRIMARY KEY column '%s' cannot have IF conditions", receiver.name);
if (receiver.type instanceof CounterColumnType)
throw invalidRequest("Conditions on counters are not supported");
validateOperationOnDurations(receiver.type);
return new ColumnCondition(expression, operator, prepareTerms(table.keyspace, receiver));
}
private Terms prepareTerms(String keyspace, ColumnSpecification receiver)
{
checkFalse(operator == Operator.CONTAINS_KEY && !(receiver.type instanceof MapType),
"Cannot use CONTAINS KEY on non-map column %s", receiver.name);
checkFalse(operator == Operator.CONTAINS && !(receiver.type.isCollection()),
"Cannot use CONTAINS on non-collection column %s", receiver.name);
if (operator == Operator.CONTAINS || operator == Operator.CONTAINS_KEY)
receiver = ((CollectionType<?>) receiver.type).makeCollectionReceiver(receiver, operator == Operator.CONTAINS_KEY);
return values.prepare(keyspace, receiver);
}
View on GitHub (pinned to 88fd0f6a0e)