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

   ### Describe the bug
   
   Valid queries against a parquet table with certain structural 
characteristics now fail with an execution error: `Field common not found in 
struct.`
   
   As noted in the issue title, my _guess_ is that this is due to 
overaggressive pruning of nested fields during pushdown, but that needs some 
further verification.
   
   I have worked up a minimal reproducer (below) which you can replicate with 
the `datafusion-cli`.
   
   ### To Reproduce
   
   ```sql
   -- Set up: an external parquet table with a few rows.
   -- Apologies for the somewhat oblique construction, but certain DataFusion 
versions
   -- rejected a simpler version with map(['en'], [english]).
   COPY (
       SELECT named_struct(
           'primary', local_name,
           'common', map([language], [english])
       ) AS names
       FROM (VALUES ('Local', 'en', 'English'), (NULL, 'en', 'Fallback'), ('', 
'en', ''))
           AS input(local_name, language, english)
   ) TO '/tmp/datafusion-reproducer.parquet' STORED AS PARQUET;
   
   CREATE EXTERNAL TABLE nested_names
   STORED AS PARQUET
   LOCATION '/tmp/datafusion-reproducer.parquet';
   
   -- These are defaults for a while AFAIK but including for reproducibility.
   SET datafusion.execution.parquet.pushdown_filters = true;
   SET datafusion.optimizer.enable_leaf_expression_pushdown = true;
   
   -- Expected:
   -- +-----------------------------+
   -- | nested_names.names[primary] |
   -- +-----------------------------+
   -- | Local                       |
   -- | NULL                        |
   -- +-----------------------------+
   --
   -- Actual:
   -- Parquet error: External: External error: Error evaluating filter predicate
   -- caused by
   -- Execution error: Field common not found in struct
   SELECT names.primary
   FROM nested_names
   WHERE coalesce(names.primary, names.common['en']) <> '';
   
   SET datafusion.execution.parquet.pushdown_filters = false;
   SET datafusion.optimizer.enable_leaf_expression_pushdown = false;
   
   -- With BOTH of these settings disabled, it succeeds and returns Local and 
NULL.
   -- It still fails if either one is true.
   SELECT names.primary
   FROM nested_names
   WHERE coalesce(names.primary, names.common['en']) <> '';
   
   -- Hacky SQL workaround: succeeds even with pushdown enabled.
   SET datafusion.execution.parquet.pushdown_filters = true;
   SET datafusion.optimizer.enable_leaf_expression_pushdown = true;
   
   SELECT names.primary
   FROM nested_names
   WHERE coalesce(names.primary, map_extract(names.common, 'en')[1]) <> '';
   ```
   
   ### Expected behavior
   
   The original query should succeed as written with syntax like 
`names.common['en']`, without needing to disable predicate pushdown or 
SQL-level hacks.
   
   ### Additional context
   
   I haven't had a chance to do a full git bisect, but installing a few 
releases, I've narrowed it quite a bit. Release-wise, the bug first appeared in 
54.0.0; 53.1.0 was fine, and it is still broken on `main` at the time of this 
writing.
   
   ### Willingness to contribute
   
   I would like to contribute a fix for this bug, but request guidance from the 
DataFusion community


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