{"record":{"id":"70ce2e0504f48d81","repo":"apache/beam","slug":"s-does-not-support-predicate-project-push-down-yet-non-empty-70ce2e","errorCode":null,"errorMessage":"%s does not support predicate/project push-down, yet non-empty 'filters' is passed.","messagePattern":"(.+?) does not support predicate/project push-down, yet non-empty 'filters' is passed\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/BaseBeamTable.java","lineNumber":42,"sourceCode":"import org.apache.beam.sdk.values.PCollection;\nimport org.apache.beam.sdk.values.Row;\nimport org.apache.beam.vendor.calcite.v1_40_0.org.apache.calcite.rex.RexNode;\n\n/** Basic implementation of {@link BeamSqlTable}. */\npublic abstract class BaseBeamTable implements BeamSqlTable {\n\n  @Override\n  public BeamTableStatistics getTableStatistics(PipelineOptions options) {\n    return BeamTableStatistics.BOUNDED_UNKNOWN;\n  }\n\n  @Override\n  public PCollection<Row> buildIOReader(\n      PBegin begin, BeamSqlTableFilter filters, List<String> fieldNames) {\n    String error = \"%s does not support predicate/project push-down, yet non-empty %s is passed.\";\n\n    if (!(filters instanceof DefaultTableFilter)) {\n      throw new UnsupportedOperationException(\n          String.format(error, this.getClass().getName(), \"'filters'\"));\n    }\n\n    if (!fieldNames.isEmpty()) {\n      throw new UnsupportedOperationException(\n          String.format(error, this.getClass().getName(), \"'fieldNames'\"));\n    }\n\n    return buildIOReader(begin);\n  }\n\n  @Override\n  public BeamSqlTableFilter constructFilter(List<RexNode> filter) {\n    return new DefaultTableFilter(filter);\n  }\n\n  @Override\n  public ProjectSupport supportsProjects() {","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/meta/BaseBeamTable.java#L24-L60","documentation":"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.","triggerScenarios":"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.","commonSituations":"See trigger scenarios.","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."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}