This is an automated email from the ASF dual-hosted git repository.
atoomula pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/samza.git
The following commit(s) were added to refs/heads/master by this push:
new 4e39201 SAMZA-2637: Samza-sql: Fix ANY type validation while checking
UDF arg types (#1477)
4e39201 is described below
commit 4e392013a321a55eaccc03f75780cbea48668f4e
Author: Aditya Toomula <[email protected]>
AuthorDate: Mon Mar 22 14:41:24 2021 -0700
SAMZA-2637: Samza-sql: Fix ANY type validation while checking UDF arg types
(#1477)
* SAMZA-2637: Samza-sql: Fix ANY type validation while checking UDF arg
types
---
.../java/org/apache/samza/sql/planner/Checker.java | 2 +-
.../org/apache/samza/sql/planner/CheckerTest.java | 33 +++++++++++++++++++++-
2 files changed, 33 insertions(+), 2 deletions(-)
diff --git a/samza-sql/src/main/java/org/apache/samza/sql/planner/Checker.java
b/samza-sql/src/main/java/org/apache/samza/sql/planner/Checker.java
index ccbee6a..4a3c657 100644
--- a/samza-sql/src/main/java/org/apache/samza/sql/planner/Checker.java
+++ b/samza-sql/src/main/java/org/apache/samza/sql/planner/Checker.java
@@ -98,7 +98,7 @@ class Checker implements SqlOperandTypeChecker {
if (parsedSqlArgType.getSqlTypeName() == SqlTypeName.CHAR &&
udfArgumentAsSqlType == SqlTypeName.VARCHAR) {
return true;
} else if (!Objects.equals(parsedSqlArgType.getSqlTypeName(),
udfArgumentAsSqlType)
- &&
!ANY_SQL_TYPE_NAMES.contains(parsedSqlArgType.getSqlTypeName()) &&
hasOneUdfMethod(udfMetadata)) {
+ && !ANY_SQL_TYPE_NAMES.contains(udfArgumentAsSqlType) &&
hasOneUdfMethod(udfMetadata)) {
// 3(b). Throw up and fail on mismatch between the SamzaSqlType and
CalciteType for any argument.
String msg = String.format("Type mismatch in udf class: %s at
argument index: %d." +
"Expected type: %s, actual type: %s.",
udfMetadata.getName(),
diff --git
a/samza-sql/src/test/java/org/apache/samza/sql/planner/CheckerTest.java
b/samza-sql/src/test/java/org/apache/samza/sql/planner/CheckerTest.java
index b9ecfd2..78e2179 100644
--- a/samza-sql/src/test/java/org/apache/samza/sql/planner/CheckerTest.java
+++ b/samza-sql/src/test/java/org/apache/samza/sql/planner/CheckerTest.java
@@ -57,6 +57,22 @@ public class CheckerTest {
}
}
+ @SamzaSqlUdf(name = "TestUdfWithAnyType", description = "TestUDFClass")
+ private static class TestUdfWithAnyType implements ScalarUdf {
+
+ public TestUdfWithAnyType() {
+ }
+
+ @Override
+ public void init(Config udfConfig, Context context) {
+ }
+
+ @SamzaSqlUdfMethod(params = SamzaSqlFieldType.ANY, returns =
SamzaSqlFieldType.STRING)
+ public String execute(Object val) {
+ return "RandomStringtoFail";
+ }
+ }
+
@Test(expected = SamzaSqlValidatorException.class)
public void testCheckOperandTypesShouldFailOnTypeMisMatch() throws
NoSuchMethodException {
Method udfMethod = TestUdfWithWrongTypes.class.getMethod("execute",
String.class);
@@ -76,7 +92,7 @@ public class CheckerTest {
public void testCheckOperandTypesShouldReturnTrueOnTypeMatch() throws
NoSuchMethodException {
Method udfMethod = MyTestPolyUdf.class.getMethod("execute", String.class);
UdfMetadata udfMetadata = new UdfMetadata("MyTestPoly", "Test Polymorphism
UDF.",
- udfMethod, new MapConfig(),
ImmutableList.of(SamzaSqlFieldType.STRING), SamzaSqlFieldType.INT32, false);
+ udfMethod, new MapConfig(),
ImmutableList.of(SamzaSqlFieldType.STRING), SamzaSqlFieldType.INT32, false);
Checker operandTypeChecker = Checker.getChecker(1, 3, udfMetadata);
@@ -88,6 +104,21 @@ public class CheckerTest {
}
@Test
+ public void testCheckOperandTypesShouldReturnTrueOnAnyTypeInArg() throws
NoSuchMethodException {
+ Method udfMethod = TestUdfWithAnyType.class.getMethod("execute",
Object.class);
+ UdfMetadata udfMetadata = new UdfMetadata("TestUdfWithAnyType",
"TestUDFClass",
+ udfMethod, new MapConfig(), ImmutableList.of(SamzaSqlFieldType.ANY),
SamzaSqlFieldType.INT64, false);
+
+ Checker operandTypeChecker = Checker.getChecker(1, 3, udfMetadata);
+
+ SqlCallBinding callBinding = Mockito.mock(SqlCallBinding.class);
+ Mockito.when(callBinding.getOperandCount()).thenReturn(1);
+ Mockito.when(callBinding.getOperandType(0)).thenReturn(new
BasicSqlType(RelDataTypeSystem.DEFAULT, SqlTypeName.ARRAY));
+
+ assertTrue(operandTypeChecker.checkOperandTypes(callBinding, true));
+ }
+
+ @Test
public void
testCheckOperandTypesShouldReturnTrueWhenArgumentCheckIsDisabled() throws
NoSuchMethodException {
Method udfMethod = TestUdfWithWrongTypes.class.getMethod("execute",
String.class);
UdfMetadata udfMetadata = new UdfMetadata("TestUdfWithWrongTypes",
"TestUDFClass",