diff --git a/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java b/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java index 754653245323..28b359e62e7f 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java +++ b/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java @@ -2304,12 +2304,15 @@ public ResolvedFunction resolve(Session session, CatalogHandle catalogHandle, Fu .filter(Objects::nonNull) .forEach(functions::add); + boolean deprecated = functionMetadata.isDeprecated(); return new ResolvedFunction( functionBinding.getBoundSignature(), catalogHandle, functionBinding.getFunctionId(), functionMetadata.getKind(), functionMetadata.isDeterministic(), + deprecated, + deprecated ? Optional.of(functionMetadata.getDescription()) : Optional.empty(), functionMetadata.getFunctionNullability(), dependentTypes, functions.build()); diff --git a/core/trino-main/src/main/java/io/trino/metadata/ResolvedFunction.java b/core/trino-main/src/main/java/io/trino/metadata/ResolvedFunction.java index 818e4fa50cef..facbdaaca96d 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/ResolvedFunction.java +++ b/core/trino-main/src/main/java/io/trino/metadata/ResolvedFunction.java @@ -65,6 +65,8 @@ public class ResolvedFunction private final FunctionId functionId; private final FunctionKind functionKind; private final boolean deterministic; + private final boolean deprecated; + private final Optional description; private final FunctionNullability functionNullability; private final Map typeDependencies; private final Set functionDependencies; @@ -76,6 +78,8 @@ public ResolvedFunction( @JsonProperty("id") FunctionId functionId, @JsonProperty("functionKind") FunctionKind functionKind, @JsonProperty("deterministic") boolean deterministic, + @JsonProperty("deprecated") boolean deprecated, + @JsonProperty("description") Optional description, @JsonProperty("functionNullability") FunctionNullability functionNullability, @JsonProperty("typeDependencies") Map typeDependencies, @JsonProperty("functionDependencies") Set functionDependencies) @@ -85,6 +89,8 @@ public ResolvedFunction( this.functionId = requireNonNull(functionId, "functionId is null"); this.functionKind = requireNonNull(functionKind, "functionKind is null"); this.deterministic = deterministic; + this.deprecated = deprecated; + this.description = requireNonNull(description, "description is null"); this.functionNullability = requireNonNull(functionNullability, "functionNullability is null"); this.typeDependencies = ImmutableMap.copyOf(requireNonNull(typeDependencies, "typeDependencies is null")); this.functionDependencies = ImmutableSet.copyOf(requireNonNull(functionDependencies, "functionDependencies is null")); @@ -121,6 +127,18 @@ public boolean isDeterministic() return deterministic; } + @JsonProperty + public boolean isDeprecated() + { + return deprecated; + } + + @JsonProperty + public Optional getDescription() + { + return description; + } + @JsonProperty public FunctionNullability getFunctionNullability() { @@ -175,6 +193,8 @@ public boolean equals(Object o) Objects.equals(functionId, that.functionId) && functionKind == that.functionKind && deterministic == that.deterministic && + deprecated == that.deprecated && + Objects.equals(description, that.description) && Objects.equals(functionNullability, that.functionNullability) && Objects.equals(typeDependencies, that.typeDependencies) && Objects.equals(functionDependencies, that.functionDependencies); @@ -183,7 +203,7 @@ public boolean equals(Object o) @Override public int hashCode() { - return Objects.hash(signature, catalogHandle, functionId, functionKind, deterministic, functionNullability, typeDependencies, functionDependencies); + return Objects.hash(signature, catalogHandle, functionId, functionKind, deterministic, deprecated, description, functionNullability, typeDependencies, functionDependencies); } @Override diff --git a/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java b/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java index fb77534dee53..95f7ea776d42 100644 --- a/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java +++ b/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java @@ -36,7 +36,6 @@ import io.trino.spi.TrinoException; import io.trino.spi.TrinoWarning; import io.trino.spi.function.BoundSignature; -import io.trino.spi.function.FunctionMetadata; import io.trino.spi.function.OperatorType; import io.trino.spi.type.CharType; import io.trino.spi.type.DateType; @@ -1313,12 +1312,11 @@ else if (node.getArguments().size() > 127) { resolvedFunctions.put(NodeRef.of(node), function); - FunctionMetadata functionMetadata = plannerContext.getMetadata().getFunctionMetadata(session, function); - if (functionMetadata.isDeprecated()) { + if (function.isDeprecated()) { warningCollector.add(new TrinoWarning(DEPRECATED_FUNCTION, format("Use of deprecated function: %s: %s", - functionMetadata.getSignature().getName(), - functionMetadata.getDescription()))); + function.getSignature().toSignature().getName(), + function.getDescription().get()))); } Type type = signature.getReturnType(); diff --git a/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java b/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java index 22590e9e5fde..c33793b75754 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java +++ b/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java @@ -754,6 +754,8 @@ public ResolvedFunction resolveFunction(Session session, QualifiedName name, Lis toFunctionId(boundSignature.toSignature()), SCALAR, true, + false, + Optional.empty(), new FunctionNullability(false, ImmutableList.of()), ImmutableMap.of(), ImmutableSet.of()); diff --git a/core/trino-main/src/test/java/io/trino/metadata/TestResolvedFunction.java b/core/trino-main/src/test/java/io/trino/metadata/TestResolvedFunction.java index 90c30af43571..a1bbef808485 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/TestResolvedFunction.java +++ b/core/trino-main/src/test/java/io/trino/metadata/TestResolvedFunction.java @@ -65,6 +65,8 @@ private static ResolvedFunction createResolvedFunction(String name, int depth) .build()), SCALAR, true, + false, + Optional.empty(), new FunctionNullability(false, ImmutableList.of(false, false)), ImmutableSet.of(createVarcharType(11), createVarcharType(12), createVarcharType(13)).stream() .collect(toImmutableMap(Type::getTypeSignature, Function.identity())), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java index 50000f3e6106..c586f11c9eae 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java @@ -1214,6 +1214,8 @@ private static ResolvedFunction fakeFunction(String name) toFunctionId(boundSignature.toSignature()), SCALAR, true, + false, + Optional.empty(), new FunctionNullability(false, ImmutableList.of()), ImmutableMap.of(), ImmutableSet.of()); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java index 33af3f07de8a..dbeac00b2165 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java @@ -41,6 +41,7 @@ import java.util.Arrays; import java.util.Base64; import java.util.Map; +import java.util.Optional; import java.util.function.BiPredicate; import static com.google.common.base.Verify.verify; @@ -90,6 +91,8 @@ public class TestLiteralEncoder new LiteralFunction(PLANNER_CONTEXT.getBlockEncodingSerde()).getFunctionMetadata().getFunctionId(), SCALAR, true, + false, + Optional.empty(), new FunctionNullability(false, ImmutableList.of(false)), ImmutableMap.of(), ImmutableSet.of()); @@ -104,6 +107,8 @@ public class TestLiteralEncoder .build()), SCALAR, true, + false, + Optional.empty(), new FunctionNullability(false, ImmutableList.of(false)), ImmutableMap.of(), ImmutableSet.of());