diff --git a/presto-main/src/main/java/com/facebook/presto/SystemSessionProperties.java b/presto-main/src/main/java/com/facebook/presto/SystemSessionProperties.java index 6100e40054a71..a524bc8f92ff6 100644 --- a/presto-main/src/main/java/com/facebook/presto/SystemSessionProperties.java +++ b/presto-main/src/main/java/com/facebook/presto/SystemSessionProperties.java @@ -137,6 +137,7 @@ public final class SystemSessionProperties public static final String INDEX_LOADER_TIMEOUT = "index_loader_timeout"; public static final String OPTIMIZED_REPARTITIONING_ENABLED = "optimized_repartitioning"; public static final String AGGREGATION_PARTITIONING_MERGING_STRATEGY = "aggregation_partitioning_merging_strategy"; + public static final String LIST_BUILT_IN_FUNCTIONS_ONLY = "list_built_in_functions_only"; private final List> sessionProperties; @@ -678,7 +679,12 @@ public SystemSessionProperties( featuresConfig.getAggregationPartitioningMergingStrategy(), false, value -> AggregationPartitioningMergingStrategy.valueOf(((String) value).toUpperCase()), - AggregationPartitioningMergingStrategy::name)); + AggregationPartitioningMergingStrategy::name), + booleanProperty( + LIST_BUILT_IN_FUNCTIONS_ONLY, + "Only List built-in functions in SHOW FUNCTIONS", + featuresConfig.isListBuiltInFunctionsOnly(), + false)); } public List> getSessionProperties() @@ -1153,4 +1159,9 @@ public static AggregationPartitioningMergingStrategy getAggregationPartitioningM { return session.getSystemProperty(AGGREGATION_PARTITIONING_MERGING_STRATEGY, AggregationPartitioningMergingStrategy.class); } + + public static boolean isListBuiltInFunctionsOnly(Session session) + { + return session.getSystemProperty(LIST_BUILT_IN_FUNCTIONS_ONLY, Boolean.class); + } } 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 63fd6a0b8c4ea..4c2a7deb01c4a 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 @@ -13,6 +13,7 @@ */ package com.facebook.presto.metadata; +import com.facebook.presto.Session; import com.facebook.presto.operator.aggregation.InternalAggregationFunction; import com.facebook.presto.operator.scalar.BuiltInScalarFunctionImplementation; import com.facebook.presto.operator.window.WindowFunctionSupplier; @@ -61,6 +62,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import static com.facebook.presto.SystemSessionProperties.isListBuiltInFunctionsOnly; import static com.facebook.presto.metadata.BuiltInFunctionNamespaceManager.DEFAULT_NAMESPACE; import static com.facebook.presto.metadata.CastType.toOperatorType; import static com.facebook.presto.spi.StandardErrorCode.AMBIGUOUS_FUNCTION_CALL; @@ -99,8 +101,6 @@ public class FunctionManager private final Map functionNamespaces = new ConcurrentHashMap<>(); private final Map> functionNamespaceManagers = new ConcurrentHashMap<>(); - private final boolean listNonBuiltInFunctions; - @Inject public FunctionManager( TypeManager typeManager, @@ -121,7 +121,6 @@ public FunctionManager( } // TODO: Provide a more encapsulated way for TransactionManager to register FunctionNamespaceManager transactionManager.registerFunctionNamespaceManager(BuiltInFunctionNamespaceManager.ID, builtInFunctionNamespaceManager); - this.listNonBuiltInFunctions = featuresConfig.isListNonBuiltInFunctions(); } @VisibleForTesting @@ -171,11 +170,11 @@ public void registerBuiltInFunctions(List functions) builtInFunctionNamespaceManager.registerBuiltInFunctions(functions); } - public List listFunctions() + public List listFunctions(Session session) { - Collection> managers = listNonBuiltInFunctions ? - functionNamespaceManagers.values() : - ImmutableSet.of(builtInFunctionNamespaceManager); + Collection> managers = isListBuiltInFunctionsOnly(session) ? + ImmutableSet.of(builtInFunctionNamespaceManager) : + functionNamespaceManagers.values(); return managers.stream() .flatMap(manager -> manager.listFunctions().stream()) diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java index e81b5f90a9d4c..509915677a4a9 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/Metadata.java @@ -59,7 +59,7 @@ public interface Metadata Type getType(TypeSignature signature); - List listFunctions(); + List listFunctions(Session session); void registerBuiltInFunctions(List functions); diff --git a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java index a9dfb6dd70756..3723493ea865a 100644 --- a/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java +++ b/presto-main/src/main/java/com/facebook/presto/metadata/MetadataManager.java @@ -266,10 +266,10 @@ public Type getType(TypeSignature signature) return typeManager.getType(signature); } - public List listFunctions() + public List listFunctions(Session session) { // TODO: transactional when FunctionManager is made transactional - return functions.listFunctions(); + return functions.listFunctions(session); } @Override diff --git a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/FeaturesConfig.java b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/FeaturesConfig.java index 28edcb82a82e6..89af54f7fd6dd 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/analyzer/FeaturesConfig.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/analyzer/FeaturesConfig.java @@ -145,7 +145,7 @@ public class FeaturesConfig private Duration indexLoaderTimeout = new Duration(20, SECONDS); - private boolean listNonBuiltInFunctions; + private boolean listBuiltInFunctionsOnly = true; public enum JoinReorderingStrategy { @@ -1135,15 +1135,15 @@ public FeaturesConfig setOptimizedRepartitioningEnabled(boolean optimizedReparti return this; } - public boolean isListNonBuiltInFunctions() + public boolean isListBuiltInFunctionsOnly() { - return listNonBuiltInFunctions; + return listBuiltInFunctionsOnly; } - @Config("list-non-built-in-functions") - public FeaturesConfig setListNonBuiltInFunctions(boolean listNonBuiltInFunctions) + @Config("list-built-in-functions-only") + public FeaturesConfig setListBuiltInFunctionsOnly(boolean listBuiltInFunctionsOnly) { - this.listNonBuiltInFunctions = listNonBuiltInFunctions; + this.listBuiltInFunctionsOnly = listBuiltInFunctionsOnly; return this; } } diff --git a/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java b/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java index b66a648285663..454fc40b4af69 100644 --- a/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java +++ b/presto-main/src/main/java/com/facebook/presto/sql/rewrite/ShowQueriesRewrite.java @@ -524,7 +524,7 @@ private static String toQualifedName(Object objectName, Optional columnN protected Node visitShowFunctions(ShowFunctions node, Void context) { ImmutableList.Builder rows = ImmutableList.builder(); - for (SqlFunction function : metadata.listFunctions()) { + for (SqlFunction function : metadata.listFunctions(session)) { rows.add(row( function.getSignature().getName().getFunctionNamespace().equals(DEFAULT_NAMESPACE) ? new StringLiteral(function.getSignature().getNameSuffix()) : diff --git a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java index 58efad33b52d5..56026afc2d341 100644 --- a/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java +++ b/presto-main/src/test/java/com/facebook/presto/metadata/AbstractMockMetadata.java @@ -70,7 +70,7 @@ public Type getType(TypeSignature signature) } @Override - public List listFunctions() + public List listFunctions(Session session) { throw new UnsupportedOperationException(); } 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 acd0bd62fd7be..bc0d8bd10cf02 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 @@ -148,7 +148,7 @@ public void testListingHiddenFunctions() { TypeRegistry typeManager = new TypeRegistry(); FunctionManager functionManager = createFunctionManager(typeManager); - List functions = functionManager.listFunctions(); + List functions = functionManager.listFunctions(TEST_SESSION); List names = transform(functions, input -> input.getSignature().getNameSuffix()); assertTrue(names.contains("length"), "Expected function names " + names + " to contain 'length'"); diff --git a/presto-main/src/test/java/com/facebook/presto/sql/analyzer/TestFeaturesConfig.java b/presto-main/src/test/java/com/facebook/presto/sql/analyzer/TestFeaturesConfig.java index 974559352fa74..f0a0a4dc9b806 100644 --- a/presto-main/src/test/java/com/facebook/presto/sql/analyzer/TestFeaturesConfig.java +++ b/presto-main/src/test/java/com/facebook/presto/sql/analyzer/TestFeaturesConfig.java @@ -125,7 +125,7 @@ public void testDefaults() .setOptimizeFullOuterJoinWithCoalesce(true) .setIndexLoaderTimeout(new Duration(20, SECONDS)) .setOptimizedRepartitioningEnabled(false) - .setListNonBuiltInFunctions(false)); + .setListBuiltInFunctionsOnly(true)); } @Test @@ -207,7 +207,7 @@ public void testExplicitPropertyMappings() .put("optimizer.optimize-full-outer-join-with-coalesce", "false") .put("index-loader-timeout", "10s") .put("experimental.optimized-repartitioning", "true") - .put("list-non-built-in-functions", "true") + .put("list-built-in-functions-only", "false") .build(); FeaturesConfig expected = new FeaturesConfig() @@ -286,7 +286,7 @@ public void testExplicitPropertyMappings() .setOptimizeFullOuterJoinWithCoalesce(false) .setIndexLoaderTimeout(new Duration(10, SECONDS)) .setOptimizedRepartitioningEnabled(true) - .setListNonBuiltInFunctions(true); + .setListBuiltInFunctionsOnly(false); assertFullMapping(properties, expected); }