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 'fieldNames' is passed.

What it means

Same guard as the filters case, but for project push-down: BaseBeamTable.buildIOReader rejects a non-empty fieldNames list when the concrete table does not support column projection. The table can only be read in full; requesting a column subset at the source is unsupported.

Solutions

  1. Drop the projection request and read all columns, selecting the needed fields downstream in the pipeline.
  2. Use a provider implementation that overrides buildIOReader to support field projection.
  3. Reconfigure the query so Calcite does not attempt project push-down on this table.
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:47 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/3081406c4570d0ee. Report an issue: GitHub.

Appendix: source

Thrown at sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/BaseBeamTable.java:47

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() {
    return ProjectSupport.NONE;
  }
}

View on GitHub (pinned to 12126d8942)