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

  1. Remove the IF condition from counter updates.
  2. 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)