diff --git a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java index 317bf8da07a8f..30c1aed82d468 100644 --- a/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java +++ b/presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/optimization/JdbcComputePushdown.java @@ -106,7 +106,7 @@ public PlanNode visitFilter(FilterNode node, RewriteContext context) TableHandle oldTableHandle = oldTableScanNode.getTable(); JdbcTableHandle oldConnectorTable = (JdbcTableHandle) oldTableHandle.getConnectorHandle(); - RowExpression predicate = expressionOptimizerProvider.getExpressionOptimizer(session).optimize(node.getPredicate(), OPTIMIZED, session); + RowExpression predicate = expressionOptimizerProvider.getExpressionOptimizer(session).optimize(node.getPredicate(), OPTIMIZED, session, false); predicate = logicalRowExpressions.convertToConjunctiveNormalForm(predicate); TranslatedExpression jdbcExpression = translateWith( predicate, diff --git a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java index 39bd93d8de15b..9fd25e691764b 100755 --- a/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java +++ b/presto-clickhouse/src/main/java/com/facebook/presto/plugin/clickhouse/optimization/ClickHouseComputePushdown.java @@ -257,7 +257,7 @@ public PlanNode visitFilter(FilterNode node, Void context) TableHandle oldTableHandle = oldTableScanNode.getTable(); ClickHouseTableHandle oldConnectorTable = (ClickHouseTableHandle) oldTableHandle.getConnectorHandle(); - RowExpression predicate = rowExpressionService.getExpressionOptimizer(session).optimize(node.getPredicate(), OPTIMIZED, session); + RowExpression predicate = rowExpressionService.getExpressionOptimizer(session).optimize(node.getPredicate(), OPTIMIZED, session, false); predicate = logicalRowExpressions.convertToConjunctiveNormalForm(predicate); TranslatedExpression clickHouseExpression = translateWith( predicate, diff --git a/presto-hive-common/src/main/java/com/facebook/presto/hive/SubfieldExtractor.java b/presto-hive-common/src/main/java/com/facebook/presto/hive/SubfieldExtractor.java index 5171c7cfbcaad..17273ee83a6e3 100644 --- a/presto-hive-common/src/main/java/com/facebook/presto/hive/SubfieldExtractor.java +++ b/presto-hive-common/src/main/java/com/facebook/presto/hive/SubfieldExtractor.java @@ -122,7 +122,7 @@ private static Optional toSubfield( RowExpression indexExpression = expressionOptimizer.optimize( dereferenceExpression.getArguments().get(1), ExpressionOptimizer.Level.OPTIMIZED, - connectorSession); + connectorSession, false); if (indexExpression instanceof ConstantExpression) { Object index = ((ConstantExpression) indexExpression).getValue(); @@ -143,7 +143,7 @@ private static Optional toSubfield( RowExpression indexExpression = expressionOptimizer.optimize( arguments.get(1), ExpressionOptimizer.Level.OPTIMIZED, - connectorSession); + connectorSession, false); if (indexExpression instanceof ConstantExpression) { Object index = ((ConstantExpression) indexExpression).getValue(); diff --git a/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java b/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java index 1894a49afe965..2c7be02f6e108 100644 --- a/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java +++ b/presto-hive-common/src/main/java/com/facebook/presto/hive/rule/BaseSubfieldExtractionRewriter.java @@ -233,7 +233,7 @@ public ConnectorPushdownFilterResult pushdownFilter( } RowExpression optimizedRemainingExpression = rowExpressionService.getExpressionOptimizer(session) - .optimize(decomposedFilter.getRemainingExpression(), OPTIMIZED, session); + .optimize(decomposedFilter.getRemainingExpression(), OPTIMIZED, session, false); if (optimizedRemainingExpression instanceof ConstantExpression) { ConstantExpression constantExpression = (ConstantExpression) optimizedRemainingExpression; if (FALSE_CONSTANT.equals(constantExpression) || constantExpression.getValue() == null) { diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java b/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java index 0890c00278fcd..4de5c92dc1b96 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/FilteringPageSource.java @@ -118,7 +118,7 @@ public FilteringPageSource( columnHandle -> new VariableReferenceExpression(Optional.empty(), columnHandle.getName(), columnHandle.getHiveType().getType(typeManager)), columnHandle -> new InputReferenceExpression(Optional.empty(), columnHandle.getHiveColumnIndex(), columnHandle.getHiveType().getType(typeManager)))); - RowExpression optimizedRemainingPredicate = rowExpressionService.getExpressionOptimizer(session).optimize(remainingPredicate, OPTIMIZED, session); + RowExpression optimizedRemainingPredicate = rowExpressionService.getExpressionOptimizer(session).optimize(remainingPredicate, OPTIMIZED, session, false); if (TRUE_CONSTANT.equals(optimizedRemainingPredicate)) { this.filterFunction = null; } diff --git a/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java b/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java index 85d00b8b9571c..8b432660a7982 100644 --- a/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java +++ b/presto-hive/src/main/java/com/facebook/presto/hive/HivePageSourceProvider.java @@ -129,7 +129,7 @@ public HivePageSourceProvider( this.optimizedRowExpressionCache = CacheBuilder.newBuilder() .recordStats() .maximumSize(10_000) - .build(CacheLoader.from(cacheKey -> rowExpressionService.getExpressionOptimizer(cacheKey.session).optimize(cacheKey.rowExpression, OPTIMIZED, cacheKey.session))); + .build(CacheLoader.from(cacheKey -> rowExpressionService.getExpressionOptimizer(cacheKey.session).optimize(cacheKey.rowExpression, OPTIMIZED, cacheKey.session, false))); } @Override diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/TestDomainTranslator.java b/presto-hive/src/test/java/com/facebook/presto/hive/TestDomainTranslator.java index 7a02c67825c47..395ec23eabef7 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/TestDomainTranslator.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/TestDomainTranslator.java @@ -89,7 +89,7 @@ public class TestDomainTranslator private static final ExpressionOptimizer TEST_EXPRESSION_OPTIMIZER = new ExpressionOptimizer() { @Override - public RowExpression optimize(RowExpression rowExpression, Level level, ConnectorSession session) + public RowExpression optimize(RowExpression rowExpression, Level level, ConnectorSession session, boolean useBuiltInFunctions) { return rowExpression; } diff --git a/presto-hive/src/test/java/com/facebook/presto/hive/TestSubfieldExtractor.java b/presto-hive/src/test/java/com/facebook/presto/hive/TestSubfieldExtractor.java index 3b6b8328852a4..c03626802c8ed 100644 --- a/presto-hive/src/test/java/com/facebook/presto/hive/TestSubfieldExtractor.java +++ b/presto-hive/src/test/java/com/facebook/presto/hive/TestSubfieldExtractor.java @@ -74,7 +74,7 @@ public class TestSubfieldExtractor private static final ExpressionOptimizer TEST_EXPRESSION_OPTIMIZER = new ExpressionOptimizer() { @Override - public RowExpression optimize(RowExpression rowExpression, Level level, ConnectorSession session) + public RowExpression optimize(RowExpression rowExpression, Level level, ConnectorSession session, boolean useBuiltInFunctions) { return rowExpression; } diff --git a/presto-main-base/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java b/presto-main-base/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java index a25351ca7a88a..ad01b1524c667 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java +++ b/presto-main-base/src/main/java/com/facebook/presto/cost/ScalarStatsCalculator.java @@ -134,7 +134,7 @@ public VariableStatsEstimate visitCall(CallExpression call, Void context) return computeArithmeticBinaryStatistics(call, context); } - RowExpression value = expressionOptimizerProvider.getExpressionOptimizer(session).optimize(call, OPTIMIZED, session); + RowExpression value = expressionOptimizerProvider.getExpressionOptimizer(session).optimize(call, OPTIMIZED, session, false); if (isNull(value)) { return nullStatsEstimate(); diff --git a/presto-main-base/src/main/java/com/facebook/presto/cost/StatsCalculatorModule.java b/presto-main-base/src/main/java/com/facebook/presto/cost/StatsCalculatorModule.java index 41716b3d1e687..703a765cde720 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/cost/StatsCalculatorModule.java +++ b/presto-main-base/src/main/java/com/facebook/presto/cost/StatsCalculatorModule.java @@ -14,6 +14,7 @@ package com.facebook.presto.cost; import com.facebook.presto.metadata.Metadata; +import com.facebook.presto.sql.expressions.ExpressionOptimizerManager; import com.google.common.collect.ImmutableList; import com.google.inject.Binder; import com.google.inject.Module; @@ -36,6 +37,7 @@ public void configure(Binder binder) configBinder(binder).bindConfig(HistoryBasedOptimizationConfig.class); binder.bind(HistoryBasedPlanStatisticsManager.class).in(Scopes.SINGLETON); binder.bind(FragmentStatsProvider.class).in(Scopes.SINGLETON); + binder.bind(ExpressionOptimizerManager.class).in(Scopes.SINGLETON); } @Provides @@ -46,9 +48,10 @@ public static StatsCalculator createNewStatsCalculator( StatsNormalizer normalizer, FilterStatsCalculator filterStatsCalculator, HistoryBasedPlanStatisticsManager historyBasedPlanStatisticsManager, - FragmentStatsProvider fragmentStatsProvider) + FragmentStatsProvider fragmentStatsProvider, + ExpressionOptimizerManager expressionOptimizerManager) { - StatsCalculator delegate = createComposableStatsCalculator(metadata, scalarStatsCalculator, normalizer, filterStatsCalculator, fragmentStatsProvider); + StatsCalculator delegate = createComposableStatsCalculator(metadata, scalarStatsCalculator, normalizer, filterStatsCalculator, fragmentStatsProvider, expressionOptimizerManager); return historyBasedPlanStatisticsManager.getHistoryBasedPlanStatisticsCalculator(delegate); } @@ -57,14 +60,15 @@ public static ComposableStatsCalculator createComposableStatsCalculator( ScalarStatsCalculator scalarStatsCalculator, StatsNormalizer normalizer, FilterStatsCalculator filterStatsCalculator, - FragmentStatsProvider fragmentStatsProvider) + FragmentStatsProvider fragmentStatsProvider, + ExpressionOptimizerManager expressionOptimizerManager) { ImmutableList.Builder> rules = ImmutableList.builder(); rules.add(new OutputStatsRule()); rules.add(new TableScanStatsRule(metadata, normalizer)); rules.add(new SimpleFilterProjectSemiJoinStatsRule(normalizer, filterStatsCalculator, metadata.getFunctionAndTypeManager())); // this must be before FilterStatsRule rules.add(new FilterStatsRule(normalizer, filterStatsCalculator)); - rules.add(new ValuesStatsRule(metadata)); + rules.add(new ValuesStatsRule(metadata, expressionOptimizerManager)); rules.add(new LimitStatsRule(normalizer)); rules.add(new EnforceSingleRowStatsRule(normalizer)); rules.add(new ProjectStatsRule(scalarStatsCalculator, normalizer)); diff --git a/presto-main-base/src/main/java/com/facebook/presto/cost/ValuesStatsRule.java b/presto-main-base/src/main/java/com/facebook/presto/cost/ValuesStatsRule.java index a7c67756c4622..d6b6e2cd693f9 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/cost/ValuesStatsRule.java +++ b/presto-main-base/src/main/java/com/facebook/presto/cost/ValuesStatsRule.java @@ -19,7 +19,9 @@ import com.facebook.presto.matching.Pattern; import com.facebook.presto.metadata.Metadata; import com.facebook.presto.spi.plan.ValuesNode; +import com.facebook.presto.spi.relation.ExpressionOptimizer; import com.facebook.presto.spi.relation.VariableReferenceExpression; +import com.facebook.presto.sql.expressions.ExpressionOptimizerManager; import com.facebook.presto.sql.planner.TypeProvider; import com.facebook.presto.sql.planner.iterative.Lookup; @@ -32,8 +34,8 @@ import static com.facebook.presto.common.type.UnknownType.UNKNOWN; import static com.facebook.presto.cost.StatsUtil.toStatsRepresentation; +import static com.facebook.presto.spi.relation.ExpressionOptimizer.Level.EVALUATED; import static com.facebook.presto.spi.statistics.SourceInfo.ConfidenceLevel.FACT; -import static com.facebook.presto.sql.planner.RowExpressionInterpreter.evaluateConstantRowExpression; import static com.facebook.presto.sql.planner.plan.Patterns.values; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.util.stream.Collectors.toList; @@ -44,10 +46,12 @@ public class ValuesStatsRule private static final Pattern PATTERN = values(); private final Metadata metadata; + private final ExpressionOptimizerManager expressionOptimizerManager; - public ValuesStatsRule(Metadata metadata) + public ValuesStatsRule(Metadata metadata, ExpressionOptimizerManager expressionOptimizerManager) { this.metadata = metadata; + this.expressionOptimizerManager = expressionOptimizerManager; } @Override @@ -80,9 +84,10 @@ private List getVariableValues(ValuesNode valuesNode, int symbolId, Sess .mapToObj(rowId -> null) .collect(toList()); } + ExpressionOptimizer expressionOptimizer = expressionOptimizerManager.getExpressionOptimizer(session.toConnectorSession()); return valuesNode.getRows().stream() .map(row -> row.get(symbolId)) - .map(rowExpression -> evaluateConstantRowExpression(rowExpression, metadata.getFunctionAndTypeManager(), session.toConnectorSession())) + .map(rowExpression -> expressionOptimizer.optimize(rowExpression, EVALUATED, session.toConnectorSession(), true)) .collect(toList()); } diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java index fe2c124c5b54e..a323da8b6c34d 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/RowExpressionInterpreter.java @@ -15,6 +15,7 @@ import com.facebook.airlift.json.JsonCodec; import com.facebook.presto.client.FailureInfo; +import com.facebook.presto.common.QualifiedObjectName; import com.facebook.presto.common.block.BlockBuilder; import com.facebook.presto.common.block.RowBlockBuilder; import com.facebook.presto.common.function.OperatorType; @@ -71,6 +72,7 @@ import static com.facebook.presto.common.type.VarcharType.VARCHAR; import static com.facebook.presto.common.type.VarcharType.createVarcharType; import static com.facebook.presto.expressions.DynamicFilters.isDynamicFilter; +import static com.facebook.presto.metadata.BuiltInTypeAndFunctionNamespaceManager.JAVA_BUILTIN_NAMESPACE; import static com.facebook.presto.metadata.CastType.CAST; import static com.facebook.presto.metadata.CastType.JSON_TO_ARRAY_CAST; import static com.facebook.presto.metadata.CastType.JSON_TO_MAP_CAST; @@ -93,6 +95,7 @@ import static com.facebook.presto.spi.relation.SpecialFormExpression.Form.ROW_CONSTRUCTOR; import static com.facebook.presto.spi.relation.SpecialFormExpression.Form.SWITCH; import static com.facebook.presto.spi.relation.SpecialFormExpression.Form.WHEN; +import static com.facebook.presto.sql.analyzer.TypeSignatureProvider.fromTypeSignatures; 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.Interpreters.interpretDereference; @@ -129,7 +132,7 @@ public class RowExpressionInterpreter private final FunctionAndTypeManager functionAndTypeManager; private final FunctionResolution resolution; - private final Visitor visitor; + private Visitor visitor; public static Object evaluateConstantRowExpression(RowExpression expression, FunctionAndTypeManager functionAndTypeManager, ConnectorSession session) { @@ -144,6 +147,12 @@ public static RowExpressionInterpreter rowExpressionInterpreter(RowExpression ex return new RowExpressionInterpreter(expression, functionAndTypeManager, session, EVALUATED); } + public RowExpressionInterpreter(RowExpression expression, FunctionAndTypeManager functionAndTypeManager, ConnectorSession session, Level optimizationLevel, boolean useBuiltInFunction) + { + this(expression, functionAndTypeManager, session, optimizationLevel); + this.visitor = new Visitor(useBuiltInFunction); + } + public RowExpressionInterpreter(RowExpression expression, Metadata metadata, ConnectorSession session, Level optimizationLevel) { this(expression, metadata.getFunctionAndTypeManager(), session, optimizationLevel); @@ -160,7 +169,7 @@ public RowExpressionInterpreter(RowExpression expression, FunctionAndTypeManager this.resolution = new FunctionResolution(functionAndTypeManager.getFunctionAndTypeResolver()); this.functionAndTypeManager = functionAndTypeManager; - this.visitor = new Visitor(); + this.visitor = new Visitor(false); } public Type getType() @@ -192,6 +201,13 @@ public Object optimize(VariableResolver inputs) private class Visitor implements RowExpressionVisitor { + private final boolean useBuiltInFunctions; + + private Visitor(boolean useBuiltInFunctions) + { + this.useBuiltInFunctions = useBuiltInFunctions; + } + @Override public Object visitInputReference(InputReferenceExpression node, Object context) { @@ -224,8 +240,19 @@ public Object visitCall(CallExpression node, Object context) argumentTypes.add(expression.getType()); } - FunctionHandle functionHandle = node.getFunctionHandle(); - FunctionMetadata functionMetadata = functionAndTypeManager.getFunctionMetadata(node.getFunctionHandle()); + FunctionMetadata functionMetadata = null; + FunctionHandle functionHandle = null; + if (useBuiltInFunctions) { + functionHandle = functionAndTypeManager.lookupFunction( + QualifiedObjectName.valueOf(JAVA_BUILTIN_NAMESPACE, node.getDisplayName()), + fromTypeSignatures(node.getFunctionHandle().getArgumentTypes())); + functionMetadata = functionAndTypeManager.getFunctionAndTypeResolver().getFunctionMetadata(functionHandle); + } + else { + functionHandle = node.getFunctionHandle(); + functionMetadata = functionAndTypeManager.getFunctionMetadata(functionHandle); + } + if (!functionMetadata.isCalledOnNullInput()) { for (Object value : argumentValues) { if (value == null) { diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyRowExpressions.java b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyRowExpressions.java index b7192926bb807..6cbfd935bea50 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyRowExpressions.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/iterative/rule/SimplifyRowExpressions.java @@ -69,7 +69,7 @@ private RowExpression rewrite(RowExpression expression, Session session) // Rewrite RowExpression first to reduce depth of RowExpression tree by balancing AND/OR predicates. // It doesn't matter whether we rewrite/optimize first because this will be called by IterativeOptimizer. RowExpression rewritten = RowExpressionTreeRewriter.rewriteWith(logicalExpressionRewriter, expression, true); - return expressionOptimizerManager.getExpressionOptimizer(session.toConnectorSession()).optimize(rewritten, SERIALIZABLE, session.toConnectorSession()); + return expressionOptimizerManager.getExpressionOptimizer(session.toConnectorSession()).optimize(rewritten, SERIALIZABLE, session.toConnectorSession(), false); } } diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java index b5a4edaf0351f..88950c31f5dcb 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PredicatePushDown.java @@ -1439,7 +1439,7 @@ private boolean canConvertOuterToInner(List innerVa // Temporary implementation for joins because the SimplifyExpressions optimizers can not run properly on join clauses private RowExpression simplifyExpression(RowExpression expression) { - return expressionOptimizerProvider.getExpressionOptimizer(session.toConnectorSession()).optimize(expression, ExpressionOptimizer.Level.SERIALIZABLE, session.toConnectorSession()); + return expressionOptimizerProvider.getExpressionOptimizer(session.toConnectorSession()).optimize(expression, ExpressionOptimizer.Level.SERIALIZABLE, session.toConnectorSession(), false); } private boolean areExpressionsEquivalent(RowExpression leftExpression, RowExpression rightExpression) @@ -1454,7 +1454,7 @@ private RowExpression nullInputEvaluator(final Collection constantNull(variable.getSourceLocation(), variable.getType())))); - return expressionOptimizerProvider.getExpressionOptimizer(session.toConnectorSession()).optimize(expression, ExpressionOptimizer.Level.OPTIMIZED, session.toConnectorSession()); + return expressionOptimizerProvider.getExpressionOptimizer(session.toConnectorSession()).optimize(expression, ExpressionOptimizer.Level.OPTIMIZED, session.toConnectorSession(), false); } private Predicate joinEqualityExpression(final Collection leftVariables) diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java index 6a0a5d37c79d1..de2f552d473ea 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java @@ -591,7 +591,7 @@ private static Optional toSubfield( RowExpression indexExpression = expressionOptimizer.optimize( dereference.getArguments().get(1), ExpressionOptimizer.Level.OPTIMIZED, - connectorSession); + connectorSession, false); if (indexExpression instanceof ConstantExpression) { Object index = ((ConstantExpression) indexExpression).getValue(); @@ -613,7 +613,7 @@ private static Optional toSubfield( RowExpression indexExpression = expressionOptimizer.optimize( arguments.get(1), ExpressionOptimizer.Level.OPTIMIZED, - connectorSession); + connectorSession, false); if (indexExpression instanceof ConstantExpression) { Object index = ((ConstantExpression) indexExpression).getValue(); diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/relational/RowExpressionOptimizer.java b/presto-main-base/src/main/java/com/facebook/presto/sql/relational/RowExpressionOptimizer.java index 173b1c996e0ea..d0125afe735ac 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/relational/RowExpressionOptimizer.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/relational/RowExpressionOptimizer.java @@ -43,12 +43,12 @@ public RowExpressionOptimizer(FunctionAndTypeManager functionAndTypeManager) } @Override - public RowExpression optimize(RowExpression rowExpression, Level level, ConnectorSession session) + public RowExpression optimize(RowExpression rowExpression, Level level, ConnectorSession session, boolean useBuiltInFunctions) { if (level.ordinal() <= OPTIMIZED.ordinal()) { return toRowExpression(rowExpression.getSourceLocation(), new RowExpressionInterpreter(rowExpression, functionAndTypeManager, session, level).optimize(), rowExpression.getType()); } - throw new IllegalArgumentException("Not supported optimization level: " + level); + return toRowExpression(rowExpression.getSourceLocation(), new RowExpressionInterpreter(rowExpression, functionAndTypeManager, session, level, useBuiltInFunctions).evaluate(), rowExpression.getType()); } @Override diff --git a/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java b/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java index e6a1e2495ab06..fa1913e3d80d6 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java +++ b/presto-main-base/src/main/java/com/facebook/presto/testing/LocalQueryRunner.java @@ -478,7 +478,7 @@ private LocalQueryRunner(Session defaultSession, FeaturesConfig featuresConfig, this.filterStatsCalculator = new FilterStatsCalculator(metadata, scalarStatsCalculator, statsNormalizer); this.historyBasedPlanStatisticsManager = new HistoryBasedPlanStatisticsManager(objectMapper, createTestingSessionPropertyManager(), metadata, new HistoryBasedOptimizationConfig(), featuresConfig, new NodeVersion("1")); this.fragmentStatsProvider = new FragmentStatsProvider(); - this.statsCalculator = createNewStatsCalculator(metadata, scalarStatsCalculator, statsNormalizer, filterStatsCalculator, historyBasedPlanStatisticsManager, fragmentStatsProvider); + this.statsCalculator = createNewStatsCalculator(metadata, scalarStatsCalculator, statsNormalizer, filterStatsCalculator, historyBasedPlanStatisticsManager, fragmentStatsProvider, expressionOptimizerManager); this.taskCountEstimator = new TaskCountEstimator(() -> nodeCountForStats); this.costCalculator = new CostCalculatorUsingExchanges(taskCountEstimator); this.estimatedExchangesCostCalculator = new CostCalculatorWithEstimatedExchanges(costCalculator, taskCountEstimator); diff --git a/presto-main-base/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonExtract.java b/presto-main-base/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonExtract.java index 2c934134d5170..1064433d5f99a 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonExtract.java +++ b/presto-main-base/src/test/java/com/facebook/presto/operator/scalar/BenchmarkJsonExtract.java @@ -137,7 +137,7 @@ private RowExpression rowExpression(String value) Map, Type> expressionTypes = getExpressionTypes(TEST_SESSION, METADATA, SQL_PARSER, TypeProvider.copyOf(symbolTypes), expression, emptyMap(), WarningCollector.NOOP); RowExpression rowExpression = SqlToRowExpressionTranslator.translate(expression, expressionTypes, sourceLayout, METADATA.getFunctionAndTypeManager(), TEST_SESSION); RowExpressionOptimizer optimizer = new RowExpressionOptimizer(METADATA); - return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession()); + return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession(), false); } private static Block createChannel() diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/TestRowExpressionSerde.java b/presto-main-base/src/test/java/com/facebook/presto/sql/TestRowExpressionSerde.java index 485dbfbacdfc8..c1e453a4941df 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/TestRowExpressionSerde.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/TestRowExpressionSerde.java @@ -271,7 +271,7 @@ private RowExpression translate(Expression expression, boolean optimize) RowExpression rowExpression = SqlToRowExpressionTranslator.translate(expression, getExpressionTypes(expression), ImmutableMap.of(), metadata.getFunctionAndTypeManager(), TEST_SESSION); if (optimize) { RowExpressionOptimizer optimizer = new RowExpressionOptimizer(metadata); - return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession()); + return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession(), false); } return rowExpression; } diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/TestingRowExpressionTranslator.java b/presto-main-base/src/test/java/com/facebook/presto/sql/TestingRowExpressionTranslator.java index fe2f86d8d92ff..0256498efa7f7 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/TestingRowExpressionTranslator.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/TestingRowExpressionTranslator.java @@ -82,7 +82,7 @@ public RowExpression translateAndOptimize(Expression expression, Map, Type> expressionTypes = getExpressionTypes(TEST_SESSION, METADATA, SQL_PARSER, TypeProvider.copyOf(symbolTypes), expression, emptyMap(), WarningCollector.NOOP); RowExpression rowExpression = SqlToRowExpressionTranslator.translate(expression, expressionTypes, sourceLayout, METADATA.getFunctionAndTypeManager(), TEST_SESSION); RowExpressionOptimizer optimizer = new RowExpressionOptimizer(METADATA); - return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession()); + return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession(), false); } private static Page createPage(String functionType, boolean dictionary) diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java b/presto-main-base/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java index 3061e5625896c..9deadbe9055bf 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/gen/PageProcessorBenchmark.java @@ -184,7 +184,7 @@ private RowExpression rowExpression(String value) Map, Type> expressionTypes = getExpressionTypes(TEST_SESSION, METADATA, SQL_PARSER, TypeProvider.copyOf(symbolTypes), expression, emptyMap(), WarningCollector.NOOP); RowExpression rowExpression = SqlToRowExpressionTranslator.translate(expression, expressionTypes, sourceLayout, METADATA.getFunctionAndTypeManager(), TEST_SESSION); RowExpressionOptimizer optimizer = new RowExpressionOptimizer(METADATA); - return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession()); + return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession(), false); } private static Page createPage(List types, boolean dictionary) diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java index f6e6fcb94ed27..15d42d6cf570e 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/TestRowExpressionFormatter.java @@ -263,7 +263,7 @@ public void testCalls() constant(utf8Slice("prefix%"), VARCHAR))); assertEquals(format(callExpression), "c_varchar LIKE VARCHAR'prefix%'"); - callExpression = OPTIMIZER.optimize(callExpression, OPTIMIZED, SESSION); + callExpression = OPTIMIZER.optimize(callExpression, OPTIMIZED, SESSION, false); assertTrue(format(callExpression).startsWith("c_varchar LIKE LIKEPATTERN'io.airlift.joni.Regex@")); // like escape @@ -280,7 +280,7 @@ public void testCalls() constant(utf8Slice("$"), VARCHAR))); assertEquals(format(callExpression), "c_varchar LIKE VARCHAR'%escaped$_' ESCAPE VARCHAR'$'"); - callExpression = OPTIMIZER.optimize(callExpression, OPTIMIZED, SESSION); + callExpression = OPTIMIZER.optimize(callExpression, OPTIMIZED, SESSION, false); assertTrue(format(callExpression).startsWith("c_varchar LIKE LIKEPATTERN'io.airlift.joni.Regex@")); } diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/relational/TestRowExpressionOptimizer.java b/presto-main-base/src/test/java/com/facebook/presto/sql/relational/TestRowExpressionOptimizer.java index dca72b62123ef..ac13b58110a12 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/relational/TestRowExpressionOptimizer.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/relational/TestRowExpressionOptimizer.java @@ -141,6 +141,6 @@ private static RowExpression ifExpression(RowExpression condition, long trueValu private RowExpression optimize(RowExpression expression) { - return optimizer.optimize(expression, OPTIMIZED, SESSION); + return optimizer.optimize(expression, OPTIMIZED, SESSION, false); } } diff --git a/presto-main-base/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java b/presto-main-base/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java index eb26a38db4e13..bc9c9d03a9652 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java +++ b/presto-main-base/src/test/java/com/facebook/presto/type/BenchmarkDecimalOperators.java @@ -611,7 +611,7 @@ private RowExpression rowExpression(String value) Map, Type> expressionTypes = getExpressionTypes(TEST_SESSION, metadata, SQL_PARSER, TypeProvider.copyOf(symbolTypes), expression, emptyMap(), WarningCollector.NOOP); RowExpression rowExpression = SqlToRowExpressionTranslator.translate(expression, expressionTypes, sourceLayout, metadata.getFunctionAndTypeManager(), TEST_SESSION); RowExpressionOptimizer optimizer = new RowExpressionOptimizer(metadata); - return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession()); + return optimizer.optimize(rowExpression, OPTIMIZED, TEST_SESSION.toConnectorSession(), false); } private Object generateRandomValue(Type type) diff --git a/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java b/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java index 1dcafec04678c..48e7abc3ea960 100644 --- a/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java +++ b/presto-parquet/src/main/java/com/facebook/presto/parquet/rule/ParquetDereferencePushDown.java @@ -182,7 +182,7 @@ private Subfield createNestedColumn( RowExpression indexExpression = expressionOptimizer.optimize( dereferenceExpression.getArguments().get(1), ExpressionOptimizer.Level.OPTIMIZED, - session); + session, false); if (indexExpression instanceof ConstantExpression) { Object index = ((ConstantExpression) indexExpression).getValue(); @@ -245,7 +245,7 @@ public Void visitSpecialForm(SpecialFormExpression specialForm, Set variable); }