cetra3 opened a new issue, #27318:
URL: https://github.com/apache/datafusion/issues/27318

   ### Describe the bug
   
   This query fails to plan on `main`:
   
   ```sql
   SET datafusion.execution.target_partitions = 2;
   SET datafusion.optimizer.hash_join_single_partition_threshold_rows = 0;
   COPY (SELECT named_struct('k', 'a') AS s) TO 'data/t/1.parquet';
   COPY (SELECT named_struct('k', 'b') AS s) TO 'data/t/2.parquet';
   CREATE EXTERNAL TABLE t STORED AS PARQUET LOCATION 'data/t/';
   
   SELECT s['k'] FROM t WHERE s['k'] = 'a' OR s['k'] IN (SELECT s['k'] FROM t) 
GROUP BY 1;
   ```
   
   ```text
   SanityCheckPlan: order and distribution requirements stopped holding after 
physical optimizer rule 'ProjectionPushdown'
   caused by
   Error during planning: Plan: [
   AggregateExec: mode=SinglePartitioned, gby=[__datafusion_extracted_2@0 as 
__datafusion_extracted_2], aggr=[]
     FilterExec: __datafusion_extracted_3@1 = a OR mark@0, 
projection=[__datafusion_extracted_2@2]
       ProjectionExec: expr=[mark@0 as mark, get_field(s@1, k) as 
__datafusion_extracted_3, get_field(s@1, k) as __datafusion_extracted_2]
         HashJoinExec: mode=Partitioned, join_type=LeftMark, 
on=[(__datafusion_extracted_4@0, t.s[k]@0)], projection=[mark@2, s@1]
           RepartitionExec: partitioning=Hash([__datafusion_extracted_4@0], 2), 
input_partitions=2
             DataSourceExec: file_groups={...}, projection=[get_field(s@0, k) 
as __datafusion_extracted_4, s], file_type=parquet
           RepartitionExec: partitioning=Hash([t.s[k]@0], 2), input_partitions=2
             DataSourceExec: file_groups={...}, projection=[get_field(s@0, k) 
as t.s[k]], file_type=parquet
   ] does not satisfy distribution requirements: 
KeyPartitioned[[__datafusion_extracted_2@0]]). Child-0 output partitioning: 
Hash([__datafusion_extracted_4@0], 2)
   ```
   
   The settings make the join `Partitioned` on this small data set.
   
   ### Expected behavior
   
   The query returns `a` and `b`, as it does at `0d3aac0bde`.
   
   ### Additional context
   
   A bisect points to #26747 (`99e723dd47`). Its parent `ce0e8293f9` plans the 
query.
   
   #26747 records `get_field(s, k) ≡ __datafusion_extracted_4` when projecting 
equivalences. That lets `EnsureRequirements` use the join's hash partitioning 
for the group key and skip a repartition, which is correct. Then 
`ProjectionPushdown` moves `get_field(s, k)` into the `DataSourceExec` 
projection and drops `__datafusion_extracted_4` through the join's embedded 
projection. Neither step records the equivalence again. So the join's output 
partitioning becomes an unknown column, and the final check rejects the plan.
   
   No rows move in that rewrite, so the query fails to plan and never returns 
wrong results.
   
   ---
   
   Claude Code (an AI coding assistant) investigated this and wrote this issue 
on behalf of cetra3. A PR with a fix follows.
   


-- 
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