You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@datafusion.apache.org by "alamb (via GitHub)" <gi...@apache.org> on 2024/12/13 15:42:41 UTC

Re: [I] Feature request: Support for lateral joins [datafusion]

alamb commented on issue #10048:
URL: https://github.com/apache/datafusion/issues/10048#issuecomment-2541729713

   There is some more discussion about this here: https://github.com/apache/datafusion/issues/13659#issuecomment-2541722186
   
   Summarizing: Postgres appears to plan this type of query as a NestedLoops join:
   
   ```sql
   postgres=# create table unnest_test (c1 int[]);
   CREATE TABLE
   postgres=# insert into unnest_test values (ARRAY [1,2,3]);
   INSERT 0 1
   postgres=# select * from unnest_test u, unnest(u.c1);
      c1    | unnest 
   ---------+--------
    {1,2,3} |      1
    {1,2,3} |      2
    {1,2,3} |      3
   (3 rows)
   ```
   
   ```sql
    Nested Loop  (cost=0.00..295.60 rows=13600 width=36)
      Output: u.c1, unnest.unnest
      ->  Seq Scan on public.unnest_test u  (cost=0.00..23.60 rows=1360 width=32)
            Output: u.c1
      ->  Function Scan on pg_catalog.unnest  (cost=0.00..0.10 rows=10 width=4)
            Output: unnest.unnest
            Function Call: unnest(u.c1)
   ```
   
   🤔 
   
   I think the postgres join operator re-evaluates the right input (`pg_catalog.unnest`) on each input row to the join which is how the lateral joins can refer to the outer query
   
   The current DataFusion join operators don't run the input over and over again -- they normally run each input and then combine them (they don't restart inputs)
   
   So in a query like
   ```sql
   select * from t1, unnest(t1.c1)
   ```
   
   I think we would need a (new) type of JoinExec that actually does run the outer query (aka `unnest(t1.c1)` for each input row of `t1`) 🤔 


-- 
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: github-unsubscribe@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org