apache/cassandra · error · InvalidRequestException

Invalid operator

Error message

Invalid operator

What it means

Operation.determineIndexTargetType maps a relation's operator to an IndexTarget.Type for SAI index targeting. If the operator falls through all known cases (an operator that cannot be answered by the selected index type), it throws InvalidRequestException("Invalid operator").

Source

Thrown at src/java/org/apache/cassandra/index/sai/plan/Operation.java:287

        IndexTarget.Type indexTargetType = IndexTarget.Type.SIMPLE;
        if (type.isCollection() && type.isMultiCell())
        {
            CollectionType<?> collection = ((CollectionType<?>) type);
            if (collection.kind == CollectionType.Kind.MAP)
            {
                switch (expression.operator())
                {
                    case EQ:
                        indexTargetType = IndexTarget.Type.KEYS_AND_VALUES;
                        break;
                    case CONTAINS:
                        indexTargetType = IndexTarget.Type.VALUES;
                        break;
                    case CONTAINS_KEY:
                        indexTargetType = IndexTarget.Type.KEYS;
                        break;
                    default:
                        throw new InvalidRequestException("Invalid operator");
                }
            }
        }
        return indexTargetType;
    }

    private static int getPriority(Operator op)
    {
        switch (op)
        {
            case EQ:
            case CONTAINS:
            case CONTAINS_KEY:
                return 5;

            case GTE:
            case GT:
                return 3;

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Use an operator supported by SAI for that column type (EQ, LT/LTE/GT/GTE, CONTAINS/CONTAINS KEY on collections, ANN on vectors)
  2. Check the CREATE INDEX target type matches the query operator semantics
  3. Upgrade Cassandra if the operator should be supported in your version

Example fix

// before
SELECT * FROM t WHERE vec ANN OF [1,2] AND description CONTAINS 'x' AND id != 5; // unsupported operator in SAI targeting
// after
SELECT * FROM t WHERE vec ANN OF [1,2] AND description CONTAINS 'x' AND (id > 5 OR id < 5);
Defensive patterns

Strategy: validation

Validate before calling

// Only use operators SAI supports for the target type:
// scalar: =, <, <=, >, >= ; collection: CONTAINS / CONTAINS KEY ; vector: ANN OF

Prevention

When it happens

Trigger: Using a CQL relation operator that SAI's target-type mapping does not handle for the given index kind — e.g. an operator like LIKE/CONTAINS applied where the switch has no matching case, after `break`-less fall-through reaches the default branch of the operator-to-IndexTarget.Type switch.

Common situations: Typing an operator that the index doesn't support (e.g. CONTAINS on a non-collection target, SIMILARITY/ANN operator mixed into non-vector expressions); version mismatch where a new operator isn't yet mapped for SAI.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/d71b63bbd9d96e0a. Report an issue: GitHub.