apache/beam · error · UnsupportedOperationException
does not support predicate/project push-down, yet non-empty…
Error message
%s does not support predicate/project push-down, yet non-empty 'filters' is passed.
What it means
BaseBeamTable.buildIOReader's default implementation supports only unfiltered, unprojected reads. When a table's concrete subclass does not override predicate push-down and a non-empty filter (a BeamSqlTableFilter that is not DefaultTableFilter) is passed, this guard rejects the request because the provider cannot apply the predicate itself.
Solutions
- Remove explicit filter push-down expectations and let Beam apply the predicate after the read (filter in the pipeline instead of at the source).
- Use a table provider that implements predicate push-down by overriding buildIOReader with filter support.
- Wrap the table read so the query planner does not attempt to push the predicate into this provider.
Defensive patterns
Strategy: fallback
When it happens
Trigger: Thrown at sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/BaseBeamTable.java:42 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/70ce2e0504f48d81.
Report an issue: GitHub.
Appendix: source
Thrown at sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/BaseBeamTable.java:42
import org.apache.beam.sdk.values.PCollection;
import org.apache.beam.sdk.values.Row;
import org.apache.beam.vendor.calcite.v1_40_0.org.apache.calcite.rex.RexNode;
/** Basic implementation of {@link BeamSqlTable}. */
public abstract class BaseBeamTable implements BeamSqlTable {
@Override
public BeamTableStatistics getTableStatistics(PipelineOptions options) {
return BeamTableStatistics.BOUNDED_UNKNOWN;
}
@Override
public PCollection<Row> buildIOReader(
PBegin begin, BeamSqlTableFilter filters, List<String> fieldNames) {
String error = "%s does not support predicate/project push-down, yet non-empty %s is passed.";
if (!(filters instanceof DefaultTableFilter)) {
throw new UnsupportedOperationException(
String.format(error, this.getClass().getName(), "'filters'"));
}
if (!fieldNames.isEmpty()) {
throw new UnsupportedOperationException(
String.format(error, this.getClass().getName(), "'fieldNames'"));
}
return buildIOReader(begin);
}
@Override
public BeamSqlTableFilter constructFilter(List<RexNode> filter) {
return new DefaultTableFilter(filter);
}
@Override
public ProjectSupport supportsProjects() {View on GitHub (pinned to 12126d8942)