diff --git a/plugin/trino-base-jdbc/src/main/antlr4/io/trino/plugin/jdbc/expression/ConnectorExpressionPattern.g4 b/plugin/trino-base-jdbc/src/main/antlr4/io/trino/plugin/jdbc/expression/ConnectorExpressionPattern.g4 index ca8a960fb2fc..803a2553df33 100644 --- a/plugin/trino-base-jdbc/src/main/antlr4/io/trino/plugin/jdbc/expression/ConnectorExpressionPattern.g4 +++ b/plugin/trino-base-jdbc/src/main/antlr4/io/trino/plugin/jdbc/expression/ConnectorExpressionPattern.g4 @@ -36,7 +36,7 @@ call ; expressionCapture - : identifier ':' type + : identifier (':' type)? ; type diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionCapture.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionCapture.java index 83bd1b2d1f7e..9d62cb46abfd 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionCapture.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionCapture.java @@ -19,6 +19,7 @@ import io.trino.spi.expression.ConnectorExpression; import java.util.Objects; +import java.util.Optional; import static io.trino.matching.Capture.newCapture; import static io.trino.plugin.base.expression.ConnectorExpressionPatterns.type; @@ -29,17 +30,30 @@ public class ExpressionCapture extends ExpressionPattern { private final String name; - private final TypePattern type; + private final Optional type; private final Capture capture = newCapture(); private final Pattern pattern; + public ExpressionCapture(String name) + { + this(name, Optional.empty()); + } + public ExpressionCapture(String name, TypePattern type) + { + this(name, Optional.of(type)); + } + + public ExpressionCapture(String name, Optional type) { this.name = requireNonNull(name, "name is null"); this.type = requireNonNull(type, "type is null"); - this.pattern = Pattern.typeOf(ConnectorExpression.class).capturedAs(capture) - .with(type().matching(type.getPattern())); + Pattern pattern = Pattern.typeOf(ConnectorExpression.class).capturedAs(capture); + if (type.isPresent()) { + pattern = pattern.with(type().matching(type.get().getPattern())); + } + this.pattern = pattern; } @Override @@ -52,7 +66,7 @@ public Pattern getPattern() public void resolve(Captures captures, MatchContext matchContext) { matchContext.record(name, captures.get(capture)); - type.resolve(captures, matchContext); + type.ifPresent(type -> type.resolve(captures, matchContext)); } @Override @@ -78,6 +92,9 @@ public int hashCode() @Override public String toString() { - return format("%s: %s", name, type); + if (type.isEmpty()) { + return name; + } + return format("%s: %s", name, type.get()); } } diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionPatternBuilder.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionPatternBuilder.java index a6d02989960a..207c5e5d068f 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionPatternBuilder.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/expression/ExpressionPatternBuilder.java @@ -52,7 +52,7 @@ public ExpressionPattern visitExpressionCapture(ConnectorExpressionPatternParser { return new ExpressionCapture( visit(context.identifier(), String.class), - visit(context.type(), TypePattern.class)); + visitIfPresent(context.type(), TypePattern.class)); } @Override diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/expression/TestExpressionMappingParser.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/expression/TestExpressionMappingParser.java index f5db6bf71347..fe0386208053 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/expression/TestExpressionMappingParser.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/expression/TestExpressionMappingParser.java @@ -26,6 +26,8 @@ public class TestExpressionMappingParser @Test public void testCapture() { + assertExpressionPattern("b", new ExpressionCapture("b")); + assertExpressionPattern( "b: bigint", new ExpressionCapture( @@ -52,6 +54,13 @@ public void testParameterizedType() @Test public void testCallPattern() { + assertExpressionPattern( + "is_null(a)", + new CallPattern( + "is_null", + List.of(new ExpressionCapture("a")), + Optional.empty())); + assertExpressionPattern( "$like_pattern(a: varchar(n), b: varchar(m))", new CallPattern(