From 1f639cce58fdacdd14b01c201f1e37031c0a9d9e Mon Sep 17 00:00:00 2001 From: stephen Date: Wed, 8 Jan 2025 11:25:35 +0800 Subject: [PATCH] [Enhancement] adjust translate function syntax structure to prevent parser performance rollback Signed-off-by: stephen --- .../java/com/starrocks/sql/parser/AstBuilder.java | 12 +++++++++++- .../main/java/com/starrocks/sql/parser/StarRocks.g4 | 3 ++- .../java/com/starrocks/sql/parser/StarRocksLex.g4 | 2 +- .../java/com/starrocks/sql/parser/ParserTest.java | 12 ++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/parser/AstBuilder.java b/fe/fe-core/src/main/java/com/starrocks/sql/parser/AstBuilder.java index 281df72d0b80e1..f7fd30caa6b8d7 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/parser/AstBuilder.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/parser/AstBuilder.java @@ -6857,7 +6857,6 @@ private static void addArgumentUseTypeInt(Expr value, List exprs) { @Override public ParseNode visitSimpleFunctionCall(StarRocksParser.SimpleFunctionCallContext context) { - String fullFunctionName = getQualifiedName(context.qualifiedName()).toString(); NodePosition pos = createPos(context); @@ -7057,6 +7056,17 @@ public ParseNode visitSimpleFunctionCall(StarRocksParser.SimpleFunctionCallConte return SyntaxSugars.parse(functionCallExpr); } + @Override + public ParseNode visitTranslateFunctionCall(StarRocksParser.TranslateFunctionCallContext context) { + String fullFunctionName = "translate"; + NodePosition pos = createPos(context); + + FunctionName fnName = FunctionName.createFnName(fullFunctionName); + FunctionCallExpr functionCallExpr = new FunctionCallExpr(fnName, + new FunctionParams(false, visit(context.expression(), Expr.class)), pos); + return SyntaxSugars.parse(functionCallExpr); + } + @Override public ParseNode visitAggregationFunctionCall(StarRocksParser.AggregationFunctionCallContext context) { NodePosition pos = createPos(context); diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocks.g4 b/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocks.g4 index 07ba111c159cfe..7e4d9cf83608e6 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocks.g4 +++ b/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocks.g4 @@ -2478,6 +2478,7 @@ functionCall | specialFunctionExpression #specialFunction | aggregationFunction over? #aggregationFunctionCall | windowFunction over #windowFunctionCall + | TRANSLATE '(' (expression (',' expression)*)? ')' #translateFunctionCall | qualifiedName '(' (expression (',' expression)*)? ')' over? #simpleFunctionCall ; @@ -2974,7 +2975,7 @@ nonReserved | SAMPLE | SCHEDULE | SCHEDULER | SECOND | SECURITY | SEPARATOR | SERIALIZABLE |SEMI | SESSION | SETS | SIGNED | SNAPSHOT | SNAPSHOTS | SQLBLACKLIST | START | STREAM | SUM | STATUS | STOP | SKIP_HEADER | SWAP | STORAGE| STRING | STRUCT | STATS | SUBMIT | SUSPEND | SYNC | SYSTEM_TIME - | TABLES | TABLET | TABLETS | TAG | TASK | TEMPORARY | TIMESTAMP | TIMESTAMPADD | TIMESTAMPDIFF | THAN | TIME | TIMES | TRANSACTION | TRACE + | TABLES | TABLET | TABLETS | TAG | TASK | TEMPORARY | TIMESTAMP | TIMESTAMPADD | TIMESTAMPDIFF | THAN | TIME | TIMES | TRANSACTION | TRACE | TRANSLATE | TRIM_SPACE | TRIGGERS | TRUNCATE | TYPE | TYPES | UNBOUNDED | UNCOMMITTED | UNSET | UNINSTALL | USAGE | USER | USERS | UNLOCK diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocksLex.g4 b/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocksLex.g4 index a6ed05a1e28dca..0cb66c514a0471 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocksLex.g4 +++ b/fe/fe-core/src/main/java/com/starrocks/sql/parser/StarRocksLex.g4 @@ -443,7 +443,7 @@ TIMESTAMPADD: 'TIMESTAMPADD'; TIMESTAMPDIFF: 'TIMESTAMPDIFF'; TINYINT: 'TINYINT'; TRANSACTION: 'TRANSACTION'; -TRANSLATE: {getCharPositionInLine() == 0}? 'TRANSLATE'; +TRANSLATE: 'TRANSLATE'; TO: 'TO'; TRACE: 'TRACE'; TRIGGERS: 'TRIGGERS'; diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/parser/ParserTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/parser/ParserTest.java index 20ee294fd82e4f..e7c7d2712e073e 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/parser/ParserTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/parser/ParserTest.java @@ -41,6 +41,7 @@ import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.atn.PredictionMode; import org.junit.Assert; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -578,6 +579,17 @@ private static Stream unexpectedTokenSqls() { return arguments.stream(); } + @Test + public void testTranslateFunction() { + String sql = "select translate('abcabc', 'ab', '12') as test;"; + SessionVariable sessionVariable = new SessionVariable(); + try { + SqlParser.parse(sql, sessionVariable); + } catch (Exception e) { + Assertions.fail("sql should success. errMsg: " + e.getMessage()); + } + } + }