I'll replace the VALUES subqueries with tables and indent to make the intended operator precedence clearer:
SELECT * FROM customer LEFT OUTER JOIN orders INNER JOIN lineitem ON o_orderkey = l_orderkey ON c_custkey = o_custkey Since 1.31 [1] we support parenthesized joins, like this: SELECT * FROM customer AS c LEFT OUTER JOIN (orders AS o INNER JOIN lineitem AS l ON o.orderkey = l.orderkey) ON c.custkey = o.custkey But I believe the thing before the ON keyword must be a table reference, not a join term. For your query to be valid, you need to convert a join term such as 'x join y on condition' into a table reference by enclosing it in parentheses. Should we support the version without parentheses? My inclination is no. The precedence/associativity of the JOIN operator are not clear enough without parentheses; ambiguity is bad for users (cryptic error messages, and obscure parser bugs) and bad for performance (parsers have to backtrack). But if you can show that the SQL standard allows joins without parentheses we should reconsider. Julian [1] https://issues.apache.org/jira/browse/CALCITE-35 On Tue, Jan 2, 2024 at 3:36 PM Sean Broeder <s...@dremio.com.invalid> wrote: > > Thank you for looking at this Julian. To be clear, I’m asking if this > statement should be supported or not. I’m not suggesting that it should be. > > Hopefully this formatting is easier to read: > > SELECT * > FROM ( > VALUES (1, > 'John')) AS "customer"(c_custkey, > c_name) > LEFT OUTER JOIN ( > VALUES(100, > 1)) AS "orders"(o_orderkey, > o_custkey) > INNER JOIN ( > VALUES (100, > 'Random item')) AS "lineitem"(l_orderkey, > l_itemname) ON o_orderkey = > l_orderkey ON c_custkey = o_custkey > > > > On Jan 2, 2024, at 1:07 PM, Julian Hyde <jh...@apache.org> wrote: > > > > What is 'this syntax' you think we should support? (Your query is > > poorly formatted, so I can't see what pattern in it is confusing the > > parser.) > > > > On Tue, Jan 2, 2024 at 11:46 AM Sean Broeder <sbroe...@apache.org> wrote: > >> > >> It looks like Calcite doesn't support the query > >> > >> select * from (values (1, 'John')) as > >> > >> "customer"(c_custkey, c_name) > >> > >> left outer join (values(100, 1)) as "orders"(o_orderkey, o_custkey) > >> > >> inner join (values (100, 'Random item')) as "lineitem"(l_orderkey, > >> l_itemname) on o_orderkey = l_orderkey > >> > >> on c_custkey = o_custkey > >> I'm seeing a parser error > >> on c_custkey = o_custkey": parse failed: Encountered "on" at line 5, column > >> 1. > >> Was expecting one of: > >> <EOF> > >> "EXCEPT" ... > >> > >> Should this syntax be supported? > >> > >> It looks like this syntax is supported by at least postgres and sqlserver. > >> > >> Thanks! >