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
- Rewrite the filter using only supported operators (=, <>, <, <=, >, >=, IN, NOT IN, AND, OR).
- Handle unsupported predicates outside this converter (e.g., pre-filter rows or use Iceberg Expressions API directly).
- 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
- Restrict user-facing filter syntax to supported operators.
- Document that LIKE, IS NULL, BETWEEN, and arithmetic are not supported for pushdown.
- Catch IllegalArgumentException from convert and degrade to a non-pushdown read.
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
- Operator %s is not supported in join condition
- Unsupported operands for expression: {call}
- Unexpected date type: {typeName}
- Unexpected timestamp type: {typeName}
- Unsupported filter type in field '{field}': {type}
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/0b728d6a18c30aa9.
Report an issue: GitHub.