You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by tw...@apache.org on 2020/11/04 13:54:44 UTC

[flink] branch release-1.11 updated: [FLINK-19867][table-common] Validation fails for UDF that accepts var-args

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

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


The following commit(s) were added to refs/heads/release-1.11 by this push:
     new f488e70  [FLINK-19867][table-common] Validation fails for UDF that accepts var-args
f488e70 is described below

commit f488e700d9e80909640776b1d33975f85153990d
Author: Rui Li <li...@apache.org>
AuthorDate: Thu Oct 29 12:01:44 2020 +0800

    [FLINK-19867][table-common] Validation fails for UDF that accepts var-args
    
    This closes #13833.
---
 .../table/types/extraction/ExtractionUtils.java    | 24 +++++++++++++++-------
 .../extraction/TypeInferenceExtractorTest.java     |  6 ++++--
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java
index e814fb6..1b411f4 100644
--- a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java
+++ b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java
@@ -102,22 +102,32 @@ public final class ExtractionUtils {
 		int currentClass = 0;
 		for (int currentParam = 0; currentParam < paramCount; currentParam++) {
 			final Class<?> param = executable.getParameterTypes()[currentParam];
-			// entire parameter matches
-			if (classes[currentClass] == null || ExtractionUtils.isAssignable(classes[currentClass], param, true)) {
-				currentClass++;
-			}
-			// last parameter is a vararg that consumes remaining classes
-			else if (currentParam == paramCount - 1 && executable.isVarArgs()) {
+			// last parameter is a vararg that needs to consume remaining classes
+			if (currentParam == paramCount - 1 && executable.isVarArgs()) {
 				final Class<?> paramComponent = executable.getParameterTypes()[currentParam].getComponentType();
-				while (currentClass < classCount && ExtractionUtils.isAssignable(classes[currentClass], paramComponent, true)) {
+				// we have more than 1 classes left so the vararg needs to consume them all
+				if (classCount - currentClass > 1) {
+					while (currentClass < classCount && ExtractionUtils.isAssignable(classes[currentClass], paramComponent, true)) {
+						currentClass++;
+					}
+				} else if (parameterMatches(classes[currentClass], param)
+						|| parameterMatches(classes[currentClass], paramComponent)) {
 					currentClass++;
 				}
 			}
+			// entire parameter matches
+			else if (parameterMatches(classes[currentClass], param)) {
+				currentClass++;
+			}
 		}
 		// check if all classes have been consumed
 		return currentClass == classCount;
 	}
 
+	private static boolean parameterMatches(Class<?> clz, Class<?> param) {
+		return clz == null || ExtractionUtils.isAssignable(clz, param, true);
+	}
+
 	/**
 	 * Creates a method signature string like {@code int eval(Integer, String)}.
 	 */
diff --git a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/extraction/TypeInferenceExtractorTest.java b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/extraction/TypeInferenceExtractorTest.java
index feb9803..c5ef970 100644
--- a/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/extraction/TypeInferenceExtractorTest.java
+++ b/flink-table/flink-table-common/src/test/java/org/apache/flink/table/types/extraction/TypeInferenceExtractorTest.java
@@ -139,7 +139,9 @@ public class TypeInferenceExtractorTest {
 				.expectOutputMapping(
 					InputTypeStrategies.varyingSequence(
 						new String[]{"myInt", "myAny"},
-						new ArgumentTypeStrategy[]{InputTypeStrategies.explicit(DataTypes.INT()), InputTypeStrategies.ANY}),
+						new ArgumentTypeStrategy[]{
+							InputTypeStrategies.explicit(
+								DataTypes.ARRAY(DataTypes.INT())), InputTypeStrategies.ANY}),
 					TypeStrategies.explicit(DataTypes.BOOLEAN())),
 
 			// global input hints and local output hints
@@ -579,7 +581,7 @@ public class TypeInferenceExtractorTest {
 
 	private static class ComplexFunctionHint extends ScalarFunction {
 		@FunctionHint(
-			input = {@DataTypeHint("INT"), @DataTypeHint(inputGroup = InputGroup.ANY)},
+			input = {@DataTypeHint("ARRAY<INT>"), @DataTypeHint(inputGroup = InputGroup.ANY)},
 			argumentNames = {"myInt", "myAny"},
 			output = @DataTypeHint("BOOLEAN"),
 			isVarArgs = true