Parquet: boolean equality filter pushdown throws UnsupportedOperationException
- 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
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