Allow java parameter replace entire IN expression

This commit is contained in:
aboyko
2025-03-16 11:50:14 -04:00
parent e696e8355b
commit 9c4aa052d4
10 changed files with 7707 additions and 7553 deletions

View File

@@ -2531,6 +2531,7 @@ expression
predicate
: predicate NOT? IN '(' (selectStatement | expressions) ')' # inPredicate
| predicate NOT? IN parameter # inPredicateWithParameter
| predicate IS nullNotnull # isNullPredicate
| left = predicate comparisonOperator right = predicate # binaryComparisonPredicate
| predicate comparisonOperator quantifier = (ALL | ANY | SOME) '(' selectStatement ')' # subqueryComparisonPredicate

View File

@@ -4044,6 +4044,7 @@ trim_list
in_expr
: select_with_parens # in_expr_select
| OPEN_PAREN expr_list CLOSE_PAREN # in_expr_list
| parameter # in_parameter
;
case_expr

View File

@@ -7020,6 +7020,18 @@ public class MySqlParserBaseListener implements MySqlParserListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitInPredicate(MySqlParser.InPredicateContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterInPredicateWithParameter(MySqlParser.InPredicateWithParameterContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitInPredicateWithParameter(MySqlParser.InPredicateWithParameterContext ctx) { }
/**
* {@inheritDoc}
*

View File

@@ -6409,6 +6409,18 @@ public interface MySqlParserListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitInPredicate(MySqlParser.InPredicateContext ctx);
/**
* Enter a parse tree produced by the {@code inPredicateWithParameter}
* labeled alternative in {@link MySqlParser#predicate}.
* @param ctx the parse tree
*/
void enterInPredicateWithParameter(MySqlParser.InPredicateWithParameterContext ctx);
/**
* Exit a parse tree produced by the {@code inPredicateWithParameter}
* labeled alternative in {@link MySqlParser#predicate}.
* @param ctx the parse tree
*/
void exitInPredicateWithParameter(MySqlParser.InPredicateWithParameterContext ctx);
/**
* Enter a parse tree produced by the {@code betweenPredicate}
* labeled alternative in {@link MySqlParser#predicate}.

View File

@@ -7898,6 +7898,18 @@ public class PostgreSqlParserBaseListener implements PostgreSqlParserListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitIn_expr_list(PostgreSqlParser.In_expr_listContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterIn_parameter(PostgreSqlParser.In_parameterContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitIn_parameter(PostgreSqlParser.In_parameterContext ctx) { }
/**
* {@inheritDoc}
*

View File

@@ -6589,6 +6589,18 @@ public interface PostgreSqlParserListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitIn_expr_list(PostgreSqlParser.In_expr_listContext ctx);
/**
* Enter a parse tree produced by the {@code in_parameter}
* labeled alternative in {@link PostgreSqlParser#in_expr}.
* @param ctx the parse tree
*/
void enterIn_parameter(PostgreSqlParser.In_parameterContext ctx);
/**
* Exit a parse tree produced by the {@code in_parameter}
* labeled alternative in {@link PostgreSqlParser#in_expr}.
* @param ctx the parse tree
*/
void exitIn_parameter(PostgreSqlParser.In_parameterContext ctx);
/**
* Enter a parse tree produced by {@link PostgreSqlParser#case_expr}.
* @param ctx the parse tree

View File

@@ -141,4 +141,19 @@ public class MySqlSemanticTokensTest {
assertThat(tokens.get(24)).isEqualTo(new SemanticTokenData(95, 97, "property", new String[0])); // id
}
@Test
void parameterIn() {
List<SemanticTokenData> tokens = provider.computeTokens("DELETE FROM t WHERE ID IN :ids");
assertThat(tokens.size()).isEqualTo(8);
assertThat(tokens.get(0)).isEqualTo(new SemanticTokenData(0, 6, "keyword", new String[0])); // DELETE
assertThat(tokens.get(1)).isEqualTo(new SemanticTokenData(7, 11, "keyword", new String[0])); // FROM
assertThat(tokens.get(2)).isEqualTo(new SemanticTokenData(12, 13, "variable", new String[0])); // t
assertThat(tokens.get(3)).isEqualTo(new SemanticTokenData(14, 19, "keyword", new String[0])); // WHERE
assertThat(tokens.get(4)).isEqualTo(new SemanticTokenData(20, 22, "variable", new String[0])); // ID
assertThat(tokens.get(5)).isEqualTo(new SemanticTokenData(23, 25, "keyword", new String[0])); // IN
assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(26, 27, "operator", new String[0])); // :
assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(27, 30, "parameter", new String[0])); // ids
}
}

View File

@@ -347,4 +347,19 @@ public class PostgreSqlSemanticTokensTest {
assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(43, 44, "operator", new String[0])); // ;
}
@Test
void parameterIn() {
List<SemanticTokenData> tokens = provider.computeTokens("DELETE FROM t WHERE ID IN :ids");
assertThat(tokens.size()).isEqualTo(8);
assertThat(tokens.get(0)).isEqualTo(new SemanticTokenData(0, 6, "keyword", new String[0])); // DELETE
assertThat(tokens.get(1)).isEqualTo(new SemanticTokenData(7, 11, "keyword", new String[0])); // FROM
assertThat(tokens.get(2)).isEqualTo(new SemanticTokenData(12, 13, "variable", new String[0])); // t
assertThat(tokens.get(3)).isEqualTo(new SemanticTokenData(14, 19, "keyword", new String[0])); // WHERE
assertThat(tokens.get(4)).isEqualTo(new SemanticTokenData(20, 22, "variable", new String[0])); // ID
assertThat(tokens.get(5)).isEqualTo(new SemanticTokenData(23, 25, "keyword", new String[0])); // IN
assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(26, 27, "operator", new String[0])); // :
assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(27, 30, "parameter", new String[0])); // ids
}
}