diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 087c530b4..e0ee6a94a 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -1202,7 +1202,6 @@ public class CCJSqlParser extends AbstractJSqlParser { if (k2 == K_TABLE && isTableQueryAhead(2)) return false; // ( ( SELECT ) UNION ( SELECT ) ) → isNestedSetOperationAhead handles it // Other (( patterns: ( (SELECT...) JOIN ... ) or ( (table) ) → ParenthesedFromItem - if (k2 == K_LATERAL) return false; // handled by LateralSubSelect if (k2 == CLOSING_BRACKET) return false; // empty "()" is not valid // EXASOL: ( IMPORT ... ) is a SubImport; handled at the outer FromItem level // by LOOKAHEAD(2, Dialect.EXASOL...) SubImport() - must NOT go into ParenthesedFromItem diff --git a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java index 122b13ba4..37c9c837d 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java @@ -2728,6 +2728,13 @@ public void testLateral1() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(stmt); } + @Test + public void testParenthesedLateral() throws JSQLParserException { + String stmt = + "SELECT O.ORDERID, O.CUSTNAME, OL.LINETOTAL FROM ORDERS AS O, (LATERAL(SELECT SUM(NETAMT) AS LINETOTAL FROM ORDERLINES AS LINES WHERE LINES.ORDERID = O.ORDERID)) AS OL"; + assertSqlCanBeParsedAndDeparsed(stmt); + } + @Test public void testLateralComplex1() throws IOException, JSQLParserException { String stmt = IOUtils.toString( diff --git a/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java b/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java index 3187e046c..c39f2f0c8 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java @@ -33,6 +33,19 @@ void testLateralFlat() throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); } + /** + * A LATERAL item may be wrapped in parentheses, in which case it is a parenthesed FROM item + * whose content happens to be lateral, not a bare LateralSubSelect. + */ + @Test + void testParenthesedLateralFlat() throws JSQLParserException { + String sqlStr = "SELECT DIM, count(value) AS COUNT_\n" + + "FROM t a,\n" + + "(LATERAL FLATTEN(input => a.user_items)) b\n" + + "group by 1"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } + /** * The SQL keyword "OUTER" is a valid parameter name for Snowflake's FLATTEN table function. */