apache / apache/iceberg

Parquet: boolean equality filter pushdown throws UnsupportedOperationException

Open Beginner friendly
#17,092 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
9.2k
Forks
3.5k
Avg merge
2d 11h
Merged PRs (30d)
132

Description

**Apache Iceberg version**
main @ 3038fde68

**Query engine**
None — engine-agnostic, reproducible via the Java Generic Read API (`Parquet.read(...).filter(...)`).

**Please describe the bug**
`ParquetFilters.getParquetPrimitive()` (`parquet/src/main/java/org/apache/iceberg/parquet/ParquetFilters.java` line 219) only handles `Number`, `CharSequence`, and `ByteBuffer` literal values, so any `EQ`/`NOT_EQ` predicate on a `boolean` column falls through to the exception on line 233. `Literals.BooleanLiteral` (`api/.../expressions/Literals.java`) always returns a `java.lang.Boolean`, so this path is unavoidable for any boolean predicate. The exception is thrown while building the Parquet read builder (`Parquet.java` line 1635), before any rows are read — the read fails outright instead of falling back to a full scan.

**Steps to reproduce**
1. Write a Parquet file for a schema containing a `required(N, "b", Types.BooleanType.get())` column.
2. Read it back with `Parquet.read(input).project(schema).filter(Expressions.equal("b", true)).build()`.
3. Observe `java.lang.UnsupportedOperationException: Type not supported yet: java.lang.Boolean` at `ParquetFilters.getParquetPrimitive`, called from `ConvertFilterToParquet.predicate()`'s `case BOOLEAN` branch.

Expected: the reader returns only matching rows. Actual: the read throws before returning any rows.

**Additional context**
Same failure occurs for `Expressions.notEqual("b", false)`. `Number` values in the same method are returned via a direct cast; `Boolean` needs the identical treatment since `FilterApi.eq(BooleanColumn, Boolean)` expects a `Boolean` as-is.

Contributor guide

Open the contributing guide

Research direction

Start in parquet/src/main/java/org/apache/iceberg/parquet/ParquetFilters.java at getParquetPrimitive(), then follow the BOOLEAN branch in ConvertFilterToParquet.predicate(). Reproduce the Java Generic Read API filter for boolean EQ and NOT_EQ predicates; done means both return matching rows without throwing while building the Parquet reader.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
databases
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
76/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.