This is an automated email from the ASF dual-hosted git repository.

twalthr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git

commit 07648939f45abb9a79528a50369c93bb6879fe1f
Author: Ingo Bürk <[email protected]>
AuthorDate: Mon May 31 13:48:56 2021 +0200

    [hotfix][table-common][table-planner-blink] Support deferred runtime 
implementation for built-in functions
    
    We can have functions which will not be implemented through a runtime class,
    but we still want to use the new function stack for them. In order to do
    so, we flag them.
---
 .../table/functions/BuiltInFunctionDefinition.java | 26 +++++++++++++++++++---
 .../catalog/FunctionCatalogOperatorTable.java      |  2 +-
 .../converter/FunctionDefinitionConvertRule.java   |  2 +-
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinition.java
 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinition.java
index 6136090..0ed3615 100644
--- 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinition.java
+++ 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/functions/BuiltInFunctionDefinition.java
@@ -53,19 +53,23 @@ public final class BuiltInFunctionDefinition implements 
SpecializedFunction {
 
     private final boolean isDeterministic;
 
-    private @Nullable String runtimeClass;
+    private final boolean isRuntimeProvided;
+
+    private final @Nullable String runtimeClass;
 
     private BuiltInFunctionDefinition(
             String name,
             FunctionKind kind,
             TypeInference typeInference,
             boolean isDeterministic,
+            boolean isRuntimeProvided,
             String runtimeClass) {
         this.name = Preconditions.checkNotNull(name, "Name must not be null.");
         this.kind = Preconditions.checkNotNull(kind, "Kind must not be null.");
         this.typeInference =
                 Preconditions.checkNotNull(typeInference, "Type inference must 
not be null.");
         this.isDeterministic = isDeterministic;
+        this.isRuntimeProvided = isRuntimeProvided;
         this.runtimeClass = runtimeClass;
     }
 
@@ -82,6 +86,10 @@ public final class BuiltInFunctionDefinition implements 
SpecializedFunction {
         return Optional.ofNullable(runtimeClass);
     }
 
+    public boolean hasRuntimeImplementation() {
+        return isRuntimeProvided || runtimeClass != null;
+    }
+
     @Override
     public UserDefinedFunction specialize(SpecializedContext context) {
         if (runtimeClass == null) {
@@ -140,10 +148,12 @@ public final class BuiltInFunctionDefinition implements 
SpecializedFunction {
 
         private FunctionKind kind;
 
-        private TypeInference.Builder typeInferenceBuilder = 
TypeInference.newBuilder();
+        private final TypeInference.Builder typeInferenceBuilder = 
TypeInference.newBuilder();
 
         private boolean isDeterministic = true;
 
+        private boolean isRuntimeProvided = false;
+
         private String runtimeClass;
 
         public Builder() {
@@ -185,6 +195,11 @@ public final class BuiltInFunctionDefinition implements 
SpecializedFunction {
             return this;
         }
 
+        public Builder runtimeProvided() {
+            this.isRuntimeProvided = true;
+            return this;
+        }
+
         public Builder runtimeClass(String runtimeClass) {
             this.runtimeClass = runtimeClass;
             return this;
@@ -192,7 +207,12 @@ public final class BuiltInFunctionDefinition implements 
SpecializedFunction {
 
         public BuiltInFunctionDefinition build() {
             return new BuiltInFunctionDefinition(
-                    name, kind, typeInferenceBuilder.build(), isDeterministic, 
runtimeClass);
+                    name,
+                    kind,
+                    typeInferenceBuilder.build(),
+                    isDeterministic,
+                    isRuntimeProvided,
+                    runtimeClass);
         }
     }
 }
diff --git 
a/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/catalog/FunctionCatalogOperatorTable.java
 
b/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/catalog/FunctionCatalogOperatorTable.java
index 452b93c..074e3ab 100644
--- 
a/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/catalog/FunctionCatalogOperatorTable.java
+++ 
b/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/catalog/FunctionCatalogOperatorTable.java
@@ -206,7 +206,7 @@ public class FunctionCatalogOperatorTable implements 
SqlOperatorTable {
         if (definition instanceof BuiltInFunctionDefinition) {
             final BuiltInFunctionDefinition builtInFunction =
                     (BuiltInFunctionDefinition) definition;
-            if (!builtInFunction.getRuntimeClass().isPresent()) {
+            if (!builtInFunction.hasRuntimeImplementation()) {
                 return false;
             }
         }
diff --git 
a/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/expressions/converter/FunctionDefinitionConvertRule.java
 
b/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/expressions/converter/FunctionDefinitionConvertRule.java
index 79dfdf6..40c200b 100644
--- 
a/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/expressions/converter/FunctionDefinitionConvertRule.java
+++ 
b/flink-table/flink-table-planner-blink/src/main/java/org/apache/flink/table/planner/expressions/converter/FunctionDefinitionConvertRule.java
@@ -42,7 +42,7 @@ public class FunctionDefinitionConvertRule implements 
CallExpressionConvertRule
         if (functionDefinition instanceof BuiltInFunctionDefinition) {
             final BuiltInFunctionDefinition builtInFunction =
                     (BuiltInFunctionDefinition) functionDefinition;
-            if (!builtInFunction.getRuntimeClass().isPresent()) {
+            if (!builtInFunction.hasRuntimeImplementation()) {
                 return Optional.empty();
             }
         }

Reply via email to