github-actions[bot] commented on code in PR #66820:
URL: https://github.com/apache/doris/pull/66820#discussion_r3859395421


##########
be/src/format/parquet/vparquet_reader.cpp:
##########
@@ -1565,6 +1567,7 @@ Status ParquetReader::_process_column_stat_filter(
                     auto cache_iter = bloom_filter_cache.find(parquet_col_id);
                     if (cache_iter != bloom_filter_cache.end()) {
                         // Bloom filter already loaded for this column, reuse 
it

Review Comment:
   [P1] Preserve Doris floating equality before Bloom pruning
   
   V1 also enables FLOAT/DOUBLE here but probes only the literal's raw IEEE 
bytes. A file Bloom built from `-0.0` can miss `+0.0` (and vice versa), even 
though Doris equality treats them as equal and the min/max path retains that 
row group; the Bloom result can therefore falsely prune a matching row. The v2 
evaluator already covers both signed-zero encodings and conservatively retains 
NaN equality classes. Please give V1 equality/IN the same treatment, or disable 
floating Bloom pruning where a raw miss is not conclusive, with both sign 
directions covered by tests.



##########
be/src/format/parquet/vparquet_reader.cpp:
##########
@@ -1565,6 +1567,7 @@ Status ParquetReader::_process_column_stat_filter(
                     auto cache_iter = bloom_filter_cache.find(parquet_col_id);

Review Comment:
   [P1] Gate V1 Bloom probes by the Parquet physical representation
   
   The eligibility check just above this cache lookup sees only the widened 
Doris primitive. A valid physical INT32/logical UINT32 column is exposed as 
BIGINT, so it passes the check but equality/IN hashes the 8-byte logical value 
while the writer hashed the 4-byte INT32 carrier; FLOAT16 similarly maps a 
2-byte FIXED_LEN_BYTE_ARRAY value to a 4-byte FLOAT probe, and V1's Boolean 
special case uses four bytes rather than the one-byte carrier used by 
schema-aware v2. A Bloom miss on those different bytes can falsely prune a 
matching row group. Please make V1 probing schema-aware and use the exact 
physical carrier as v2 does, or conservatively disable converted 
representations, with UINT32/FLOAT16/Boolean equality and IN regressions.



##########
be/src/format/parquet/vparquet_reader.cpp:
##########
@@ -1565,6 +1567,7 @@ Status ParquetReader::_process_column_stat_filter(
                     auto cache_iter = bloom_filter_cache.find(parquet_col_id);
                     if (cache_iter != bloom_filter_cache.end()) {
                         // Bloom filter already loaded for this column, reuse 
it
+                        cached_bloom_filter_bytes -= 
cache_iter->second->size();

Review Comment:
   [P1] Keep the active Bloom filter keyed to its column
   
   `_collect_predicate_columns_from_conjuncts()` puts predicates for all slots 
in one `AndBlockColumnPredicate`, and that AND reuses this single `ColumnStat` 
across its children. For `a = 1 AND b = 2`, after A's Bloom accepts 1, B misses 
this cache but `stat->bloom_filter` still owns A, so the `if 
(!stat->bloom_filter)` below skips reading B and B's literal is probed against 
A's filter. A matching row group where A contains 1 but not 2 and B contains 2 
is then falsely pruned. Please track the active Bloom's column ID 
(return/discard it when `cid` changes), value-initialize/set the stat schema in 
Bloom-only mode, and add a two-column AND regression proving each literal uses 
its own filter.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to