diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java index b818ce30425f2..65d13eba63bf2 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/AbstractOperatorBenchmark.java @@ -224,7 +224,7 @@ protected final OperatorFactory createHashProjectOperator(int operatorId, PlanNo RowExpression translatedHashExpression = translate(hashExpression.get(), variableToInputMapping.build()); PageFunctionCompiler functionCompiler = new PageFunctionCompiler(localQueryRunner.getMetadata(), 0); - projections.add(functionCompiler.compileProjection(translatedHashExpression, Optional.empty()).get()); + projections.add(functionCompiler.compileProjection(session.getSqlFunctionProperties(), translatedHashExpression, Optional.empty()).get()); return new FilterAndProjectOperator.FilterAndProjectOperatorFactory( operatorId, diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java index 3c478d1b06aac..1b189a2d8bb5f 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/HandTpchQuery6.java @@ -71,7 +71,7 @@ protected List createOperatorFactories() // and quantity < 24; OperatorFactory tableScanOperator = createTableScanOperator(0, new PlanNodeId("test"), "lineitem", "extendedprice", "discount", "shipdate", "quantity"); - Supplier projection = new PageFunctionCompiler(localQueryRunner.getMetadata(), 0).compileProjection(field(0, BIGINT), Optional.empty()); + Supplier projection = new PageFunctionCompiler(localQueryRunner.getMetadata(), 0).compileProjection(session.getSqlFunctionProperties(), field(0, BIGINT), Optional.empty()); FilterAndProjectOperator.FilterAndProjectOperatorFactory tpchQuery6Operator = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 1, diff --git a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java index c7f28dcf7153b..7a28e70b6ea99 100644 --- a/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java +++ b/presto-benchmark/src/main/java/com/facebook/presto/benchmark/PredicateFilterBenchmark.java @@ -59,7 +59,7 @@ protected List createOperatorFactories() field(0, DOUBLE), constant(50000.0, DOUBLE)); ExpressionCompiler expressionCompiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(0, DOUBLE))); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(localQueryRunner.getDefaultSession().getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(0, DOUBLE))); FilterAndProjectOperator.FilterAndProjectOperatorFactory filterAndProjectOperator = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 1, diff --git a/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java b/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java index 2eac8d1026332..f5f1aa0c60df1 100644 --- a/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java +++ b/presto-expressions/src/main/java/com/facebook/presto/expressions/translator/TranslatorAnnotationParser.java @@ -37,6 +37,7 @@ import java.util.Set; import java.util.stream.Stream; +import static com.facebook.presto.spi.function.FunctionImplementationType.BUILTIN; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.google.common.base.CaseFormat.LOWER_CAMEL; @@ -79,6 +80,7 @@ public static FunctionMetadata removeTypeParameters(FunctionMetadata metadata) argumentsBuilder.build(), metadata.getReturnType(), metadata.getFunctionKind(), + metadata.getImplementationType(), metadata.isDeterministic(), metadata.isCalledOnNullInput()); } @@ -87,6 +89,7 @@ public static FunctionMetadata removeTypeParameters(FunctionMetadata metadata) argumentsBuilder.build(), metadata.getReturnType(), metadata.getFunctionKind(), + metadata.getImplementationType(), metadata.isDeterministic(), metadata.isCalledOnNullInput()); } @@ -155,9 +158,9 @@ private static FunctionMetadata methodToFunctionMetadata(ScalarTranslationHeader } if (header.getOperatorType().isPresent()) { - return new FunctionMetadata(header.getOperatorType().get(), argumentTypes.build(), returnType, SCALAR, header.isDeterministic(), header.isCalledOnNullInput()); + return new FunctionMetadata(header.getOperatorType().get(), argumentTypes.build(), returnType, SCALAR, BUILTIN, header.isDeterministic(), header.isCalledOnNullInput()); } - return new FunctionMetadata(header.getName(), argumentTypes.build(), returnType, SCALAR, header.isDeterministic(), header.isCalledOnNullInput()); + return new FunctionMetadata(header.getName(), argumentTypes.build(), returnType, SCALAR, BUILTIN, header.isDeterministic(), header.isCalledOnNullInput()); } @SafeVarargs diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java b/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java index 4586b87f01cb0..54c4304ee7d67 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/orc/OrcSelectivePageSourceFactory.java @@ -506,7 +506,7 @@ private static List toFilterFunctions(RowExpression filter, Conn List conjuncts = extractConjuncts(filter); if (conjuncts.size() == 1) { - return ImmutableList.of(new FilterFunction(session, determinismEvaluator.isDeterministic(filter), predicateCompiler.compilePredicate(filter).get())); + return ImmutableList.of(new FilterFunction(session, determinismEvaluator.isDeterministic(filter), predicateCompiler.compilePredicate(session.getSqlFunctionProperties(), filter).get())); } // Use LinkedHashMap to preserve user-specified order of conjuncts. This will be the initial order in which filters are applied. @@ -517,7 +517,7 @@ private static List toFilterFunctions(RowExpression filter, Conn return inputsToConjuncts.values().stream() .map(expressions -> binaryExpression(AND, expressions)) - .map(predicate -> new FilterFunction(session, determinismEvaluator.isDeterministic(predicate), predicateCompiler.compilePredicate(predicate).get())) + .map(predicate -> new FilterFunction(session, determinismEvaluator.isDeterministic(predicate), predicateCompiler.compilePredicate(session.getSqlFunctionProperties(), predicate).get())) .collect(toImmutableList()); } diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java b/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java index 89975bf507459..2fc0be0234f87 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/AbstractTestHiveClient.java @@ -79,6 +79,7 @@ import com.facebook.presto.spi.connector.ConnectorSplitManager; import com.facebook.presto.spi.connector.ConnectorSplitManager.SplitSchedulingContext; import com.facebook.presto.spi.connector.ConnectorTransactionHandle; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.predicate.Domain; import com.facebook.presto.spi.predicate.NullableValue; import com.facebook.presto.spi.predicate.Range; @@ -949,6 +950,12 @@ public boolean isLegacyTimestamp() return session.isLegacyTimestamp(); } + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return session.getSqlFunctionProperties(); + } + @Override public T getProperty(String name, Class type) { diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java b/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java index b0817cb8c85f3..81eba32421538 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/TestOrcBatchPageSourceMemoryTracking.java @@ -522,8 +522,8 @@ public SourceOperator newScanFilterAndProjectOperator(DriverContext driverContex for (int i = 0; i < types.size(); i++) { projectionsBuilder.add(field(i, types.get(i))); } - Supplier cursorProcessor = EXPRESSION_COMPILER.compileCursorProcessor(Optional.empty(), projectionsBuilder.build(), "key"); - Supplier pageProcessor = EXPRESSION_COMPILER.compilePageProcessor(Optional.empty(), projectionsBuilder.build()); + Supplier cursorProcessor = EXPRESSION_COMPILER.compileCursorProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projectionsBuilder.build(), "key"); + Supplier pageProcessor = EXPRESSION_COMPILER.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projectionsBuilder.build()); SourceOperatorFactory sourceOperatorFactory = new ScanFilterAndProjectOperatorFactory( 0, new PlanNodeId("test"), diff --git a/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java b/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java index 4cdaf15d90ed5..58a359f73a2ba 100644 --- a/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java +++ b/presto-main/src/main/java/com/facebook/presto/FullConnectorSession.java @@ -17,6 +17,7 @@ import com.facebook.presto.spi.ConnectorId; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.type.TimeZoneKey; import com.google.common.collect.ImmutableMap; @@ -39,7 +40,7 @@ public class FullConnectorSession private final ConnectorId connectorId; private final String catalog; private final SessionPropertyManager sessionPropertyManager; - private final boolean isLegacyTimestamp; + private final SqlFunctionProperties sqlFunctionProperties; public FullConnectorSession(Session session, ConnectorIdentity identity) { @@ -49,7 +50,7 @@ public FullConnectorSession(Session session, ConnectorIdentity identity) this.connectorId = null; this.catalog = null; this.sessionPropertyManager = null; - this.isLegacyTimestamp = SystemSessionProperties.isLegacyTimestamp(session); + this.sqlFunctionProperties = session.getSqlFunctionProperties(); } public FullConnectorSession( @@ -66,7 +67,7 @@ public FullConnectorSession( this.connectorId = requireNonNull(connectorId, "connectorId is null"); this.catalog = requireNonNull(catalog, "catalog is null"); this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); - this.isLegacyTimestamp = SystemSessionProperties.isLegacyTimestamp(session); + this.sqlFunctionProperties = session.getSqlFunctionProperties(); } public Session getSession() @@ -125,7 +126,13 @@ public Optional getClientInfo() @Override public boolean isLegacyTimestamp() { - return isLegacyTimestamp; + return sqlFunctionProperties.isLegacyTimestamp(); + } + + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return sqlFunctionProperties; } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/Session.java b/presto-main/src/main/java/com/facebook/presto/Session.java index cccecb87405f9..fe4f05ea2e3da 100644 --- a/presto-main/src/main/java/com/facebook/presto/Session.java +++ b/presto-main/src/main/java/com/facebook/presto/Session.java @@ -19,6 +19,7 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.QueryId; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.Identity; import com.facebook.presto.spi.security.SelectedRole; import com.facebook.presto.spi.session.ResourceEstimates; @@ -43,6 +44,9 @@ import java.util.TimeZone; import java.util.stream.Collectors; +import static com.facebook.presto.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; +import static com.facebook.presto.SystemSessionProperties.isLegacyTimestamp; +import static com.facebook.presto.SystemSessionProperties.isParseDecimalLiteralsAsDouble; import static com.facebook.presto.spi.ConnectorId.createInformationSchemaConnectorId; import static com.facebook.presto.spi.ConnectorId.createSystemTablesConnectorId; import static com.facebook.presto.spi.StandardErrorCode.NOT_FOUND; @@ -409,6 +413,16 @@ public ConnectorSession toConnectorSession() return new FullConnectorSession(this, identity.toConnectorIdentity()); } + public SqlFunctionProperties getSqlFunctionProperties() + { + return SqlFunctionProperties.builder() + .setTimeZoneKey(timeZoneKey) + .setLegacyRowFieldOrdinalAccessEnabled(isLegacyRowFieldOrdinalAccessEnabled(this)) + .setLegacyTimestamp(isLegacyTimestamp(this)) + .setParseDecimalLiteralAsDouble(isParseDecimalLiteralsAsDouble(this)) + .build(); + } + public ConnectorSession toConnectorSession(ConnectorId connectorId) { requireNonNull(connectorId, "connectorId is null"); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java index 235ee37a6e117..30ba09f9dcba7 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/BuiltInFunctionNamespaceManager.java @@ -93,6 +93,7 @@ import com.facebook.presto.operator.scalar.ArrayUnionFunction; import com.facebook.presto.operator.scalar.ArraysOverlapFunction; import com.facebook.presto.operator.scalar.BitwiseFunctions; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.scalar.CharacterStringCasts; import com.facebook.presto.operator.scalar.ColorFunctions; import com.facebook.presto.operator.scalar.CombineHashFunction; @@ -125,7 +126,6 @@ import com.facebook.presto.operator.scalar.Re2JRegexpFunctions; import com.facebook.presto.operator.scalar.Re2JRegexpReplaceLambdaFunction; import com.facebook.presto.operator.scalar.RepeatFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.operator.scalar.SequenceFunction; import com.facebook.presto.operator.scalar.SessionFunctions; import com.facebook.presto.operator.scalar.SplitToMapFunction; @@ -158,6 +158,7 @@ import com.facebook.presto.spi.function.FunctionNamespaceManager; import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlFunction; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -247,6 +248,8 @@ import static com.facebook.presto.operator.scalar.ArrayToElementConcatFunction.ARRAY_TO_ELEMENT_CONCAT_FUNCTION; import static com.facebook.presto.operator.scalar.ArrayToJsonCast.ARRAY_TO_JSON; import static com.facebook.presto.operator.scalar.ArrayTransformFunction.ARRAY_TRANSFORM_FUNCTION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.CastFromUnknownOperator.CAST_FROM_UNKNOWN; import static com.facebook.presto.operator.scalar.ConcatFunction.VARBINARY_CONCAT; import static com.facebook.presto.operator.scalar.ConcatFunction.VARCHAR_CONCAT; @@ -284,13 +287,12 @@ import static com.facebook.presto.operator.scalar.RowNotEqualOperator.ROW_NOT_EQUAL; import static com.facebook.presto.operator.scalar.RowToJsonCast.ROW_TO_JSON; import static com.facebook.presto.operator.scalar.RowToRowCast.ROW_TO_ROW_CAST; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.TryCastFunction.TRY_CAST; import static com.facebook.presto.operator.scalar.ZipFunction.ZIP_FUNCTIONS; import static com.facebook.presto.operator.scalar.ZipWithFunction.ZIP_WITH_FUNCTION; import static com.facebook.presto.operator.window.AggregateWindowFunction.supplier; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_IMPLEMENTATION_MISSING; +import static com.facebook.presto.spi.function.FunctionImplementationType.BUILTIN; import static com.facebook.presto.spi.function.FunctionKind.AGGREGATE; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.FunctionKind.WINDOW; @@ -356,7 +358,7 @@ public class BuiltInFunctionNamespaceManager private final TypeManager typeManager; private final LoadingCache specializedFunctionKeyCache; - private final LoadingCache specializedScalarCache; + private final LoadingCache specializedScalarCache; private final LoadingCache specializedAggregationCache; private final LoadingCache specializedWindowCache; private final MagicLiteralFunction magicLiteralFunction; @@ -744,6 +746,7 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) signature.getArgumentTypes(), signature.getReturnType(), signature.getKind(), + BUILTIN, function.isDeterministic(), function.isCalledOnNullInput()); } @@ -753,6 +756,7 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) signature.getArgumentTypes(), signature.getReturnType(), signature.getKind(), + BUILTIN, function.isDeterministic(), function.isCalledOnNullInput()); } @@ -790,13 +794,14 @@ public InternalAggregationFunction getAggregateFunctionImplementation(FunctionHa } } + @Override public ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) { checkArgument(functionHandle instanceof BuiltInFunctionHandle, "Expect BuiltInFunctionHandle"); return getScalarFunctionImplementation(((BuiltInFunctionHandle) functionHandle).getSignature()); } - public ScalarFunctionImplementation getScalarFunctionImplementation(Signature signature) + public BuiltInScalarFunctionImplementation getScalarFunctionImplementation(Signature signature) { checkArgument(signature.getKind() == SCALAR, "%s is not a scalar function", signature); checkArgument(signature.getTypeVariableConstraints().isEmpty(), "%s has unbound type parameters", signature); @@ -963,7 +968,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type parameterType = boundVariables.getTypeVariable("T"); Type type = boundVariables.getTypeVariable("R"); @@ -985,7 +990,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in parameterType.getJavaType(), type.getJavaType()); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java index d2750720a1420..cf208410300ed 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionInvokerProvider.java @@ -13,10 +13,10 @@ */ package com.facebook.presto.metadata; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.InvocationConvention; @@ -27,11 +27,11 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_NOT_FOUND; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; @@ -47,8 +47,8 @@ public FunctionInvokerProvider(FunctionManager functionManager) public FunctionInvoker createFunctionInvoker(FunctionHandle functionHandle, Optional invocationConvention) { - ScalarFunctionImplementation scalarFunctionImplementation = functionManager.getScalarFunctionImplementation(functionHandle); - for (ScalarImplementationChoice choice : scalarFunctionImplementation.getAllChoices()) { + BuiltInScalarFunctionImplementation builtInScalarFunctionImplementation = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); + for (ScalarImplementationChoice choice : builtInScalarFunctionImplementation.getAllChoices()) { if (checkChoice(choice.getArgumentProperties(), choice.isNullable(), choice.hasSession(), invocationConvention)) { return new FunctionInvoker(choice.getMethodHandle()); } diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java index 32c508c9039c7..138b57d012580 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionManager.java @@ -15,7 +15,7 @@ import com.facebook.presto.Session; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.window.WindowFunctionSupplier; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.BlockEncodingSerde; @@ -27,6 +27,7 @@ import com.facebook.presto.spi.function.FunctionNamespaceManagerFactory; import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlFunction; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -36,6 +37,7 @@ import com.facebook.presto.sql.analyzer.FeaturesConfig; import com.facebook.presto.sql.analyzer.TypeSignatureProvider; import com.facebook.presto.sql.tree.QualifiedName; +import com.facebook.presto.transaction.TransactionId; import com.facebook.presto.transaction.TransactionManager; import com.facebook.presto.type.TypeRegistry; import com.google.common.annotations.VisibleForTesting; @@ -129,8 +131,9 @@ public void loadFunctionNamespaces(String functionNamespaceManagerName, List otherFunctionNamespaceManager = functionNamespaces.putIfAbsent(FullyQualifiedName.Prefix.of(functionNamespacePrefix), functionNamespaceManager); + if (otherFunctionNamespaceManager != null) { + throw new IllegalArgumentException(format("Function namespace manager '%s' already registered to handle function namespace '%s'", otherFunctionNamespaceManager.getName(), functionNamespacePrefix)); } } } @@ -168,12 +171,7 @@ public List listFunctions() * * @throws PrestoException if there are no matches or multiple matches */ - public FunctionHandle resolveFunction(Session session, QualifiedName name, List parameterTypes) - { - return resolveFunction(Optional.of(session), name, parameterTypes); - } - - private FunctionHandle resolveFunction(Optional session, QualifiedName name, List parameterTypes) + public FunctionHandle resolveFunction(Optional transactionId, QualifiedName name, List parameterTypes) { FullyQualifiedName functionName; if (!name.getPrefix().isPresent()) { @@ -188,8 +186,8 @@ private FunctionHandle resolveFunction(Optional session, QualifiedName throw new PrestoException(FUNCTION_NOT_FOUND, format("Cannot find function namespace for function %s", name)); } - Optional transactionHandle = session.flatMap(Session::getTransactionId) - .map(transactionId -> transactionManager.getFunctionNamespaceTransaction(transactionId, functionNamespaceManager.get().getName())); + Optional transactionHandle = transactionId + .map(id -> transactionManager.getFunctionNamespaceTransaction(id, functionNamespaceManager.get().getName())); Collection candidates = functionNamespaceManager.get().getFunctions(transactionHandle, functionName); try { @@ -228,6 +226,11 @@ public FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) return functionNamespaces.get(functionHandle.getFunctionNamespace()).getFunctionMetadata(functionHandle); } + public ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + { + return functionNamespaces.get(functionHandle.getFunctionNamespace()).getScalarFunctionImplementation(functionHandle); + } + public WindowFunctionSupplier getWindowFunctionImplementation(FunctionHandle functionHandle) { return builtInFunctionNamespaceManager.getWindowFunctionImplementation(functionHandle); @@ -238,9 +241,9 @@ public InternalAggregationFunction getAggregateFunctionImplementation(FunctionHa return builtInFunctionNamespaceManager.getAggregateFunctionImplementation(functionHandle); } - public ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + public BuiltInScalarFunctionImplementation getBuiltInScalarFunctionImplementation(FunctionHandle functionHandle) { - return builtInFunctionNamespaceManager.getScalarFunctionImplementation(functionHandle); + return (BuiltInScalarFunctionImplementation) builtInFunctionNamespaceManager.getScalarFunctionImplementation(functionHandle); } @VisibleForTesting diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java index 80741ea1611f8..c015f044c0279 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunction.java @@ -16,11 +16,11 @@ import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.MethodAndNativeContainerTypes; import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.MethodsGroup; import com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.SpecializeContext; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; import com.facebook.presto.spi.type.TypeManager; @@ -35,8 +35,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.SignatureBinder.applyBoundVariables; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.google.common.base.Preconditions.checkState; import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; @@ -92,7 +92,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { ImmutableList.Builder implementationChoices = ImmutableList.builder(); @@ -100,7 +100,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in implementationChoices.add(getScalarFunctionImplementationChoice(boundVariables, typeManager, functionManager, choice)); } - return new ScalarFunctionImplementation(implementationChoices.build()); + return new BuiltInScalarFunctionImplementation(implementationChoices.build()); } private ScalarImplementationChoice getScalarFunctionImplementationChoice( diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java index ebe19d46ce307..75265f9a1c691 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/PolymorphicScalarFunctionBuilder.java @@ -14,8 +14,8 @@ package com.facebook.presto.metadata; import com.facebook.presto.metadata.PolymorphicScalarFunction.PolymorphicScalarFunctionChoice; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; import com.facebook.presto.spi.function.OperatorType; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.Type; @@ -29,9 +29,9 @@ import java.util.Optional; import java.util.function.Function; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.ImmutableList.toImmutableList; diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java b/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java index 7596cf08ed870..da596d6af1e38 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/SqlScalarFunction.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.metadata; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.OperatorType; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.type.TypeManager; @@ -39,7 +39,7 @@ public final Signature getSignature() return signature; } - public abstract ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager); + public abstract BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager); public static PolymorphicScalarFunctionBuilder builder(Class clazz, OperatorType operatorType) { diff --git a/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java b/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java index 27bf24af7cb1f..aa4a770438cfa 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/SimplePagesHashStrategy.java @@ -75,7 +75,7 @@ public SimplePagesHashStrategy( ImmutableList.Builder distinctFromMethodHandlesBuilder = ImmutableList.builder(); for (Type type : types) { distinctFromMethodHandlesBuilder.add( - functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(IS_DISTINCT_FROM, fromTypes(type, type))).getMethodHandle()); + functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(IS_DISTINCT_FROM, fromTypes(type, type))).getMethodHandle()); } distinctFromMethodHandles = distinctFromMethodHandlesBuilder.build(); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java index be20382c05099..4d479af727235 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java @@ -90,7 +90,7 @@ protected AbstractMinMaxAggregationFunction(String name, boolean min) public InternalAggregationFunction specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); - MethodHandle compareMethodHandle = functionManager.getScalarFunctionImplementation( + MethodHandle compareMethodHandle = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(operatorType, fromTypes(type, type))).getMethodHandle(); return generateAggregation(type, compareMethodHandle); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java index 71fae449886b7..f5df7c17990df 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/aggregation/minmaxby/AbstractMinMaxBy.java @@ -136,7 +136,7 @@ private InternalAggregationFunction generateAggregation(Type valueType, Type key CallSiteBinder binder = new CallSiteBinder(); OperatorType operator = min ? LESS_THAN : GREATER_THAN; - MethodHandle compareMethod = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(operator, fromTypes(keyType, keyType))).getMethodHandle(); + MethodHandle compareMethod = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(operator, fromTypes(keyType, keyType))).getMethodHandle(); ClassDefinition definition = new ClassDefinition( a(PUBLIC, FINAL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java b/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java index c07b6e92377d3..8ec12e632ef4c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/annotations/ScalarImplementationDependency.java @@ -41,7 +41,7 @@ public MethodHandle resolve(BoundVariables boundVariables, TypeManager typeManag return functionManager.getFunctionInvokerProvider().createFunctionInvoker(functionHandle, invocationConvention).methodHandle(); } else { - return functionManager.getScalarFunctionImplementation(functionHandle).getMethodHandle(); + return functionManager.getBuiltInScalarFunctionImplementation(functionHandle).getMethodHandle(); } } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java b/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java index 926a377689f7b..09c839e88f7d2 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/index/DynamicTupleFilterFactory.java @@ -18,6 +18,7 @@ import com.facebook.presto.operator.project.PageProjection; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.plan.PlanNodeId; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.gen.PageFunctionCompiler; @@ -57,6 +58,7 @@ public DynamicTupleFilterFactory( int[] tupleFilterChannels, int[] outputFilterChannels, List outputTypes, + SqlFunctionProperties sqlFunctionProperties, PageFunctionCompiler pageFunctionCompiler) { requireNonNull(planNodeId, "planNodeId is null"); @@ -79,7 +81,7 @@ public DynamicTupleFilterFactory( this.outputTypes = ImmutableList.copyOf(outputTypes); this.outputProjections = IntStream.range(0, outputTypes.size()) - .mapToObj(field -> pageFunctionCompiler.compileProjection(Expressions.field(field, outputTypes.get(field)), Optional.empty())) + .mapToObj(field -> pageFunctionCompiler.compileProjection(sqlFunctionProperties, Expressions.field(field, outputTypes.get(field)), Optional.empty())) .collect(toImmutableList()); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java b/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java index 9c0f314c42712..b2c065453f236 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/index/FieldSetFilteringRecordSet.java @@ -54,7 +54,7 @@ public FieldSetFilteringRecordSet(FunctionManager functionManager, RecordSet del for (int field : fieldSet) { fieldSetBuilder.add(new Field( field, - functionManager.getScalarFunctionImplementation( + functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(columnTypes.get(field), columnTypes.get(field)))).getMethodHandle())); } fieldSetsBuilder.add(fieldSetBuilder.build()); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java index 5d7e13a62713b..b97dc36761d5b 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/AbstractGreatestLeast.java @@ -47,8 +47,8 @@ import static com.facebook.presto.bytecode.Access.a; import static com.facebook.presto.bytecode.Parameter.arg; import static com.facebook.presto.bytecode.ParameterizedType.type; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED; import static com.facebook.presto.spi.function.Signature.orderableTypeParameter; @@ -99,12 +99,12 @@ public boolean isDeterministic() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); checkArgument(type.isOrderable(), "Type must be orderable"); - MethodHandle compareMethod = functionManager.getScalarFunctionImplementation( + MethodHandle compareMethod = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(operatorType, fromTypes(type, type))).getMethodHandle(); List> javaTypes = IntStream.range(0, arity) @@ -114,7 +114,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in Class clazz = generate(javaTypes, type, compareMethod); MethodHandle methodHandle = methodHandle(clazz, getSignature().getNameSuffix(), javaTypes.toArray(new Class[javaTypes.size()])); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(javaTypes.size(), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java index 98ee7adb3dfbb..55e480fcc4d83 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ApplyFunction.java @@ -27,9 +27,9 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; @@ -82,11 +82,11 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type argumentType = boundVariables.getTypeVariable("T"); Type returnType = boundVariables.getTypeVariable("U"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(USE_BOXED_TYPE), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java index 3588500385fc4..79439e6468991 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConcatFunction.java @@ -33,8 +33,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -84,7 +84,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { if (arity < 2) { throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "There must be two or more arguments to " + FUNCTION_NAME); @@ -99,7 +99,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in METHOD_HANDLE.bindTo(elementType), USER_STATE_FACTORY.bindTo(elementType)); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandleAndConstructor.getMethodHandle(), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java index 99c92ed3061bc..416f895c0c3b7 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayConstructor.java @@ -54,8 +54,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantNull; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.equal; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -110,7 +110,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Map types = boundVariables.getTypeVariables(); checkArgument(types.size() == 1, "Can only construct arrays from exactly matching types"); @@ -134,7 +134,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in catch (ReflectiveOperationException e) { throw new RuntimeException(e); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(stackTypes.size(), valueTypeArgumentProperty(USE_BOXED_TYPE)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java index 58744f9fee806..19224e1b9b58d 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayFlattenFunction.java @@ -30,8 +30,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; @@ -74,12 +74,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type elementType = boundVariables.getTypeVariable("E"); Type arrayType = typeManager.getParameterizedType(StandardTypes.ARRAY, ImmutableList.of(TypeSignatureParameter.of(elementType.getTypeSignature()))); MethodHandle methodHandle = METHOD_HANDLE.bindTo(elementType).bindTo(arrayType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java index dfa7a776289f9..04801b57f8c52 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayJoin.java @@ -17,7 +17,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.PrestoException; @@ -43,9 +43,9 @@ import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; import static com.facebook.presto.metadata.CastType.CAST; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; @@ -124,7 +124,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return specializeArrayJoin(boundVariables.getTypeVariables(), functionManager, ImmutableList.of(false, false, false), METHOD_HANDLE); } @@ -167,12 +167,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return specializeArrayJoin(boundVariables.getTypeVariables(), functionManager, ImmutableList.of(false, false), METHOD_HANDLE); } - private static ScalarFunctionImplementation specializeArrayJoin(Map types, FunctionManager functionManager, List nullableArguments, MethodHandle methodHandle) + private static BuiltInScalarFunctionImplementation specializeArrayJoin(Map types, FunctionManager functionManager, List nullableArguments, MethodHandle methodHandle) { Type type = types.get("T"); List argumentProperties = nullableArguments.stream() @@ -182,7 +182,7 @@ private static ScalarFunctionImplementation specializeArrayJoin(Map elementType = type.getJavaType(); @@ -226,7 +226,7 @@ else if (elementType == Slice.class) { cast = MethodHandles.foldArguments(cast, getter.bindTo(type)); MethodHandle target = MethodHandles.insertArguments(methodHandle, 0, cast); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, argumentProperties, target, diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java index 46b0f413f0729..eb3059bfe1e0d 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayReduceFunction.java @@ -30,10 +30,10 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; @@ -83,13 +83,13 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type inputType = boundVariables.getTypeVariable("T"); Type intermediateType = boundVariables.getTypeVariable("S"); Type outputType = boundVariables.getTypeVariable("R"); MethodHandle methodHandle = METHOD_HANDLE.bindTo(inputType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java index 135780db13128..0b192e20ff99b 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArraySubscriptOperator.java @@ -26,8 +26,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT; import static com.facebook.presto.spi.function.Signature.typeVariable; @@ -58,7 +58,7 @@ protected ArraySubscriptOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(boundVariables.getTypeVariables().size() == 1, "Expected one type, got %s", boundVariables.getTypeVariables()); Type elementType = boundVariables.getTypeVariable("E"); @@ -81,7 +81,7 @@ else if (elementType.getJavaType() == Slice.class) { } methodHandle = methodHandle.bindTo(elementType); requireNonNull(methodHandle, "methodHandle is null"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java index 1991a3a764414..6d7b3260f4310 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToArrayCast.java @@ -45,8 +45,8 @@ import static com.facebook.presto.bytecode.Parameter.arg; import static com.facebook.presto.bytecode.ParameterizedType.type; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantBoolean; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.CAST; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -70,17 +70,17 @@ private ArrayToArrayCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type fromType = boundVariables.getTypeVariable("F"); Type toType = boundVariables.getTypeVariable("T"); FunctionHandle functionHandle = functionManager.lookupCast(CastType.CAST, fromType.getTypeSignature(), toType.getTypeSignature()); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); Class castOperatorClass = generateArrayCast(typeManager, functionManager.getFunctionMetadata(functionHandle), function); MethodHandle methodHandle = methodHandle(castOperatorClass, "castArray", ConnectorSession.class, Block.class); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -88,7 +88,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in methodHandle); } - private static Class generateArrayCast(TypeManager typeManager, FunctionMetadata elementCastFunctionMetadata, ScalarFunctionImplementation elementCast) + private static Class generateArrayCast(TypeManager typeManager, FunctionMetadata elementCastFunctionMetadata, BuiltInScalarFunctionImplementation elementCast) { CallSiteBinder binder = new CallSiteBinder(); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java index fc3fdbcf4729f..b513ab2768ec1 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToElementConcatFunction.java @@ -28,8 +28,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; @@ -76,7 +76,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); MethodHandle methodHandle; @@ -97,7 +97,7 @@ else if (type.getJavaType() == Slice.class) { } methodHandle = methodHandle.bindTo(type); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java index 364b510ac12bc..f1526407e6668 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayToJsonCast.java @@ -33,9 +33,9 @@ import java.io.IOException; import java.lang.invoke.MethodHandle; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.JsonOperators.JSON_FACTORY; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -62,7 +62,7 @@ private ArrayToJsonCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); @@ -71,7 +71,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in JsonGeneratorWriter writer = JsonGeneratorWriter.createJsonGeneratorWriter(type); MethodHandle methodHandle = METHOD_HANDLE.bindTo(writer); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java index 001edf26d9c99..9d5292f5a75e8 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ArrayTransformFunction.java @@ -57,9 +57,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; @@ -104,12 +104,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type inputType = boundVariables.getTypeVariable("T"); Type outputType = boundVariables.getTypeVariable("U"); Class generatedClass = generateTransform(inputType, outputType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ScalarFunctionImplementation.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java similarity index 94% rename from presto-main/src/main/java/com/facebook/presto/operator/scalar/ScalarFunctionImplementation.java rename to presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java index 2953b9e1fd260..6fe41722a9008 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ScalarFunctionImplementation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/BuiltInScalarFunctionImplementation.java @@ -14,6 +14,7 @@ package com.facebook.presto.operator.scalar; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.google.common.collect.ImmutableList; import java.lang.invoke.MethodHandle; @@ -21,18 +22,19 @@ import java.util.Objects; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.FUNCTION_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.lang.String.format; import static java.util.Objects.requireNonNull; -public final class ScalarFunctionImplementation +public final class BuiltInScalarFunctionImplementation + implements ScalarFunctionImplementation { private final List choices; - public ScalarFunctionImplementation( + public BuiltInScalarFunctionImplementation( boolean nullable, List argumentProperties, MethodHandle methodHandle) @@ -44,7 +46,7 @@ public ScalarFunctionImplementation( Optional.empty()); } - public ScalarFunctionImplementation( + public BuiltInScalarFunctionImplementation( boolean nullable, List argumentProperties, MethodHandle methodHandle, @@ -68,7 +70,7 @@ public ScalarFunctionImplementation( * * @param choices the list of choices, ordered from generic to specific */ - public ScalarFunctionImplementation(List choices) + public BuiltInScalarFunctionImplementation(List choices) { checkArgument(!choices.isEmpty(), "choices is an empty list"); this.choices = ImmutableList.copyOf(choices); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java index 2071ba1907d0a..9468625b1f9ca 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/CastFromUnknownOperator.java @@ -23,8 +23,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.CAST; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -46,13 +46,13 @@ public CastFromUnknownOperator() } @Override - public ScalarFunctionImplementation specialize( + public BuiltInScalarFunctionImplementation specialize( BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type toType = boundVariables.getTypeVariable("E"); MethodHandle methodHandle = METHOD_HANDLE_NON_NULL.asType(METHOD_HANDLE_NON_NULL.type().changeReturnType(toType.getJavaType())); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java index eec29fb7a2bcc..5fd6e6e90906e 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ConcatFunction.java @@ -51,8 +51,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantInt; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.invokeStatic; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED; import static com.facebook.presto.spi.type.VarbinaryType.VARBINARY; @@ -107,7 +107,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { if (arity < 2) { throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "There must be two or more concatenation arguments"); @@ -116,7 +116,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in Class clazz = generateConcat(getSignature().getReturnType(), arity); MethodHandle methodHandle = methodHandle(clazz, "concat", nCopies(arity, Slice.class).toArray(new Class[arity])); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java index afe323559e0fb..468b70e959b78 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ElementToArrayConcatFunction.java @@ -28,8 +28,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; @@ -76,7 +76,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("E"); MethodHandle methodHandle; @@ -97,7 +97,7 @@ else if (type.getJavaType() == Slice.class) { } methodHandle = methodHandle.bindTo(type); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java index 7fa41a329144e..a8f09bd606175 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/IdentityCast.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.google.common.base.Preconditions.checkArgument; @@ -45,12 +45,12 @@ protected IdentityCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(boundVariables.getTypeVariables().size() == 1, "Expected only one type"); Type type = boundVariables.getTypeVariable("T"); MethodHandle identity = MethodHandles.identity(type.getJavaType()); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), identity); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java index 52157e3118079..14fe2e91be7d9 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/InvokeFunction.java @@ -28,7 +28,7 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; @@ -75,10 +75,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type returnType = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(functionTypeArgumentProperty(InvokeLambda.class)), METHOD_HANDLE.asType( diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java index aab91fd2063fb..a5f9684fcc1ff 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToArrayCast.java @@ -66,7 +66,7 @@ public final boolean isHidden() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return JSON_TO_ARRAY.specialize(boundVariables, arity, typeManager, functionManager); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java index d17e8f68861b3..3c7319844e4db 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToMapCast.java @@ -67,7 +67,7 @@ public final boolean isHidden() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return JSON_TO_MAP.specialize(boundVariables, arity, typeManager, functionManager); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java index 1255b00e1b434..6120d481d7ae7 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonStringToRowCast.java @@ -66,7 +66,7 @@ public final boolean isHidden() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { return JSON_TO_ROW.specialize(boundVariables, arity, typeManager, functionManager); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java index 46baf8ac4b49e..64cd45c153492 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToArrayCast.java @@ -36,8 +36,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -67,7 +67,7 @@ private JsonToArrayCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); @@ -76,7 +76,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in BlockBuilderAppender elementAppender = BlockBuilderAppender.createBlockBuilderAppender(arrayType.getElementType()); MethodHandle methodHandle = METHOD_HANDLE.bindTo(arrayType).bindTo(elementAppender); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java index 574db4ec4c1a6..36829d8aaf85e 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToMapCast.java @@ -36,8 +36,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; import static com.facebook.presto.spi.function.Signature.typeVariable; @@ -70,7 +70,7 @@ private JsonToMapCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type keyType = boundVariables.getTypeVariable("K"); @@ -81,7 +81,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in BlockBuilderAppender keyAppender = createBlockBuilderAppender(mapType.getKeyType()); BlockBuilderAppender valueAppender = createBlockBuilderAppender(mapType.getValueType()); MethodHandle methodHandle = METHOD_HANDLE.bindTo(mapType).bindTo(keyAppender).bindTo(valueAppender); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java index b37370ac5f3b6..28c7cf33cde07 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/JsonToRowCast.java @@ -39,8 +39,8 @@ import java.util.Map; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -74,7 +74,7 @@ private JsonToRowCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); RowType rowType = (RowType) boundVariables.getTypeVariable("T"); @@ -85,7 +85,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in .map(rowField -> createBlockBuilderAppender(rowField.getType())) .toArray(BlockBuilderAppender[]::new); MethodHandle methodHandle = METHOD_HANDLE.bindTo(rowType).bindTo(fieldAppenders).bindTo(getFieldNameToIndex(rowFields)); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java index 60ec56ee6691e..8d51db9a951c9 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConcatFunction.java @@ -37,8 +37,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -89,7 +89,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { if (arity < 2) { throw new PrestoException(INVALID_FUNCTION_ARGUMENT, "There must be two or more concatenation arguments to " + FUNCTION_NAME); @@ -108,7 +108,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in METHOD_HANDLE.bindTo(mapType), USER_STATE_FACTORY.bindTo(mapType)); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandleAndConstructor.getMethodHandle(), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java index a97cd54a33814..1c8fd821f7855 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapConstructor.java @@ -39,8 +39,8 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.INDETERMINATE; import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; @@ -104,19 +104,19 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); Type mapType = typeManager.getParameterizedType(MAP, ImmutableList.of(TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(valueType.getTypeSignature()))); - MethodHandle keyHashCode = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.HASH_CODE, fromTypes(keyType))).getMethodHandle(); - MethodHandle keyEqual = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(keyType, keyType))).getMethodHandle(); - MethodHandle keyIndeterminate = functionManager.getScalarFunctionImplementation( + MethodHandle keyHashCode = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.HASH_CODE, fromTypes(keyType))).getMethodHandle(); + MethodHandle keyEqual = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(keyType, keyType))).getMethodHandle(); + MethodHandle keyIndeterminate = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(INDETERMINATE, fromTypeSignatures((keyType.getTypeSignature())))).getMethodHandle(); MethodHandle instanceFactory = constructorMethodHandle(State.class, MapType.class).bindTo(mapType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java index 5b14b8cd12a67..d7a06c7f7f328 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapElementAtFunction.java @@ -32,8 +32,8 @@ import java.lang.invoke.MethodHandle; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; @@ -82,12 +82,12 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); - MethodHandle keyEqualsMethod = functionManager.getScalarFunctionImplementation( + MethodHandle keyEqualsMethod = functionManager.getBuiltInScalarFunctionImplementation( functionManager.resolveOperator(OperatorType.EQUAL, fromTypes(keyType, keyType))).getMethodHandle(); MethodHandle methodHandle; @@ -109,7 +109,7 @@ else if (keyType.getJavaType() == Slice.class) { methodHandle = methodHandle.bindTo(keyEqualsMethod).bindTo(keyType).bindTo(valueType); methodHandle = methodHandle.asType(methodHandle.type().changeReturnType(Primitives.wrap(valueType.getJavaType()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java index 6e90dd836c2cc..65d08c52a4327 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapFilterFunction.java @@ -62,9 +62,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.sql.gen.SqlTypeBytecodeExpression.constantType; @@ -110,14 +110,14 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); MapType mapType = (MapType) typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(valueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java index e033044b3b126..f1cb90c05e9e9 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapHashCodeOperator.java @@ -25,8 +25,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.HASH_CODE; import static com.facebook.presto.spi.function.Signature.comparableTypeParameter; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -50,16 +50,16 @@ private MapHashCodeOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); - MethodHandle keyHashCodeFunction = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(keyType))).getMethodHandle(); - MethodHandle valueHashCodeFunction = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(valueType))).getMethodHandle(); + MethodHandle keyHashCodeFunction = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(keyType))).getMethodHandle(); + MethodHandle valueHashCodeFunction = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(valueType))).getMethodHandle(); MethodHandle method = METHOD_HANDLE.bindTo(keyHashCodeFunction).bindTo(valueHashCodeFunction).bindTo(keyType).bindTo(valueType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), method); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java index 4b5e1bf8dea6b..00355f4368cb0 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapSubscriptOperator.java @@ -33,8 +33,8 @@ import java.lang.invoke.MethodHandles; import static com.facebook.presto.metadata.CastType.CAST; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT; import static com.facebook.presto.spi.function.Signature.typeVariable; @@ -66,7 +66,7 @@ public MapSubscriptOperator(boolean legacyMissingKey) } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V"); @@ -92,7 +92,7 @@ else if (keyType.getJavaType() == Slice.class) { methodHandle = methodHandle.bindTo(missingKeyExceptionFactory).bindTo(valueType); methodHandle = methodHandle.asType(methodHandle.type().changeReturnType(Primitives.wrap(valueType.getJavaType()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java index 577ca3e3c89be..4cfb74e8999f7 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToJsonCast.java @@ -35,9 +35,9 @@ import java.util.Map; import java.util.TreeMap; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.JsonOperators.JSON_FACTORY; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -66,7 +66,7 @@ private MapToJsonCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type keyType = boundVariables.getTypeVariable("K"); @@ -80,7 +80,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in JsonGeneratorWriter writer = JsonGeneratorWriter.createJsonGeneratorWriter(valueType); MethodHandle methodHandle = METHOD_HANDLE.bindTo(provider).bindTo(writer); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java index 7f0fe9c5b0f34..23db25231aec3 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapToMapCast.java @@ -32,8 +32,8 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.block.MethodHandleUtil.compose; import static com.facebook.presto.spi.block.MethodHandleUtil.nativeValueGetter; @@ -79,7 +79,7 @@ public MapToMapCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type fromKeyType = boundVariables.getTypeVariable("FK"); @@ -95,7 +95,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in MethodHandle keyProcessor = buildProcessor(functionManager, fromKeyType, toKeyType, true); MethodHandle valueProcessor = buildProcessor(functionManager, fromValueType, toValueType, false); MethodHandle target = MethodHandles.insertArguments(METHOD_HANDLE, 0, keyProcessor, valueProcessor, toMapType); - return new ScalarFunctionImplementation(true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), target); + return new BuiltInScalarFunctionImplementation(true, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), target); } /** @@ -107,7 +107,7 @@ private MethodHandle buildProcessor(FunctionManager functionManager, Type fromTy MethodHandle getter = nativeValueGetter(fromType); // Adapt cast that takes ([ConnectorSession,] ?) to one that takes (?, ConnectorSession), where ? is the return type of getter. - ScalarFunctionImplementation castImplementation = functionManager.getScalarFunctionImplementation(functionManager.lookupCast(CastType.CAST, fromType.getTypeSignature(), toType.getTypeSignature())); + BuiltInScalarFunctionImplementation castImplementation = functionManager.getBuiltInScalarFunctionImplementation(functionManager.lookupCast(CastType.CAST, fromType.getTypeSignature(), toType.getTypeSignature())); MethodHandle cast = castImplementation.getMethodHandle(); if (cast.type().parameterArray()[0] != ConnectorSession.class) { cast = MethodHandles.dropArguments(cast, 0, ConnectorSession.class); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java index 78a18fc2239dd..09f3e418be435 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformKeyFunction.java @@ -71,9 +71,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -120,7 +120,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K1"); Type transformedKeyType = boundVariables.getTypeVariable("K2"); @@ -128,7 +128,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in MapType resultMapType = (MapType) typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(transformedKeyType.getTypeSignature()), TypeSignatureParameter.of(valueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java index b899a9b22dd12..b94cbf139cc99 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapTransformValueFunction.java @@ -69,9 +69,9 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.subtract; import static com.facebook.presto.bytecode.instruction.VariableInstruction.incrementVariable; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -118,7 +118,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type valueType = boundVariables.getTypeVariable("V1"); @@ -126,7 +126,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in Type resultMapType = typeManager.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(transformedValueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java index 45ec282e724f3..e8d88b3c4e75e 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/MapZipWithFunction.java @@ -35,9 +35,9 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; @@ -84,7 +84,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type keyType = boundVariables.getTypeVariable("K"); Type inputValueType1 = boundVariables.getTypeVariable("V1"); @@ -95,7 +95,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in ImmutableList.of( TypeSignatureParameter.of(keyType.getTypeSignature()), TypeSignatureParameter.of(outputValueType.getTypeSignature()))); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java index 092f4ef273d12..107d5739b1d71 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ParametricScalar.java @@ -80,19 +80,19 @@ public ParametricImplementationsGroup getImpleme } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Signature boundSignature = applyBoundVariables(getSignature(), boundVariables, arity); if (implementations.getExactImplementations().containsKey(boundSignature)) { ParametricScalarImplementation implementation = implementations.getExactImplementations().get(boundSignature); - Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); + Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); checkCondition(scalarFunctionImplementation.isPresent(), FUNCTION_IMPLEMENTATION_ERROR, String.format("Exact implementation of %s do not match expected java types.", boundSignature.getNameSuffix())); return scalarFunctionImplementation.get(); } - ScalarFunctionImplementation selectedImplementation = null; + BuiltInScalarFunctionImplementation selectedImplementation = null; for (ParametricScalarImplementation implementation : implementations.getSpecializedImplementations()) { - Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); + Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); if (scalarFunctionImplementation.isPresent()) { checkCondition(selectedImplementation == null, AMBIGUOUS_FUNCTION_IMPLEMENTATION, "Ambiguous implementation for %s with bindings %s", getSignature(), boundVariables.getTypeVariables()); selectedImplementation = scalarFunctionImplementation.get(); @@ -102,7 +102,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in return selectedImplementation; } for (ParametricScalarImplementation implementation : implementations.getGenericImplementations()) { - Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); + Optional scalarFunctionImplementation = implementation.specialize(boundSignature, boundVariables, typeManager, functionManager); if (scalarFunctionImplementation.isPresent()) { checkCondition(selectedImplementation == null, AMBIGUOUS_FUNCTION_IMPLEMENTATION, "Ambiguous implementation for %s with bindings %s", getSignature(), boundVariables.getTypeVariables()); selectedImplementation = scalarFunctionImplementation.get(); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java index 3aa79ae513a50..165ed3671952a 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JCastToRegexpFunction.java @@ -26,8 +26,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT; import static com.facebook.presto.spi.function.OperatorType.CAST; import static com.facebook.presto.spi.type.Chars.padSpaces; @@ -64,9 +64,9 @@ private Re2JCastToRegexpFunction(String sourceType, int dfaStatesLimit, int dfaR } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), insertArguments(METHOD_HANDLE, 0, dfaStatesLimit, dfaRetries, padSpaces, boundVariables.getLongVariable("x"))); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java index 2c73c36729cd2..4d3925e2ea094 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowComparisonOperator.java @@ -50,7 +50,7 @@ protected List getMethodHandles(RowType type, FunctionManager func ImmutableList.Builder argumentMethods = ImmutableList.builder(); for (Type parameterType : type.getTypeParameters()) { FunctionHandle operatorHandle = functionManager.resolveOperator(operatorType, fromTypes(parameterType, parameterType)); - argumentMethods.add(functionManager.getScalarFunctionImplementation(operatorHandle).getMethodHandle()); + argumentMethods.add(functionManager.getBuiltInScalarFunctionImplementation(operatorHandle).getMethodHandle()); } return argumentMethods.build(); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java index 98553ab3da70c..8660b80a890c6 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowDistinctFromOperator.java @@ -17,8 +17,8 @@ import com.facebook.presto.metadata.FunctionInvoker; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlOperator; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.InvocationConvention; @@ -31,9 +31,9 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.NULL_FLAG; import static com.facebook.presto.spi.function.OperatorType.IS_DISTINCT_FROM; import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; @@ -61,7 +61,7 @@ private RowDistinctFromOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { ImmutableList.Builder argumentMethods = ImmutableList.builder(); Type type = boundVariables.getTypeVariable("T"); @@ -75,7 +75,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in false))); argumentMethods.add(functionInvoker.methodHandle()); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( ImmutableList.of( new ScalarImplementationChoice( false, diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java index ba4dbb2519fdf..f831cd441a0fa 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowEqualOperator.java @@ -27,8 +27,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.EQUAL; import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -54,10 +54,10 @@ private RowEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { RowType type = (RowType) boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -77,7 +77,7 @@ public static List resolveFieldEqualOperators(RowType rowType, Fun private static MethodHandle resolveEqualOperator(Type type, FunctionManager functionManager) { FunctionHandle operator = functionManager.resolveOperator(EQUAL, fromTypes(type, type)); - ScalarFunctionImplementation implementation = functionManager.getScalarFunctionImplementation(operator); + BuiltInScalarFunctionImplementation implementation = functionManager.getBuiltInScalarFunctionImplementation(operator); return implementation.getMethodHandle(); } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java index 822a4a10fad6f..eb7ed136c3d5e 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.util.Reflection.methodHandle; @@ -41,10 +41,10 @@ private RowGreaterThanOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java index 20617fc92a96f..98abee1cd6843 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowGreaterThanOrEqualOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN_OR_EQUAL; import static com.facebook.presto.util.Reflection.methodHandle; @@ -42,10 +42,10 @@ private RowGreaterThanOrEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java index 9b7b5f773973f..d0912af6612a6 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowHashCodeOperator.java @@ -26,8 +26,8 @@ import java.lang.invoke.MethodHandle; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.HASH_CODE; import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -49,10 +49,10 @@ private RowHashCodeOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), METHOD_HANDLE.bindTo(type)); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java index cdb17f7ed7324..ce5549ca63d4b 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowIndeterminateOperator.java @@ -43,8 +43,8 @@ import static com.facebook.presto.bytecode.ParameterizedType.type; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantFalse; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantInt; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.OperatorType.INDETERMINATE; import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; @@ -69,13 +69,13 @@ private RowIndeterminateOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); Class indeterminateOperatorClass = generateIndeterminate(type, functionManager); MethodHandle indeterminateMethod = methodHandle(indeterminateOperatorClass, "indeterminate", type.getJavaType(), boolean.class); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(USE_NULL_FLAG)), indeterminateMethod); @@ -133,7 +133,7 @@ private static Class generateIndeterminate(Type type, FunctionManager functio FunctionHandle functionHandle = functionManager.resolveOperator(INDETERMINATE, fromTypes(fieldTypes.get(i))); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); BytecodeExpression element = constantType(binder, fieldTypes.get(i)).getValue(value, constantInt(i)); ifNullField.ifFalse(new IfStatement("if the field is not null but indeterminate...") diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java index 106c60d871bf5..532c75e7e1b8f 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; import static com.facebook.presto.util.Reflection.methodHandle; @@ -41,10 +41,10 @@ private RowLessThanOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java index e24f72af4d31e..2162d4d59958e 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowLessThanOrEqualOperator.java @@ -24,8 +24,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN; import static com.facebook.presto.spi.function.OperatorType.LESS_THAN_OR_EQUAL; import static com.facebook.presto.util.Reflection.methodHandle; @@ -42,10 +42,10 @@ private RowLessThanOrEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java index 61d20ebf2a067..06528f94745b3 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowNotEqualOperator.java @@ -26,8 +26,8 @@ import java.lang.invoke.MethodHandle; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.NOT_EQUAL; import static com.facebook.presto.spi.function.Signature.comparableWithVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -49,10 +49,10 @@ private RowNotEqualOperator() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { RowType type = (RowType) boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( true, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java index cd49a29cf95ec..c606b94a1f1c1 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToJsonCast.java @@ -35,9 +35,9 @@ import java.util.ArrayList; import java.util.List; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.operator.scalar.JsonOperators.JSON_FACTORY; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.StandardErrorCode.INVALID_CAST_ARGUMENT; import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -65,7 +65,7 @@ private RowToJsonCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type type = boundVariables.getTypeVariable("T"); @@ -78,7 +78,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in } MethodHandle methodHandle = METHOD_HANDLE.bindTo(fieldWriters); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java index d16912acc0b9d..87f36a804f24c 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/RowToRowCast.java @@ -53,8 +53,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantBoolean; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantInt; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantNull; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.CAST; import static com.facebook.presto.spi.function.Signature.withVariadicBound; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -77,7 +77,7 @@ private RowToRowCast() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { checkArgument(arity == 1, "Expected arity to be 1"); Type fromType = boundVariables.getTypeVariable("F"); @@ -87,7 +87,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in } Class castOperatorClass = generateRowCast(fromType, toType, functionManager); MethodHandle methodHandle = methodHandle(castOperatorClass, "castRow", ConnectorSession.class, Block.class); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); @@ -142,7 +142,7 @@ private static Class generateRowCast(Type fromType, Type toType, FunctionMana // loop through to append member blocks for (int i = 0; i < toTypes.size(); i++) { FunctionHandle functionHandle = functionManager.lookupCast(CastType.CAST, fromTypes.get(i).getTypeSignature(), toTypes.get(i).getTypeSignature()); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); Type currentFromType = fromTypes.get(i); if (currentFromType.equals(UNKNOWN)) { body.append(singleRowBlockWriter.invoke("appendNull", BlockBuilder.class).pop()); diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java index d8eb3d1e13696..60cf95e728d60 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/TryCastFunction.java @@ -16,7 +16,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.Signature; @@ -75,7 +75,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type fromType = boundVariables.getTypeVariable("F"); Type toType = boundVariables.getTypeVariable("T"); @@ -86,7 +86,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in // the resulting method needs to return a boxed type FunctionHandle functionHandle = functionManager.lookupCast(CAST, fromType.getTypeSignature(), toType.getTypeSignature()); - ScalarFunctionImplementation implementation = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation implementation = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); argumentProperties = ImmutableList.of(implementation.getArgumentProperty(0)); MethodHandle coercion = implementation.getMethodHandle(); coercion = coercion.asType(methodType(returnType, coercion.type())); @@ -94,6 +94,6 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in MethodHandle exceptionHandler = dropArguments(constant(returnType, null), 0, RuntimeException.class); tryCastHandle = catchException(coercion, RuntimeException.class, exceptionHandler); - return new ScalarFunctionImplementation(true, argumentProperties, tryCastHandle); + return new BuiltInScalarFunctionImplementation(true, argumentProperties, tryCastHandle); } } diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java index fa88c01adcc69..32ceaca2471b5 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipFunction.java @@ -17,7 +17,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.function.FunctionKind; @@ -34,8 +34,8 @@ import java.util.stream.IntStream; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.methodHandle; import static com.google.common.collect.ImmutableList.toImmutableList; @@ -98,13 +98,13 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { List types = this.typeParameters.stream().map(boundVariables::getTypeVariable).collect(toImmutableList()); List argumentProperties = nCopies(types.size(), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)); List> javaArgumentTypes = nCopies(types.size(), Block.class); MethodHandle methodHandle = METHOD_HANDLE.bindTo(types).asVarargsCollector(Block[].class).asType(methodType(Block.class, javaArgumentTypes)); - return new ScalarFunctionImplementation(false, argumentProperties, methodHandle); + return new BuiltInScalarFunctionImplementation(false, argumentProperties, methodHandle); } @UsedByGeneratedCode diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java index 506f91e2b9b28..34b0baed98777 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/ZipWithFunction.java @@ -32,9 +32,9 @@ import java.util.Optional; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.spi.type.TypeUtils.readNativeValue; @@ -82,13 +82,13 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type leftElementType = boundVariables.getTypeVariable("T"); Type rightElementType = boundVariables.getTypeVariable("U"); Type outputElementType = boundVariables.getTypeVariable("R"); ArrayType outputArrayType = new ArrayType(outputElementType); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java b/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java index ae89bb723464f..3b5a4e06a7e08 100644 --- a/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java +++ b/presto-main/src/main/java/com/facebook/presto/operator/scalar/annotations/ParametricScalarImplementation.java @@ -18,11 +18,11 @@ import com.facebook.presto.operator.ParametricImplementation; import com.facebook.presto.operator.annotations.FunctionsParserHelper; import com.facebook.presto.operator.annotations.ImplementationDependency; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.function.BlockIndex; @@ -70,12 +70,12 @@ import static com.facebook.presto.operator.annotations.ImplementationDependency.checkTypeParameters; import static com.facebook.presto.operator.annotations.ImplementationDependency.getImplementationDependencyAnnotation; import static com.facebook.presto.operator.annotations.ImplementationDependency.validateImplementationDependencyAnnotation; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.functionTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.StandardErrorCode.FUNCTION_IMPLEMENTATION_ERROR; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -118,7 +118,7 @@ private ParametricScalarImplementation( } } - public Optional specialize(Signature boundSignature, BoundVariables boundVariables, TypeManager typeManager, FunctionManager functionManager) + public Optional specialize(Signature boundSignature, BoundVariables boundVariables, TypeManager typeManager, FunctionManager functionManager) { List implementationChoices = new ArrayList<>(); for (Map.Entry> entry : specializedTypeParameters.entrySet()) { @@ -169,7 +169,7 @@ public Optional specialize(Signature boundSignatur boundMethodHandle.asType(javaMethodType(choice, boundSignature, typeManager)), boundConstructor)); } - return Optional.of(new ScalarFunctionImplementation(implementationChoices)); + return Optional.of(new BuiltInScalarFunctionImplementation(implementationChoices)); } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java b/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java index b929cf65dd2ae..0460c34416a58 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/InterpretedFunctionInvoker.java @@ -14,8 +14,8 @@ package com.facebook.presto.sql; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.function.FunctionHandle; import com.google.common.base.Defaults; @@ -25,9 +25,9 @@ import java.util.Arrays; import java.util.List; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.google.common.base.Throwables.throwIfUnchecked; import static java.lang.invoke.MethodHandleProxies.asInterfaceInstance; import static java.util.Objects.requireNonNull; @@ -48,7 +48,7 @@ public Object invoke(FunctionHandle functionHandle, ConnectorSession session, Ob public Object invoke(FunctionHandle functionHandle, ConnectorSession session, List arguments) { - return invoke(functionManager.getScalarFunctionImplementation(functionHandle), session, arguments); + return invoke(functionManager.getBuiltInScalarFunctionImplementation(functionHandle), session, arguments); } /** @@ -56,7 +56,7 @@ public Object invoke(FunctionHandle functionHandle, ConnectorSession session, Li *

* Returns a value in the native container type corresponding to the declared SQL return type */ - private Object invoke(ScalarFunctionImplementation function, ConnectorSession session, List arguments) + private Object invoke(BuiltInScalarFunctionImplementation function, ConnectorSession session, List arguments) { MethodHandle method = function.getMethodHandle(); @@ -103,7 +103,7 @@ else if (function.getArgumentProperty(i).getNullConvention() == USE_NULL_FLAG) { } } - private static MethodHandle bindInstanceFactory(MethodHandle method, ScalarFunctionImplementation implementation) + private static MethodHandle bindInstanceFactory(MethodHandle method, BuiltInScalarFunctionImplementation implementation) { if (!implementation.getInstanceFactory().isPresent()) { return method; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java index 63ada762b12f0..dd4f03d121373 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/ExpressionAnalyzer.java @@ -14,7 +14,6 @@ package com.facebook.presto.sql.analyzer; import com.facebook.presto.Session; -import com.facebook.presto.SystemSessionProperties; import com.facebook.presto.execution.warnings.WarningCollector; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.Metadata; @@ -27,6 +26,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.type.CharType; import com.facebook.presto.spi.type.DecimalParseResult; import com.facebook.presto.spi.type.Decimals; @@ -96,6 +96,7 @@ import com.facebook.presto.sql.tree.TryExpression; import com.facebook.presto.sql.tree.WhenClause; import com.facebook.presto.sql.tree.WindowFrame; +import com.facebook.presto.transaction.TransactionId; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -114,7 +115,6 @@ import java.util.Set; import java.util.function.Function; -import static com.facebook.presto.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; import static com.facebook.presto.metadata.CastType.CAST; import static com.facebook.presto.spi.function.OperatorType.SUBSCRIPT; import static com.facebook.presto.spi.type.BigintType.BIGINT; @@ -175,7 +175,6 @@ public class ExpressionAnalyzer private final Function statementAnalyzerFactory; private final TypeProvider symbolTypes; private final boolean isDescribe; - private final boolean legacyRowFieldOrdinalAccess; private final Map, FunctionHandle> resolvedFunctions = new LinkedHashMap<>(); private final Set> scalarSubqueries = new LinkedHashSet<>(); @@ -191,15 +190,17 @@ public class ExpressionAnalyzer private final Set> windowFunctions = new LinkedHashSet<>(); private final Multimap tableColumnReferences = HashMultimap.create(); - private final Session session; + private final Optional transactionId; + private final SqlFunctionProperties sqlFunctionProperties; private final List parameters; private final WarningCollector warningCollector; - public ExpressionAnalyzer( + private ExpressionAnalyzer( FunctionManager functionManager, TypeManager typeManager, Function statementAnalyzerFactory, - Session session, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties, TypeProvider symbolTypes, List parameters, WarningCollector warningCollector, @@ -208,11 +209,11 @@ public ExpressionAnalyzer( this.functionManager = requireNonNull(functionManager, "functionManager is null"); this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); - this.session = requireNonNull(session, "session is null"); + this.transactionId = requireNonNull(transactionId, "transactionId is null"); + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); this.symbolTypes = requireNonNull(symbolTypes, "symbolTypes is null"); this.parameters = requireNonNull(parameters, "parameters is null"); this.isDescribe = isDescribe; - this.legacyRowFieldOrdinalAccess = isLegacyRowFieldOrdinalAccessEnabled(session); this.warningCollector = requireNonNull(warningCollector, "warningCollector is null"); } @@ -453,7 +454,7 @@ protected Type visitDereferenceExpression(DereferenceExpression node, StackableA } } - if (legacyRowFieldOrdinalAccess && rowFieldType == null) { + if (sqlFunctionProperties.isLegacyRowFieldOrdinalAccessEnabled() && rowFieldType == null) { OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, rowType.getFields()); if (rowIndex.isPresent()) { rowFieldType = rowType.getFields().get(rowIndex.getAsInt()).getType(); @@ -784,8 +785,8 @@ protected Type visitTimeLiteral(TimeLiteral node, StackableAstVisitorContext context) { try { - if (SystemSessionProperties.isLegacyTimestamp(session)) { - parseTimestampLiteral(session.getTimeZoneKey(), node.getValue()); + if (sqlFunctionProperties.isLegacyTimestamp()) { + parseTimestampLiteral(sqlFunctionProperties.getTimeZoneKey(), node.getValue()); } else { parseTimestampLiteral(node.getValue()); @@ -879,7 +880,8 @@ protected Type visitFunctionCall(FunctionCall node, StackableAstVisitorContext argumentTypes = argumentTypesBuilder.build(); - FunctionHandle function = resolveFunction(session, node, argumentTypes, functionManager); + FunctionHandle function = resolveFunction(transactionId, node, argumentTypes, functionManager); FunctionMetadata functionMetadata = functionManager.getFunctionMetadata(function); if (node.getOrderBy().isPresent()) { @@ -1449,10 +1451,10 @@ public List getFunctionInputTypes() } } - public static FunctionHandle resolveFunction(Session session, FunctionCall node, List argumentTypes, FunctionManager functionManager) + public static FunctionHandle resolveFunction(Optional transactionId, FunctionCall node, List argumentTypes, FunctionManager functionManager) { try { - return functionManager.resolveFunction(session, node.getName(), argumentTypes); + return functionManager.resolveFunction(transactionId, node.getName(), argumentTypes); } catch (PrestoException e) { if (e.getErrorCode().getCode() == StandardErrorCode.FUNCTION_NOT_FOUND.toErrorCode().getCode()) { @@ -1585,7 +1587,8 @@ private static ExpressionAnalyzer create( metadata.getFunctionManager(), metadata.getTypeManager(), node -> new StatementAnalyzer(analysis, metadata, sqlParser, accessControl, session, warningCollector), - session, + session.getTransactionId(), + session.getSqlFunctionProperties(), types, analysis.getParameters(), warningCollector, @@ -1648,6 +1651,29 @@ public static ExpressionAnalyzer createWithoutSubqueries( Function statementAnalyzerRejection, WarningCollector warningCollector, boolean isDescribe) + { + return createWithoutSubqueries( + functionManager, + typeManager, + session.getTransactionId(), + session.getSqlFunctionProperties(), + symbolTypes, + parameters, + statementAnalyzerRejection, + warningCollector, + isDescribe); + } + + public static ExpressionAnalyzer createWithoutSubqueries( + FunctionManager functionManager, + TypeManager typeManager, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties, + TypeProvider symbolTypes, + List parameters, + Function statementAnalyzerRejection, + WarningCollector warningCollector, + boolean isDescribe) { return new ExpressionAnalyzer( functionManager, @@ -1655,7 +1681,8 @@ public static ExpressionAnalyzer createWithoutSubqueries( node -> { throw statementAnalyzerRejection.apply(node); }, - session, + transactionId, + sqlFunctionProperties, symbolTypes, parameters, warningCollector, diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java index b02ab4ef89708..ced4714312f4c 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/ArrayGeneratorUtils.java @@ -16,7 +16,7 @@ import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.bytecode.expression.BytecodeExpression; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.type.Type; import java.util.function.Function; @@ -29,7 +29,7 @@ private ArrayGeneratorUtils() { } - public static ArrayMapBytecodeExpression map(Scope scope, CachedInstanceBinder cachedInstanceBinder, Type fromElementType, Type toElementType, Variable array, String elementFunctionName, ScalarFunctionImplementation elementFunction) + public static ArrayMapBytecodeExpression map(Scope scope, CachedInstanceBinder cachedInstanceBinder, Type fromElementType, Type toElementType, Variable array, String elementFunctionName, BuiltInScalarFunctionImplementation elementFunction) { return map( scope, diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java index c80883264870b..225a726f38c3d 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BodyCompiler.java @@ -14,11 +14,12 @@ package com.facebook.presto.sql.gen; import com.facebook.presto.bytecode.ClassDefinition; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.RowExpression; import java.util.List; public interface BodyCompiler { - void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections); + void generateMethods(SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java index 96115e1772d40..2b7cb0116f8d1 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeGeneratorContext.java @@ -18,7 +18,7 @@ import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.sql.gen.BytecodeUtils.OutputBlockVariableAndType; @@ -83,7 +83,7 @@ public FunctionManager getFunctionManager() return manager; } - public BytecodeNode generateCall(String name, ScalarFunctionImplementation function, List arguments) + public BytecodeNode generateCall(String name, BuiltInScalarFunctionImplementation function, List arguments) { return generateCall(name, function, arguments, Optional.empty()); } @@ -93,7 +93,7 @@ public BytecodeNode generateCall(String name, ScalarFunctionImplementation funct */ public BytecodeNode generateCall( String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, List arguments, Optional outputBlockVariableAndType) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java index 25b122b60f976..f3780b654b715 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/BytecodeUtils.java @@ -20,10 +20,10 @@ import com.facebook.presto.bytecode.control.IfStatement; import com.facebook.presto.bytecode.expression.BytecodeExpression; import com.facebook.presto.bytecode.instruction.LabelNode; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.type.Type; @@ -44,8 +44,8 @@ import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantFalse; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.constantTrue; import static com.facebook.presto.bytecode.expression.BytecodeExpressions.invokeDynamic; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention.PROVIDED_BLOCKBUILDER; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention.PROVIDED_BLOCKBUILDER; import static com.facebook.presto.sql.gen.Bootstrap.BOOTSTRAP_METHOD; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; @@ -182,7 +182,7 @@ public static BytecodeExpression loadConstant(Binding binding) public static BytecodeNode generateInvocation( Scope scope, String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, Optional instance, List arguments, CallSiteBinder binder) @@ -200,7 +200,7 @@ public static BytecodeNode generateInvocation( public static BytecodeNode generateInvocation( Scope scope, String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, Optional instance, List arguments, CallSiteBinder binder, diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java index e1765ba006a82..5dc633b209d95 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/CursorProcessorCompiler.java @@ -30,6 +30,7 @@ import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.RecordCursor; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -69,19 +70,19 @@ public CursorProcessorCompiler(Metadata metadata) } @Override - public void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections) + public void generateMethods(SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, List projections) { CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); generateProcessMethod(classDefinition, projections.size()); - Map filterCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata.getFunctionManager(), "filter"); - generateFilterMethod(classDefinition, callSiteBinder, cachedInstanceBinder, filterCompiledLambdaMap, filter); + Map filterCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata, sqlFunctionProperties, "filter"); + generateFilterMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, filterCompiledLambdaMap, filter); for (int i = 0; i < projections.size(); i++) { String methodName = "project_" + i; - Map projectCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projections.get(i), metadata.getFunctionManager(), methodName); - generateProjectMethod(classDefinition, callSiteBinder, cachedInstanceBinder, projectCompiledLambdaMap, methodName, projections.get(i)); + Map projectCompiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projections.get(i), metadata, sqlFunctionProperties, methodName); + generateProjectMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, projectCompiledLambdaMap, methodName, projections.get(i)); } MethodDefinition constructorDefinition = classDefinition.declareConstructor(a(PUBLIC)); @@ -189,6 +190,7 @@ private static IfStatement createProjectIfStatement( } private void generateFilterMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -205,10 +207,12 @@ private void generateFilterMethod( Variable wasNullVariable = scope.declareVariable(type(boolean.class), "wasNull"); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(cursor), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); LabelNode end = new LabelNode("end"); @@ -227,6 +231,7 @@ private void generateFilterMethod( } private void generateProjectMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -245,10 +250,12 @@ private void generateProjectMethod( Variable wasNullVariable = scope.declareVariable(type(boolean.class), "wasNull"); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(cursor), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); method.getBody() diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java index 09ce4e4b533e2..b524d298bd9fb 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/ExpressionCompiler.java @@ -21,6 +21,7 @@ import com.facebook.presto.operator.project.PageProcessor; import com.facebook.presto.operator.project.PageProjection; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.RowExpression; import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.CacheBuilder; @@ -66,7 +67,7 @@ public ExpressionCompiler(Metadata metadata, PageFunctionCompiler pageFunctionCo this.cursorProcessors = CacheBuilder.newBuilder() .recordStats() .maximumSize(1000) - .build(CacheLoader.from(key -> compile(key.getFilter(), key.getProjections(), new CursorProcessorCompiler(metadata), CursorProcessor.class))); + .build(CacheLoader.from(key -> compile(key.getSqlFunctionProperties(), key.getFilter(), key.getProjections(), new CursorProcessorCompiler(metadata), CursorProcessor.class))); this.cacheStatsMBean = new CacheStatsMBean(cursorProcessors); } @@ -77,9 +78,9 @@ public CacheStatsMBean getCursorProcessorCache() return cacheStatsMBean; } - public Supplier compileCursorProcessor(Optional filter, List projections, Object uniqueKey) + public Supplier compileCursorProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Object uniqueKey) { - Class cursorProcessor = cursorProcessors.getUnchecked(new CacheKey(filter, projections, uniqueKey)); + Class cursorProcessor = cursorProcessors.getUnchecked(new CacheKey(sqlFunctionProperties, filter, projections, uniqueKey)); return () -> { try { return cursorProcessor.getConstructor().newInstance(); @@ -90,20 +91,21 @@ public Supplier compileCursorProcessor(Optional }; } - public Supplier compilePageProcessor(Optional filter, List projections, Optional classNameSuffix) + public Supplier compilePageProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Optional classNameSuffix) { - return compilePageProcessor(filter, projections, classNameSuffix, OptionalInt.empty()); + return compilePageProcessor(sqlFunctionProperties, filter, projections, classNameSuffix, OptionalInt.empty()); } private Supplier compilePageProcessor( + SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Optional classNameSuffix, OptionalInt initialBatchSize) { - Optional> filterFunctionSupplier = filter.map(expression -> pageFunctionCompiler.compileFilter(expression, classNameSuffix)); + Optional> filterFunctionSupplier = filter.map(expression -> pageFunctionCompiler.compileFilter(sqlFunctionProperties, expression, classNameSuffix)); List> pageProjectionSuppliers = projections.stream() - .map(projection -> pageFunctionCompiler.compileProjection(projection, classNameSuffix)) + .map(projection -> pageFunctionCompiler.compileProjection(sqlFunctionProperties, projection, classNameSuffix)) .collect(toImmutableList()); return () -> { @@ -115,22 +117,22 @@ private Supplier compilePageProcessor( }; } - public Supplier compilePageProcessor(Optional filter, List projections) + public Supplier compilePageProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections) { - return compilePageProcessor(filter, projections, Optional.empty()); + return compilePageProcessor(sqlFunctionProperties, filter, projections, Optional.empty()); } @VisibleForTesting - public Supplier compilePageProcessor(Optional filter, List projections, int initialBatchSize) + public Supplier compilePageProcessor(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, int initialBatchSize) { - return compilePageProcessor(filter, projections, Optional.empty(), OptionalInt.of(initialBatchSize)); + return compilePageProcessor(sqlFunctionProperties, filter, projections, Optional.empty(), OptionalInt.of(initialBatchSize)); } - private Class compile(Optional filter, List projections, BodyCompiler bodyCompiler, Class superType) + private Class compile(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, BodyCompiler bodyCompiler, Class superType) { // create filter and project page iterator class try { - return compileProcessor(filter.orElse(constant(true, BOOLEAN)), projections, bodyCompiler, superType); + return compileProcessor(sqlFunctionProperties, filter.orElse(constant(true, BOOLEAN)), projections, bodyCompiler, superType); } catch (CompilationException e) { throw new PrestoException(COMPILER_ERROR, e.getCause()); @@ -138,6 +140,7 @@ private Class compile(Optional filter, List Class compileProcessor( + SqlFunctionProperties sqlFunctionProperties, RowExpression filter, List projections, BodyCompiler bodyCompiler, @@ -150,7 +153,7 @@ private Class compileProcessor( type(superType)); CallSiteBinder callSiteBinder = new CallSiteBinder(); - bodyCompiler.generateMethods(classDefinition, callSiteBinder, filter, projections); + bodyCompiler.generateMethods(sqlFunctionProperties, classDefinition, callSiteBinder, filter, projections); // // toString method @@ -177,17 +180,24 @@ private static void generateToString(ClassDefinition classDefinition, CallSiteBi private static final class CacheKey { + private final SqlFunctionProperties sqlFunctionProperties; private final Optional filter; private final List projections; private final Object uniqueKey; - private CacheKey(Optional filter, List projections, Object uniqueKey) + private CacheKey(SqlFunctionProperties sqlFunctionProperties, Optional filter, List projections, Object uniqueKey) { + this.sqlFunctionProperties = sqlFunctionProperties; this.filter = filter; this.uniqueKey = uniqueKey; this.projections = ImmutableList.copyOf(projections); } + public SqlFunctionProperties getSqlFunctionProperties() + { + return sqlFunctionProperties; + } + private Optional getFilter() { return filter; @@ -201,7 +211,7 @@ private List getProjections() @Override public int hashCode() { - return Objects.hash(filter, projections, uniqueKey); + return Objects.hash(sqlFunctionProperties, filter, projections, uniqueKey); } @Override @@ -214,7 +224,8 @@ public boolean equals(Object obj) return false; } CacheKey other = (CacheKey) obj; - return Objects.equals(this.filter, other.filter) && + return Objects.equals(this.sqlFunctionProperties, other.sqlFunctionProperties) && + Objects.equals(this.filter, other.filter) && Objects.equals(this.projections, other.projections) && Objects.equals(this.uniqueKey, other.uniqueKey); } @@ -223,6 +234,7 @@ public boolean equals(Object obj) public String toString() { return toStringHelper(this) + .add("sqlFunctionProperties", sqlFunctionProperties) .add("filter", filter) .add("projections", projections) .add("uniqueKey", uniqueKey) diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java index 43b0055ecc396..f39fc51f3f35f 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/FunctionCallCodeGenerator.java @@ -16,7 +16,7 @@ import com.facebook.presto.bytecode.BytecodeNode; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.type.Type; @@ -26,7 +26,7 @@ import java.util.List; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; public class FunctionCallCodeGenerator { @@ -34,12 +34,12 @@ public BytecodeNode generateCall(FunctionHandle functionHandle, BytecodeGenerato { FunctionManager functionManager = context.getFunctionManager(); - ScalarFunctionImplementation function = functionManager.getScalarFunctionImplementation(functionHandle); + BuiltInScalarFunctionImplementation function = functionManager.getBuiltInScalarFunctionImplementation(functionHandle); List argumentsBytecode = new ArrayList<>(); for (int i = 0; i < arguments.size(); i++) { RowExpression argument = arguments.get(i); - ScalarFunctionImplementation.ArgumentProperty argumentProperty = function.getArgumentProperty(i); + BuiltInScalarFunctionImplementation.ArgumentProperty argumentProperty = function.getArgumentProperty(i); if (argumentProperty.getArgumentType() == VALUE_TYPE) { argumentsBytecode.add(context.generate(argument, Optional.empty())); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java index 649168576a11a..1a794f69e0e66 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/InCodeGenerator.java @@ -21,7 +21,7 @@ import com.facebook.presto.bytecode.control.SwitchStatement.SwitchBuilder; import com.facebook.presto.bytecode.instruction.LabelNode; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.RowExpression; @@ -123,9 +123,9 @@ public BytecodeNode generateExpression(BytecodeGeneratorContext generatorContext SwitchGenerationCase switchGenerationCase = checkSwitchGenerationCase(type, values); FunctionHandle hashCodeHandle = generatorContext.getFunctionManager().resolveOperator(HASH_CODE, fromTypes(type)); - MethodHandle hashCodeFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(hashCodeHandle).getMethodHandle(); + MethodHandle hashCodeFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(hashCodeHandle).getMethodHandle(); FunctionHandle isIndeterminateHandle = generatorContext.getFunctionManager().resolveOperator(INDETERMINATE, fromTypes(type)); - ScalarFunctionImplementation isIndeterminateFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(isIndeterminateHandle); + BuiltInScalarFunctionImplementation isIndeterminateFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(isIndeterminateHandle); ImmutableListMultimap.Builder hashBucketsBuilder = ImmutableListMultimap.builder(); ImmutableList.Builder defaultBucket = ImmutableList.builder(); @@ -295,7 +295,7 @@ private static BytecodeBlock buildInCase( Variable value, Collection testValues, boolean checkForNulls, - ScalarFunctionImplementation isIndeterminateFunction) + BuiltInScalarFunctionImplementation isIndeterminateFunction) { Variable caseWasNull = null; // caseWasNull is set to true the first time a null in `testValues` is encountered if (checkForNulls) { @@ -332,7 +332,7 @@ private static BytecodeBlock buildInCase( elseBlock.gotoLabel(noMatchLabel); FunctionHandle equalsHandle = generatorContext.getFunctionManager().resolveOperator(EQUAL, fromTypes(type, type)); - ScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(equalsHandle); + BuiltInScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(equalsHandle); BytecodeNode elseNode = elseBlock; for (BytecodeNode testNode : testValues) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java index 54bad4747a41f..75be5120427db 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/InvokeFunctionBytecodeExpression.java @@ -18,7 +18,7 @@ import com.facebook.presto.bytecode.MethodGenerationContext; import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.expression.BytecodeExpression; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Primitives; @@ -34,12 +34,12 @@ public class InvokeFunctionBytecodeExpression extends BytecodeExpression { - public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, ScalarFunctionImplementation function, BytecodeExpression... parameters) + public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, BuiltInScalarFunctionImplementation function, BytecodeExpression... parameters) { return invokeFunction(scope, cachedInstanceBinder, name, function, ImmutableList.copyOf(parameters)); } - public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, ScalarFunctionImplementation function, List parameters) + public static BytecodeExpression invokeFunction(Scope scope, CachedInstanceBinder cachedInstanceBinder, String name, BuiltInScalarFunctionImplementation function, List parameters) { requireNonNull(scope, "scope is null"); requireNonNull(function, "function is null"); @@ -59,7 +59,7 @@ private InvokeFunctionBytecodeExpression( Scope scope, CallSiteBinder binder, String name, - ScalarFunctionImplementation function, + BuiltInScalarFunctionImplementation function, Optional instance, List parameters) { diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java index 108d41e3e93b8..62adc995b5010 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinCompiler.java @@ -35,7 +35,7 @@ import com.facebook.presto.operator.LookupSourceSupplier; import com.facebook.presto.operator.PagesHash; import com.facebook.presto.operator.PagesHashStrategy; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; @@ -707,7 +707,7 @@ private void generatePositionNotDistinctFromRowWithPageMethod( continue; } } - ScalarFunctionImplementation operator = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.IS_DISTINCT_FROM, fromTypes(type, type))); + BuiltInScalarFunctionImplementation operator = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(OperatorType.IS_DISTINCT_FROM, fromTypes(type, type))); callSiteBinder.bind(operator.getMethodHandle()); List argumentsBytecode = new ArrayList<>(); argumentsBytecode.add(generateInputReference(callSiteBinder, scope, type, leftBlock, leftBlockPosition)); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java index 8ff5d07e80a9b..904b0f6cd5388 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/JoinFilterFunctionCompiler.java @@ -30,6 +30,7 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.RowExpression; import com.facebook.presto.spi.relation.RowExpressionVisitor; @@ -78,7 +79,7 @@ public JoinFilterFunctionCompiler(Metadata metadata) private final LoadingCache joinFilterFunctionFactories = CacheBuilder.newBuilder() .recordStats() .maximumSize(1000) - .build(CacheLoader.from(key -> internalCompileFilterFunctionFactory(key.getFilter(), key.getLeftBlocksSize()))); + .build(CacheLoader.from(key -> internalCompileFilterFunctionFactory(key.getSqlFunctionProperties(), key.getFilter(), key.getLeftBlocksSize()))); @Managed @Nested @@ -87,18 +88,18 @@ public CacheStatsMBean getJoinFilterFunctionFactoryStats() return new CacheStatsMBean(joinFilterFunctionFactories); } - public JoinFilterFunctionFactory compileJoinFilterFunction(RowExpression filter, int leftBlocksSize) + public JoinFilterFunctionFactory compileJoinFilterFunction(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, int leftBlocksSize) { - return joinFilterFunctionFactories.getUnchecked(new JoinFilterCacheKey(filter, leftBlocksSize)); + return joinFilterFunctionFactories.getUnchecked(new JoinFilterCacheKey(sqlFunctionProperties, filter, leftBlocksSize)); } - private JoinFilterFunctionFactory internalCompileFilterFunctionFactory(RowExpression filterExpression, int leftBlocksSize) + private JoinFilterFunctionFactory internalCompileFilterFunctionFactory(SqlFunctionProperties sqlFunctionProperties, RowExpression filterExpression, int leftBlocksSize) { - Class internalJoinFilterFunction = compileInternalJoinFilterFunction(filterExpression, leftBlocksSize); + Class internalJoinFilterFunction = compileInternalJoinFilterFunction(sqlFunctionProperties, filterExpression, leftBlocksSize); return new IsolatedJoinFilterFunctionFactory(internalJoinFilterFunction); } - private Class compileInternalJoinFilterFunction(RowExpression filterExpression, int leftBlocksSize) + private Class compileInternalJoinFilterFunction(SqlFunctionProperties sqlFunctionProperties, RowExpression filterExpression, int leftBlocksSize) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -108,7 +109,7 @@ private Class compileInternalJoinFilterFun CallSiteBinder callSiteBinder = new CallSiteBinder(); - new JoinFilterFunctionCompiler(metadata).generateMethods(classDefinition, callSiteBinder, filterExpression, leftBlocksSize); + new JoinFilterFunctionCompiler(metadata).generateMethods(sqlFunctionProperties, classDefinition, callSiteBinder, filterExpression, leftBlocksSize); // // toString method @@ -124,14 +125,14 @@ private Class compileInternalJoinFilterFun return defineClass(classDefinition, InternalJoinFilterFunction.class, callSiteBinder.getBindings(), getClass().getClassLoader()); } - private void generateMethods(ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, int leftBlocksSize) + private void generateMethods(SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, RowExpression filter, int leftBlocksSize) { CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); FieldDefinition sessionField = classDefinition.declareField(a(PRIVATE, FINAL), "session", ConnectorSession.class); - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata.getFunctionManager()); - generateFilterMethod(classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter, leftBlocksSize, sessionField); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata, sqlFunctionProperties); + generateFilterMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter, leftBlocksSize, sessionField); generateConstructor(classDefinition, sessionField, cachedInstanceBinder); } @@ -157,6 +158,7 @@ private static void generateConstructor( } private void generateFilterMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -190,10 +192,12 @@ private void generateFilterMethod( scope.declareVariable("session", body, method.getThis().getField(sessionField)); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder, leftPosition, leftPage, rightPosition, rightPage, leftBlocksSize), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); BytecodeNode visitorBody = compiler.compile(filter, scope, Optional.empty()); @@ -242,15 +246,22 @@ private static RowExpressionVisitor fieldReferenceCompiler( private static final class JoinFilterCacheKey { + private final SqlFunctionProperties sqlFunctionProperties; private final RowExpression filter; private final int leftBlocksSize; - public JoinFilterCacheKey(RowExpression filter, int leftBlocksSize) + public JoinFilterCacheKey(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, int leftBlocksSize) { + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); this.filter = requireNonNull(filter, "filter can not be null"); this.leftBlocksSize = leftBlocksSize; } + public SqlFunctionProperties getSqlFunctionProperties() + { + return sqlFunctionProperties; + } + public RowExpression getFilter() { return filter; diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java index 6eddd349d13b4..3b32891ca8bb4 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/LambdaBytecodeGenerator.java @@ -24,10 +24,11 @@ import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.bytecode.expression.BytecodeExpression; -import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.metadata.Metadata; import com.facebook.presto.operator.aggregation.AccumulatorCompiler; import com.facebook.presto.operator.aggregation.LambdaProvider; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -84,9 +85,10 @@ public static Map generateMethodsFor CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpression expression, - FunctionManager functionManager) + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties) { - return generateMethodsForLambda(containerClassDefinition, callSiteBinder, cachedInstanceBinder, expression, functionManager, ""); + return generateMethodsForLambda(containerClassDefinition, callSiteBinder, cachedInstanceBinder, expression, metadata, sqlFunctionProperties, ""); } public static Map generateMethodsForLambda( @@ -94,7 +96,8 @@ public static Map generateMethodsFor CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpression expression, - FunctionManager functionManager, + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties, String methodNamePrefix) { Set lambdaExpressions = ImmutableSet.copyOf(extractLambdaExpressions(expression)); @@ -109,7 +112,8 @@ public static Map generateMethodsFor compiledLambdaMap.build(), callSiteBinder, cachedInstanceBinder, - functionManager); + metadata, + sqlFunctionProperties); compiledLambdaMap.put(lambdaExpression, compiledLambda); counter++; } @@ -127,7 +131,8 @@ public static CompiledLambda preGenerateLambdaExpression( Map compiledLambdaMap, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, - FunctionManager functionManager) + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties) { ImmutableList.Builder parameters = ImmutableList.builder(); ImmutableMap.Builder parameterMapBuilder = ImmutableMap.builder(); @@ -142,10 +147,12 @@ public static CompiledLambda preGenerateLambdaExpression( } RowExpressionCompiler innerExpressionCompiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, variableReferenceCompiler(parameterMapBuilder.build()), - functionManager, + metadata, + sqlFunctionProperties, compiledLambdaMap); return defineLambdaMethod( @@ -242,7 +249,7 @@ public static BytecodeNode generateLambda( return block; } - public static Class compileLambdaProvider(LambdaDefinitionExpression lambdaExpression, FunctionManager functionManager, Class lambdaInterface) + public static Class compileLambdaProvider(LambdaDefinitionExpression lambdaExpression, Metadata metadata, SqlFunctionProperties sqlFunctionProperties, Class lambdaInterface) { ClassDefinition lambdaProviderClassDefinition = new ClassDefinition( a(PUBLIC, Access.FINAL), @@ -260,7 +267,8 @@ public static Class compileLambdaProvider(LambdaDefini callSiteBinder, cachedInstanceBinder, lambdaExpression, - functionManager); + metadata, + sqlFunctionProperties); MethodDefinition method = lambdaProviderClassDefinition.declareMethod( a(PUBLIC), @@ -274,10 +282,12 @@ public static Class compileLambdaProvider(LambdaDefini scope.declareVariable("session", body, method.getThis().getField(sessionField)); RowExpressionCompiler rowExpressionCompiler = new RowExpressionCompiler( + lambdaProviderClassDefinition, callSiteBinder, cachedInstanceBinder, variableReferenceCompiler(ImmutableMap.of()), - functionManager, + metadata, + sqlFunctionProperties, compiledLambdaMap); BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( @@ -285,7 +295,7 @@ public static Class compileLambdaProvider(LambdaDefini scope, callSiteBinder, cachedInstanceBinder, - functionManager); + metadata.getFunctionManager()); body.append( generateLambda( diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java index 8b5c2af157231..72921aa3353c9 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/NullIfCodeGenerator.java @@ -21,7 +21,7 @@ import com.facebook.presto.bytecode.instruction.LabelNode; import com.facebook.presto.metadata.CastType; import com.facebook.presto.metadata.FunctionManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.relation.RowExpression; @@ -68,7 +68,7 @@ public BytecodeNode generateExpression(BytecodeGeneratorContext generatorContext FunctionManager functionManager = generatorContext.getFunctionManager(); FunctionHandle equalFunction = functionManager.resolveOperator(EQUAL, fromTypes(firstType, secondType)); FunctionMetadata equalFunctionMetadata = functionManager.getFunctionMetadata(equalFunction); - ScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getScalarFunctionImplementation(equalFunction); + BuiltInScalarFunctionImplementation equalsFunction = generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(equalFunction); BytecodeNode equalsCall = generatorContext.generateCall( EQUAL.name(), equalsFunction, @@ -111,6 +111,6 @@ private static BytecodeNode cast( .lookupCast(CastType.CAST, actualType.getTypeSignature(), requiredType); // TODO: do we need a full function call? (nullability checks, etc) - return generatorContext.generateCall(CAST.name(), generatorContext.getFunctionManager().getScalarFunctionImplementation(functionHandle), ImmutableList.of(argument)); + return generatorContext.generateCall(CAST.name(), generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(functionHandle), ImmutableList.of(argument)); } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java index 42ab951ba1646..a197d408eb5b2 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/PageFunctionCompiler.java @@ -39,6 +39,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.DeterminismEvaluator; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -61,6 +62,7 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.TreeSet; import java.util.function.Consumer; @@ -97,8 +99,8 @@ public class PageFunctionCompiler private final Metadata metadata; private final DeterminismEvaluator determinismEvaluator; - private final LoadingCache> projectionCache; - private final LoadingCache> filterCache; + private final LoadingCache> projectionCache; + private final LoadingCache> filterCache; private final CacheStatsMBean projectionCacheStats; private final CacheStatsMBean filterCacheStats; @@ -118,7 +120,7 @@ public PageFunctionCompiler(Metadata metadata, int expressionCacheSize) projectionCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(expressionCacheSize) - .build(CacheLoader.from(projection -> compileProjectionInternal(projection, Optional.empty()))); + .build(CacheLoader.from(cacheKey -> compileProjectionInternal(cacheKey.sqlFunctionProperties, cacheKey.rowExpression, Optional.empty()))); projectionCacheStats = new CacheStatsMBean(projectionCache); } else { @@ -130,7 +132,7 @@ public PageFunctionCompiler(Metadata metadata, int expressionCacheSize) filterCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(expressionCacheSize) - .build(CacheLoader.from(filter -> compileFilterInternal(filter, Optional.empty()))); + .build(CacheLoader.from(cacheKey -> compileFilterInternal(cacheKey.sqlFunctionProperties, cacheKey.rowExpression, Optional.empty()))); filterCacheStats = new CacheStatsMBean(filterCache); } else { @@ -155,15 +157,15 @@ public CacheStatsMBean getFilterCache() return filterCacheStats; } - public Supplier compileProjection(RowExpression projection, Optional classNameSuffix) + public Supplier compileProjection(SqlFunctionProperties sqlFunctionProperties, RowExpression projection, Optional classNameSuffix) { if (projectionCache == null) { - return compileProjectionInternal(projection, classNameSuffix); + return compileProjectionInternal(sqlFunctionProperties, projection, classNameSuffix); } - return projectionCache.getUnchecked(projection); + return projectionCache.getUnchecked(new CacheKey(sqlFunctionProperties, projection)); } - private Supplier compileProjectionInternal(RowExpression projection, Optional classNameSuffix) + private Supplier compileProjectionInternal(SqlFunctionProperties sqlFunctionProperties, RowExpression projection, Optional classNameSuffix) { requireNonNull(projection, "projection is null"); @@ -184,7 +186,7 @@ private Supplier compileProjectionInternal(RowExpression project CallSiteBinder callSiteBinder = new CallSiteBinder(); // generate Work - ClassDefinition pageProjectionWorkDefinition = definePageProjectWorkClass(result.getRewrittenExpression(), callSiteBinder, classNameSuffix); + ClassDefinition pageProjectionWorkDefinition = definePageProjectWorkClass(sqlFunctionProperties, result.getRewrittenExpression(), callSiteBinder, classNameSuffix); Class pageProjectionWorkClass; try { @@ -206,7 +208,7 @@ private static ParameterizedType generateProjectionWorkClassName(Optional classNameSuffix) + private ClassDefinition definePageProjectWorkClass(SqlFunctionProperties sqlFunctionProperties, RowExpression projection, CallSiteBinder callSiteBinder, Optional classNameSuffix) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -231,8 +233,8 @@ private ClassDefinition definePageProjectWorkClass(RowExpression projection, Cal method.getBody().append(method.getThis().getField(resultField)).ret(Object.class); // evaluate - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projection, metadata.getFunctionManager()); - generateEvaluateMethod(classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, projection, blockBuilderField); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, projection, metadata, sqlFunctionProperties); + generateEvaluateMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, projection, blockBuilderField); // constructor Parameter blockBuilder = arg("blockBuilder", BlockBuilder.class); @@ -310,6 +312,7 @@ private static MethodDefinition generateProcessMethod( } private MethodDefinition generateEvaluateMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -341,10 +344,12 @@ private MethodDefinition generateEvaluateMethod( scope.declareVariable("wasNull", body, constantFalse()); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); Variable outputBlockVariable = scope.createTempVariable(BlockBuilder.class); @@ -354,22 +359,22 @@ private MethodDefinition generateEvaluateMethod( return method; } - public Supplier compileFilter(RowExpression filter, Optional classNameSuffix) + public Supplier compileFilter(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, Optional classNameSuffix) { if (filterCache == null) { - return compileFilterInternal(filter, classNameSuffix); + return compileFilterInternal(sqlFunctionProperties, filter, classNameSuffix); } - return filterCache.getUnchecked(filter); + return filterCache.getUnchecked(new CacheKey(sqlFunctionProperties, filter)); } - private Supplier compileFilterInternal(RowExpression filter, Optional classNameSuffix) + private Supplier compileFilterInternal(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, Optional classNameSuffix) { requireNonNull(filter, "filter is null"); PageFieldsToInputParametersRewriter.Result result = rewritePageFieldsToInputParameters(filter); CallSiteBinder callSiteBinder = new CallSiteBinder(); - ClassDefinition classDefinition = defineFilterClass(result.getRewrittenExpression(), result.getInputChannels(), callSiteBinder, classNameSuffix); + ClassDefinition classDefinition = defineFilterClass(sqlFunctionProperties, result.getRewrittenExpression(), result.getInputChannels(), callSiteBinder, classNameSuffix); Class functionClass; try { @@ -394,7 +399,7 @@ private static ParameterizedType generateFilterClassName(Optional classN return makeClassName(PageFilter.class.getSimpleName(), classNameSuffix); } - private ClassDefinition defineFilterClass(RowExpression filter, InputChannels inputChannels, CallSiteBinder callSiteBinder, Optional classNameSuffix) + private ClassDefinition defineFilterClass(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, InputChannels inputChannels, CallSiteBinder callSiteBinder, Optional classNameSuffix) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -404,8 +409,8 @@ private ClassDefinition defineFilterClass(RowExpression filter, InputChannels in CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata.getFunctionManager()); - generateFilterMethod(classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, filter, metadata, sqlFunctionProperties); + generateFilterMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, compiledLambdaMap, filter); FieldDefinition selectedPositions = classDefinition.declareField(a(PRIVATE), "selectedPositions", boolean[].class); generatePageFilterMethod(classDefinition, selectedPositions); @@ -486,6 +491,7 @@ private static MethodDefinition generatePageFilterMethod(ClassDefinition classDe } private MethodDefinition generateFilterMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, @@ -515,10 +521,12 @@ private MethodDefinition generateFilterMethod( Variable wasNullVariable = scope.declareVariable("wasNull", body, constantFalse()); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), - metadata.getFunctionManager(), + metadata, + sqlFunctionProperties, compiledLambdaMap); Variable result = scope.declareVariable(boolean.class, "result"); @@ -589,4 +597,36 @@ private static RowExpressionVisitor fieldReferenceCompiler( (scope, field) -> scope.getVariable("position"), callSiteBinder); } + + private static final class CacheKey + { + private final SqlFunctionProperties sqlFunctionProperties; + private final RowExpression rowExpression; + + private CacheKey(SqlFunctionProperties sqlFunctionProperties, RowExpression rowExpression) + { + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); + this.rowExpression = requireNonNull(rowExpression, "rowExpression is null"); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof CacheKey)) { + return false; + } + CacheKey that = (CacheKey) o; + return Objects.equals(sqlFunctionProperties, that.sqlFunctionProperties) && + Objects.equals(rowExpression, that.rowExpression); + } + + @Override + public int hashCode() + { + return Objects.hash(sqlFunctionProperties, rowExpression); + } + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionCompiler.java index 3350eddcfcf86..8eef9b77c8f12 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionCompiler.java @@ -15,9 +15,14 @@ import com.facebook.presto.bytecode.BytecodeBlock; import com.facebook.presto.bytecode.BytecodeNode; +import com.facebook.presto.bytecode.ClassDefinition; import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.spi.function.FunctionMetadata; +import com.facebook.presto.spi.function.SqlFunctionProperties; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -29,6 +34,7 @@ import com.facebook.presto.sql.gen.LambdaBytecodeGenerator.CompiledLambda; import com.google.common.base.VerifyException; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import java.util.Map; import java.util.Optional; @@ -43,28 +49,37 @@ import static com.facebook.presto.sql.gen.BytecodeUtils.generateWrite; import static com.facebook.presto.sql.gen.BytecodeUtils.loadConstant; import static com.facebook.presto.sql.gen.LambdaBytecodeGenerator.generateLambda; +import static com.facebook.presto.sql.gen.LambdaBytecodeGenerator.generateMethodsForLambda; +import static com.facebook.presto.sql.relational.SqlFunctionUtils.getSqlFunctionRowExpression; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; +import static java.lang.String.format; public class RowExpressionCompiler { + private final ClassDefinition classDefinition; private final CallSiteBinder callSiteBinder; private final CachedInstanceBinder cachedInstanceBinder; private final RowExpressionVisitor fieldReferenceCompiler; - private final FunctionManager functionManager; + private final Metadata metadata; + private final SqlFunctionProperties sqlFunctionProperties; private final Map compiledLambdaMap; RowExpressionCompiler( + ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpressionVisitor fieldReferenceCompiler, - FunctionManager functionManager, + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties, Map compiledLambdaMap) { + this.classDefinition = classDefinition; this.callSiteBinder = callSiteBinder; this.cachedInstanceBinder = cachedInstanceBinder; this.fieldReferenceCompiler = fieldReferenceCompiler; - this.functionManager = functionManager; + this.metadata = metadata; + this.sqlFunctionProperties = sqlFunctionProperties; this.compiledLambdaMap = compiledLambdaMap; } @@ -86,14 +101,36 @@ private class Visitor @Override public BytecodeNode visitCall(CallExpression call, Context context) { - BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( - RowExpressionCompiler.this, - context.getScope(), - callSiteBinder, - cachedInstanceBinder, - functionManager); + FunctionManager functionManager = metadata.getFunctionManager(); + FunctionMetadata functionMetadata = functionManager.getFunctionMetadata(call.getFunctionHandle()); + switch (functionMetadata.getImplementationType()) { + case BUILTIN: + BytecodeGeneratorContext generatorContext = new BytecodeGeneratorContext( + RowExpressionCompiler.this, + context.getScope(), + callSiteBinder, + cachedInstanceBinder, + functionManager); + return (new FunctionCallCodeGenerator()).generateCall(call.getFunctionHandle(), generatorContext, call.getType(), call.getArguments(), context.getOutputBlockVariable()); + case SQL: + SqlInvokedScalarFunctionImplementation functionImplementation = (SqlInvokedScalarFunctionImplementation) functionManager.getScalarFunctionImplementation(call.getFunctionHandle()); + RowExpression function = getSqlFunctionRowExpression(functionMetadata, functionImplementation, metadata, sqlFunctionProperties, call.getArguments()); + + // Pre-compile lambda bytecode + ImmutableMap.Builder newCompiledLambdaMap = ImmutableMap.builder(); + newCompiledLambdaMap.putAll(compiledLambdaMap); + newCompiledLambdaMap.putAll(generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, function, metadata, sqlFunctionProperties, "sql")); + + // generate bytecode for SQL function + return new RowExpressionCompiler(classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler, metadata, sqlFunctionProperties, newCompiledLambdaMap.build()).compile( + function, + context.getScope(), + context.getOutputBlockVariable(), + context.getLambdaInterface()); - return (new FunctionCallCodeGenerator()).generateCall(call.getFunctionHandle(), generatorContext, call.getType(), call.getArguments(), context.getOutputBlockVariable()); + default: + throw new IllegalArgumentException(format("Unsupported function implementation type: %s", functionMetadata.getImplementationType())); + } } @Override @@ -185,7 +222,7 @@ public BytecodeNode visitLambda(LambdaDefinitionExpression lambda, Context conte context.getScope(), callSiteBinder, cachedInstanceBinder, - functionManager); + metadata.getFunctionManager()); return generateLambda( generatorContext, @@ -237,7 +274,7 @@ public BytecodeNode visitSpecialForm(SpecialFormExpression specialForm, Context break; // functions that require varargs and/or complex types (e.g., lists) case IN: - generator = new InCodeGenerator(functionManager); + generator = new InCodeGenerator(metadata.getFunctionManager()); break; // optimized implementations (shortcircuiting behavior) case AND: @@ -263,7 +300,7 @@ public BytecodeNode visitSpecialForm(SpecialFormExpression specialForm, Context context.getScope(), callSiteBinder, cachedInstanceBinder, - functionManager); + metadata.getFunctionManager()); return generator.generateExpression(generatorContext, specialForm.getType(), specialForm.getArguments(), context.getOutputBlockVariable()); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java index 68fa5cc459e55..6fa3be0440009 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/RowExpressionPredicateCompiler.java @@ -20,13 +20,13 @@ import com.facebook.presto.bytecode.Parameter; import com.facebook.presto.bytecode.Scope; import com.facebook.presto.bytecode.Variable; -import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.operator.project.PageFieldsToInputParametersRewriter; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.block.Block; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.InputReferenceExpression; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.Predicate; @@ -43,6 +43,7 @@ import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.TreeSet; import java.util.function.Supplier; @@ -67,25 +68,25 @@ public class RowExpressionPredicateCompiler implements PredicateCompiler { - private final FunctionManager functionManager; + private final Metadata metadata; - private final LoadingCache> predicateCache; + private final LoadingCache> predicateCache; @Inject public RowExpressionPredicateCompiler(Metadata metadata) { - this(requireNonNull(metadata, "metadata is null").getFunctionManager(), 10_000); + this(requireNonNull(metadata, "metadata is null"), 10_000); } - public RowExpressionPredicateCompiler(FunctionManager functionManager, int predicateCacheSize) + public RowExpressionPredicateCompiler(Metadata metadata, int predicateCacheSize) { - this.functionManager = requireNonNull(functionManager, "functionManager is null"); + this.metadata = requireNonNull(metadata, "metadata is null"); if (predicateCacheSize > 0) { predicateCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(predicateCacheSize) - .build(CacheLoader.from(this::compilePredicateInternal)); + .build(CacheLoader.from(cacheKey -> compilePredicateInternal(cacheKey.sqlFunctionProperties, cacheKey.rowExpression))); } else { predicateCache = null; @@ -93,15 +94,15 @@ public RowExpressionPredicateCompiler(FunctionManager functionManager, int predi } @Override - public Supplier compilePredicate(RowExpression predicate) + public Supplier compilePredicate(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate) { if (predicateCache == null) { - return compilePredicateInternal(predicate); + return compilePredicateInternal(sqlFunctionProperties, predicate); } - return predicateCache.getUnchecked(predicate); + return predicateCache.getUnchecked(new CacheKey(sqlFunctionProperties, predicate)); } - private Supplier compilePredicateInternal(RowExpression predicate) + private Supplier compilePredicateInternal(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate) { requireNonNull(predicate, "predicate is null"); @@ -111,7 +112,7 @@ private Supplier compilePredicateInternal(RowExpression predicate) .toArray(); CallSiteBinder callSiteBinder = new CallSiteBinder(); - ClassDefinition classDefinition = definePredicateClass(result.getRewrittenExpression(), inputChannels, callSiteBinder); + ClassDefinition classDefinition = definePredicateClass(sqlFunctionProperties, result.getRewrittenExpression(), inputChannels, callSiteBinder); Class predicateClass; try { @@ -131,7 +132,7 @@ private Supplier compilePredicateInternal(RowExpression predicate) }; } - private ClassDefinition definePredicateClass(RowExpression predicate, int[] inputChannels, CallSiteBinder callSiteBinder) + private ClassDefinition definePredicateClass(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate, int[] inputChannels, CallSiteBinder callSiteBinder) { ClassDefinition classDefinition = new ClassDefinition( a(PUBLIC, FINAL), @@ -141,7 +142,7 @@ private ClassDefinition definePredicateClass(RowExpression predicate, int[] inpu CachedInstanceBinder cachedInstanceBinder = new CachedInstanceBinder(classDefinition, callSiteBinder); - generatePredicateMethod(classDefinition, callSiteBinder, cachedInstanceBinder, predicate); + generatePredicateMethod(sqlFunctionProperties, classDefinition, callSiteBinder, cachedInstanceBinder, predicate); // getInputChannels classDefinition.declareMethod(a(PUBLIC), "getInputChannels", type(int[].class)) @@ -156,12 +157,13 @@ private ClassDefinition definePredicateClass(RowExpression predicate, int[] inpu } private MethodDefinition generatePredicateMethod( + SqlFunctionProperties sqlFunctionProperties, ClassDefinition classDefinition, CallSiteBinder callSiteBinder, CachedInstanceBinder cachedInstanceBinder, RowExpression predicate) { - Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, predicate, functionManager); + Map compiledLambdaMap = generateMethodsForLambda(classDefinition, callSiteBinder, cachedInstanceBinder, predicate, metadata, sqlFunctionProperties); Parameter session = arg("session", ConnectorSession.class); Parameter page = arg("page", Page.class); @@ -186,10 +188,12 @@ private MethodDefinition generatePredicateMethod( Variable wasNullVariable = scope.declareVariable("wasNull", body, constantFalse()); RowExpressionCompiler compiler = new RowExpressionCompiler( + classDefinition, callSiteBinder, cachedInstanceBinder, fieldReferenceCompiler(callSiteBinder), - functionManager, + metadata, + sqlFunctionProperties, compiledLambdaMap); Variable result = scope.declareVariable(boolean.class, "result"); @@ -247,4 +251,36 @@ private static void generateConstructor( cachedInstanceBinder.generateInitializations(thisVariable, body); body.ret(); } + + private static final class CacheKey + { + private final SqlFunctionProperties sqlFunctionProperties; + private final RowExpression rowExpression; + + private CacheKey(SqlFunctionProperties sqlFunctionProperties, RowExpression rowExpression) + { + this.sqlFunctionProperties = requireNonNull(sqlFunctionProperties, "sqlFunctionProperties is null"); + this.rowExpression = requireNonNull(rowExpression, "rowExpression is null"); + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof CacheKey)) { + return false; + } + CacheKey that = (CacheKey) o; + return Objects.equals(sqlFunctionProperties, that.sqlFunctionProperties) && + Objects.equals(rowExpression, that.rowExpression); + } + + @Override + public int hashCode() + { + return Objects.hash(sqlFunctionProperties, rowExpression); + } + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java b/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java index 917dc42b2046b..fde1a4a1ea560 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/gen/SwitchCodeGenerator.java @@ -126,7 +126,7 @@ else if ( == ) { // check if wasNull is true BytecodeNode equalsCall = generatorContext.generateCall( EQUAL.name(), - generatorContext.getFunctionManager().getScalarFunctionImplementation(equalsFunction), + generatorContext.getFunctionManager().getBuiltInScalarFunctionImplementation(equalsFunction), ImmutableList.of(generatorContext.generate(operand, Optional.empty()), getTempVariableNode)); BytecodeBlock condition = new BytecodeBlock() diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java index 48da9402878c2..b91fae9403a3e 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/ExpressionInterpreter.java @@ -28,6 +28,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.type.ArrayType; import com.facebook.presto.spi.type.FunctionType; import com.facebook.presto.spi.type.RowType; @@ -41,6 +42,7 @@ import com.facebook.presto.sql.analyzer.Scope; import com.facebook.presto.sql.analyzer.SemanticErrorCode; import com.facebook.presto.sql.analyzer.SemanticException; +import com.facebook.presto.sql.parser.SqlParser; import com.facebook.presto.sql.planner.Interpreters.LambdaVariableResolver; import com.facebook.presto.sql.planner.iterative.rule.DesugarCurrentUser; import com.facebook.presto.sql.tree.ArithmeticBinaryExpression; @@ -119,6 +121,7 @@ import static com.facebook.presto.spi.type.VarcharType.createVarcharType; import static com.facebook.presto.sql.analyzer.ConstantExpressionVerifier.verifyExpressionIsConstant; import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.createConstantAnalyzer; +import static com.facebook.presto.sql.analyzer.ExpressionAnalyzer.getExpressionTypes; import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypes; import static com.facebook.presto.sql.gen.VarArgsToMapAdapterGenerator.generateVarArgsToMapAdapter; import static com.facebook.presto.sql.planner.ExpressionDeterminismEvaluator.isDeterministic; @@ -128,6 +131,7 @@ import static com.facebook.presto.sql.planner.LiteralEncoder.isSupportedLiteralType; import static com.facebook.presto.sql.planner.iterative.rule.CanonicalizeExpressionRewriter.canonicalizeExpression; import static com.facebook.presto.sql.relational.Expressions.variable; +import static com.facebook.presto.sql.relational.SqlFunctionUtils.getSqlFunctionExpression; import static com.facebook.presto.type.LikeFunctions.isLikePattern; import static com.facebook.presto.type.LikeFunctions.unescapeLiteralLikePattern; import static com.facebook.presto.util.LegacyRowFieldOrdinalAccessUtil.parseAnonymousRowFieldOrdinalAccess; @@ -140,6 +144,7 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static java.lang.Math.toIntExact; import static java.lang.String.format; +import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; @Deprecated @@ -675,7 +680,7 @@ protected Object visitArithmeticUnary(ArithmeticUnaryExpression node, Object con return value; case MINUS: FunctionHandle operatorHandle = metadata.getFunctionManager().resolveOperator(OperatorType.NEGATION, fromTypes(types(node.getValue()))); - MethodHandle handle = metadata.getFunctionManager().getScalarFunctionImplementation(operatorHandle).getMethodHandle(); + MethodHandle handle = metadata.getFunctionManager().getBuiltInScalarFunctionImplementation(operatorHandle).getMethodHandle(); if (handle.type().parameterCount() > 0 && handle.type().parameterType(0) == ConnectorSession.class) { handle = handle.bindTo(connectorSession); @@ -892,12 +897,14 @@ protected Object visitFunctionCall(FunctionCall node, Object context) argumentValues.add(value); argumentTypes.add(type); } - FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session, node.getName(), fromTypes(argumentTypes)); + FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session.getTransactionId(), node.getName(), fromTypes(argumentTypes)); FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(functionHandle); - for (int i = 0; i < argumentValues.size(); i++) { - Object value = argumentValues.get(i); - if (value == null && !functionMetadata.isCalledOnNullInput()) { - return null; + if (!functionMetadata.isCalledOnNullInput()) { + for (int i = 0; i < argumentValues.size(); i++) { + Object value = argumentValues.get(i); + if (value == null) { + return null; + } } } @@ -905,7 +912,27 @@ protected Object visitFunctionCall(FunctionCall node, Object context) if (optimize && (!functionMetadata.isDeterministic() || hasUnresolvedValue(argumentValues) || node.getName().equals(QualifiedName.of("fail")))) { return new FunctionCall(node.getName(), node.getWindow(), node.isDistinct(), toExpressions(argumentValues, argumentTypes)); } - Object result = functionInvoker.invoke(functionHandle, connectorSession, argumentValues); + + Object result; + + switch (functionMetadata.getImplementationType()) { + case BUILTIN: + result = functionInvoker.invoke(functionHandle, connectorSession, argumentValues); + break; + case SQL: + Expression function = getSqlFunctionExpression(functionMetadata, (SqlInvokedScalarFunctionImplementation) metadata.getFunctionManager().getScalarFunctionImplementation(functionHandle), session.getSqlFunctionProperties(), node.getArguments()); + ExpressionInterpreter functionInterpreter = new ExpressionInterpreter( + function, + metadata, + session, + getExpressionTypes(session, metadata, new SqlParser(), TypeProvider.empty(), function, emptyList(), WarningCollector.NOOP), + optimize); + result = functionInterpreter.visitor.process(function, context); + break; + default: + throw new IllegalArgumentException(format("Unsupported function implementation type: %s", functionMetadata.getImplementationType())); + } + if (optimize && !isSerializable(result, type(node))) { return new FunctionCall(node.getName(), node.getWindow(), node.isDistinct(), toExpressions(argumentValues, argumentTypes)); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java index 4499d35027951..a07c14761e2ea 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/LocalExecutionPlanner.java @@ -121,6 +121,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.plan.AggregationNode; import com.facebook.presto.spi.plan.AggregationNode.Aggregation; import com.facebook.presto.spi.plan.AggregationNode.Step; @@ -487,7 +488,7 @@ public LocalExecutionPlan plan( TableWriteInfo tableWriteInfo) { Session session = taskContext.getSession(); - LocalExecutionPlanContext context = new LocalExecutionPlanContext(taskContext, types, taskExchangeClientManager, tableWriteInfo); + LocalExecutionPlanContext context = new LocalExecutionPlanContext(taskContext, taskExchangeClientManager, tableWriteInfo); PhysicalOperation physicalOperation = plan.accept(new Visitor(session, stageExecutionDescriptor), context); @@ -558,7 +559,6 @@ private static void addLookupOuterDrivers(LocalExecutionPlanContext context) private static class LocalExecutionPlanContext { private final TaskContext taskContext; - private final TypeProvider types; private final TaskExchangeClientManager taskExchangeClientManager; private final List driverFactories; private final Optional indexSourceContext; @@ -573,16 +573,14 @@ private static class LocalExecutionPlanContext public LocalExecutionPlanContext( TaskContext taskContext, - TypeProvider types, TaskExchangeClientManager taskExchangeClientManager, TableWriteInfo tableWriteInfo) { - this(taskContext, types, taskExchangeClientManager, new ArrayList<>(), Optional.empty(), new AtomicInteger(0), tableWriteInfo); + this(taskContext, taskExchangeClientManager, new ArrayList<>(), Optional.empty(), new AtomicInteger(0), tableWriteInfo); } private LocalExecutionPlanContext( TaskContext taskContext, - TypeProvider types, TaskExchangeClientManager taskExchangeClientManager, List driverFactories, Optional indexSourceContext, @@ -590,7 +588,6 @@ private LocalExecutionPlanContext( TableWriteInfo tableWriteInfo) { this.taskContext = taskContext; - this.types = types; this.taskExchangeClientManager = taskExchangeClientManager; this.driverFactories = driverFactories; this.indexSourceContext = indexSourceContext; @@ -627,11 +624,6 @@ public StageExecutionId getStageExecutionId() return taskContext.getTaskId().getStageExecutionId(); } - public TypeProvider getTypes() - { - return types; - } - public TaskExchangeClientManager getTaskExchangeClientManager() { return taskExchangeClientManager; @@ -670,12 +662,12 @@ public TableWriteInfo getTableWriteInfo() public LocalExecutionPlanContext createSubContext() { checkState(!indexSourceContext.isPresent(), "index build plan can not have sub-contexts"); - return new LocalExecutionPlanContext(taskContext, types, taskExchangeClientManager, driverFactories, indexSourceContext, nextPipelineId, tableWriteInfo); + return new LocalExecutionPlanContext(taskContext, taskExchangeClientManager, driverFactories, indexSourceContext, nextPipelineId, tableWriteInfo); } public LocalExecutionPlanContext createIndexSourceSubContext(IndexSourceContext indexSourceContext) { - return new LocalExecutionPlanContext(taskContext, types, taskExchangeClientManager, driverFactories, Optional.of(indexSourceContext), nextPipelineId, tableWriteInfo); + return new LocalExecutionPlanContext(taskContext, taskExchangeClientManager, driverFactories, Optional.of(indexSourceContext), nextPipelineId, tableWriteInfo); } public OptionalInt getDriverInstanceCount() @@ -771,7 +763,7 @@ private PhysicalOperation createMergeSource(RemoteSourceNode node, LocalExecutio List sortChannels = getChannelsForVariables(orderingScheme.getOrderByVariables(), layout); List sortOrder = getOrderingList(orderingScheme); - List types = getSourceOperatorTypes(node, context.getTypes()); + List types = getSourceOperatorTypes(node); ImmutableList outputChannels = IntStream.range(0, types.size()) .boxed() .collect(toImmutableList()); @@ -1266,8 +1258,8 @@ private PhysicalOperation visitScanFilterAndProject( try { if (columns != null) { - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(filterExpression, projections, sourceNode.getId()); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(session.getSqlFunctionProperties(), filterExpression, projections, sourceNode.getId()); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(session.getSqlFunctionProperties(), filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); SourceOperatorFactory operatorFactory = new ScanFilterAndProjectOperatorFactory( context.getNextOperatorId(), @@ -1285,7 +1277,7 @@ private PhysicalOperation visitScanFilterAndProject( return new PhysicalOperation(operatorFactory, outputMappings, context, stageExecutionDescriptor.isScanGroupedExecution(sourceNode.getId()) ? GROUPED_EXECUTION : UNGROUPED_EXECUTION); } else { - Supplier pageProcessor = expressionCompiler.compilePageProcessor(filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(session.getSqlFunctionProperties(), filterExpression, projections, Optional.of(context.getStageExecutionId() + "_" + planNodeId)); OperatorFactory operatorFactory = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( context.getNextOperatorId(), @@ -1567,6 +1559,7 @@ public PhysicalOperation visitIndexJoin(IndexJoinNode node, LocalExecutionPlanCo nonLookupInputChannels, nonLookupOutputChannels, indexSource.getTypes(), + session.getSqlFunctionProperties(), pageFunctionCompiler)); } @@ -1932,6 +1925,7 @@ private PagesSpatialIndexFactory createPagesSpatialIndexFactory( Optional filterFunctionFactory = joinFilter .map(filterExpression -> compileJoinFilterFunction( + session.getSqlFunctionProperties(), filterExpression, probeLayout, buildLayout)); @@ -2023,6 +2017,7 @@ private JoinBridgeManager createLookupSourceFact Optional filterFunctionFactory = node.getFilter() .map(filterExpression -> compileJoinFilterFunction( + session.getSqlFunctionProperties(), filterExpression, probeSource.getLayout(), buildSource.getLayout())); @@ -2040,6 +2035,7 @@ private JoinBridgeManager createLookupSourceFact .map(SortExpressionContext::getSearchExpressions) .map(searchExpressions -> searchExpressions.stream() .map(searchExpression -> compileJoinFilterFunction( + session.getSqlFunctionProperties(), searchExpression, probeSource.getLayout(), buildSource.getLayout())) @@ -2092,12 +2088,13 @@ private JoinBridgeManager createLookupSourceFact } private JoinFilterFunctionFactory compileJoinFilterFunction( + SqlFunctionProperties sqlFunctionProperties, RowExpression filterExpression, Map probeLayout, Map buildLayout) { Map joinSourcesLayout = createJoinSourcesLayout(buildLayout, probeLayout); - return joinFilterFunctionCompiler.compileJoinFilterFunction(bindChannels(filterExpression, joinSourcesLayout), buildLayout.size()); + return joinFilterFunctionCompiler.compileJoinFilterFunction(sqlFunctionProperties, bindChannels(filterExpression, joinSourcesLayout), buildLayout.size()); } private int sortExpressionAsSortChannel( @@ -2494,7 +2491,7 @@ private PhysicalOperation createLocalMerge(ExchangeNode node, LocalExecutionPlan PhysicalOperation source = sourceNode.accept(this, subContext); int operatorsCount = subContext.getDriverInstanceCount().orElse(1); - List types = getSourceOperatorTypes(node, context.getTypes()); + List types = getSourceOperatorTypes(node); LocalExchangeFactory exchangeFactory = new LocalExchangeFactory( partitioningProviderManager, session, @@ -2549,7 +2546,7 @@ else if (context.getDriverInstanceCount().isPresent()) { context.setDriverInstanceCount(driverInstanceCount); } - List types = getSourceOperatorTypes(node, context.getTypes()); + List types = getSourceOperatorTypes(node); List channels = node.getPartitioningScheme().getPartitioning().getArguments().stream() .map(argument -> { checkArgument(argument instanceof VariableReferenceExpression, format("Expect VariableReferenceExpression but get %s", argument)); @@ -2622,7 +2619,7 @@ public PhysicalOperation visitPlan(PlanNode node, LocalExecutionPlanContext cont throw new UnsupportedOperationException("not yet implemented"); } - private List getSourceOperatorTypes(PlanNode node, TypeProvider types) + private List getSourceOperatorTypes(PlanNode node) { return getVariableTypes(node.getOutputVariables()); } @@ -2636,8 +2633,7 @@ private List getVariableTypes(List variables) private AccumulatorFactory buildAccumulatorFactory( PhysicalOperation source, - Aggregation aggregation, - TypeProvider types) + Aggregation aggregation) { FunctionManager functionManager = metadata.getFunctionManager(); InternalAggregationFunction internalAggregationFunction = functionManager.getAggregateFunctionImplementation(aggregation.getFunctionHandle()); @@ -2657,7 +2653,7 @@ private AccumulatorFactory buildAccumulatorFactory( .collect(toImmutableList()); for (int i = 0; i < lambdas.size(); i++) { List lambdaInterfaces = internalAggregationFunction.getLambdaInterfaces(); - Class lambdaProviderClass = compileLambdaProvider(lambdas.get(i), metadata.getFunctionManager(), lambdaInterfaces.get(i)); + Class lambdaProviderClass = compileLambdaProvider(lambdas.get(i), metadata, session.getSqlFunctionProperties(), lambdaInterfaces.get(i)); try { lambdaProviders.add((LambdaProvider) constructorMethodHandle(lambdaProviderClass, ConnectorSession.class).invoke(session.toConnectorSession())); } @@ -2718,7 +2714,7 @@ private AggregationOperatorFactory createAggregationOperatorFactory( for (Map.Entry entry : aggregations.entrySet()) { VariableReferenceExpression variable = entry.getKey(); Aggregation aggregation = entry.getValue(); - accumulatorFactories.add(buildAccumulatorFactory(source, aggregation, context.getTypes())); + accumulatorFactories.add(buildAccumulatorFactory(source, aggregation)); outputMappings.put(variable, outputChannel); // one aggregation per channel outputChannel++; } @@ -2781,7 +2777,7 @@ private OperatorFactory createHashAggregationOperatorFactory( VariableReferenceExpression variable = entry.getKey(); Aggregation aggregation = entry.getValue(); - accumulatorFactories.add(buildAccumulatorFactory(source, aggregation, context.getTypes())); + accumulatorFactories.add(buildAccumulatorFactory(source, aggregation)); aggregationOutputVariables.add(variable); } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java index 71a46232f54a5..943e6e1b918b2 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/PlanVariableAllocator.java @@ -157,7 +157,7 @@ public VariableReferenceExpression toVariableReference(Expression expression) { checkArgument(expression instanceof SymbolReference, "Unexpected expression: %s", expression); String name = ((SymbolReference) expression).getName(); - checkArgument(variables.containsKey(name), "variable map does not contain name"); + checkArgument(variables.containsKey(name), "variable map does not contain name %s", name); return new VariableReferenceExpression(name, variables.get(name)); } 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 3b2f5a2a6fd25..bf2c2c3c86dc2 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 @@ -23,6 +23,7 @@ import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.OperatorType; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.relation.CallExpression; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.InputReferenceExpression; @@ -95,6 +96,7 @@ import static com.facebook.presto.sql.planner.RowExpressionInterpreter.SpecialCallResult.changed; import static com.facebook.presto.sql.planner.RowExpressionInterpreter.SpecialCallResult.notChanged; import static com.facebook.presto.sql.relational.Expressions.call; +import static com.facebook.presto.sql.relational.SqlFunctionUtils.getSqlFunctionRowExpression; import static com.facebook.presto.type.JsonType.JSON; import static com.facebook.presto.type.LikeFunctions.isLikePattern; import static com.facebook.presto.type.LikeFunctions.unescapeLiteralLikePattern; @@ -106,6 +108,7 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.Iterables.getOnlyElement; import static io.airlift.slice.Slices.utf8Slice; +import static java.lang.String.format; import static java.lang.invoke.MethodHandles.insertArguments; import static java.util.Arrays.asList; import static java.util.Objects.requireNonNull; @@ -207,17 +210,22 @@ public Object visitCall(CallExpression node, Object context) { List argumentTypes = new ArrayList<>(); List argumentValues = new ArrayList<>(); - FunctionHandle functionHandle = node.getFunctionHandle(); - FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(node.getFunctionHandle()); for (RowExpression expression : node.getArguments()) { Object value = expression.accept(this, context); - if (value == null && !functionMetadata.isCalledOnNullInput()) { - return null; - } argumentValues.add(value); argumentTypes.add(expression.getType()); } + FunctionHandle functionHandle = node.getFunctionHandle(); + FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(node.getFunctionHandle()); + if (!functionMetadata.isCalledOnNullInput()) { + for (Object value : argumentValues) { + if (value == null) { + return null; + } + } + } + // Special casing for large constant array construction if (resolution.isArrayConstructor(functionHandle)) { SpecialCallResult result = tryHandleArrayConstructor(node, argumentValues); @@ -252,7 +260,25 @@ public Object visitCall(CallExpression node, Object context) return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); } - Object value = functionInvoker.invoke(functionHandle, session, argumentValues); + Object value; + switch (functionMetadata.getImplementationType()) { + case BUILTIN: + value = functionInvoker.invoke(functionHandle, session, argumentValues); + break; + case SQL: + SqlInvokedScalarFunctionImplementation functionImplementation = (SqlInvokedScalarFunctionImplementation) functionManager.getScalarFunctionImplementation(functionHandle); + RowExpression function = getSqlFunctionRowExpression(functionMetadata, functionImplementation, metadata, session.getSqlFunctionProperties(), node.getArguments()); + RowExpressionInterpreter rowExpressionInterpreter = new RowExpressionInterpreter(function, metadata, session, optimizationLevel); + if (optimizationLevel.ordinal() >= EVALUATED.ordinal()) { + value = rowExpressionInterpreter.evaluate(); + } + else { + value = rowExpressionInterpreter.optimize(); + } + break; + default: + throw new IllegalArgumentException(format("Unsupported function implementation type: %s", functionMetadata.getImplementationType())); + } if (optimizationLevel.ordinal() <= SERIALIZABLE.ordinal() && !isSerializable(value, node.getType())) { return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java index f3c5d6fc56cd9..d017494db8305 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/TypeProvider.java @@ -72,4 +72,9 @@ public Set allVariables() .map(entry -> new VariableReferenceExpression(entry.getKey(), entry.getValue())) .collect(toImmutableSet()); } + + public Map allTypes() + { + return types; + } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlFunctionUtils.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlFunctionUtils.java new file mode 100644 index 0000000000000..6d7b0cede59cc --- /dev/null +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlFunctionUtils.java @@ -0,0 +1,260 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.presto.sql.relational; + +import com.facebook.presto.execution.warnings.WarningCollector; +import com.facebook.presto.expressions.RowExpressionRewriter; +import com.facebook.presto.expressions.RowExpressionTreeRewriter; +import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.spi.function.FunctionMetadata; +import com.facebook.presto.spi.function.SqlFunctionProperties; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; +import com.facebook.presto.spi.relation.RowExpression; +import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.facebook.presto.spi.type.Type; +import com.facebook.presto.sql.analyzer.ExpressionAnalyzer; +import com.facebook.presto.sql.analyzer.Field; +import com.facebook.presto.sql.analyzer.RelationId; +import com.facebook.presto.sql.analyzer.RelationType; +import com.facebook.presto.sql.analyzer.Scope; +import com.facebook.presto.sql.analyzer.SemanticException; +import com.facebook.presto.sql.parser.ParsingOptions; +import com.facebook.presto.sql.parser.SqlParser; +import com.facebook.presto.sql.planner.PlanVariableAllocator; +import com.facebook.presto.sql.planner.TypeProvider; +import com.facebook.presto.sql.planner.iterative.rule.LambdaCaptureDesugaringRewriter; +import com.facebook.presto.sql.tree.Expression; +import com.facebook.presto.sql.tree.ExpressionRewriter; +import com.facebook.presto.sql.tree.ExpressionTreeRewriter; +import com.facebook.presto.sql.tree.Identifier; +import com.facebook.presto.sql.tree.LambdaArgumentDeclaration; +import com.facebook.presto.sql.tree.LambdaExpression; +import com.facebook.presto.sql.tree.NodeRef; +import com.facebook.presto.sql.tree.SymbolReference; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static com.facebook.presto.spi.function.FunctionImplementationType.SQL; +import static com.facebook.presto.sql.analyzer.SemanticErrorCode.NOT_SUPPORTED; +import static com.facebook.presto.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DECIMAL; +import static com.facebook.presto.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DOUBLE; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.ImmutableList.toImmutableList; +import static java.lang.String.format; +import static java.util.Collections.emptyList; +import static java.util.Objects.requireNonNull; + +public final class SqlFunctionUtils +{ + private SqlFunctionUtils() {} + + public static Expression getSqlFunctionExpression(FunctionMetadata functionMetadata, SqlInvokedScalarFunctionImplementation implementation, SqlFunctionProperties sqlFunctionProperties, List arguments) + { + checkArgument(functionMetadata.getImplementationType().equals(SQL), format("Expect SQL function, get %s", functionMetadata.getImplementationType())); + ParsingOptions parsingOptions = ParsingOptions.builder() + .setDecimalLiteralTreatment(sqlFunctionProperties.isParseDecimalLiteralAsDouble() ? AS_DOUBLE : AS_DECIMAL) + .build(); + Expression expression = parseSqlFunctionExpression(implementation, sqlFunctionProperties); + return SqlFunctionArgumentBinder.bindFunctionArguments(expression, functionMetadata.getArgumentNames().get(), arguments); + } + + public static RowExpression getSqlFunctionRowExpression(FunctionMetadata functionMetadata, SqlInvokedScalarFunctionImplementation functionImplementation, Metadata metadata, SqlFunctionProperties sqlFunctionProperties, List arguments) + { + Expression expression = parseSqlFunctionExpression(functionImplementation, sqlFunctionProperties); + + // Allocate variables for identifiers + PlanVariableAllocator variableAllocator = new PlanVariableAllocator(); + Map variables = buildIdentifierToVariableMap(functionMetadata, expression, sqlFunctionProperties, metadata, variableAllocator); + + // Rewrite expression with allocated variables + Expression rewritten = rewriteSqlFunctionExpressionWithVariables(expression, variables); + + // Desugar lambda capture + Expression lambdaCaptureDesugaredExpression = LambdaCaptureDesugaringRewriter.rewrite(rewritten, variableAllocator); + + // Translate to row expression + return SqlFunctionArgumentBinder.bindFunctionArguments( + SqlToRowExpressionTranslator.translate( + lambdaCaptureDesugaredExpression, + getSqlFunctionExpressionTypes(metadata, sqlFunctionProperties, lambdaCaptureDesugaredExpression, variableAllocator.getTypes().allTypes()), + ImmutableMap.of(), + metadata.getFunctionManager(), + metadata.getTypeManager(), + Optional.empty(), + Optional.empty(), + sqlFunctionProperties), + functionMetadata.getArgumentNames().get().stream() + .map(Identifier::new) + .map(variables::get) + .map(VariableReferenceExpression::getName) + .collect(toImmutableList()), + arguments); + } + + private static Expression parseSqlFunctionExpression(SqlInvokedScalarFunctionImplementation functionImplementation, SqlFunctionProperties sqlFunctionProperties) + { + ParsingOptions parsingOptions = ParsingOptions.builder() + .setDecimalLiteralTreatment(sqlFunctionProperties.isParseDecimalLiteralAsDouble() ? AS_DOUBLE : AS_DECIMAL) + .build(); + return new SqlParser().createExpression(functionImplementation.getImplementation(), parsingOptions); + } + + private static Map, Type> getSqlFunctionExpressionTypes( + Metadata metadata, + SqlFunctionProperties sqlFunctionProperties, + Expression expression, + Map argumentTypes) + { + ExpressionAnalyzer analyzer = ExpressionAnalyzer.createWithoutSubqueries( + metadata.getFunctionManager(), + metadata.getTypeManager(), + Optional.empty(), + sqlFunctionProperties, + TypeProvider.copyOf(argumentTypes), + emptyList(), + node -> new SemanticException(NOT_SUPPORTED, node, "SQL function does not support subquery"), + WarningCollector.NOOP, + false); + + analyzer.analyze( + expression, + Scope.builder() + .withRelationType( + RelationId.anonymous(), + new RelationType(argumentTypes.entrySet().stream() + .map(entry -> Field.newUnqualified(entry.getKey(), entry.getValue())) + .collect(toImmutableList()))).build()); + return analyzer.getExpressionTypes(); + } + + private static Map getFunctionArgumentTypes(FunctionMetadata functionMetadata, Metadata metadata) + { + List argumentNames = functionMetadata.getArgumentNames().get(); + List argumentTypes = functionMetadata.getArgumentTypes().stream().map(metadata::getType).collect(toImmutableList()); + checkState(argumentNames.size() == argumentTypes.size(), format("Expect argumentNames (size %d) and argumentTypes (size %d) to be of the same size", argumentNames.size(), argumentTypes.size())); + ImmutableMap.Builder typeBuilder = ImmutableMap.builder(); + for (int i = 0; i < argumentNames.size(); i++) { + typeBuilder.put(argumentNames.get(i), argumentTypes.get(i)); + } + return typeBuilder.build(); + } + + private static Map buildIdentifierToVariableMap(FunctionMetadata functionMetadata, Expression sqlFunction, SqlFunctionProperties sqlFunctionProperties, Metadata metadata, PlanVariableAllocator variableAllocator) + { + // Allocate variables for identifiers + Map argumentTypes = getFunctionArgumentTypes(functionMetadata, metadata); + Map, Type> expressionTypes = getSqlFunctionExpressionTypes(metadata, sqlFunctionProperties, sqlFunction, argumentTypes); + Map variables = new LinkedHashMap<>(); + for (Map.Entry, Type> entry : expressionTypes.entrySet()) { + Expression node = entry.getKey().getNode(); + if (node instanceof LambdaArgumentDeclaration) { + LambdaArgumentDeclaration lambdaArgumentDeclaration = (LambdaArgumentDeclaration) node; + if (!variables.containsKey(lambdaArgumentDeclaration.getName())) { + variables.put(lambdaArgumentDeclaration.getName(), variableAllocator.newVariable(lambdaArgumentDeclaration.getName(), entry.getValue())); + } + } + else if (node instanceof Identifier && argumentTypes.containsKey(((Identifier) node).getValue())) { + // input + if (!variables.containsKey(node)) { + variables.put((Identifier) node, variableAllocator.newVariable(node, entry.getValue())); + } + } + } + return variables; + } + + private static Expression rewriteSqlFunctionExpressionWithVariables(Expression sqlFunction, Map variableMap) + { + return ExpressionTreeRewriter.rewriteWith(new ExpressionRewriter>() + { + @Override + public Expression rewriteLambdaExpression(LambdaExpression node, Map context, ExpressionTreeRewriter> treeRewriter) + { + ImmutableList.Builder newArguments = ImmutableList.builder(); + for (LambdaArgumentDeclaration argument : node.getArguments()) { + VariableReferenceExpression variable = context.get(argument.getName()); + newArguments.add(new LambdaArgumentDeclaration(new Identifier(variable.getName()))); + } + return new LambdaExpression(newArguments.build(), treeRewriter.rewrite(node.getBody(), context)); + } + + @Override + public Expression rewriteIdentifier(Identifier node, Map context, ExpressionTreeRewriter> treeRewriter) + { + return new SymbolReference(context.get(node).getName()); + } + }, sqlFunction, variableMap); + } + + private static final class SqlFunctionArgumentBinder + { + private SqlFunctionArgumentBinder() {} + + public static Expression bindFunctionArguments(Expression function, List argumentNames, List argumentValues) + { + checkArgument(argumentNames.size() == argumentValues.size(), format("Expect same size for argumentNames (%d) and argumentValues (%d)", argumentNames.size(), argumentValues.size())); + ImmutableMap.Builder argumentBindings = ImmutableMap.builder(); + for (int i = 0; i < argumentNames.size(); i++) { + argumentBindings.put(argumentNames.get(i), argumentValues.get(i)); + } + return ExpressionTreeRewriter.rewriteWith(new ExpressionFunctionVisitor(argumentBindings.build()), function); + } + + public static RowExpression bindFunctionArguments(RowExpression function, List argumentNames, List argumentValues) + { + checkArgument(argumentNames.size() == argumentValues.size(), format("Expect same size for argumentNames (%d) and argumentValues (%d)", argumentNames.size(), argumentValues.size())); + ImmutableMap.Builder argumentBindings = ImmutableMap.builder(); + for (int i = 0; i < argumentNames.size(); i++) { + argumentBindings.put(argumentNames.get(i), argumentValues.get(i)); + } + return RowExpressionTreeRewriter.rewriteWith(new RowExpressionRewriter>() + { + @Override + public RowExpression rewriteVariableReference(VariableReferenceExpression variable, Map context, RowExpressionTreeRewriter> treeRewriter) + { + if (context.containsKey(variable.getName())) { + return context.get(variable.getName()); + } + return variable; + } + }, function, argumentBindings.build()); + } + + private static class ExpressionFunctionVisitor + extends ExpressionRewriter + { + private final Map argumentBindings; + + public ExpressionFunctionVisitor(Map argumentBindings) + { + this.argumentBindings = requireNonNull(argumentBindings, "argumentBindings is null"); + } + + @Override + public Expression rewriteIdentifier(Identifier node, Void context, ExpressionTreeRewriter treeRewriter) + { + if (argumentBindings.containsKey(node.getValue())) { + return argumentBindings.get(node.getValue()); + } + return node; + } + } + } +} diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java index 12072b8729175..4c8276ba0c581 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/SqlToRowExpressionTranslator.java @@ -15,6 +15,7 @@ import com.facebook.presto.Session; import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.relation.ConstantExpression; import com.facebook.presto.spi.relation.LambdaDefinitionExpression; import com.facebook.presto.spi.relation.RowExpression; @@ -77,6 +78,7 @@ import com.facebook.presto.sql.tree.TimestampLiteral; import com.facebook.presto.sql.tree.TryExpression; import com.facebook.presto.sql.tree.WhenClause; +import com.facebook.presto.transaction.TransactionId; import com.facebook.presto.type.UnknownType; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -85,10 +87,9 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.OptionalInt; -import static com.facebook.presto.SystemSessionProperties.isLegacyRowFieldOrdinalAccessEnabled; -import static com.facebook.presto.SystemSessionProperties.isLegacyTimestamp; import static com.facebook.presto.metadata.CastType.CAST; import static com.facebook.presto.metadata.CastType.TRY_CAST; import static com.facebook.presto.spi.function.OperatorType.BETWEEN; @@ -151,13 +152,28 @@ public static RowExpression translate( FunctionManager functionManager, TypeManager typeManager, Session session) + { + return translate(expression, types, layout, functionManager, typeManager, Optional.of(session.getUser()), session.getTransactionId(), session.getSqlFunctionProperties()); + } + + public static RowExpression translate( + Expression expression, + Map, Type> types, + Map layout, + FunctionManager functionManager, + TypeManager typeManager, + Optional user, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties) { Visitor visitor = new Visitor( types, layout, typeManager, functionManager, - session); + user, + transactionId, + sqlFunctionProperties); RowExpression result = visitor.process(expression, null); requireNonNull(result, "translated expression is null"); return result; @@ -170,7 +186,9 @@ private static class Visitor private final Map layout; private final TypeManager typeManager; private final FunctionManager functionManager; - private final Session session; + private final Optional user; + private final Optional transactionId; + private final SqlFunctionProperties sqlFunctionProperties; private final FunctionResolution functionResolution; private Visitor( @@ -178,13 +196,17 @@ private Visitor( Map layout, TypeManager typeManager, FunctionManager functionManager, - Session session) + Optional user, + Optional transactionId, + SqlFunctionProperties sqlFunctionProperties) { this.types = ImmutableMap.copyOf(requireNonNull(types, "types is null")); this.layout = layout; this.typeManager = typeManager; this.functionManager = functionManager; - this.session = session; + this.user = user; + this.transactionId = transactionId; + this.sqlFunctionProperties = sqlFunctionProperties; this.functionResolution = new FunctionResolution(functionManager); } @@ -209,7 +231,7 @@ protected RowExpression visitIdentifier(Identifier node, Void context) @Override protected RowExpression visitCurrentUser(CurrentUser node, Void context) { - return constant(Slices.utf8Slice(session.getUser()), VARCHAR); + return user.map(user -> constant(Slices.utf8Slice(user), VARCHAR)).orElseThrow(() -> new UnsupportedOperationException("Do not have current user")); } @Override @@ -319,9 +341,9 @@ protected RowExpression visitTimeLiteral(TimeLiteral node, Void context) value = parseTimeWithTimeZone(node.getValue()); } else { - if (isLegacyTimestamp(session)) { + if (sqlFunctionProperties.isLegacyTimestamp()) { // parse in time zone of client - value = parseTimeWithoutTimeZone(session.getTimeZoneKey(), node.getValue()); + value = parseTimeWithoutTimeZone(sqlFunctionProperties.getTimeZoneKey(), node.getValue()); } else { value = parseTimeWithoutTimeZone(node.getValue()); @@ -334,8 +356,8 @@ protected RowExpression visitTimeLiteral(TimeLiteral node, Void context) protected RowExpression visitTimestampLiteral(TimestampLiteral node, Void context) { long value; - if (isLegacyTimestamp(session)) { - value = parseTimestampLiteral(session.getTimeZoneKey(), node.getValue()); + if (sqlFunctionProperties.isLegacyTimestamp()) { + value = parseTimestampLiteral(sqlFunctionProperties.getTimeZoneKey(), node.getValue()); } else { value = parseTimestampLiteral(node.getValue()); @@ -383,7 +405,7 @@ protected RowExpression visitFunctionCall(FunctionCall node, Void context) .map(TypeSignatureProvider::new) .collect(toImmutableList()); - return call(node.getName().toString(), functionManager.resolveFunction(session, node.getName(), argumentTypes), getType(node), arguments); + return call(node.getName().toString(), functionManager.resolveFunction(transactionId, node.getName(), argumentTypes), getType(node), arguments); } @Override @@ -580,7 +602,7 @@ protected RowExpression visitDereferenceExpression(DereferenceExpression node, V } } - if (isLegacyRowFieldOrdinalAccessEnabled(session) && index < 0) { + if (sqlFunctionProperties.isLegacyRowFieldOrdinalAccessEnabled() && index < 0) { OptionalInt rowIndex = parseAnonymousRowFieldOrdinalAccess(fieldName, fields); if (rowIndex.isPresent()) { index = rowIndex.getAsInt(); diff --git a/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java b/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java index e3b3e5d8ace6a..13283f8c0c010 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/InMemoryFunctionNamespaceManager.java @@ -15,6 +15,7 @@ import com.facebook.presto.spi.PrestoException; import com.facebook.presto.spi.function.FunctionMetadata; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.facebook.presto.sqlfunction.AbstractSqlInvokedFunctionNamespaceManager; import com.facebook.presto.sqlfunction.SqlFunctionId; @@ -94,6 +95,15 @@ public FunctionMetadata fetchFunctionMetadataDirect(SqlInvokedRegularFunctionHan .collect(onlyElement()); } + @Override + protected ScalarFunctionImplementation fetchFunctionImplementationDirect(SqlInvokedRegularFunctionHandle functionHandle) + { + return fetchFunctionsDirect(functionHandle.getName()).stream() + .filter(function -> function.getRequiredFunctionHandle().equals(functionHandle)) + .map(AbstractSqlInvokedFunctionNamespaceManager::sqlInvokedFunctionToImplementation) + .collect(onlyElement()); + } + private static SqlInvokedRegularFunction copyFunction(SqlInvokedRegularFunction function) { return new SqlInvokedRegularFunction( diff --git a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java index 61f8faf2fca35..5215d54bb3950 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorSession.java @@ -16,6 +16,7 @@ import com.facebook.presto.execution.QueryIdGenerator; import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.session.PropertyMetadata; import com.facebook.presto.spi.type.TimeZoneKey; @@ -44,14 +45,13 @@ public class TestingConnectorSession private final String queryId; private final ConnectorIdentity identity; private final Optional source; - private final TimeZoneKey timeZoneKey; private final Locale locale; private final Optional traceToken; private final long startTime; private final Map> properties; private final Map propertyValues; - private final boolean isLegacyTimestamp; private final Optional clientInfo; + private final SqlFunctionProperties sqlFunctionProperties; public TestingConnectorSession(List> properties) { @@ -74,13 +74,15 @@ public TestingConnectorSession( this.identity = new ConnectorIdentity(requireNonNull(user, "user is null"), Optional.empty(), Optional.empty()); this.source = requireNonNull(source, "source is null"); this.traceToken = requireNonNull(traceToken, "traceToken is null"); - this.timeZoneKey = requireNonNull(timeZoneKey, "timeZoneKey is null"); this.locale = requireNonNull(locale, "locale is null"); this.startTime = startTime; this.properties = Maps.uniqueIndex(propertyMetadatas, PropertyMetadata::getName); this.propertyValues = ImmutableMap.copyOf(propertyValues); - this.isLegacyTimestamp = isLegacyTimestamp; this.clientInfo = clientInfo; + this.sqlFunctionProperties = SqlFunctionProperties.builder() + .setTimeZoneKey(requireNonNull(timeZoneKey, "timeZoneKey is null")) + .setLegacyTimestamp(isLegacyTimestamp) + .build(); } @Override @@ -104,7 +106,7 @@ public ConnectorIdentity getIdentity() @Override public TimeZoneKey getTimeZoneKey() { - return timeZoneKey; + return sqlFunctionProperties.getTimeZoneKey(); } @Override @@ -134,7 +136,13 @@ public Optional getClientInfo() @Override public boolean isLegacyTimestamp() { - return isLegacyTimestamp; + return sqlFunctionProperties.isLegacyTimestamp(); + } + + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return SqlFunctionProperties.builder().setTimeZoneKey(UTC_KEY).build(); } @Override @@ -158,9 +166,9 @@ public String toString() .add("user", getUser()) .add("source", source.orElse(null)) .add("traceToken", traceToken.orElse(null)) - .add("timeZoneKey", timeZoneKey) .add("locale", locale) .add("startTime", startTime) + .add("sqlFunctionProperties", sqlFunctionProperties) .add("properties", propertyValues) .add("clientInfo", clientInfo) .omitNullValues() diff --git a/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java b/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java index e2a1eb37bdffa..2fe144687c410 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java +++ b/presto-main/src/main/java/com/facebook/presto/type/DecimalInequalityOperators.java @@ -30,9 +30,9 @@ import java.util.Optional; import static com.facebook.presto.metadata.PolymorphicScalarFunctionBuilder.constant; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.BETWEEN; diff --git a/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java b/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java index aee5b9eb946fa..9238c1f5da6d4 100644 --- a/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java +++ b/presto-main/src/main/java/com/facebook/presto/type/TypeRegistry.java @@ -665,7 +665,7 @@ public static boolean isCovariantTypeBase(String typeBase) public MethodHandle resolveOperator(OperatorType operatorType, List argumentTypes) { requireNonNull(functionManager, "functionManager is null"); - return functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(operatorType, fromTypes(argumentTypes))).getMethodHandle(); + return functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(operatorType, fromTypes(argumentTypes))).getMethodHandle(); } public static class TypeCompatibility diff --git a/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java b/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java index d1e1364545f93..bd0b91b99d140 100644 --- a/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java +++ b/presto-main/src/main/java/com/facebook/presto/util/FastutilSetHelper.java @@ -94,8 +94,8 @@ private static final class LongStrategy private LongStrategy(FunctionManager functionManager, Type type) { - hashCodeHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); - equalsHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); + hashCodeHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); + equalsHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); } @Override @@ -136,8 +136,8 @@ private static final class DoubleStrategy private DoubleStrategy(FunctionManager functionManager, Type type) { - hashCodeHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); - equalsHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); + hashCodeHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))).getMethodHandle(); + equalsHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))).getMethodHandle(); } @Override @@ -178,10 +178,10 @@ private static final class ObjectStrategy private ObjectStrategy(FunctionManager functionManager, Type type) { - hashCodeHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))) + hashCodeHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(HASH_CODE, fromTypes(type))) .getMethodHandle() .asType(MethodType.methodType(long.class, Object.class)); - equalsHandle = functionManager.getScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))) + equalsHandle = functionManager.getBuiltInScalarFunctionImplementation(functionManager.resolveOperator(EQUAL, fromTypes(type, type))) .getMethodHandle() .asType(MethodType.methodType(Boolean.class, Object.class, Object.class)); } diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java index 0b517e6f76719..4d2729d9800a9 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionInvokerProvider.java @@ -14,7 +14,7 @@ package com.facebook.presto.metadata; import com.facebook.presto.operator.scalar.AbstractTestFunctions; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty; import com.facebook.presto.spi.function.InvocationConvention; import com.facebook.presto.spi.function.InvocationConvention.InvocationReturnConvention; import com.google.common.collect.ImmutableList; @@ -23,11 +23,11 @@ import java.util.Optional; import static com.facebook.presto.metadata.FunctionInvokerProvider.checkChoice; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentType.VALUE_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentType.VALUE_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.BLOCK_POSITION; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.BOXED_NULLABLE; import static com.facebook.presto.spi.function.InvocationConvention.InvocationArgumentConvention.NEVER_NULL; diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java index 87d73d60beafc..e448b7e121b7c 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionManager.java @@ -14,8 +14,8 @@ package com.facebook.presto.metadata; import com.facebook.presto.block.BlockEncodingManager; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.scalar.CustomFunctions; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.spi.block.BlockEncodingSerde; import com.facebook.presto.spi.function.FunctionHandle; import com.facebook.presto.spi.function.OperatorType; @@ -39,8 +39,8 @@ import java.util.List; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.CAST; import static com.facebook.presto.spi.function.OperatorType.SATURATED_FLOOR_CAST; @@ -109,7 +109,7 @@ public void testMagicLiteralFunction() TypeRegistry typeManager = new TypeRegistry(); FunctionManager functionManager = createFunctionManager(typeManager); - BuiltInFunctionHandle functionHandle = (BuiltInFunctionHandle) functionManager.resolveFunction(TEST_SESSION, QualifiedName.of(signature.getName().getParts()), fromTypeSignatures(signature.getArgumentTypes())); + BuiltInFunctionHandle functionHandle = (BuiltInFunctionHandle) functionManager.resolveFunction(TEST_SESSION.getTransactionId(), QualifiedName.of(signature.getName().getParts()), fromTypeSignatures(signature.getArgumentTypes())); assertEquals(functionManager.getFunctionMetadata(functionHandle).getArgumentTypes(), ImmutableList.of(parseTypeSignature(StandardTypes.BIGINT))); assertEquals(signature.getReturnType().getBase(), StandardTypes.TIMESTAMP_WITH_TIME_ZONE); } @@ -400,7 +400,7 @@ private FunctionHandle resolveFunctionHandle() FeaturesConfig featuresConfig = new FeaturesConfig(); FunctionManager functionManager = new FunctionManager(typeRegistry, blockEncoding, featuresConfig); functionManager.registerBuiltInFunctions(createFunctionsFromSignatures()); - return functionManager.resolveFunction(TEST_SESSION, QualifiedName.of("presto", "default", TEST_FUNCTION_NAME), fromTypeSignatures(parameterTypes)); + return functionManager.resolveFunction(TEST_SESSION.getTransactionId(), QualifiedName.of("presto", "default", TEST_FUNCTION_NAME), fromTypeSignatures(parameterTypes)); } private List createFunctionsFromSignatures() @@ -411,13 +411,13 @@ private List createFunctionsFromSignatures() functions.add(new SqlScalarFunction(signature) { @Override - public ScalarFunctionImplementation specialize( + public BuiltInScalarFunctionImplementation specialize( BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), MethodHandles.identity(Void.class)); diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java index 79fdca16728f3..8607ef8c2c040 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestFunctionNamespaceManager.java @@ -81,7 +81,7 @@ public void testTransactionalGetFunction() InMemoryFunctionNamespaceManager functionNamespaceManager = new InMemoryFunctionNamespaceManager( new SqlInvokedFunctionNamespaceManagerConfig() .setFunctionCacheExpiration(new Duration(0, MILLISECONDS)) - .setMetadataCacheExpiration(new Duration(0, MILLISECONDS))); + .setFunctionInstanceCacheExpiration(new Duration(0, MILLISECONDS))); // begin first transaction FunctionNamespaceTransactionHandle transaction1 = functionNamespaceManager.beginTransaction(); diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java b/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java index 68634044b92a7..13d9c92436387 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/TestPolymorphicScalarFunction.java @@ -14,7 +14,7 @@ package com.facebook.presto.metadata; import com.facebook.presto.block.BlockEncodingManager; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.LongArrayBlock; import com.facebook.presto.spi.function.Signature; @@ -34,9 +34,9 @@ import static com.facebook.presto.metadata.TestPolymorphicScalarFunction.TestMethods.VARCHAR_TO_BIGINT_RETURN_VALUE; import static com.facebook.presto.metadata.TestPolymorphicScalarFunction.TestMethods.VARCHAR_TO_VARCHAR_RETURN_VALUE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.BLOCK_AND_POSITION; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.function.OperatorType.ADD; import static com.facebook.presto.spi.function.OperatorType.IS_DISTINCT_FROM; @@ -108,7 +108,7 @@ public void testSelectsMultipleChoiceWithBlockPosition() asList(Optional.of(long.class), Optional.of(long.class))))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(SHORT_DECIMAL_BOUND_VARIABLES, 2, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(SHORT_DECIMAL_BOUND_VARIABLES, 2, TYPE_REGISTRY, FUNCTION_MANAGER); assertEquals(functionImplementation.getAllChoices().size(), 2); assertEquals(functionImplementation.getAllChoices().get(0).getArgumentProperties(), Collections.nCopies(2, valueTypeArgumentProperty(USE_NULL_FLAG))); @@ -135,7 +135,7 @@ public void testSelectsMethodBasedOnArgumentTypes() .withExtraParameters(context -> ImmutableList.of(context.getLiteral("x"))))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); assertEquals(functionImplementation.getMethodHandle().invoke(INPUT_SLICE), INPUT_VARCHAR_LENGTH); } @@ -154,7 +154,7 @@ public void testSelectsMethodBasedOnReturnType() .withExtraParameters(context -> ImmutableList.of(42)))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); assertEquals(functionImplementation.getMethodHandle().invoke(INPUT_SLICE), VARCHAR_TO_BIGINT_RETURN_VALUE); } @@ -178,7 +178,7 @@ public void testSameLiteralInArgumentsAndReturnValue() .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); Slice slice = (Slice) functionImplementation.getMethodHandle().invoke(INPUT_SLICE); assertEquals(slice, VARCHAR_TO_VARCHAR_RETURN_VALUE); } @@ -203,7 +203,7 @@ public void testTypeParameters() .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); Slice slice = (Slice) functionImplementation.getMethodHandle().invoke(INPUT_SLICE); assertEquals(slice, VARCHAR_TO_VARCHAR_RETURN_VALUE); } @@ -225,7 +225,7 @@ public void testSetsHiddenToTrueForOperators() .implementation(methodsGroup -> methodsGroup.methods("varcharToVarchar"))) .build(); - ScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); + BuiltInScalarFunctionImplementation functionImplementation = function.specialize(BOUND_VARIABLES, 1, TYPE_REGISTRY, FUNCTION_MANAGER); } @Test(expectedExceptions = {IllegalStateException.class}, diff --git a/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java b/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java index d1418c08a18a1..06fda738af66f 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/GenericLongFunction.java @@ -16,7 +16,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.facebook.presto.spi.type.TypeManager; @@ -26,8 +26,8 @@ import java.util.function.LongUnaryOperator; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.facebook.presto.spi.type.StandardTypes.BIGINT; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; @@ -69,10 +69,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { MethodHandle methodHandle = METHOD_HANDLE.bindTo(longUnaryOperator); - return new ScalarFunctionImplementation(false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); + return new BuiltInScalarFunctionImplementation(false, ImmutableList.of(valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle); } public static long apply(LongUnaryOperator longUnaryOperator, long value) diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java b/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java index b201afa06a2c3..71b4998b92b80 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestAnnotationEngineForScalars.java @@ -18,8 +18,8 @@ import com.facebook.presto.operator.annotations.ImplementationDependency; import com.facebook.presto.operator.annotations.LiteralImplementationDependency; import com.facebook.presto.operator.annotations.TypeImplementationDependency; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.scalar.ParametricScalar; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; import com.facebook.presto.operator.scalar.annotations.ParametricScalarImplementation.ParametricScalarImplementationChoice; import com.facebook.presto.operator.scalar.annotations.ScalarFromAnnotationsParser; import com.facebook.presto.spi.block.Block; @@ -45,10 +45,10 @@ import java.util.List; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_NULL_FLAG; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; @@ -94,7 +94,7 @@ public void testSingleImplementationScalarParse() assertImplementationCount(scalar, 1, 0, 0); - ScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 1, new TypeRegistry(), null); + BuiltInScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 1, new TypeRegistry(), null); assertFalse(specialized.getInstanceFactory().isPresent()); assertEquals(specialized.getArgumentProperty(0).getNullConvention(), RETURN_NULL_ON_NULL); @@ -176,7 +176,7 @@ public void testWithNullablePrimitiveArgScalarParse() assertFalse(scalar.isHidden()); assertEquals(scalar.getDescription(), "Simple scalar with nullable primitive"); - ScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); + BuiltInScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); assertFalse(specialized.getInstanceFactory().isPresent()); assertEquals(specialized.getArgumentProperty(0), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)); @@ -214,7 +214,7 @@ public void testWithNullableComplexArgScalarParse() assertFalse(scalar.isHidden()); assertEquals(scalar.getDescription(), "Simple scalar with nullable complex type"); - ScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); + BuiltInScalarFunctionImplementation specialized = scalar.specialize(BoundVariables.builder().build(), 2, new TypeRegistry(), null); assertFalse(specialized.getInstanceFactory().isPresent()); assertEquals(specialized.getArgumentProperty(0), valueTypeArgumentProperty(RETURN_NULL_ON_NULL)); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java b/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java index be88b3bf64252..431b39489ae6d 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestColumnarPageProcessor.java @@ -81,6 +81,6 @@ private static Page createPage(List types, boolean dictionary) private PageProcessor newPageProcessor() { return new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), ImmutableList.of(field(0, types.get(0)), field(1, types.get(1))), MAX_BATCH_SIZE).get(); + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(field(0, types.get(0)), field(1, types.get(1))), MAX_BATCH_SIZE).get(); } } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java index c714b9516a268..f8edc70e96364 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestFilterAndProjectOperator.java @@ -106,7 +106,7 @@ public void test() constant(5L, BIGINT)); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - Supplier processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field0, add5)); + Supplier processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field0, add5)); OperatorFactory operatorFactory = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 0, @@ -151,7 +151,7 @@ public void testMergeOutput() constant(10L, BIGINT)); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - Supplier processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(1, BIGINT))); + Supplier processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(1, BIGINT))); OperatorFactory operatorFactory = new FilterAndProjectOperator.FilterAndProjectOperatorFactory( 0, diff --git a/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java index 0688aee866793..adcde12bebd34 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/TestScanFilterAndProjectOperator.java @@ -107,8 +107,8 @@ public void testPageSource() DriverContext driverContext = newDriverContext(); List projections = ImmutableList.of(field(0, VARCHAR)); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -151,8 +151,8 @@ public void testPageSourceMergeOutput() field(0, BIGINT), constant(10L, BIGINT)); List projections = ImmutableList.of(field(0, BIGINT)); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.of(filter), projections, "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.of(filter), projections); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -195,7 +195,7 @@ public void testPageSourceLazyLoad() DriverContext driverContext = newDriverContext(); List projections = ImmutableList.of(field(0, VARCHAR)); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); PageProcessor pageProcessor = new PageProcessor(Optional.of(new SelectAllFilter()), ImmutableList.of(new LazyPagePageProjection())); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( @@ -229,8 +229,8 @@ public void testRecordCursorSource() DriverContext driverContext = newDriverContext(); List projections = ImmutableList.of(field(0, VARCHAR)); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -282,8 +282,8 @@ public void testPageYield() for (int i = 0; i < totalColumns; i++) { projections.add(call("generic_long_page_col", functionManager.lookupFunction("generic_long_page_col" + i, fromTypes(BIGINT)), BIGINT, field(0, BIGINT))); } - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections.build(), "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections.build(), MAX_BATCH_SIZE); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections.build(), "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections.build(), MAX_BATCH_SIZE); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, @@ -349,8 +349,8 @@ public void testRecordCursorYield() functionManager.lookupFunction("generic_long_record_cursor", fromTypes(BIGINT)), BIGINT, field(0, BIGINT))); - Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(Optional.empty(), projections, "key"); - Supplier pageProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), projections); + Supplier cursorProcessor = expressionCompiler.compileCursorProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections, "key"); + Supplier pageProcessor = expressionCompiler.compilePageProcessor(driverContext.getSession().getSqlFunctionProperties(), Optional.empty(), projections); ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory factory = new ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory( 0, diff --git a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java index 47980932fdd0f..6bc7a5e556c97 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/aggregation/AbstractTestAggregationFunction.java @@ -77,7 +77,7 @@ protected void registerTypes(Plugin plugin) protected final InternalAggregationFunction getFunction() { List parameterTypes = fromTypeSignatures(Lists.transform(getFunctionParameterTypes(), TypeSignature::parseTypeSignature)); - FunctionHandle functionHandle = functionManager.resolveFunction(session, QualifiedName.of(getFunctionName()), parameterTypes); + FunctionHandle functionHandle = functionManager.resolveFunction(session.getTransactionId(), QualifiedName.of(getFunctionName()), parameterTypes); return functionManager.getAggregateFunctionImplementation(functionHandle); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java b/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java index 1707b74e4eab6..ec669c22ae91c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/index/TestTupleFilterProcessor.java @@ -62,6 +62,7 @@ public void testFilter() new int[] {0, 1, 2}, new int[] {1, 0, 3}, outputTypes, + SESSION.getSqlFunctionProperties(), new PageFunctionCompiler(createTestMetadataManager(), 0)); PageProcessor tupleFilterProcessor = filterFactory.createPageProcessor(tuplePage, OptionalInt.of(MAX_BATCH_SIZE)).get(); Page actualPage = getOnlyElement( diff --git a/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java b/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java index 27b1fbd21ac17..fe83349b14e2c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/project/TestPageProcessor.java @@ -394,7 +394,7 @@ public void testExpressionProfiler() TestingTicker testingTicker = new TestingTicker(); PageFunctionCompiler functionCompiler = new PageFunctionCompiler(metadata, 0); - Supplier projectionSupplier = functionCompiler.compileProjection(add10Expression, Optional.empty()); + Supplier projectionSupplier = functionCompiler.compileProjection(SESSION.getSqlFunctionProperties(), add10Expression, Optional.empty()); PageProjection projection = projectionSupplier.get(); Page page = new Page(createLongSequenceBlock(1, 11)); ExpressionProfiler profiler = new ExpressionProfiler(testingTicker, SPLIT_RUN_QUANTA); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java index 80797553cb785..57a7b4d7f6544 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayDistinct.java @@ -120,7 +120,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java index 7aa66b60e6cd8..260b290b54c84 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayFilter.java @@ -64,8 +64,8 @@ import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; import static com.facebook.presto.operator.scalar.BenchmarkArrayFilter.ExactArrayFilterFunction.EXACT_ARRAY_FILTER_FUNCTION; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.BigintType.BIGINT; @@ -145,7 +145,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(blocks); } @@ -231,10 +231,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java index da4d41934e793..04e9d8a90895e 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayHashCodeOperator.java @@ -145,7 +145,7 @@ public void setup() blocks[0] = createChannel(POSITIONS, ARRAY_SIZE, arrayType); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java index 6bb2a72a00444..6dd8ffe05c505 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayIntersect.java @@ -128,7 +128,7 @@ public void setup() new CallExpression(name, functionHandle, arrayType, ImmutableList.of(field(0, arrayType), field(1, arrayType)))); ExpressionCompiler compiler = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(createChannel(POSITIONS, arraySize, elementType), createChannel(POSITIONS, arraySize, elementType)); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java index 9d8d63fc28f7d..b7c41459655eb 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayJoin.java @@ -100,7 +100,7 @@ public void setup() constant(Slices.wrappedBuffer(",".getBytes(UTF_8)), VARCHAR)))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); page = new Page(createChannel(POSITIONS, ARRAY_SIZE)); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java index 47e8f93ebc776..2dec2bf70364d 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySort.java @@ -118,7 +118,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java index e8c09ef58998e..8e05f66f8b292 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArraySubscript.java @@ -145,7 +145,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java index dd4d013aa30eb..c8fe32eeb3625 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkArrayTransform.java @@ -127,7 +127,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); pageBuilder = new PageBuilder(projections.stream().map(RowExpression::getType).collect(Collectors.toList())); page = new Page(blocks); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java index 7f056ba150d7e..dfd5093cf1921 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkEqualsOperator.java @@ -89,7 +89,7 @@ public void setup() metadata, new PageFunctionCompiler(metadata, 0)); RowExpression projection = generateComplexComparisonProjection(functionManager, FIELDS_COUNT, COMPARISONS_COUNT); - compiledProcessor = expressionCompiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projection)).get(); + compiledProcessor = expressionCompiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(projection)).get(); } private static RowExpression generateComplexComparisonProjection(FunctionManager functionManager, int fieldsCount, int comparisonsCount) diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java index 0d750cc173d87..6aea907b7796c 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToArrayCast.java @@ -120,7 +120,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, new ArrayType(elementType), ImmutableList.of(field(0, JSON)))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); page = new Page(createChannel(POSITION_COUNT, ARRAY_SIZE, elementType)); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java index c5ef0ce6fa617..eac0e4114c7fd 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonToMapCast.java @@ -120,7 +120,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, mapType(VARCHAR, valueType), ImmutableList.of(field(0, JSON)))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); page = new Page(createChannel(POSITION_COUNT, MAP_SIZE, valueType)); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java index 734b630548bb4..fd139b1d31564 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapConcat.java @@ -146,7 +146,7 @@ public void setup() ImmutableList.of(field(0, mapType), field(1, mapType)))); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(leftBlock, rightBlock); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java index 691d05ecf6831..22e48d51bb342 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapSubscript.java @@ -157,7 +157,7 @@ public void setup() } ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java index 807db118e7b53..aebef8774f986 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkMapToMapCast.java @@ -99,7 +99,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, mapType(BIGINT, DOUBLE), ImmutableList.of(field(0, mapType(DOUBLE, BIGINT))))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); Block keyBlock = createKeyBlock(POSITION_COUNT, MAP_SIZE); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java index 595339e5e5106..24a4a2656a817 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkRowToRowCast.java @@ -99,7 +99,7 @@ public void setup() new CallExpression(CAST.name(), functionHandle, RowType.anonymous(fromFieldTypes), ImmutableList.of(field(0, RowType.anonymous(toFieldTypes))))); pageProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.empty(), projections) + .compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections) .get(); Block[] fieldBlocks = fromFieldTypes.stream() diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java index 9731a58881d76..f204861f0ecef 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformKey.java @@ -142,7 +142,7 @@ public void setup() Block block = createChannel(POSITIONS, mapType, elementType); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java index acf75f4e0b84d..231e2289fbcdf 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/BenchmarkTransformValue.java @@ -154,7 +154,7 @@ public void setup() Block block = createChannel(POSITIONS, mapType, elementType); ImmutableList projections = projectionsBuilder.build(); - pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); + pageProcessor = compiler.compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); page = new Page(block); } diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java index f0b4282de184b..045a98edd4dcd 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/FunctionAssertions.java @@ -48,6 +48,7 @@ import com.facebook.presto.spi.TableHandle; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.connector.ConnectorTransactionHandle; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.plan.PlanNodeId; import com.facebook.presto.spi.predicate.Utils; import com.facebook.presto.spi.relation.RowExpression; @@ -448,7 +449,7 @@ public void assertCachedInstanceHasBoundedRetainedSize(String projection) Expression projectionExpression = createExpression(session, projection, metadata, SYMBOL_TYPES); RowExpression projectionRowExpression = toRowExpression(session, projectionExpression); - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projectionRowExpression)).get(); + PageProcessor processor = compiler.compilePageProcessor(session.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(projectionRowExpression)).get(); // This is a heuristic to detect whether the retained size of cachedInstance is bounded. // * The test runs at least 1000 iterations. @@ -577,7 +578,7 @@ private List executeProjectionWithAll(String projection, Type expectedTy } // execute as standalone operator - OperatorFactory operatorFactory = compileFilterProject(Optional.empty(), projectionRowExpression, compiler); + OperatorFactory operatorFactory = compileFilterProject(session.getSqlFunctionProperties(), Optional.empty(), projectionRowExpression, compiler); Object directOperatorValue = selectSingleValue(operatorFactory, expectedType, session); results.add(directOperatorValue); @@ -586,7 +587,7 @@ private List executeProjectionWithAll(String projection, Type expectedTy results.add(interpretedValue); // execute over normal operator - SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(Optional.empty(), projectionRowExpression, compiler); + SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(session.getSqlFunctionProperties(), Optional.empty(), projectionRowExpression, compiler); Object scanOperatorValue = selectSingleValue(scanProjectOperatorFactory, expectedType, createNormalSplit(), session); results.add(scanOperatorValue); @@ -677,12 +678,12 @@ private List executeFilterWithAll(String filter, Session session, boole List results = new ArrayList<>(); // execute as standalone operator - OperatorFactory operatorFactory = compileFilterProject(Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); + OperatorFactory operatorFactory = compileFilterProject(session.getSqlFunctionProperties(), Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); results.add(executeFilter(operatorFactory, session)); if (executeWithNoInputColumns) { // execute as standalone operator - operatorFactory = compileFilterWithNoInputColumns(filterRowExpression, compiler); + operatorFactory = compileFilterWithNoInputColumns(session.getSqlFunctionProperties(), filterRowExpression, compiler); results.add(executeFilterWithNoInputColumns(operatorFactory, session)); } @@ -694,7 +695,7 @@ private List executeFilterWithAll(String filter, Session session, boole results.add(interpretedValue); // execute over normal operator - SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); + SourceOperatorFactory scanProjectOperatorFactory = compileScanFilterProject(session.getSqlFunctionProperties(), Optional.of(filterRowExpression), constant(true, BOOLEAN), compiler); boolean scanOperatorValue = executeFilter(scanProjectOperatorFactory, createNormalSplit(), session); results.add(scanOperatorValue); @@ -897,10 +898,10 @@ else if (javaType == Block.class) { return expectedType.getObjectValue(session.toConnectorSession(), block, 0); } - private static OperatorFactory compileFilterWithNoInputColumns(RowExpression filter, ExpressionCompiler compiler) + private static OperatorFactory compileFilterWithNoInputColumns(SqlFunctionProperties sqlFunctionProperties, RowExpression filter, ExpressionCompiler compiler) { try { - Supplier processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of()); + Supplier processor = compiler.compilePageProcessor(sqlFunctionProperties, Optional.of(filter), ImmutableList.of()); return new FilterAndProjectOperatorFactory(0, new PlanNodeId("test"), processor, ImmutableList.of(), new DataSize(0, BYTE), 0); } @@ -912,10 +913,10 @@ private static OperatorFactory compileFilterWithNoInputColumns(RowExpression fil } } - private static OperatorFactory compileFilterProject(Optional filter, RowExpression projection, ExpressionCompiler compiler) + private static OperatorFactory compileFilterProject(SqlFunctionProperties sqlFunctionProperties, Optional filter, RowExpression projection, ExpressionCompiler compiler) { try { - Supplier processor = compiler.compilePageProcessor(filter, ImmutableList.of(projection)); + Supplier processor = compiler.compilePageProcessor(sqlFunctionProperties, filter, ImmutableList.of(projection)); return new FilterAndProjectOperatorFactory(0, new PlanNodeId("test"), processor, ImmutableList.of(projection.getType()), new DataSize(0, BYTE), 0); } catch (Throwable e) { @@ -926,15 +927,17 @@ private static OperatorFactory compileFilterProject(Optional filt } } - private static SourceOperatorFactory compileScanFilterProject(Optional filter, RowExpression projection, ExpressionCompiler compiler) + private static SourceOperatorFactory compileScanFilterProject(SqlFunctionProperties sqlFunctionProperties, Optional filter, RowExpression projection, ExpressionCompiler compiler) { try { Supplier cursorProcessor = compiler.compileCursorProcessor( + sqlFunctionProperties, filter, ImmutableList.of(projection), SOURCE_ID); Supplier pageProcessor = compiler.compilePageProcessor( + sqlFunctionProperties, filter, ImmutableList.of(projection)); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java index ceca36252ee92..fe6e210cb2d90 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestPageProcessorCompiler.java @@ -38,6 +38,7 @@ import java.util.Optional; +import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.block.BlockAssertions.createLongDictionaryBlock; import static com.facebook.presto.block.BlockAssertions.createRLEBlock; import static com.facebook.presto.block.BlockAssertions.createSlicesBlock; @@ -86,15 +87,15 @@ public void testNoCaching() projectionsBuilder.add(new CallExpression("concat", functionHandle, arrayType, ImmutableList.of(field(0, arrayType), field(1, arrayType)))); ImmutableList projections = projectionsBuilder.build(); - PageProcessor pageProcessor = compiler.compilePageProcessor(Optional.empty(), projections).get(); - PageProcessor pageProcessor2 = compiler.compilePageProcessor(Optional.empty(), projections).get(); + PageProcessor pageProcessor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); + PageProcessor pageProcessor2 = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), projections).get(); assertTrue(pageProcessor != pageProcessor2); } @Test public void testSanityRLE() { - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(field(0, BIGINT), field(1, VARCHAR)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(field(0, BIGINT), field(1, VARCHAR)), MAX_BATCH_SIZE).get(); Slice varcharValue = Slices.utf8Slice("hello"); Page page = new Page(RunLengthEncodedBlock.create(BIGINT, 123L, 100), RunLengthEncodedBlock.create(VARCHAR, varcharValue, 100)); @@ -126,7 +127,7 @@ public void testSanityFilterOnDictionary() FunctionHandle lessThan = functionManager.resolveOperator(LESS_THAN, fromTypes(BIGINT, BIGINT)); CallExpression filter = new CallExpression(LESS_THAN.name(), lessThan, BOOLEAN, ImmutableList.of(lengthVarchar, constant(10L, BIGINT))); - PageProcessor processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); Page page = new Page(createDictionaryBlock(createExpectedValues(10), 100)); Page outputPage = getOnlyElement( @@ -165,7 +166,7 @@ public void testSanityFilterOnRLE() FunctionHandle lessThan = functionManager.resolveOperator(LESS_THAN, fromTypes(BIGINT, BIGINT)); CallExpression filter = new CallExpression(LESS_THAN.name(), lessThan, BOOLEAN, ImmutableList.of(field(0, BIGINT), constant(10L, BIGINT))); - PageProcessor processor = compiler.compilePageProcessor(Optional.of(filter), ImmutableList.of(field(0, BIGINT)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(field(0, BIGINT)), MAX_BATCH_SIZE).get(); Page page = new Page(createRLEBlock(5L, 100)); Page outputPage = getOnlyElement( @@ -186,7 +187,7 @@ public void testSanityFilterOnRLE() @Test public void testSanityColumnarDictionary() { - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(field(0, VARCHAR)), MAX_BATCH_SIZE).get(); Page page = new Page(createDictionaryBlock(createExpectedValues(10), 100)); Page outputPage = getOnlyElement( @@ -214,7 +215,7 @@ public void testNonDeterministicProject() InputReferenceExpression col0 = field(0, BIGINT); CallExpression lessThanRandomExpression = new CallExpression(LESS_THAN.name(), lessThan, BOOLEAN, ImmutableList.of(col0, random)); - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(lessThanRandomExpression), MAX_BATCH_SIZE).get(); + PageProcessor processor = compiler.compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(lessThanRandomExpression), MAX_BATCH_SIZE).get(); assertFalse(new RowExpressionDeterminismEvaluator(metadataManager.getFunctionManager()).isDeterministic(lessThanRandomExpression)); diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java index 31f5dcc815207..29be0a32f5b9f 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestParametricScalarImplementationValidation.java @@ -20,8 +20,8 @@ import java.lang.invoke.MethodHandle; import java.util.Optional; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.util.Reflection.methodHandle; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; @@ -35,7 +35,7 @@ public void testConnectorSessionPosition() { // Without cached instance factory MethodHandle validFunctionMethodHandle = methodHandle(TestParametricScalarImplementationValidation.class, "validConnectorSessionParameterPosition", ConnectorSession.class, long.class, long.class); - ScalarFunctionImplementation validFunction = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation validFunction = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -44,7 +44,7 @@ public void testConnectorSessionPosition() assertEquals(validFunction.getMethodHandle(), validFunctionMethodHandle); try { - ScalarFunctionImplementation invalidFunction = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation invalidFunction = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -58,7 +58,7 @@ public void testConnectorSessionPosition() // With cached instance factory MethodHandle validFunctionWithInstanceFactoryMethodHandle = methodHandle(TestParametricScalarImplementationValidation.class, "validConnectorSessionParameterPosition", Object.class, ConnectorSession.class, long.class, long.class); - ScalarFunctionImplementation validFunctionWithInstanceFactory = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation validFunctionWithInstanceFactory = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), @@ -68,7 +68,7 @@ public void testConnectorSessionPosition() assertEquals(validFunctionWithInstanceFactory.getMethodHandle(), validFunctionWithInstanceFactoryMethodHandle); try { - ScalarFunctionImplementation invalidFunctionWithInstanceFactory = new ScalarFunctionImplementation( + BuiltInScalarFunctionImplementation invalidFunctionWithInstanceFactory = new BuiltInScalarFunctionImplementation( false, ImmutableList.of( valueTypeArgumentProperty(RETURN_NULL_ON_NULL), diff --git a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java index 5e6e981fd1457..8a8b33c47beb4 100644 --- a/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java +++ b/presto-main/src/test/java/com/facebook/presto/operator/scalar/TestProvidedBlockBuilderReturnPlaceConvention.java @@ -16,8 +16,8 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ScalarImplementationChoice; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ScalarImplementationChoice; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; import com.facebook.presto.spi.function.FunctionKind; @@ -37,10 +37,10 @@ import java.util.concurrent.atomic.AtomicLong; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ReturnPlaceConvention.PROVIDED_BLOCKBUILDER; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.USE_BOXED_TYPE; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ReturnPlaceConvention.PROVIDED_BLOCKBUILDER; import static com.facebook.presto.operator.scalar.TestProvidedBlockBuilderReturnPlaceConvention.FunctionWithProvidedBlockReturnPlaceConvention1.PROVIDED_BLOCKBUILDER_CONVENTION1; import static com.facebook.presto.operator.scalar.TestProvidedBlockBuilderReturnPlaceConvention.FunctionWithProvidedBlockReturnPlaceConvention2.PROVIDED_BLOCKBUILDER_CONVENTION2; import static com.facebook.presto.spi.function.Signature.typeVariable; @@ -165,7 +165,7 @@ protected FunctionWithProvidedBlockReturnPlaceConvention1() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); MethodHandle methodHandleStack = MethodHandles.identity(type.getJavaType()); @@ -189,7 +189,7 @@ else if (type.getJavaType() == Block.class) { throw new UnsupportedOperationException(); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( ImmutableList.of( new ScalarImplementationChoice( false, @@ -285,7 +285,7 @@ protected FunctionWithProvidedBlockReturnPlaceConvention2() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { Type type = boundVariables.getTypeVariable("T"); MethodHandle methodHandleStack = MethodHandles.identity(wrap(type.getJavaType())); @@ -309,7 +309,7 @@ else if (type.getJavaType() == Block.class) { throw new UnsupportedOperationException(); } - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( ImmutableList.of( new ScalarImplementationChoice( true, diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java index bbd369ecb6d4d..e18853b9eb558 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/BenchmarkPageProcessor.java @@ -44,6 +44,7 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; +import static com.facebook.presto.SessionTestUtils.TEST_SESSION; import static com.facebook.presto.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.spi.function.OperatorType.GREATER_THAN_OR_EQUAL; @@ -89,7 +90,7 @@ public void setup() MetadataManager metadata = createTestMetadataManager(); FunctionManager functionManager = metadata.getFunctionManager(); compiledProcessor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)) - .compilePageProcessor(Optional.of(createFilterExpression(functionManager)), ImmutableList.of(createProjectExpression(functionManager))) + .compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(createFilterExpression(functionManager)), ImmutableList.of(createProjectExpression(functionManager))) .get(); } diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java index 9a164ca5de4bd..6d11bbcc2ad82 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/InCodeGeneratorBenchmark.java @@ -127,7 +127,7 @@ public void setup() RowExpression filter = specialForm(IN, BOOLEAN, arguments); MetadataManager metadata = MetadataManager.createTestMetadataManager(); - processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(Optional.of(filter), ImmutableList.of(project)).get(); + processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.of(filter), ImmutableList.of(project)).get(); } @Benchmark diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java index 0f358b2724d9b..9d9173669f7d6 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java @@ -123,10 +123,10 @@ public void setup() PageFunctionCompiler pageFunctionCompiler = new PageFunctionCompiler(metadata, 0); inputPage = createPage(types, dictionaryBlocks); - pageProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compilePageProcessor(Optional.of(getFilter(type)), projections).get(); + pageProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compilePageProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(getFilter(type)), projections).get(); recordSet = new PageRecordSet(types, inputPage); - cursorProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compileCursorProcessor(Optional.of(getFilter(type)), projections, "key").get(); + cursorProcessor = new ExpressionCompiler(metadata, pageFunctionCompiler).compileCursorProcessor(TEST_SESSION.getSqlFunctionProperties(), Optional.of(getFilter(type)), projections, "key").get(); } @Benchmark diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java index d93e37474911d..9e6c07d8faf12 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestPageFunctionCompiler.java @@ -56,7 +56,7 @@ public void testFailureDoesNotCorruptFutureResults() { PageFunctionCompiler functionCompiler = new PageFunctionCompiler(createTestMetadataManager(), 0); - Supplier projectionSupplier = functionCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()); + Supplier projectionSupplier = functionCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()); PageProjection projection = projectionSupplier.get(); // process good page and verify we got the expected number of result rows @@ -88,7 +88,7 @@ public void testGeneratedClassName() String planNodeId = "7"; String stageId = "20170707_223500_67496_zguwn.2"; String classSuffix = stageId + "_" + planNodeId; - Supplier projectionSupplier = functionCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of(classSuffix)); + Supplier projectionSupplier = functionCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of(classSuffix)); PageProjection projection = projectionSupplier.get(); Work work = projection.project(SESSION, new DriverYieldSignal(), createLongBlockPage(0), SelectedPositions.positionsRange(0, 1)); // class name should look like PageProjectionOutput_20170707_223500_67496_zguwn_2_7_XX @@ -100,31 +100,31 @@ public void testCache() { PageFunctionCompiler cacheCompiler = new PageFunctionCompiler(createTestMetadataManager(), 100); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty())); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty())); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint"))); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint"))); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); assertSame( - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - cacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + cacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); PageFunctionCompiler noCacheCompiler = new PageFunctionCompiler(createTestMetadataManager(), 0); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty())); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty())); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint"))); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint"))); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint")), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint")), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); assertNotSame( - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.empty()), - noCacheCompiler.compileProjection(ADD_10_EXPRESSION, Optional.of("hint2"))); + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.empty()), + noCacheCompiler.compileProjection(SESSION.getSqlFunctionProperties(), ADD_10_EXPRESSION, Optional.of("hint2"))); } private Block project(PageProjection projection, Page page, SelectedPositions selectedPositions) diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java index 41e922ae519bd..9b3bb83be6420 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestRowExpressionPredicateCompiler.java @@ -13,7 +13,7 @@ */ package com.facebook.presto.sql.gen; -import com.facebook.presto.metadata.FunctionManager; +import com.facebook.presto.metadata.Metadata; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.block.BlockBuilder; @@ -45,8 +45,8 @@ public class TestRowExpressionPredicateCompiler { - private FunctionManager functionManager = createTestMetadataManager().getFunctionManager(); - private FunctionResolution functionResolution = new FunctionResolution(functionManager); + private Metadata metadata = createTestMetadataManager(); + private FunctionResolution functionResolution = new FunctionResolution(metadata.getFunctionManager()); @Test public void test() @@ -65,8 +65,8 @@ public void test() call("b - a", functionResolution.arithmeticFunction(SUBTRACT, BIGINT, BIGINT), BIGINT, b, a), constant(0L, BIGINT)); - PredicateCompiler compiler = new RowExpressionPredicateCompiler(functionManager, 10_000); - Predicate compiledSum = compiler.compilePredicate(sum).get(); + PredicateCompiler compiler = new RowExpressionPredicateCompiler(metadata, 10_000); + Predicate compiledSum = compiler.compilePredicate(SESSION.getSqlFunctionProperties(), sum).get(); assertEquals(Arrays.asList(1, 0), Ints.asList(compiledSum.getInputChannels())); @@ -84,7 +84,7 @@ public void test() BOOLEAN, call("b * 2", functionResolution.arithmeticFunction(MULTIPLY, BIGINT, BIGINT), BIGINT, b, constant(2L, BIGINT)), constant(10L, BIGINT)); - Predicate compiledTimesTwo = compiler.compilePredicate(timesTwo).get(); + Predicate compiledTimesTwo = compiler.compilePredicate(SESSION.getSqlFunctionProperties(), timesTwo).get(); assertEquals(Arrays.asList(1), Ints.asList(compiledTimesTwo.getInputChannels())); @@ -107,11 +107,11 @@ public void testCache() call("a * 2", functionResolution.arithmeticFunction(MULTIPLY, BIGINT, BIGINT), BIGINT, new InputReferenceExpression(1, BIGINT), constant(2L, BIGINT)), constant(10L, BIGINT)); - PredicateCompiler compiler = new RowExpressionPredicateCompiler(functionManager, 10_000); - assertSame(compiler.compilePredicate(predicate), compiler.compilePredicate(predicate)); + PredicateCompiler compiler = new RowExpressionPredicateCompiler(metadata, 10_000); + assertSame(compiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate), compiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate)); - PredicateCompiler noCacheCompiler = new RowExpressionPredicateCompiler(functionManager, 0); - assertNotSame(noCacheCompiler.compilePredicate(predicate), noCacheCompiler.compilePredicate(predicate)); + PredicateCompiler noCacheCompiler = new RowExpressionPredicateCompiler(metadata, 0); + assertNotSame(noCacheCompiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate), noCacheCompiler.compilePredicate(SESSION.getSqlFunctionProperties(), predicate)); } private static Block createLongBlock(long... values) diff --git a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java index 0f79efc427d08..5199ba101c3a1 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/gen/TestVarArgsToArrayAdapterGenerator.java @@ -18,7 +18,7 @@ import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; import com.facebook.presto.operator.scalar.AbstractTestFunctions; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -33,8 +33,8 @@ import java.util.stream.IntStream; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.type.IntegerType.INTEGER; import static com.facebook.presto.sql.gen.TestVarArgsToArrayAdapterGenerator.TestVarArgsSum.VAR_ARGS_SUM; import static com.facebook.presto.sql.gen.VarArgsToArrayAdapterGenerator.generateVarArgsToArrayAdapter; @@ -107,7 +107,7 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { VarArgsToArrayAdapterGenerator.MethodHandleAndConstructor methodHandleAndConstructor = generateVarArgsToArrayAdapter( long.class, @@ -115,7 +115,7 @@ public ScalarFunctionImplementation specialize(BoundVariables boundVariables, in arity, METHOD_HANDLE, USER_STATE_FACTORY); - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(arity, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandleAndConstructor.getMethodHandle(), diff --git a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java index c0d513b98eee8..dda2dbda742b7 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/planner/iterative/rule/test/PlanBuilder.java @@ -337,7 +337,7 @@ private AggregationBuilder addAggregation(VariableReferenceExpression output, Ex { checkArgument(expression instanceof FunctionCall); FunctionCall call = (FunctionCall) expression; - FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session, call.getName(), TypeSignatureProvider.fromTypes(inputTypes)); + FunctionHandle functionHandle = metadata.getFunctionManager().resolveFunction(session.getTransactionId(), call.getName(), TypeSignatureProvider.fromTypes(inputTypes)); return addAggregation(output, new Aggregation( new CallExpression( call.getName().getSuffix(), diff --git a/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java b/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java index c43f302a1c990..8a3466015059a 100644 --- a/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java +++ b/presto-main/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java @@ -596,7 +596,7 @@ protected void generateInputPage(int... initialValues) protected void generateProcessor(String expression) { - processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(Optional.empty(), ImmutableList.of(rowExpression(expression))).get(); + processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(SESSION.getSqlFunctionProperties(), Optional.empty(), ImmutableList.of(rowExpression(expression))).get(); } protected void setDoubleMaxValue(double doubleMaxValue) diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java index dd79bf4b22b9f..c186ceb7e3958 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.spi; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.type.TimeZoneKey; @@ -32,6 +33,11 @@ default String getUser() ConnectorIdentity getIdentity(); + /** + * @deprecated In favor of {@link com.facebook.presto.spi.function.SqlFunctionProperties#getTimeZoneKey()} + * @return + */ + @Deprecated TimeZoneKey getTimeZoneKey(); Locale getLocale(); @@ -42,8 +48,14 @@ default String getUser() long getStartTime(); + /** + * @deprecated In favor of {@link com.facebook.presto.spi.function.SqlFunctionProperties#isLegacyTimestamp()} + * @return + */ @Deprecated boolean isLegacyTimestamp(); + SqlFunctionProperties getSqlFunctionProperties(); + T getProperty(String name, Class type); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionImplementationType.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionImplementationType.java new file mode 100644 index 0000000000000..cf7965c033ef3 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionImplementationType.java @@ -0,0 +1,20 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.presto.spi.function; + +public enum FunctionImplementationType +{ + BUILTIN, + SQL +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java index c66c00b58ab67..cf400ff2d7c31 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionMetadata.java @@ -29,8 +29,10 @@ public class FunctionMetadata private final FullyQualifiedName name; private final Optional operatorType; private final List argumentTypes; + private final Optional> argumentNames; private final TypeSignature returnType; private final FunctionKind functionKind; + private final FunctionImplementationType implementationType; private final boolean deterministic; private final boolean calledOnNullInput; @@ -39,10 +41,24 @@ public FunctionMetadata( List argumentTypes, TypeSignature returnType, FunctionKind functionKind, + FunctionImplementationType implementationType, boolean deterministic, boolean calledOnNullInput) { - this(name, Optional.empty(), argumentTypes, returnType, functionKind, deterministic, calledOnNullInput); + this(name, Optional.empty(), argumentTypes, Optional.empty(), returnType, functionKind, implementationType, deterministic, calledOnNullInput); + } + + public FunctionMetadata( + FullyQualifiedName name, + List argumentTypes, + List argumentNames, + TypeSignature returnType, + FunctionKind functionKind, + FunctionImplementationType implementationType, + boolean deterministic, + boolean calledOnNullInput) + { + this(name, Optional.empty(), argumentTypes, Optional.of(argumentNames), returnType, functionKind, implementationType, deterministic, calledOnNullInput); } public FunctionMetadata( @@ -50,26 +66,31 @@ public FunctionMetadata( List argumentTypes, TypeSignature returnType, FunctionKind functionKind, + FunctionImplementationType implementationType, boolean deterministic, boolean calledOnNullInput) { - this(operatorType.getFunctionName(), Optional.of(operatorType), argumentTypes, returnType, functionKind, deterministic, calledOnNullInput); + this(operatorType.getFunctionName(), Optional.of(operatorType), argumentTypes, Optional.empty(), returnType, functionKind, implementationType, deterministic, calledOnNullInput); } private FunctionMetadata( FullyQualifiedName name, Optional operatorType, List argumentTypes, + Optional> argumentNames, TypeSignature returnType, FunctionKind functionKind, + FunctionImplementationType implementationType, boolean deterministic, boolean calledOnNullInput) { this.name = requireNonNull(name, "name is null"); this.operatorType = requireNonNull(operatorType, "operatorType is null"); this.argumentTypes = unmodifiableList(new ArrayList<>(requireNonNull(argumentTypes, "argumentTypes is null"))); + this.argumentNames = requireNonNull(argumentNames, "argumentNames is null").map(names -> unmodifiableList(new ArrayList<>(names))); this.returnType = requireNonNull(returnType, "returnType is null"); this.functionKind = requireNonNull(functionKind, "functionKind is null"); + this.implementationType = requireNonNull(implementationType, "language is null"); this.deterministic = deterministic; this.calledOnNullInput = calledOnNullInput; } @@ -89,6 +110,11 @@ public List getArgumentTypes() return argumentTypes; } + public Optional> getArgumentNames() + { + return argumentNames; + } + public TypeSignature getReturnType() { return returnType; @@ -99,6 +125,11 @@ public Optional getOperatorType() return operatorType; } + public FunctionImplementationType getImplementationType() + { + return implementationType; + } + public boolean isDeterministic() { return deterministic; @@ -122,8 +153,10 @@ public boolean equals(Object obj) return Objects.equals(this.name, other.name) && Objects.equals(this.operatorType, other.operatorType) && Objects.equals(this.argumentTypes, other.argumentTypes) && + Objects.equals(this.argumentNames, other.argumentNames) && Objects.equals(this.returnType, other.returnType) && Objects.equals(this.functionKind, other.functionKind) && + Objects.equals(this.implementationType, other.implementationType) && Objects.equals(this.deterministic, other.deterministic) && Objects.equals(this.calledOnNullInput, other.calledOnNullInput); } @@ -131,6 +164,6 @@ public boolean equals(Object obj) @Override public int hashCode() { - return Objects.hash(name, operatorType, argumentTypes, returnType, functionKind, deterministic, calledOnNullInput); + return Objects.hash(name, operatorType, argumentTypes, argumentNames, returnType, functionKind, implementationType, deterministic, calledOnNullInput); } } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java index df723bbaf057d..f8afbffd13400 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/FunctionNamespaceManager.java @@ -58,4 +58,6 @@ public interface FunctionNamespaceManager FunctionHandle getFunctionHandle(Optional transactionHandle, Signature signature); FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle); + + ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/ScalarFunctionImplementation.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/ScalarFunctionImplementation.java new file mode 100644 index 0000000000000..99c45f251ce99 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/ScalarFunctionImplementation.java @@ -0,0 +1,21 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.presto.spi.function; + +import com.facebook.presto.spi.api.Experimental; + +@Experimental +public interface ScalarFunctionImplementation +{ +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java new file mode 100644 index 0000000000000..b95223bed7a0f --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlFunctionProperties.java @@ -0,0 +1,127 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.presto.spi.function; + +import com.facebook.presto.spi.type.TimeZoneKey; + +import java.util.Objects; + +import static java.util.Objects.requireNonNull; + +public class SqlFunctionProperties +{ + private final boolean parseDecimalLiteralAsDouble; + private final boolean legacyRowFieldOrdinalAccessEnabled; + private final TimeZoneKey timeZoneKey; + private final boolean legacyTimestamp; + + private SqlFunctionProperties( + boolean parseDecimalLiteralAsDouble, + boolean legacyRowFieldOrdinalAccessEnabled, + TimeZoneKey timeZoneKey, + boolean legacyTimestamp) + { + this.parseDecimalLiteralAsDouble = parseDecimalLiteralAsDouble; + this.legacyRowFieldOrdinalAccessEnabled = legacyRowFieldOrdinalAccessEnabled; + this.timeZoneKey = requireNonNull(timeZoneKey, "timeZoneKey is null"); + this.legacyTimestamp = legacyTimestamp; + } + + public boolean isParseDecimalLiteralAsDouble() + { + return parseDecimalLiteralAsDouble; + } + + public boolean isLegacyRowFieldOrdinalAccessEnabled() + { + return legacyRowFieldOrdinalAccessEnabled; + } + + public TimeZoneKey getTimeZoneKey() + { + return timeZoneKey; + } + + @Deprecated + public boolean isLegacyTimestamp() + { + return legacyTimestamp; + } + + @Override + public boolean equals(Object o) + { + if (this == o) { + return true; + } + if (!(o instanceof SqlFunctionProperties)) { + return false; + } + SqlFunctionProperties that = (SqlFunctionProperties) o; + return Objects.equals(parseDecimalLiteralAsDouble, that.parseDecimalLiteralAsDouble) && + Objects.equals(legacyRowFieldOrdinalAccessEnabled, that.legacyRowFieldOrdinalAccessEnabled) && + Objects.equals(timeZoneKey, that.timeZoneKey) && + Objects.equals(legacyTimestamp, that.legacyTimestamp); + } + + @Override + public int hashCode() + { + return Objects.hash(parseDecimalLiteralAsDouble, legacyRowFieldOrdinalAccessEnabled, timeZoneKey, legacyTimestamp); + } + + public static Builder builder() + { + return new Builder(); + } + + public static class Builder + { + private boolean parseDecimalLiteralAsDouble; + private boolean legacyRowFieldOrdinalAccessEnabled; + private TimeZoneKey timeZoneKey; + private boolean legacyTimestamp; + + private Builder() {} + + public Builder setParseDecimalLiteralAsDouble(boolean parseDecimalLiteralAsDouble) + { + this.parseDecimalLiteralAsDouble = parseDecimalLiteralAsDouble; + return this; + } + + public Builder setLegacyRowFieldOrdinalAccessEnabled(boolean legacyRowFieldOrdinalAccessEnabled) + { + this.legacyRowFieldOrdinalAccessEnabled = legacyRowFieldOrdinalAccessEnabled; + return this; + } + + public Builder setTimeZoneKey(TimeZoneKey timeZoneKey) + { + this.timeZoneKey = requireNonNull(timeZoneKey, "timeZoneKey is null"); + return this; + } + + public Builder setLegacyTimestamp(boolean legacyTimestamp) + { + this.legacyTimestamp = legacyTimestamp; + return this; + } + + public SqlFunctionProperties build() + { + return new SqlFunctionProperties(parseDecimalLiteralAsDouble, legacyRowFieldOrdinalAccessEnabled, timeZoneKey, legacyTimestamp); + } + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlInvokedScalarFunctionImplementation.java b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlInvokedScalarFunctionImplementation.java new file mode 100644 index 0000000000000..03788a427cf11 --- /dev/null +++ b/presto-spi/src/main/java/com/facebook/presto/spi/function/SqlInvokedScalarFunctionImplementation.java @@ -0,0 +1,35 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.presto.spi.function; + +import com.facebook.presto.spi.api.Experimental; + +import static java.util.Objects.requireNonNull; + +@Experimental +public class SqlInvokedScalarFunctionImplementation + implements ScalarFunctionImplementation +{ + private final String implementation; + + public SqlInvokedScalarFunctionImplementation(String implementation) + { + this.implementation = requireNonNull(implementation, "implementation is null"); + } + + public String getImplementation() + { + return implementation; + } +} diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java b/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java index 49a323b1a2363..bc02c08568188 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/relation/PredicateCompiler.java @@ -14,6 +14,7 @@ package com.facebook.presto.spi.relation; import com.facebook.presto.spi.api.Experimental; +import com.facebook.presto.spi.function.SqlFunctionProperties; import java.util.function.Supplier; @@ -27,5 +28,5 @@ public interface PredicateCompiler /** * Predicate expression may not contain any variable references, only input references. */ - Supplier compilePredicate(RowExpression predicate); + Supplier compilePredicate(SqlFunctionProperties sqlFunctionProperties, RowExpression predicate); } diff --git a/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java b/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java index 201dff82e70c3..49e1ec57529c5 100644 --- a/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java +++ b/presto-spi/src/test/java/com/facebook/presto/spi/block/TestingSession.java @@ -15,6 +15,7 @@ import com.facebook.presto.spi.ConnectorSession; import com.facebook.presto.spi.PrestoException; +import com.facebook.presto.spi.function.SqlFunctionProperties; import com.facebook.presto.spi.security.ConnectorIdentity; import com.facebook.presto.spi.type.TimeZoneKey; @@ -83,6 +84,12 @@ public boolean isLegacyTimestamp() return true; } + @Override + public SqlFunctionProperties getSqlFunctionProperties() + { + return SqlFunctionProperties.builder().setTimeZoneKey(UTC_KEY).build(); + } + @Override public T getProperty(String name, Class type) { diff --git a/presto-sql-function/pom.xml b/presto-sql-function/pom.xml index 91317878b1030..cb61e405a4bd5 100644 --- a/presto-sql-function/pom.xml +++ b/presto-sql-function/pom.xml @@ -20,11 +20,13 @@ com.facebook.presto presto-spi + provided com.fasterxml.jackson.core jackson-annotations + provided diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java index 60b2650b71222..2c0bc844109bc 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/AbstractSqlInvokedFunctionNamespaceManager.java @@ -17,7 +17,9 @@ import com.facebook.presto.spi.function.FunctionMetadata; import com.facebook.presto.spi.function.FunctionNamespaceManager; import com.facebook.presto.spi.function.FunctionNamespaceTransactionHandle; +import com.facebook.presto.spi.function.ScalarFunctionImplementation; import com.facebook.presto.spi.function.Signature; +import com.facebook.presto.spi.function.SqlInvokedScalarFunctionImplementation; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -31,6 +33,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import static com.facebook.presto.spi.function.FunctionImplementationType.SQL; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableMap.toImmutableMap; @@ -43,6 +46,7 @@ public abstract class AbstractSqlInvokedFunctionNamespaceManager private final LoadingCache> functions; private final LoadingCache metadataByHandle; + private final LoadingCache implementationByHandle; public AbstractSqlInvokedFunctionNamespaceManager(SqlInvokedFunctionNamespaceManagerConfig config) { @@ -61,7 +65,7 @@ public Collection load(FullyQualifiedName functionNam } }); this.metadataByHandle = CacheBuilder.newBuilder() - .expireAfterWrite(config.getMetadataCacheExpiration().toMillis(), MILLISECONDS) + .expireAfterWrite(config.getFunctionInstanceCacheExpiration().toMillis(), MILLISECONDS) .build(new CacheLoader() { @Override @@ -70,12 +74,23 @@ public FunctionMetadata load(SqlInvokedRegularFunctionHandle functionHandle) return fetchFunctionMetadataDirect(functionHandle); } }); + this.implementationByHandle = CacheBuilder.newBuilder() + .expireAfterWrite(config.getFunctionInstanceCacheExpiration().toMillis(), MILLISECONDS) + .build(new CacheLoader() { + @Override + public ScalarFunctionImplementation load(SqlInvokedRegularFunctionHandle functionHandle) + { + return fetchFunctionImplementationDirect(functionHandle); + } + }); } protected abstract Collection fetchFunctionsDirect(FullyQualifiedName functionName); protected abstract FunctionMetadata fetchFunctionMetadataDirect(SqlInvokedRegularFunctionHandle functionHandle); + protected abstract ScalarFunctionImplementation fetchFunctionImplementationDirect(SqlInvokedRegularFunctionHandle functionHandle); + @Override public final FunctionNamespaceTransactionHandle beginTransaction() { @@ -120,17 +135,32 @@ public final FunctionMetadata getFunctionMetadata(FunctionHandle functionHandle) return metadataByHandle.getUnchecked((SqlInvokedRegularFunctionHandle) functionHandle); } + @Override + public final ScalarFunctionImplementation getScalarFunctionImplementation(FunctionHandle functionHandle) + { + checkArgument(functionHandle instanceof SqlInvokedRegularFunctionHandle, "Unsupported FunctionHandle type '%s'", functionHandle.getClass().getSimpleName()); + return implementationByHandle.getUnchecked((SqlInvokedRegularFunctionHandle) functionHandle); + } + protected static FunctionMetadata sqlInvokedFunctionToMetadata(SqlInvokedRegularFunction function) { return new FunctionMetadata( function.getSignature().getName(), function.getSignature().getArgumentTypes(), + function.getParameterNames(), function.getSignature().getReturnType(), SCALAR, + function.getFunctionImplementationType(), function.isDeterministic(), function.isCalledOnNullInput()); } + protected static ScalarFunctionImplementation sqlInvokedFunctionToImplementation(SqlInvokedRegularFunction function) + { + checkArgument(function.getFunctionImplementationType().equals(SQL)); + return new SqlInvokedScalarFunctionImplementation(function.getBody()); + } + private Collection fetchFunctions(FullyQualifiedName functionName) { return functions.getUnchecked(functionName); diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java index 1d2ec59ea5d8d..194c64ef46ec6 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedFunctionNamespaceManagerConfig.java @@ -23,7 +23,7 @@ public class SqlInvokedFunctionNamespaceManagerConfig { private Duration functionCacheExpiration = new Duration(5, MINUTES); - private Duration metadataCacheExpiration = new Duration(8, HOURS); + private Duration functionInstanceCacheExpiration = new Duration(8, HOURS); @MinDuration("0ns") public Duration getFunctionCacheExpiration() @@ -39,15 +39,15 @@ public SqlInvokedFunctionNamespaceManagerConfig setFunctionCacheExpiration(Durat } @MinDuration("0ns") - public Duration getMetadataCacheExpiration() + public Duration getFunctionInstanceCacheExpiration() { - return metadataCacheExpiration; + return functionInstanceCacheExpiration; } - @Config("metadata-cache-expiration") - public SqlInvokedFunctionNamespaceManagerConfig setMetadataCacheExpiration(Duration metadataCacheExpiration) + @Config("function-instance-cache-expiration") + public SqlInvokedFunctionNamespaceManagerConfig setFunctionInstanceCacheExpiration(Duration functionInstanceCacheExpiration) { - this.metadataCacheExpiration = metadataCacheExpiration; + this.functionInstanceCacheExpiration = functionInstanceCacheExpiration; return this; } } diff --git a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java index 061de88e0bc39..131d371bf4939 100644 --- a/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java +++ b/presto-sql-function/src/main/java/com/facebook/presto/sqlfunction/SqlInvokedRegularFunction.java @@ -13,18 +13,22 @@ */ package com.facebook.presto.sqlfunction; +import com.facebook.presto.spi.function.FunctionImplementationType; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.function.SqlFunction; import com.facebook.presto.spi.relation.FullyQualifiedName; import com.facebook.presto.spi.type.TypeSignature; +import com.google.common.collect.ImmutableMap; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; import static com.facebook.presto.spi.function.FunctionKind.SCALAR; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.ImmutableList.toImmutableList; import static java.lang.String.format; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.collectingAndThen; @@ -34,6 +38,8 @@ public class SqlInvokedRegularFunction implements SqlFunction { + private static final Map LANGUAGE_TO_IMPLEMENTATION_MAP = ImmutableMap.of(RoutineCharacteristics.Language.SQL, FunctionImplementationType.SQL); + private final List parameters; private final Optional comment; private final RoutineCharacteristics routineCharacteristics; @@ -115,6 +121,11 @@ public List getParameters() return parameters; } + public List getParameterNames() + { + return parameters.stream().map(SqlParameter::getName).collect(toImmutableList()); + } + public Optional getComment() { return comment; @@ -125,6 +136,12 @@ public RoutineCharacteristics getRoutineCharacteristics() return routineCharacteristics; } + public FunctionImplementationType getFunctionImplementationType() + { + checkState(LANGUAGE_TO_IMPLEMENTATION_MAP.containsKey(routineCharacteristics.getLanguage()), "Language is not supported: %s", routineCharacteristics.getLanguage()); + return LANGUAGE_TO_IMPLEMENTATION_MAP.get(routineCharacteristics.getLanguage()); + } + public String getBody() { return body; diff --git a/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java b/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java index d157f4086d0a9..46d4510886645 100644 --- a/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java +++ b/presto-sql-function/src/test/java/com/facebook/presto/sqlfunction/TestSqlInvokedFunctionNamespaceManagerConfig.java @@ -32,7 +32,7 @@ public void testDefault() { assertRecordedDefaults(recordDefaults(SqlInvokedFunctionNamespaceManagerConfig.class) .setFunctionCacheExpiration(new Duration(5, MINUTES)) - .setMetadataCacheExpiration(new Duration(8, HOURS))); + .setFunctionInstanceCacheExpiration(new Duration(8, HOURS))); } @Test @@ -40,11 +40,11 @@ public void testExplicitPropertyMappings() { Map properties = new ImmutableMap.Builder() .put("function-cache-expiration", "10m") - .put("metadata-cache-expiration", "4h") + .put("function-instance-cache-expiration", "4h") .build(); SqlInvokedFunctionNamespaceManagerConfig expected = new SqlInvokedFunctionNamespaceManagerConfig() .setFunctionCacheExpiration(new Duration(10, MINUTES)) - .setMetadataCacheExpiration(new Duration(4, HOURS)); + .setFunctionInstanceCacheExpiration(new Duration(4, HOURS)); assertFullMapping(properties, expected); } diff --git a/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java b/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java index 25c334b5248af..7c9c9877ef9e5 100644 --- a/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java +++ b/presto-tests/src/main/java/com/facebook/presto/tests/StatefulSleepingSum.java @@ -16,7 +16,7 @@ import com.facebook.presto.metadata.BoundVariables; import com.facebook.presto.metadata.FunctionManager; import com.facebook.presto.metadata.SqlScalarFunction; -import com.facebook.presto.operator.scalar.ScalarFunctionImplementation; +import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.spi.function.FunctionKind; import com.facebook.presto.spi.function.Signature; import com.facebook.presto.spi.relation.FullyQualifiedName; @@ -28,8 +28,8 @@ import java.util.concurrent.atomic.AtomicInteger; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; -import static com.facebook.presto.operator.scalar.ScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.ArgumentProperty.valueTypeArgumentProperty; +import static com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation.NullConvention.RETURN_NULL_ON_NULL; import static com.facebook.presto.spi.function.Signature.typeVariable; import static com.facebook.presto.spi.type.TypeSignature.parseTypeSignature; import static com.facebook.presto.util.Reflection.constructorMethodHandle; @@ -73,10 +73,10 @@ public String getDescription() } @Override - public ScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) + public BuiltInScalarFunctionImplementation specialize(BoundVariables boundVariables, int arity, TypeManager typeManager, FunctionManager functionManager) { int args = 4; - return new ScalarFunctionImplementation( + return new BuiltInScalarFunctionImplementation( false, nCopies(args, valueTypeArgumentProperty(RETURN_NULL_ON_NULL)), methodHandle(StatefulSleepingSum.class, "statefulSleepingSum", State.class, double.class, long.class, long.class, long.class),