From c7858583ac1fd2f59907902fa835527db46e5d3b Mon Sep 17 00:00:00 2001 From: Pratik Joseph Dabre Date: Tue, 14 Jan 2025 21:51:18 +0530 Subject: [PATCH] Fixed bugs --- .../InternalIcebergConnectorFactory.java | 2 + .../optimizer/IcebergMetadataOptimizer.java | 63 ++++++++++--------- .../IcebergPlanOptimizerProvider.java | 7 ++- .../presto/connector/ConnectorManager.java | 21 ++++++- .../metadata/FunctionAndTypeManager.java | 8 ++- .../optimizations/MetadataQueryOptimizer.java | 41 +++++++----- .../sql/relational/FunctionResolution.java | 40 +++++++----- .../testing/TestingConnectorContext.java | 17 ++++- .../nativeworker/NativeQueryRunnerUtils.java | 1 - .../presto/spi/ConnectorSystemConfig.java | 3 + 10 files changed, 134 insertions(+), 69 deletions(-) diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/InternalIcebergConnectorFactory.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/InternalIcebergConnectorFactory.java index bab2cb74a63d3..617d83aff8bc2 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/InternalIcebergConnectorFactory.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/InternalIcebergConnectorFactory.java @@ -28,6 +28,7 @@ import com.facebook.presto.hive.metastore.ExtendedHiveMetastore; import com.facebook.presto.hive.s3.HiveS3Module; import com.facebook.presto.plugin.base.security.AllowAllAccessControl; +import com.facebook.presto.spi.ConnectorSystemConfig; import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.PageIndexerFactory; import com.facebook.presto.spi.classloader.ThreadContextClassLoader; @@ -97,6 +98,7 @@ public static Connector createConnector( binder.bind(FunctionMetadataManager.class).toInstance(context.getFunctionMetadataManager()); binder.bind(RowExpressionService.class).toInstance(context.getRowExpressionService()); binder.bind(FilterStatsCalculatorService.class).toInstance(context.getFilterStatsCalculatorService()); + binder.bind(ConnectorSystemConfig.class).toInstance(context.getConnectorSystemConfig()); }); Injector injector = app diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java index f426afa3d36b4..d4118c76b12c0 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergMetadataOptimizer.java @@ -26,6 +26,7 @@ import com.facebook.presto.spi.ConnectorPlanOptimizer; import com.facebook.presto.spi.ConnectorPlanRewriter; import com.facebook.presto.spi.ConnectorSession; +import com.facebook.presto.spi.ConnectorSystemConfig; import com.facebook.presto.spi.ConnectorTableLayout; import com.facebook.presto.spi.Constraint; import com.facebook.presto.spi.DiscretePredicates; @@ -81,34 +82,27 @@ public class IcebergMetadataOptimizer implements ConnectorPlanOptimizer { - public static final CatalogSchemaName JAVA_BUILTIN_NAMESPACE = new CatalogSchemaName("presto", "default"); - private static final Set ALLOWED_FUNCTIONS = ImmutableSet.of( - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "max"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "min"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "approx_distinct")); - - // Min/Max could be folded into LEAST/GREATEST - private static final Map AGGREGATION_SCALAR_MAPPING = ImmutableMap.of( - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "max"), QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "greatest"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "min"), QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "least")); - private final FunctionMetadataManager functionMetadataManager; private final TypeManager typeManager; private final IcebergTransactionManager icebergTransactionManager; private final RowExpressionService rowExpressionService; private final StandardFunctionResolution functionResolution; - - public IcebergMetadataOptimizer(FunctionMetadataManager functionMetadataManager, - TypeManager typeManager, - IcebergTransactionManager icebergTransactionManager, - RowExpressionService rowExpressionService, - StandardFunctionResolution functionResolution) + private final ConnectorSystemConfig connectorSystemConfig; + + public IcebergMetadataOptimizer( + FunctionMetadataManager functionMetadataManager, + TypeManager typeManager, + IcebergTransactionManager icebergTransactionManager, + RowExpressionService rowExpressionService, + StandardFunctionResolution functionResolution, + ConnectorSystemConfig connectorSystemConfig) { this.functionMetadataManager = requireNonNull(functionMetadataManager, "functionMetadataManager is null"); this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.icebergTransactionManager = requireNonNull(icebergTransactionManager, "icebergTransactionManager is null"); this.rowExpressionService = requireNonNull(rowExpressionService, "rowExpressionService is null"); this.functionResolution = requireNonNull(functionResolution, "functionResolution is null"); + this.connectorSystemConfig = requireNonNull(connectorSystemConfig, "connectorSystemConfig is null"); } @Override @@ -121,7 +115,8 @@ public PlanNode optimize(PlanNode maxSubplan, ConnectorSession session, Variable icebergTransactionManager, rowExpressionService, functionResolution, - rowsForMetadataOptimizationThreshold); + rowsForMetadataOptimizationThreshold, + connectorSystemConfig); PlanNode rewrittenPlan = ConnectorPlanRewriter.rewriteWith(optimizer, maxSubplan, null); return rewrittenPlan; } @@ -137,15 +132,18 @@ private static class Optimizer private final RowExpressionService rowExpressionService; private final StandardFunctionResolution functionResolution; private final int rowsForMetadataOptimizationThreshold; + private final Set allowedFunctions; + private final Map aggregationScalarMapping; private Optimizer(ConnectorSession connectorSession, - PlanNodeIdAllocator idAllocator, - FunctionMetadataManager functionMetadataManager, - TypeManager typeManager, - IcebergTransactionManager icebergTransactionManager, - RowExpressionService rowExpressionService, - StandardFunctionResolution functionResolution, - int rowsForMetadataOptimizationThreshold) + PlanNodeIdAllocator idAllocator, + FunctionMetadataManager functionMetadataManager, + TypeManager typeManager, + IcebergTransactionManager icebergTransactionManager, + RowExpressionService rowExpressionService, + StandardFunctionResolution functionResolution, + int rowsForMetadataOptimizationThreshold, + ConnectorSystemConfig connectorSystemConfig) { checkArgument(rowsForMetadataOptimizationThreshold >= 0, "The value of `rowsForMetadataOptimizationThreshold` should not less than 0"); this.connectorSession = connectorSession; @@ -156,6 +154,15 @@ private Optimizer(ConnectorSession connectorSession, this.functionResolution = functionResolution; this.typeManager = typeManager; this.rowsForMetadataOptimizationThreshold = rowsForMetadataOptimizationThreshold; + CatalogSchemaName defaultNamespace = requireNonNull(connectorSystemConfig, "connectorSystemConfig is null").getDefaultNamespace(); + this.allowedFunctions = ImmutableSet.of( + QualifiedObjectName.valueOf(defaultNamespace, "max"), + QualifiedObjectName.valueOf(defaultNamespace, "min"), + QualifiedObjectName.valueOf(defaultNamespace, "approx_distinct")); + // Min/Max could be folded into LEAST/GREATEST + this.aggregationScalarMapping = ImmutableMap.of( + QualifiedObjectName.valueOf(defaultNamespace, "max"), QualifiedObjectName.valueOf(defaultNamespace, "greatest"), + QualifiedObjectName.valueOf(defaultNamespace, "min"), QualifiedObjectName.valueOf(defaultNamespace, "least")); } @Override @@ -164,7 +171,7 @@ public PlanNode visitAggregation(AggregationNode node, RewriteContext cont // supported functions are only MIN/MAX/APPROX_DISTINCT or distinct aggregates for (Aggregation aggregation : node.getAggregations().values()) { QualifiedObjectName functionName = functionMetadataManager.getFunctionMetadata(aggregation.getFunctionHandle()).getName(); - if (!ALLOWED_FUNCTIONS.contains(functionName) && !aggregation.isDistinct()) { + if (!allowedFunctions.contains(functionName) && !aggregation.isDistinct()) { return context.defaultRewrite(node); } } @@ -270,7 +277,7 @@ private boolean isReducible(AggregationNode node, List 1 || !inputs.containsAll(aggregation.getCall().getArguments())) { return false; @@ -340,7 +347,7 @@ private RowExpression evaluateMinMax(FunctionMetadata aggregationFunctionMetadat return new ConstantExpression(Optional.empty(), null, returnType); } - String scalarFunctionName = AGGREGATION_SCALAR_MAPPING.get(aggregationFunctionMetadata.getName()).getObjectName(); + String scalarFunctionName = aggregationScalarMapping.get(aggregationFunctionMetadata.getName()).getObjectName(); while (arguments.size() > 1) { List reducedArguments = new ArrayList<>(); // We fold for every 100 values because GREATEST/LEAST has argument count limit diff --git a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizerProvider.java b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizerProvider.java index 2150485a5bce5..c71bf046b5576 100644 --- a/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizerProvider.java +++ b/presto-iceberg/src/main/java/com/facebook/presto/iceberg/optimizer/IcebergPlanOptimizerProvider.java @@ -16,6 +16,7 @@ import com.facebook.presto.common.type.TypeManager; import com.facebook.presto.iceberg.IcebergTransactionManager; import com.facebook.presto.spi.ConnectorPlanOptimizer; +import com.facebook.presto.spi.ConnectorSystemConfig; import com.facebook.presto.spi.connector.ConnectorPlanOptimizerProvider; import com.facebook.presto.spi.function.FunctionMetadataManager; import com.facebook.presto.spi.function.StandardFunctionResolution; @@ -39,13 +40,15 @@ public IcebergPlanOptimizerProvider( RowExpressionService rowExpressionService, StandardFunctionResolution functionResolution, FunctionMetadataManager functionMetadataManager, - TypeManager typeManager) + TypeManager typeManager, + ConnectorSystemConfig connectorSystemConfig) { requireNonNull(transactionManager, "transactionManager is null"); requireNonNull(rowExpressionService, "rowExpressionService is null"); requireNonNull(functionResolution, "functionResolution is null"); requireNonNull(functionMetadataManager, "functionMetadataManager is null"); requireNonNull(typeManager, "typeManager is null"); + requireNonNull(connectorSystemConfig, "connectorSystemConfig is null"); this.planOptimizers = ImmutableSet.of( new IcebergPlanOptimizer(functionResolution, rowExpressionService, functionMetadataManager, transactionManager), new IcebergFilterPushdown(rowExpressionService, functionResolution, functionMetadataManager, transactionManager, typeManager), @@ -53,7 +56,7 @@ public IcebergPlanOptimizerProvider( this.logicalPlanOptimizers = ImmutableSet.of( new IcebergPlanOptimizer(functionResolution, rowExpressionService, functionMetadataManager, transactionManager), new IcebergFilterPushdown(rowExpressionService, functionResolution, functionMetadataManager, transactionManager, typeManager), - new IcebergMetadataOptimizer(functionMetadataManager, typeManager, transactionManager, rowExpressionService, functionResolution), + new IcebergMetadataOptimizer(functionMetadataManager, typeManager, transactionManager, rowExpressionService, functionResolution, connectorSystemConfig), new IcebergParquetDereferencePushDown(transactionManager, rowExpressionService, typeManager), new IcebergEqualityDeleteAsJoin(functionResolution, transactionManager, typeManager)); } diff --git a/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java index 6ed7888b33d54..d5600cc6098cf 100644 --- a/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java +++ b/presto-main/src/main/java/com/facebook/presto/connector/ConnectorManager.java @@ -15,6 +15,7 @@ import com.facebook.airlift.log.Logger; import com.facebook.airlift.node.NodeInfo; +import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.block.BlockEncodingSerde; import com.facebook.presto.common.type.TypeManager; import com.facebook.presto.connector.informationSchema.InformationSchemaConnector; @@ -181,7 +182,21 @@ public ConnectorManager( this.determinismEvaluator = requireNonNull(determinismEvaluator, "determinismEvaluator is null"); this.filterStatsCalculator = requireNonNull(filterStatsCalculator, "filterStatsCalculator is null"); this.blockEncodingSerde = requireNonNull(blockEncodingSerde, "blockEncodingSerde is null"); - this.connectorSystemConfig = () -> featuresConfig.isNativeExecutionEnabled(); + this.connectorSystemConfig = + new ConnectorSystemConfig() + { + @Override + public boolean isNativeExecution() + { + return featuresConfig.isNativeExecutionEnabled(); + } + + @Override + public CatalogSchemaName getDefaultNamespace() + { + return metadataManager.getFunctionAndTypeManager().getDefaultNamespace(); + } + }; } @PreDestroy @@ -314,8 +329,8 @@ private synchronized void addConnectorInternal(MaterializedConnector connector) .ifPresent(metadataUpdaterProvider -> connectorMetadataUpdaterManager.addMetadataUpdaterProvider(connectorId, metadataUpdaterProvider)); connector.getConnectorTypeSerdeProvider() - .ifPresent( - connectorTypeSerdeProvider -> + .ifPresent( + connectorTypeSerdeProvider -> connectorTypeSerdeManager.addConnectorTypeSerdeProvider(connectorId, connectorTypeSerdeProvider)); metadataManager.getProcedureRegistry().addProcedures(connectorId, connector.getProcedures()); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java index a3b34c57db6a9..b56df2a51f1a8 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/FunctionAndTypeManager.java @@ -379,15 +379,17 @@ public void registerBuiltInFunctions(List functions) public List listFunctions(Session session, Optional likePattern, Optional escape) { ImmutableList.Builder functions = new ImmutableList.Builder<>(); - if (!isListBuiltInFunctionsOnly(session)) { - functions.addAll(SessionFunctionUtils.listFunctions(session.getSessionFunctions())); + if (isListBuiltInFunctionsOnly(session)) { functions.addAll(functionNamespaceManagers.entrySet().stream() .flatMap(manager -> manager.getValue().listFunctions(likePattern, escape).stream() .filter((functionName) -> functionName.getSignature().getName().getCatalogSchemaName().equals(defaultNamespace))) .collect(toImmutableList())); } else { - functions.addAll(listBuiltInFunctions()); + functions.addAll(SessionFunctionUtils.listFunctions(session.getSessionFunctions())); + functions.addAll(functionNamespaceManagers.values().stream() + .flatMap(manager -> manager.listFunctions(likePattern, escape).stream()) + .collect(toImmutableList())); } return functions.build().stream() diff --git a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/MetadataQueryOptimizer.java b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/MetadataQueryOptimizer.java index 80df9828f37a9..d3737dd73be2a 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/MetadataQueryOptimizer.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/planner/optimizations/MetadataQueryOptimizer.java @@ -15,6 +15,7 @@ import com.facebook.presto.Session; import com.facebook.presto.SystemSessionProperties; +import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.QualifiedObjectName; import com.facebook.presto.common.predicate.NullableValue; import com.facebook.presto.common.predicate.TupleDomain; @@ -62,7 +63,6 @@ import java.util.Optional; import java.util.Set; -import static com.facebook.presto.metadata.BuiltInTypeAndFunctionNamespaceManager.JAVA_BUILTIN_NAMESPACE; import static com.facebook.presto.spi.plan.ProjectNode.Locality.LOCAL; import static com.facebook.presto.sql.planner.RowExpressionInterpreter.evaluateConstantRowExpression; import static com.facebook.presto.sql.relational.Expressions.call; @@ -78,16 +78,8 @@ public class MetadataQueryOptimizer implements PlanOptimizer { - private static final Set ALLOWED_FUNCTIONS = ImmutableSet.of( - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "max"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "min"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "approx_distinct")); - - // Min/Max could be folded into LEAST/GREATEST - private static final Map AGGREGATION_SCALAR_MAPPING = ImmutableMap.of( - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "max"), QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "greatest"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "min"), QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "least")); - + private final Set allowedFunctions; + private final Map aggregationScalarMapping; private final Metadata metadata; public MetadataQueryOptimizer(Metadata metadata) @@ -95,6 +87,15 @@ public MetadataQueryOptimizer(Metadata metadata) requireNonNull(metadata, "metadata is null"); this.metadata = metadata; + CatalogSchemaName defaultNamespace = metadata.getFunctionAndTypeManager().getDefaultNamespace(); + this.allowedFunctions = ImmutableSet.of( + QualifiedObjectName.valueOf(defaultNamespace, "max"), + QualifiedObjectName.valueOf(defaultNamespace, "min"), + QualifiedObjectName.valueOf(defaultNamespace, "approx_distinct")); + // Min/Max could be folded into LEAST/GREATEST + this.aggregationScalarMapping = ImmutableMap.of( + QualifiedObjectName.valueOf(defaultNamespace, "max"), QualifiedObjectName.valueOf(defaultNamespace, "greatest"), + QualifiedObjectName.valueOf(defaultNamespace, "min"), QualifiedObjectName.valueOf(defaultNamespace, "least")); } @Override @@ -108,6 +109,16 @@ public PlanOptimizerResult optimize(PlanNode plan, Session session, TypeProvider return PlanOptimizerResult.optimizerResult(rewrittenPlan, optimizer.isPlanChanged()); } + public Set getAllowedFunctions() + { + return allowedFunctions; + } + + public Map getAggregationScalarMapping() + { + return aggregationScalarMapping; + } + private static class Optimizer extends SimplePlanRewriter { @@ -118,6 +129,7 @@ private static class Optimizer private final boolean ignoreMetadataStats; private final int metastoreCallNumThreshold; private boolean planChanged; + private final MetadataQueryOptimizer metadataQueryOptimizer; private Optimizer(Session session, Metadata metadata, PlanNodeIdAllocator idAllocator) { @@ -127,6 +139,7 @@ private Optimizer(Session session, Metadata metadata, PlanNodeIdAllocator idAllo this.determinismEvaluator = new RowExpressionDeterminismEvaluator(metadata); this.ignoreMetadataStats = SystemSessionProperties.isOptimizeMetadataQueriesIgnoreStats(session); this.metastoreCallNumThreshold = SystemSessionProperties.getOptimizeMetadataQueriesCallThreshold(session); + this.metadataQueryOptimizer = new MetadataQueryOptimizer(metadata); } public boolean isPlanChanged() @@ -140,7 +153,7 @@ public PlanNode visitAggregation(AggregationNode node, RewriteContext cont // supported functions are only MIN/MAX/APPROX_DISTINCT or distinct aggregates for (Aggregation aggregation : node.getAggregations().values()) { QualifiedObjectName functionName = metadata.getFunctionAndTypeManager().getFunctionMetadata(aggregation.getFunctionHandle()).getName(); - if (!ALLOWED_FUNCTIONS.contains(functionName) && !aggregation.isDistinct()) { + if (!metadataQueryOptimizer.getAllowedFunctions().contains(functionName) && !aggregation.isDistinct()) { return context.defaultRewrite(node); } } @@ -261,7 +274,7 @@ private boolean isReducible(AggregationNode node, List 1 || !inputs.containsAll(aggregation.getCall().getArguments())) { return false; @@ -355,7 +368,7 @@ private RowExpression evaluateMinMax(FunctionMetadata aggregationFunctionMetadat return constant(null, returnType); } - String scalarFunctionName = AGGREGATION_SCALAR_MAPPING.get(aggregationFunctionMetadata.getName()).getObjectName(); + String scalarFunctionName = metadataQueryOptimizer.getAggregationScalarMapping().get(aggregationFunctionMetadata.getName()).getObjectName(); ConnectorSession connectorSession = session.toConnectorSession(); while (arguments.size() > 1) { List reducedArguments = new ArrayList<>(); diff --git a/presto-main/src/main/java/com/facebook/presto/sql/relational/FunctionResolution.java b/presto-main/src/main/java/com/facebook/presto/sql/relational/FunctionResolution.java index 71c43ecd54dbe..1619e409a73bc 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/relational/FunctionResolution.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/relational/FunctionResolution.java @@ -24,6 +24,7 @@ import com.facebook.presto.sql.analyzer.FunctionAndTypeResolver; import com.facebook.presto.sql.tree.ArithmeticBinaryExpression; import com.facebook.presto.sql.tree.ComparisonExpression; +import com.facebook.presto.sql.tree.QualifiedName; import com.google.common.collect.ImmutableList; import java.util.List; @@ -58,16 +59,17 @@ public final class FunctionResolution implements StandardFunctionResolution { private final FunctionAndTypeResolver functionAndTypeResolver; - private final List windowValueFunctions = ImmutableList.of( - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "lead"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "lag"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "first_value"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "last_value"), - QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "nth_value")); + private final List windowValueFunctions; public FunctionResolution(FunctionAndTypeResolver functionAndTypeResolver) { this.functionAndTypeResolver = requireNonNull(functionAndTypeResolver, "functionManager is null"); + this.windowValueFunctions = ImmutableList.of( + functionAndTypeResolver.qualifyObjectName(QualifiedName.of("lead")), + functionAndTypeResolver.qualifyObjectName(QualifiedName.of("lag")), + functionAndTypeResolver.qualifyObjectName(QualifiedName.of("first_value")), + functionAndTypeResolver.qualifyObjectName(QualifiedName.of("last_value")), + functionAndTypeResolver.qualifyObjectName(QualifiedName.of("nth_value"))); } @Override @@ -121,7 +123,7 @@ public FunctionHandle likeCharFunction(Type valueType) @Override public boolean isLikeFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "LIKE")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("LIKE"))); } @Override @@ -133,7 +135,11 @@ public FunctionHandle likePatternFunction() @Override public boolean isLikePatternFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "LIKE_PATTERN")); + QualifiedObjectName name = + supportsLikePatternFunction() ? + functionAndTypeResolver.qualifyObjectName(QualifiedName.of("LIKE_PATTERN")) : + QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "LIKE_PATTERN"); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(name); } @Override @@ -149,7 +155,7 @@ public boolean isTryCastFunction(FunctionHandle functionHandle) public boolean isArrayConstructor(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, ARRAY_CONSTRUCTOR)); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of(ARRAY_CONSTRUCTOR))); } @Override @@ -297,13 +303,13 @@ public boolean isTryFunction(FunctionHandle functionHandle) public boolean isFailFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "fail")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("fail"))); } @Override public boolean isCountFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "count")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("count"))); } @Override @@ -321,7 +327,7 @@ public FunctionHandle countFunction(Type valueType) @Override public boolean isMaxFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "max")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("max"))); } @Override @@ -339,7 +345,7 @@ public FunctionHandle greatestFunction(List valueTypes) @Override public boolean isMinFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "min")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("min"))); } @Override @@ -357,7 +363,7 @@ public FunctionHandle leastFunction(List valueTypes) @Override public boolean isApproximateCountDistinctFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "approx_distinct")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("approx_distinct"))); } @Override @@ -369,7 +375,7 @@ public FunctionHandle approximateCountDistinctFunction(Type valueType) @Override public boolean isApproximateSetFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "approx_set")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("approx_set"))); } @Override @@ -385,12 +391,12 @@ public boolean isEqualFunction(FunctionHandle functionHandle) public boolean isArrayContainsFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "contains")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("contains"))); } public boolean isElementAtFunction(FunctionHandle functionHandle) { - return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, "element_at")); + return functionAndTypeResolver.getFunctionMetadata(functionHandle).getName().equals(functionAndTypeResolver.qualifyObjectName(QualifiedName.of("element_at"))); } public boolean isWindowValueFunction(FunctionHandle functionHandle) diff --git a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java index 7cef5e6c1cd2f..c9df80868fc09 100644 --- a/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java +++ b/presto-main/src/main/java/com/facebook/presto/testing/TestingConnectorContext.java @@ -15,6 +15,7 @@ import com.facebook.presto.GroupByHashPageIndexerFactory; import com.facebook.presto.PagesIndexPageSorter; +import com.facebook.presto.common.CatalogSchemaName; import com.facebook.presto.common.block.BlockEncodingManager; import com.facebook.presto.common.block.BlockEncodingSerde; import com.facebook.presto.common.type.TypeManager; @@ -52,6 +53,7 @@ import com.facebook.presto.sql.relational.RowExpressionDomainTranslator; import com.facebook.presto.sql.relational.RowExpressionOptimizer; +import static com.facebook.presto.metadata.BuiltInTypeAndFunctionNamespaceManager.JAVA_BUILTIN_NAMESPACE; import static com.facebook.presto.metadata.FunctionAndTypeManager.createTestFunctionAndTypeManager; public class TestingConnectorContext @@ -157,6 +159,19 @@ public BlockEncodingSerde getBlockEncodingSerde() @Override public ConnectorSystemConfig getConnectorSystemConfig() { - return () -> false; + return new ConnectorSystemConfig() + { + @Override + public boolean isNativeExecution() + { + return false; + } + + @Override + public CatalogSchemaName getDefaultNamespace() + { + return JAVA_BUILTIN_NAMESPACE; + } + }; } } diff --git a/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/NativeQueryRunnerUtils.java b/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/NativeQueryRunnerUtils.java index 8a65bbb203628..13443d5219198 100644 --- a/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/NativeQueryRunnerUtils.java +++ b/presto-native-execution/src/test/java/com/facebook/presto/nativeworker/NativeQueryRunnerUtils.java @@ -60,7 +60,6 @@ public static Map getNativeSidecarProperties() return ImmutableMap.builder() .put("coordinator-sidecar-enabled", "true") .put("presto.default-namespace", "native.default") - .put("list-built-in-functions-only", "false") .build(); } diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSystemConfig.java b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSystemConfig.java index dcbeb6dcacbde..dd84369a46500 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSystemConfig.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSystemConfig.java @@ -13,7 +13,10 @@ */ package com.facebook.presto.spi; +import com.facebook.presto.common.CatalogSchemaName; + public interface ConnectorSystemConfig { boolean isNativeExecution(); + CatalogSchemaName getDefaultNamespace(); }