It’s all consistent - really! Consider ‘x OR NOT y’. Is ‘OR NOT’ an operator? Of course not. ‘NOT’ is a prefix operator, and ‘OR’ applies to its result.
Similarly, ‘x JOIN LATERAL y ON (c)’, the ‘LATERAL’ applies to ‘y’ more, and only later does the ‘JOIN’ kick in. ‘LATERAL’ can apply to any table-like object, such as a sub-query. So ‘x, LATERAL y’ fits with that model. (In fact, we think of ‘,’ as short-hand for ‘CROSS JOIN’.) CROSS APPLY and OUTER APPLY are really useful, and Oracle/Microsoft designed them well, but they are not fundamental. Calcite implements them as syntactic sugar — i.e. a rewrite at an early stage to ‘CROSS JOIN LATERAL’ — and I think that’s how Drill should do it too. LATERAL is fundamental but it’s hard for end-users to understand, so it’s better if end-users use UNNEST and CROSS/OUTER APPLY for most purposes. Julian > On Feb 2, 2018, at 9:08 AM, Aman Sinha <amansi...@apache.org> wrote: > > Internally, within the query engine both LATERAL and CROSS/OUTER APPLY > would be essentially doing the same work. > > After thinking about this some more, from the syntax perspective I do see > Julian's point about the CROSS/OUTER APPLY having some advantages over > LATERAL. > > In particular, with LATERAL there are a few inconsistencies: (I am not > sure why the SQL standards committee did not define this more crisply) > > Inner Join versions (equivalent to CROSS APPLY) ...there are 2 > alternatives: > 1. SELECT .. FROM t1, LATERAL (SELECT ... FROM UNNEST(t1.orders)) ; > 2. SELECT .. FROM t1 INNER JOIN LATERAL (SELECT .. FROM > UNNEST(t1.orders)) on TRUE; > > Outer Join version (equivalent to OUTER APPLY): > 3. SELECT .. FROM t1 LEFT JOIN LATERAL (SELECT ... FROM > UNNEST(t1.orders)) on TRUE ; > > I can see 3 inconsistencies : > a) In the first query there is a 'comma' separating the table with LATERAL > because LATERAL appears as a prefix operator acting on the subquery > whereas in the 2nd and 3rd queries, it appears as join qualifier and > there is no 'comma'. This gives the impression that it is a prefix in 1 > but a binary operator in 2 and 3. > b) For the outer join case, there is only one way to express the query > whereas with inner join there are 2 alternatives. > c) The 'ON TRUE' clause is needed in the 'JOIN' versions 2 and 3, but not > needed in 1. > > > In comparison, the CROSS/OUTER APPLY is less ambiguous : there is only one > way to express a CROSS or OUTER APPLY. It does not involve the 'JOIN' > clause, > so there is no need for the 'ON' clause either. It also makes it explicit > that the APPLY keyword is about applying a table function. > > Couple of disadvantages of the CROSS/OUTER APPLY: > a) it is not official SQL standard, but as Julian said, it falls in the > 'gray area'. > b) If Drill supports these, the SqlConformance setting in Calcite would > need to be customized..currently we use DEFAULT. > > Overall, seems the advantages of CROSS/OUTER APPLY outweigh the > disadvantages, so we could go with that. > > > -Aman > > > > > On Tue, Jan 30, 2018 at 4:42 PM, Julian Hyde <jh...@apache.org > <mailto:jh...@apache.org>> wrote: > >> There are a few things in the gray area between the official standard and >> the de facto standard. CROSS/OUTER APPLY is well thought out, does not >> conflict with standard SQL, and has a couple of big vendors behind it. I >> think it’s safe to add it. (Calcite has a conformance setting so that >> someone can disable it if they choose.) >> >> SQL Server goes a bit further, in that allows you to invoke a UDF without >> the TABLE keyword. We do not allow that in Calcite, at this point, because >> it could be ambiguous[2]. >> >> I recommend that you do not start building key features on LATERAL. >> LATERAL is a concept that is tricky for users to get their heads around - >> it is really a hack that subtly adjusts the namespaces that the SQL >> validator uses when resolving table aliases inside a join. It’s not >> inherently about unnesting data or calling functions - in fact LATERAL is >> implicit if you use UNNEST. The less your end users need to type LATERAL, >> the better. >> >> Julian >> >> [2] https://issues.apache.org/jira/browse/CALCITE-1490 < >> https://issues.apache.org/jira/browse/CALCITE-1490 >> <https://issues.apache.org/jira/browse/CALCITE-1490>> >> >>> On Jan 30, 2018, at 12:20 PM, Chunhui Shi <c...@mapr.com> wrote: >>> >>> Hi Julian, I think CROSS APPLY and OUTER APPLY are what we want and we >> have discussed internally. the only problem is, they are not standard SQL >> although they are supported in SQL server and Oracle 12. Since SQL syntax >> does not have way to "invoke table function for each row", we have to >> choose between using APPLY or overloading the meaning of LATERAL as in the >> current document attached in the JIRA. Which way you think is the better >> way? >>> >>> >>> Thanks, >>> >>> Chunhui >>> >>> ________________________________ >>> From: Julian Hyde <jh...@apache.org> >>> Sent: Tuesday, January 30, 2018 12:01:47 PM >>> To: dev@drill.apache.org >>> Subject: Re: LATERAL and UNNEST support for Drill >>> >>> LATERAL is a prefix operator not a binary operator, so I believe you are >> missing a comma: >>> >>>> FROM t1 LATERAL UNNEST (t1.array1), UNNEST (t1.array2) >>> >>> should be >>> >>>> FROM t1, LATERAL UNNEST (t1.array1), LATERAL UNNEST (t1.array2) >>> >>> I agree with your remarks about the extra power of putting UNNEST in the >> FROM clause (per the standard) versus the SELECT clause (per PostgreSQL). >>> >>> Note that Calcite supports CROSS APPLY and OUTER APPLY[1]. This is >> useful when you want to apply a table function for each row of a table. It >> is just syntactic sugar for LATERAL TABLE so you may get it virtually for >> free. >>> >>> Julian >>> >>> >>> [1] https://urldefense.proofpoint.com/v2/url?u=https-3A__issues. >> apache.org_jira_browse_CALCITE-2D1472&d=DwIFAg&c=cskdkSMqhcnjZxdQVpwTXg&r= >> FCGQb-L4gJ1XbsL1WU2sugDtPvzIxWFzAi5u4TTtxaI&m= >> 9Y08i3YgrresMOxi7InbjxT0WSHQkcPjJufQWLI9PGk&s= >> PfJfEyQhvXOSwuTo04m94qSHfz2KHZrR2WPazXpUl6g&e= <https://urldefense. >> proofpoint.com/v2/url?u=https-3A__issues.apache.org_jira_ >> browse_CALCITE-2D1472&d=DwIFAg&c=cskdkSMqhcnjZxdQVpwTXg&r=FCGQb- >> L4gJ1XbsL1WU2sugDtPvzIxWFzAi5u4TTtxaI&m=9Y08i3YgrresMOxi7InbjxT0WSHQkc >> PjJufQWLI9PGk&s=PfJfEyQhvXOSwuTo04m94qSHfz2KHZrR2WPazXpUl6g&e=> >>> >>> >>> >>>> On Jan 29, 2018, at 8:58 AM, Sorabh Hamirwasia <shamirwa...@mapr.com> >> wrote: >>>> >>>> Hi Ted, >>>> Thanks for you question. Array type aggregator is not planned along >> with this project. But probably after this is done we can look into it. >>>> >>>> Thanks, >>>> Sorabh >>>> >>>> Get Outlook for iOS<https://urldefense.proofpoint.com/v2/url?u=https- >> 3A__aka.ms_o0ukef&d=DwIFAg&c=cskdkSMqhcnjZxdQVpwTXg&r=FCGQb- >> L4gJ1XbsL1WU2sugDtPvzIxWFzAi5u4TTtxaI&m=9Y08i3YgrresMOxi7InbjxT0WSHQkc >> PjJufQWLI9PGk&s=InfpmexAnhHoPUeNA7M-E8qIORMLXwvsqDfFAA69glg&e=> >>>> ________________________________ >>>> From: Ted Dunning <ted.dunn...@gmail.com> >>>> Sent: Sunday, January 28, 2018 10:30:30 PM >>>> To: dev@drill.apache.org >>>> Cc: Chunhui Shi; Parth Chandra; Aman Sinha; Sorabh Hamirwasia >>>> Subject: Re: LATERAL and UNNEST support for Drill >>>> >>>> >>>> I haven't looked at the design doc, but this is a great thing to have. >>>> >>>> Would you be building something to do the inverse as well? >>>> >>>> Something like an aggregator such as array_collect, perhaps? >>>> >>>> >>>> >>>> On Thu, Jan 25, 2018 at 2:56 PM, Sorabh Hamirwasia < >> sohami.apa...@gmail.com<mailto:sohami.apa...@gmail.com>> wrote: >>>> Hi All, >>>> >>>> We (people in cc list) have been looking into design for support of >> LATERAL >>>> and UNNEST within Drill. With upgrade of Calcite to 1.15, these keywords >>>> are supported in Calcite too. As a first cut we have created a design >>>> document which proposes the changes and limitation's for this project. >>>> There are still few items which are in progress. I am sharing the JIRA >>>> details along with link to design document below. Please feel free to >> take >>>> a look and provide any feedback. >>>> >>>> >>>> DRILL-5999 <https://urldefense.proofpoint.com/v2/url?u=https- >> 3A__issues.apache.org_jira_browse_DRILL-2D5999&d=DwIFAg& >> c=cskdkSMqhcnjZxdQVpwTXg&r=FCGQb-L4gJ1XbsL1WU2sugDtPvzIxWFzAi5u4TTtxaI&m= >> 9Y08i3YgrresMOxi7InbjxT0WSHQkcPjJufQWLI9PGk&s=v0h- >> mUzhxxODVbYyAScphlkT0gnnF6vdvLAiaND2JvY&e=<https:// >> urldefense.proofpoint.com/v2/url?u=https-3A__issues.apache. >> org_jira_browse_DRILL-2D5999&d=DwMFaQ&c=cskdkSMqhcnjZxdQVpwTXg&r= >> gRpEl0WzXE3EMrwj0KFbZXGXRyadOthF2jlYxvhTlQg&m= >> iKu0hCGDHFbZsyzbsmTFjCYxYuLB4FUf26dimMQ8ErE&s=s-Ja1U7TeOgi96_ >> QzCmtlKlV9S8uvtBgjfywbJKp-Tw&e=>> >>>> >>>> Design Document >>>> <https://urldefense.proofpoint.com/v2/url?u=https- >> 3A__docs.google.com_document_d_1-2DRCIJ0F7VwAqOxkVB305zADwtX- >> 2DOS43Qj2kUmIILUaQ_edit-3Fusp-3Dsharing&d=DwIFAg&c= >> cskdkSMqhcnjZxdQVpwTXg&r=FCGQb-L4gJ1XbsL1WU2sugDtPvzIxWFzAi5u4TTtxaI&m= >> 9Y08i3YgrresMOxi7InbjxT0WSHQkcPjJufQWLI9PGk&s=30KoGGEUntrnoT- >> iDtbBdvnQKz25w3l-Op_ksZVNhRA&e=<https://urldefense. >> proofpoint.com/v2/url?u=https-3A__docs.google.com_document_d_1- >> 2DRCIJ0F7VwAqOxkVB305zADwtX-2DOS43Qj2kUmIILUaQ_edit-3Fusp- >> 3Dsharing&d=DwMFaQ&c=cskdkSMqhcnjZxdQVpwTXg&r= >> gRpEl0WzXE3EMrwj0KFbZXGXRyadOthF2jlYxvhTlQg&m= >> iKu0hCGDHFbZsyzbsmTFjCYxYuLB4FUf26dimMQ8ErE&s= >> keKwGEfpcC8MLXAV4QFiAXASguRR9R1dsGMZdyUmd2E&e=>> >>>> >>>> >>>> Thanks, >>>> Sorabh