channels, Type returnType)
+ {
+ PageBuilder pageBuilder = new PageBuilder(types);
+ pageBuilder.declarePosition();
+ for (int i = 0; i < types.size(); i++) {
+ writeOutput(types.get(i), pageBuilder.getBlockBuilder(i), arguments.get(i));
+ }
+ Page inputPage = pageBuilder.build();
+ try {
+ return convertObject(returnType, functionAndTypeManager.executeFunction("", functionHandle, inputPage, channels).get().getResult());
+ }
+ catch (InterruptedException | ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
/**
* Arguments must be the native container type for the corresponding SQL types.
*
@@ -146,4 +169,45 @@ private static RuntimeException propagate(Throwable throwable)
throwIfUnchecked(throwable);
throw new RuntimeException(throwable);
}
+
+ public void writeOutput(Type type, BlockBuilder output, Object argument)
+ {
+ switch (type.getJavaType().getSimpleName()) {
+ case "long":
+ type.writeLong(output, (Long) argument);
+ break;
+ case "double":
+ type.writeDouble(output, (Double) argument);
+ break;
+ case "boolean":
+ type.writeBoolean(output, (Boolean) argument);
+ break;
+ case "Slice":
+ type.writeSlice(output, (Slice) argument);
+ break;
+ case "Block":
+ type.writeObject(output, argument);
+ break;
+ default:
+ throw new IllegalArgumentException("Unexpected type: " + type.getJavaType().getSimpleName());
+ }
+ }
+
+ public Object convertObject(Type returnType, Block result)
+ {
+ switch (returnType.getJavaType().getSimpleName()) {
+ case "long":
+ return returnType.getLong(result, 0);
+ case "double":
+ return returnType.getDouble(result, 0);
+ case "boolean":
+ return returnType.getBoolean(result, 0);
+ case "Slice":
+ return returnType.getSlice(result, 0);
+ case "Block":
+ return returnType.getObject(result, 0);
+ default:
+ throw new IllegalArgumentException("Unexpected return type: " + returnType.getJavaType().getSimpleName());
+ }
+ }
}
diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java
index 7939cf298cf33..205e290b04d0f 100644
--- a/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java
+++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java
@@ -76,6 +76,7 @@
import static com.facebook.presto.metadata.CastType.JSON_TO_MAP_CAST;
import static com.facebook.presto.metadata.CastType.JSON_TO_ROW_CAST;
import static com.facebook.presto.spi.function.FunctionImplementationType.JAVA;
+import static com.facebook.presto.spi.function.FunctionImplementationType.REST;
import static com.facebook.presto.spi.function.FunctionImplementationType.SQL;
import static com.facebook.presto.spi.function.FunctionKind.SCALAR;
import static com.facebook.presto.spi.relation.ExpressionOptimizer.Level;
@@ -217,6 +218,7 @@ public Object visitCall(CallExpression node, Object context)
{
List argumentTypes = new ArrayList<>();
List