diff --git a/babel/src/main/codegen/config.fmpp b/babel/src/main/codegen/config.fmpp index f75631e739ab..ad2dc1f9d5bc 100644 --- a/babel/src/main/codegen/config.fmpp +++ b/babel/src/main/codegen/config.fmpp @@ -548,6 +548,10 @@ data: { "< NULL_SAFE_EQUAL: \"<=>\" >" ] + # Custom identifier token. + # Example: "< IDENTIFIER: (|)+ >". + customIdentifierToken: "< IDENTIFIER: (|)+ >" + # Binary operators initialization. # Example: "InfixCast". extraBinaryExpressions: [ diff --git a/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java b/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java index 777e34aa0c76..6e0a99e99e2d 100644 --- a/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java +++ b/babel/src/test/java/org/apache/calcite/test/BabelParserTest.java @@ -109,6 +109,13 @@ class BabelParserTest extends SqlParserTest { sql(sql).ok(expected); } + @Test void testIdentifierStartWithNumber() { + final String sql = "select 1 as 1_c1 from t"; + final String expected = "SELECT 1 AS `1_C1`\n" + + "FROM `T`"; + sql(sql).ok(expected); + } + /** Tests that there are no reserved keywords. */ @Disabled @Test void testKeywords() { diff --git a/core/src/main/codegen/templates/Parser.jj b/core/src/main/codegen/templates/Parser.jj index c18f1950244d..6a289ab7b64d 100644 --- a/core/src/main/codegen/templates/Parser.jj +++ b/core/src/main/codegen/templates/Parser.jj @@ -8323,7 +8323,11 @@ MORE : TOKEN : { - < IDENTIFIER: (|)* > + <#if parser.customIdentifierToken??> + ${parser.customIdentifierToken} + <#else> + < IDENTIFIER: (|)* > + } TOKEN :