From fc90c0b5e56653364bb6172d02e96a5d65491bc5 Mon Sep 17 00:00:00 2001 From: Chris Crabtree Date: Fri, 14 Jun 2024 16:35:26 +0100 Subject: [PATCH] feat: Allow OUTER keyword as function parameter name (#2021) * feat: Allow OUTER keyword as function parameter name * chore: Spotless --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 7 ++++--- .../statement/select/TableFunctionTest.java | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index d6b6bbb36..b8b204d9e 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4619,15 +4619,16 @@ JdbcNamedParameter JdbcNamedParameter() : { } OracleNamedFunctionParameter OracleNamedFunctionParameter() : { - String name; + Token token = null; + String name = null; Expression expression; } { - name=RelObjectNameExt2() + ( name=RelObjectNameExt2() | token= ) expression=Expression() { - return new OracleNamedFunctionParameter(name, expression); + return new OracleNamedFunctionParameter(name != null ? name : token.image, expression); } } 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 dec463eda..b53000455 100644 --- a/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java +++ b/src/test/java/net/sf/jsqlparser/statement/select/TableFunctionTest.java @@ -31,4 +31,20 @@ void testLateralFlat() throws JSQLParserException { TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); } + /** + * The SQL keyword "OUTER" is a valid parameter name for Snowflake's FLATTEN table function. + */ + @Test + void testTableFunctionWithNamedParameterWhereNameIsOuterKeyword() throws JSQLParserException { + String sqlStr = + "INSERT INTO db.schema.target\n" + + " (Name, FriendParent)\n" + + " SELECT\n" + + " i.DATA_VALUE:Name AS Name,\n" + + " f1.Value:Parent:Name AS FriendParent\n" + + " FROM\n" + + " db.schema.source AS i,\n" + + " lateral flatten(input => i.DATA_VALUE:Friends, outer => true) AS f1;"; + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } }