apache/beam · error · IllegalArgumentException

Unsupported operation '{operation}' in filter expression: {c

Error message

Unsupported operation '{operation}' in filter expression: {call}

What it means

During conversion of a parsed SQL call to an Iceberg Expression, FilterUtils only supports a fixed set of SQL operators (comparison operators, IN/NOT IN, AND/OR). Any other operator in the filter triggers this IllegalArgumentException naming the operation and the original call.

Source

Thrown at sdks/java/io/iceberg/src/main/java/org/apache/beam/sdk/io/iceberg/FilterUtils.java:227

                return Expressions.notNull(ref);
              } else if (NaNUtil.isNaN(lit)) {
                return Expressions.notNaN(ref);
              } else {
                return Expressions.notEqual(ref, lit);
              }
            },
            call,
            schema);
      case IN:
        return convertFieldInLiteral(Operation.IN, call, schema);
      case NOT_IN:
        return convertFieldInLiteral(Operation.NOT_IN, call, schema);
      case AND:
        return convertLogicalExpr(Expressions::and, call, schema);
      case OR:
        return convertLogicalExpr(Expressions::or, call, schema);
      default:
        throw new IllegalArgumentException(
            String.format("Unsupported operation '%s' in filter expression: %s", operation, call));
    }
  }

  private static String getOnlyChildName(SqlBasicCall call) {
    checkArgument(
        call.operandCount() == 1,
        "Expected only 1 operand but got %s in filter: %s",
        call.getOperandList(),
        call.toString());
    SqlNode ref = call.operand(0);
    Preconditions.checkState(
        ref instanceof SqlIdentifier, "Expected operand '%s' to be a reference.", ref);
    return getFieldName((SqlIdentifier) ref);
  }

  private static String getFieldName(SqlIdentifier identifier) {
    if (identifier.isSimple()) {

View on GitHub (pinned to 12126d8942)

Solutions

  1. Rewrite the filter using only supported operators (=, <>, <, <=, >, >=, IN, NOT IN, AND, OR).
  2. Handle unsupported predicates outside this converter (e.g., pre-filter rows or use Iceberg Expressions API directly).
  3. Extend FilterUtils' convert switch if you own the code and need the operator.

Example fix

// before
Expression e = FilterUtils.convert("name LIKE 'a%'", schema);
// after
Expression e = FilterUtils.convert("name = 'alice' OR name = 'anna'", schema);
Defensive patterns

Strategy: validation

Validate before calling

java.util.Set<String> allowed = java.util.Set.of("=","<>","!=","<","<=",">",">=");
// only submit filters whose top-level operators are comparisons, IN/NOT IN, AND, OR

Prevention

When it happens

Trigger: Calling FilterUtils.convert(filter, schema) where the parsed expression contains an unsupported operator node — e.g., arithmetic (+, -, *), LIKE, IS NULL, BETWEEN, or function calls inside the predicate.

Common situations: Filters using LIKE pattern matching or IS NULL checks, which the converter does not map; passing whole SQL WHERE clauses including unsupported clauses; expecting Spark/Iceberg expression parity with SQL features the converter omits.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/0b728d6a18c30aa9. Report an issue: GitHub.