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

  1. Remove explicit filter push-down expectations and let Beam apply the predicate after the read (filter in the pipeline instead of at the source).
  2. Use a table provider that implements predicate push-down by overriding buildIOReader with filter support.
  3. 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)