From 0e4c17d035c7bf2f2fa0c6256df854522ea13b57 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Tue, 29 Aug 2023 11:35:17 -0700 Subject: [PATCH 1/3] Fix parser fallback to LL mode --- .../io/trino/sql/jsonpath/PathParser.java | 3 +-- .../java/io/trino/sql/parser/SqlParser.java | 23 ++++++++++--------- .../java/io/trino/type/TypeCalculation.java | 3 +-- .../expression/ExpressionMappingParser.java | 3 +-- .../expression/SparkExpressionParser.java | 3 +-- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java b/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java index c4f54eaa5a3f..65a5e45d3cbc 100644 --- a/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java +++ b/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java @@ -28,7 +28,6 @@ import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.atn.PredictionMode; import org.antlr.v4.runtime.misc.Pair; -import org.antlr.v4.runtime.misc.ParseCancellationException; import org.antlr.v4.runtime.tree.TerminalNode; import java.util.Arrays; @@ -83,7 +82,7 @@ public PathNode parseJsonPath(String path) parser.getInterpreter().setPredictionMode(PredictionMode.SLL); tree = parser.path(); } - catch (ParseCancellationException ex) { + catch (ParsingException ex) { // if we fail, parse with LL mode tokenStream.seek(0); // rewind input stream parser.reset(); diff --git a/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java b/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java index a2263559b421..3928ced3d7f6 100644 --- a/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java +++ b/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java @@ -36,7 +36,6 @@ import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.atn.PredictionMode; import org.antlr.v4.runtime.misc.Pair; -import org.antlr.v4.runtime.misc.ParseCancellationException; import org.antlr.v4.runtime.tree.TerminalNode; import java.util.Arrays; @@ -152,17 +151,19 @@ public Token recoverInline(Parser recognizer) ParserRuleContext tree; try { - // first, try parsing with potentially faster SLL mode - parser.getInterpreter().setPredictionMode(PredictionMode.SLL); - tree = parseFunction.apply(parser); - } - catch (ParseCancellationException ex) { - // if we fail, parse with LL mode - tokenStream.seek(0); // rewind input stream - parser.reset(); + try { + // first, try parsing with potentially faster SLL mode + parser.getInterpreter().setPredictionMode(PredictionMode.SLL); + tree = parseFunction.apply(parser); + } + catch (ParsingException ex) { + // if we fail, parse with LL mode + tokenStream.seek(0); // rewind input stream + parser.reset(); - parser.getInterpreter().setPredictionMode(PredictionMode.LL); - tree = parseFunction.apply(parser); + parser.getInterpreter().setPredictionMode(PredictionMode.LL); + tree = parseFunction.apply(parser); + } } catch (ParsingException e) { location.ifPresent(statementLocation -> { diff --git a/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java b/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java index ee9029d0a3ba..c01298f80214 100644 --- a/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java +++ b/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java @@ -32,7 +32,6 @@ import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.atn.PredictionMode; -import org.antlr.v4.runtime.misc.ParseCancellationException; import java.math.BigInteger; import java.util.Map; @@ -92,7 +91,7 @@ private static ParserRuleContext parseTypeCalculation(String calculation) parser.getInterpreter().setPredictionMode(PredictionMode.SLL); tree = parser.typeCalculation(); } - catch (ParseCancellationException ex) { + catch (ParsingException ex) { // if we fail, parse with LL mode tokenStream.seek(0); // rewind input stream parser.reset(); diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java index ac975cef7567..77d73f09355c 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java @@ -21,7 +21,6 @@ import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.Recognizer; import org.antlr.v4.runtime.atn.PredictionMode; -import org.antlr.v4.runtime.misc.ParseCancellationException; import java.util.Map; import java.util.Set; @@ -77,7 +76,7 @@ public Object invokeParser(String input, Function Date: Tue, 29 Aug 2023 11:36:00 -0700 Subject: [PATCH 2/3] Fix exception for StackOverflow in SparkExpressionParser --- .../plugin/deltalake/expression/SparkExpressionParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java index 908e802e2520..729310871e67 100644 --- a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java +++ b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java @@ -86,7 +86,7 @@ private static Object invokeParser(String input, Function Date: Tue, 29 Aug 2023 11:41:47 -0700 Subject: [PATCH 3/3] Cleanup warnings in parsers --- .../io/trino/sql/jsonpath/PathParser.java | 34 ++++--------------- .../java/io/trino/sql/parser/SqlParser.java | 3 +- .../java/io/trino/type/TypeCalculation.java | 31 ++--------------- .../expression/ExpressionMappingParser.java | 3 +- .../expression/SparkExpressionParser.java | 3 +- 5 files changed, 15 insertions(+), 59 deletions(-) diff --git a/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java b/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java index 65a5e45d3cbc..e3be63349577 100644 --- a/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java +++ b/core/trino-parser/src/main/java/io/trino/sql/jsonpath/PathParser.java @@ -33,6 +33,7 @@ import java.util.Arrays; import java.util.List; +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; public final class PathParser @@ -43,8 +44,8 @@ public PathParser(Location startLocation) { requireNonNull(startLocation, "startLocation is null"); - int pathStartLine = startLocation.line; - int pathStartColumn = startLocation.column; + int pathStartLine = startLocation.line(); + int pathStartColumn = startLocation.column(); this.errorListener = new BaseErrorListener() { @Override @@ -134,33 +135,12 @@ public void exitNonReserved(JsonPathParser.NonReservedContext context) } } - public static class Location + public record Location(int line, int column) { - private final int line; - private final int column; - - public Location(int line, int column) - { - if (line < 1) { - throw new IllegalArgumentException("line must be at least 1"); - } - - if (column < 0) { - throw new IllegalArgumentException("column must be at least 0"); - } - - this.line = line; - this.column = column; - } - - public int getLine() - { - return line; - } - - public int getColumn() + public Location { - return column; + checkArgument(line >= 1, "line must be at least 1"); + checkArgument(column >= 0, "column must be at least 0"); } } } diff --git a/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java b/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java index 3928ced3d7f6..d155aec06bfb 100644 --- a/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java +++ b/core/trino-parser/src/main/java/io/trino/sql/parser/SqlParser.java @@ -23,6 +23,7 @@ import io.trino.sql.tree.PathSpecification; import io.trino.sql.tree.RowPattern; import io.trino.sql.tree.Statement; +import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonToken; @@ -48,7 +49,7 @@ public class SqlParser { - private static final BaseErrorListener LEXER_ERROR_LISTENER = new BaseErrorListener() + private static final ANTLRErrorListener LEXER_ERROR_LISTENER = new BaseErrorListener() { @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String message, RecognitionException e) diff --git a/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java b/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java index c01298f80214..df797ffbcb9e 100644 --- a/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java +++ b/core/trino-parser/src/main/java/io/trino/type/TypeCalculation.java @@ -25,6 +25,7 @@ import io.trino.grammar.type.TypeCalculationParser.ParenthesizedExpressionContext; import io.trino.grammar.type.TypeCalculationParser.TypeCalculationContext; import io.trino.sql.parser.ParsingException; +import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -47,7 +48,7 @@ public final class TypeCalculation { - private static final BaseErrorListener ERROR_LISTENER = new BaseErrorListener() + private static final ANTLRErrorListener ERROR_LISTENER = new BaseErrorListener() { @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String message, RecognitionException e) @@ -102,34 +103,6 @@ private static ParserRuleContext parseTypeCalculation(String calculation) return tree; } - private static class IsSimpleExpressionVisitor - extends TypeCalculationBaseVisitor - { - @Override - public Boolean visitArithmeticBinary(ArithmeticBinaryContext ctx) - { - return false; - } - - @Override - public Boolean visitArithmeticUnary(ArithmeticUnaryContext ctx) - { - return false; - } - - @Override - protected Boolean defaultResult() - { - return true; - } - - @Override - protected Boolean aggregateResult(Boolean aggregate, Boolean nextResult) - { - return aggregate && nextResult; - } - } - private static class CalculateTypeVisitor extends TypeCalculationBaseVisitor { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java index 77d73f09355c..f06e20be4a76 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionMappingParser.java @@ -14,6 +14,7 @@ package io.trino.plugin.jdbc.expression; import com.google.common.collect.ImmutableMap; +import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -31,7 +32,7 @@ public class ExpressionMappingParser { - private static final BaseErrorListener ERROR_LISTENER = new BaseErrorListener() + private static final ANTLRErrorListener ERROR_LISTENER = new BaseErrorListener() { @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String message, RecognitionException e) diff --git a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java index 729310871e67..f426d63e6a70 100644 --- a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java +++ b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/expression/SparkExpressionParser.java @@ -14,6 +14,7 @@ package io.trino.plugin.deltalake.expression; import com.google.common.annotations.VisibleForTesting; +import org.antlr.v4.runtime.ANTLRErrorListener; import org.antlr.v4.runtime.BaseErrorListener; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -28,7 +29,7 @@ public final class SparkExpressionParser { - private static final BaseErrorListener ERROR_LISTENER = new BaseErrorListener() + private static final ANTLRErrorListener ERROR_LISTENER = new BaseErrorListener() { @Override public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String message, RecognitionException e)