diff --git a/core/trino-parser/src/main/java/io/trino/sql/parser/ErrorHandler.java b/core/trino-parser/src/main/java/io/trino/sql/parser/ErrorHandler.java index f11601cc2d0d..f52489338990 100644 --- a/core/trino-parser/src/main/java/io/trino/sql/parser/ErrorHandler.java +++ b/core/trino-parser/src/main/java/io/trino/sql/parser/ErrorHandler.java @@ -301,7 +301,7 @@ else if (ignoredRules.contains(rule)) { if (transition instanceof RuleTransition) { RuleTransition ruleTransition = (RuleTransition) transition; for (int endToken : process(new ParsingState(ruleTransition.target, tokenIndex, suppressed, parser), ruleTransition.precedence)) { - activeStates.push(new ParsingState(ruleTransition.followState, endToken, suppressed, parser)); + activeStates.push(new ParsingState(ruleTransition.followState, endToken, suppressed && endToken == currentToken, parser)); } } else if (transition instanceof PrecedencePredicateTransition) { 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 dadd4e9c51fa..772cb44f78b3 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 @@ -65,7 +65,6 @@ public void syntaxError(Recognizer recognizer, Object offendingSymbol, int .specialRule(SqlBaseParser.RULE_query, "") .specialRule(SqlBaseParser.RULE_type, "") .specialToken(SqlBaseLexer.INTEGER_VALUE, "") - .ignoredRule(SqlBaseParser.RULE_nonReserved) .build(); private final BiConsumer initializer; diff --git a/core/trino-parser/src/test/java/io/trino/sql/parser/TestSqlParserErrorHandling.java b/core/trino-parser/src/test/java/io/trino/sql/parser/TestSqlParserErrorHandling.java index c1230b8adb5e..d962678c8d67 100644 --- a/core/trino-parser/src/test/java/io/trino/sql/parser/TestSqlParserErrorHandling.java +++ b/core/trino-parser/src/test/java/io/trino/sql/parser/TestSqlParserErrorHandling.java @@ -99,9 +99,9 @@ private static Stream statements() Arguments.of("SELECT grouping(a+2) FROM (VALUES (1)) AS t (a) GROUP BY a+2", "line 1:18: mismatched input '+'. Expecting: ')', ',', '.'"), Arguments.of("SELECT x() over (ROWS select) FROM t", - "line 1:23: mismatched input 'select'. Expecting: 'BETWEEN', 'CURRENT', 'UNBOUNDED', "), + "line 1:23: mismatched input 'select'. Expecting: ')', 'BETWEEN', 'CURRENT', 'GROUPS', 'MEASURES', 'ORDER', 'PARTITION', 'RANGE', 'ROWS', 'UNBOUNDED', "), Arguments.of("SELECT X() OVER (ROWS UNBOUNDED) FROM T", - "line 1:32: mismatched input ')'. Expecting: 'FOLLOWING', 'PRECEDING'"), + "line 1:32: mismatched input ')'. Expecting: '%', '(', '*', '+', '-', '->', '.', '/', 'AND', 'AT', 'FOLLOWING', 'OR', 'OVER', 'PRECEDING', '[', '||', , "), Arguments.of("SELECT a FROM x ORDER BY (SELECT b FROM t WHERE ", "line 1:49: mismatched input ''. Expecting: "), Arguments.of("SELECT a FROM a AS x TABLESAMPLE x ", @@ -160,7 +160,13 @@ private static Stream statements() Arguments.of("SELECT * FROM t FOR TIMESTAMP AS OF TIMESTAMP WHERE", "line 1:52: mismatched input ''. Expecting: "), Arguments.of("SELECT * FROM t FOR VERSION AS OF TIMESTAMP WHERE", - "line 1:50: mismatched input ''. Expecting: ")); + "line 1:50: mismatched input ''. Expecting: "), + Arguments.of("SELECT ROW(DATE '2022-10-10', DOUBLE 12.0)", + "line 1:38: mismatched input '12.0'. Expecting: '%', '(', ')', '*', '+', ',', '-', '->', '.', '/', 'AND', 'AT', 'OR', 'ORDER', 'OVER', 'PRECISION', '[', '||', , "), + Arguments.of("VALUES(DATE 2)", + "line 1:13: mismatched input '2'. Expecting: '%', '(', ')', '*', '+', ',', '-', '->', '.', '/', 'AND', 'AT', 'OR', 'OVER', '[', '||', , "), + Arguments.of("SELECT count(DISTINCT *) FROM (VALUES 1)", + "line 1:23: mismatched input '*'. Expecting: ")); } @Test @@ -178,7 +184,7 @@ public void testPossibleExponentialBacktracking() "1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * " + "1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * " + "1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9", - "line 1:375: mismatched input ''. Expecting: '%', '*', '+', '-', '/', 'AT', 'THEN', '||'"); + "line 1:375: mismatched input ''. Expecting: '%', '*', '+', '-', '.', '/', 'AND', 'AT', 'OR', 'THEN', '[', '||', "); } @Test @@ -208,7 +214,7 @@ public void testPossibleExponentialBacktracking2() "OR (f()\n" + "OR (f()\n" + "GROUP BY id", - "line 24:1: mismatched input 'GROUP'. Expecting: ')', ',', '.', 'FILTER', 'IGNORE', 'OVER', 'RESPECT', '['"); + "line 24:1: mismatched input 'GROUP'. Expecting: '%', ')', '*', '+', ',', '-', '.', '/', 'AND', 'AT', 'FILTER', 'IGNORE', 'OR', 'OVER', 'RESPECT', '[', '||', "); } @ParameterizedTest