Skip to content

Commit

Permalink
Split IR type analyzer
Browse files Browse the repository at this point in the history
  • Loading branch information
martint committed Feb 3, 2024
1 parent b6be3ef commit bee5789
Show file tree
Hide file tree
Showing 124 changed files with 1,005 additions and 431 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@
import io.trino.sql.analyzer.ExpressionAnalyzer;
import io.trino.sql.analyzer.Scope;
import io.trino.sql.planner.IrExpressionInterpreter;
import io.trino.sql.planner.IrTypeAnalyzer;
import io.trino.sql.planner.LiteralEncoder;
import io.trino.sql.planner.NoOpSymbolResolver;
import io.trino.sql.planner.Symbol;
import io.trino.sql.planner.TypeAnalyzer;
import io.trino.sql.planner.TypeProvider;
import io.trino.sql.tree.AstVisitor;
import io.trino.sql.tree.BetweenPredicate;
Expand Down Expand Up @@ -93,10 +93,10 @@ public class FilterStatsCalculator
private final PlannerContext plannerContext;
private final ScalarStatsCalculator scalarStatsCalculator;
private final StatsNormalizer normalizer;
private final TypeAnalyzer typeAnalyzer;
private final IrTypeAnalyzer typeAnalyzer;

@Inject
public FilterStatsCalculator(PlannerContext plannerContext, ScalarStatsCalculator scalarStatsCalculator, StatsNormalizer normalizer, TypeAnalyzer typeAnalyzer)
public FilterStatsCalculator(PlannerContext plannerContext, ScalarStatsCalculator scalarStatsCalculator, StatsNormalizer normalizer, IrTypeAnalyzer typeAnalyzer)
{
this.plannerContext = requireNonNull(plannerContext, "plannerContext is null");
this.scalarStatsCalculator = requireNonNull(scalarStatsCalculator, "scalarStatsCalculator is null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@
import io.trino.sql.analyzer.ExpressionAnalyzer;
import io.trino.sql.analyzer.Scope;
import io.trino.sql.planner.IrExpressionInterpreter;
import io.trino.sql.planner.IrTypeAnalyzer;
import io.trino.sql.planner.LiteralInterpreter;
import io.trino.sql.planner.NoOpSymbolResolver;
import io.trino.sql.planner.Symbol;
import io.trino.sql.planner.TypeAnalyzer;
import io.trino.sql.planner.TypeProvider;
import io.trino.sql.tree.ArithmeticBinaryExpression;
import io.trino.sql.tree.ArithmeticUnaryExpression;
Expand Down Expand Up @@ -63,10 +63,10 @@
public class ScalarStatsCalculator
{
private final PlannerContext plannerContext;
private final TypeAnalyzer typeAnalyzer;
private final IrTypeAnalyzer typeAnalyzer;

@Inject
public ScalarStatsCalculator(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer)
public ScalarStatsCalculator(PlannerContext plannerContext, IrTypeAnalyzer typeAnalyzer)
{
this.plannerContext = requireNonNull(plannerContext, "plannerContext cannot be null");
this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
import io.trino.sql.analyzer.Analyzer;
import io.trino.sql.analyzer.AnalyzerFactory;
import io.trino.sql.planner.InputExtractor;
import io.trino.sql.planner.IrTypeAnalyzer;
import io.trino.sql.planner.LogicalPlanner;
import io.trino.sql.planner.NodePartitioningManager;
import io.trino.sql.planner.Plan;
Expand All @@ -66,7 +67,6 @@
import io.trino.sql.planner.PlanOptimizersFactory;
import io.trino.sql.planner.SplitSourceFactory;
import io.trino.sql.planner.SubPlan;
import io.trino.sql.planner.TypeAnalyzer;
import io.trino.sql.planner.optimizations.PlanOptimizer;
import io.trino.sql.planner.plan.OutputNode;
import io.trino.sql.tree.ExplainAnalyze;
Expand Down Expand Up @@ -133,7 +133,7 @@ public class SqlQueryExecution
private final CostCalculator costCalculator;
private final DynamicFilterService dynamicFilterService;
private final TableExecuteContextManager tableExecuteContextManager;
private final TypeAnalyzer typeAnalyzer;
private final IrTypeAnalyzer typeAnalyzer;
private final SqlTaskManager coordinatorTaskManager;
private final ExchangeManagerRegistry exchangeManagerRegistry;
private final EventDrivenTaskSourceFactory eventDrivenTaskSourceFactory;
Expand Down Expand Up @@ -170,7 +170,7 @@ private SqlQueryExecution(
WarningCollector warningCollector,
PlanOptimizersStatsCollector planOptimizersStatsCollector,
TableExecuteContextManager tableExecuteContextManager,
TypeAnalyzer typeAnalyzer,
IrTypeAnalyzer typeAnalyzer,
SqlTaskManager coordinatorTaskManager,
ExchangeManagerRegistry exchangeManagerRegistry,
EventDrivenTaskSourceFactory eventDrivenTaskSourceFactory,
Expand Down Expand Up @@ -766,7 +766,7 @@ public static class SqlQueryExecutionFactory
private final CostCalculator costCalculator;
private final DynamicFilterService dynamicFilterService;
private final TableExecuteContextManager tableExecuteContextManager;
private final TypeAnalyzer typeAnalyzer;
private final IrTypeAnalyzer typeAnalyzer;
private final SqlTaskManager coordinatorTaskManager;
private final ExchangeManagerRegistry exchangeManagerRegistry;
private final EventDrivenTaskSourceFactory eventDrivenTaskSourceFactory;
Expand Down Expand Up @@ -798,7 +798,7 @@ public static class SqlQueryExecutionFactory
CostCalculator costCalculator,
DynamicFilterService dynamicFilterService,
TableExecuteContextManager tableExecuteContextManager,
TypeAnalyzer typeAnalyzer,
IrTypeAnalyzer typeAnalyzer,
SqlTaskManager coordinatorTaskManager,
ExchangeManagerRegistry exchangeManagerRegistry,
EventDrivenTaskSourceFactory eventDrivenTaskSourceFactory,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,11 @@
import io.trino.sql.gen.PageFunctionCompiler;
import io.trino.sql.parser.SqlParser;
import io.trino.sql.planner.CompilerConfig;
import io.trino.sql.planner.IrTypeAnalyzer;
import io.trino.sql.planner.LocalExecutionPlanner;
import io.trino.sql.planner.NodePartitioningManager;
import io.trino.sql.planner.OptimizerConfig;
import io.trino.sql.planner.RuleStatsRecorder;
import io.trino.sql.planner.TypeAnalyzer;
import io.trino.sql.tree.Expression;
import io.trino.tracing.ForTracing;
import io.trino.tracing.TracingMetadata;
Expand Down Expand Up @@ -408,7 +408,7 @@ protected void setup(Binder binder)
binder.bind(RegisterFunctionBundles.class).asEagerSingleton();

// type
binder.bind(TypeAnalyzer.class).in(Scopes.SINGLETON);
binder.bind(IrTypeAnalyzer.class).in(Scopes.SINGLETON);
jsonBinder(binder).addDeserializerBinding(Type.class).to(TypeDeserializer.class);
jsonBinder(binder).addDeserializerBinding(TypeSignature.class).to(TypeSignatureDeserializer.class);
jsonBinder(binder).addKeyDeserializerBinding(TypeSignature.class).to(TypeSignatureKeyDeserializer.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
import io.trino.spi.type.Type;
import io.trino.sql.planner.DeterminismEvaluator;
import io.trino.sql.planner.IrExpressionInterpreter;
import io.trino.sql.planner.IrTypeAnalyzer;
import io.trino.sql.planner.LiteralEncoder;
import io.trino.sql.planner.NoOpSymbolResolver;
import io.trino.sql.planner.Symbol;
import io.trino.sql.planner.SymbolsExtractor;
import io.trino.sql.planner.TypeAnalyzer;
import io.trino.sql.planner.TypeProvider;
import io.trino.sql.tree.Cast;
import io.trino.sql.tree.Expression;
Expand Down Expand Up @@ -298,7 +298,7 @@ public static boolean isEffectivelyLiteral(PlannerContext plannerContext, Sessio

private static boolean constantExpressionEvaluatesSuccessfully(PlannerContext plannerContext, Session session, Expression constantExpression)
{
Map<NodeRef<Expression>, Type> types = TypeAnalyzer.createTestingTypeAnalyzer(plannerContext).getTypes(session, TypeProvider.empty(), constantExpression);
Map<NodeRef<Expression>, Type> types = new IrTypeAnalyzer(plannerContext).getTypes(session, TypeProvider.empty(), constantExpression);
IrExpressionInterpreter interpreter = new IrExpressionInterpreter(constantExpression, plannerContext, session, types);
Object literalValue = interpreter.optimize(NoOpSymbolResolver.INSTANCE);
return !(literalValue instanceof Expression);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@
import io.trino.spi.TrinoException;
import io.trino.sql.PlannerContext;
import io.trino.sql.SqlFormatter;
import io.trino.sql.planner.IrTypeAnalyzer;
import io.trino.sql.planner.LogicalPlanner;
import io.trino.sql.planner.Plan;
import io.trino.sql.planner.PlanFragmenter;
import io.trino.sql.planner.PlanNodeIdAllocator;
import io.trino.sql.planner.PlanOptimizersFactory;
import io.trino.sql.planner.SubPlan;
import io.trino.sql.planner.TypeAnalyzer;
import io.trino.sql.planner.optimizations.PlanOptimizer;
import io.trino.sql.planner.planprinter.PlanPrinter;
import io.trino.sql.tree.CreateCatalog;
Expand Down Expand Up @@ -63,7 +63,6 @@ public class QueryExplainer
private final PlanFragmenter planFragmenter;
private final PlannerContext plannerContext;
private final AnalyzerFactory analyzerFactory;
private final StatementAnalyzerFactory statementAnalyzerFactory;
private final StatsCalculator statsCalculator;
private final CostCalculator costCalculator;
private final NodeVersion version;
Expand All @@ -73,7 +72,6 @@ public class QueryExplainer
PlanFragmenter planFragmenter,
PlannerContext plannerContext,
AnalyzerFactory analyzerFactory,
StatementAnalyzerFactory statementAnalyzerFactory,
StatsCalculator statsCalculator,
CostCalculator costCalculator,
NodeVersion version)
Expand All @@ -82,7 +80,6 @@ public class QueryExplainer
this.planFragmenter = requireNonNull(planFragmenter, "planFragmenter is null");
this.plannerContext = requireNonNull(plannerContext, "plannerContext is null");
this.analyzerFactory = requireNonNull(analyzerFactory, "analyzerFactory is null");
this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null");
this.statsCalculator = requireNonNull(statsCalculator, "statsCalculator is null");
this.costCalculator = requireNonNull(costCalculator, "costCalculator is null");
this.version = requireNonNull(version, "version is null");
Expand Down Expand Up @@ -171,7 +168,7 @@ public Plan getLogicalPlan(Session session, Statement statement, List<Expression
planOptimizers,
idAllocator,
plannerContext,
new TypeAnalyzer(plannerContext, statementAnalyzerFactory),
new IrTypeAnalyzer(plannerContext),
statsCalculator,
costCalculator,
warningCollector,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ public class QueryExplainerFactory
private final PlanOptimizersFactory planOptimizersFactory;
private final PlanFragmenter planFragmenter;
private final PlannerContext plannerContext;
private final StatementAnalyzerFactory statementAnalyzerFactory;
private final StatsCalculator statsCalculator;
private final CostCalculator costCalculator;
private final NodeVersion version;
Expand All @@ -38,15 +37,13 @@ public QueryExplainerFactory(
PlanOptimizersFactory planOptimizersFactory,
PlanFragmenter planFragmenter,
PlannerContext plannerContext,
StatementAnalyzerFactory statementAnalyzerFactory,
StatsCalculator statsCalculator,
CostCalculator costCalculator,
NodeVersion version)
{
this.planOptimizersFactory = requireNonNull(planOptimizersFactory, "planOptimizersFactory is null");
this.planFragmenter = requireNonNull(planFragmenter, "planFragmenter is null");
this.plannerContext = requireNonNull(plannerContext, "metadata is null");
this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null");
this.statsCalculator = requireNonNull(statsCalculator, "statsCalculator is null");
this.costCalculator = requireNonNull(costCalculator, "costCalculator is null");
this.version = requireNonNull(version, "version is null");
Expand All @@ -59,7 +56,6 @@ public QueryExplainer createQueryExplainer(AnalyzerFactory analyzerFactory)
planFragmenter,
plannerContext,
analyzerFactory,
statementAnalyzerFactory,
statsCalculator,
costCalculator,
version);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.trino.sql.planner;
package io.trino.sql.analyzer;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
Expand All @@ -24,7 +24,7 @@
import io.trino.security.AllowAllAccessControl;
import io.trino.spi.type.Type;
import io.trino.sql.PlannerContext;
import io.trino.sql.analyzer.StatementAnalyzerFactory;
import io.trino.sql.planner.TypeProvider;
import io.trino.sql.tree.Expression;
import io.trino.sql.tree.NodeRef;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public static Expression translate(Session session, ConnectorExpression expressi
.orElseThrow(() -> new UnsupportedOperationException("Expression is not supported: " + expression.toString()));
}

public static Optional<ConnectorExpression> translate(Session session, Expression expression, TypeProvider types, PlannerContext plannerContext, TypeAnalyzer typeAnalyzer)
public static Optional<ConnectorExpression> translate(Session session, Expression expression, TypeProvider types, PlannerContext plannerContext, IrTypeAnalyzer typeAnalyzer)
{
return new SqlToConnectorExpressionTranslator(session, typeAnalyzer.getTypes(session, types, expression), plannerContext)
.process(expression);
Expand All @@ -142,7 +142,7 @@ public static ConnectorExpressionTranslation translateConjuncts(
Expression expression,
TypeProvider types,
PlannerContext plannerContext,
TypeAnalyzer typeAnalyzer)
IrTypeAnalyzer typeAnalyzer)
{
Map<NodeRef<Expression>, Type> remainingExpressionTypes = typeAnalyzer.getTypes(session, types, expression);
ConnectorExpressionTranslator.SqlToConnectorExpressionTranslator translator = new ConnectorExpressionTranslator.SqlToConnectorExpressionTranslator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,12 @@
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.PeekingIterator;
import io.airlift.slice.Slice;
import io.airlift.slice.Slices;
import io.trino.Session;
import io.trino.connector.CatalogServiceProvider;
import io.trino.metadata.AnalyzePropertyManager;
import io.trino.metadata.OperatorNotFoundException;
import io.trino.metadata.ResolvedFunction;
import io.trino.metadata.TableFunctionRegistry;
import io.trino.metadata.TableProceduresPropertyManager;
import io.trino.metadata.TableProceduresRegistry;
import io.trino.metadata.TablePropertyManager;
import io.trino.security.AllowAllAccessControl;
import io.trino.spi.ErrorCode;
import io.trino.spi.TrinoException;
Expand All @@ -47,9 +40,6 @@
import io.trino.spi.type.VarcharType;
import io.trino.sql.InterpretedFunctionInvoker;
import io.trino.sql.PlannerContext;
import io.trino.sql.analyzer.SessionTimeProvider;
import io.trino.sql.analyzer.StatementAnalyzerFactory;
import io.trino.sql.parser.SqlParser;
import io.trino.sql.tree.AstVisitor;
import io.trino.sql.tree.BetweenPredicate;
import io.trino.sql.tree.BooleanLiteral;
Expand All @@ -67,7 +57,6 @@
import io.trino.sql.tree.NullLiteral;
import io.trino.sql.tree.StringLiteral;
import io.trino.sql.tree.SymbolReference;
import io.trino.transaction.NoOpTransactionManager;
import io.trino.type.LikeFunctions;
import io.trino.type.LikePattern;
import io.trino.type.LikePatternType;
Expand Down Expand Up @@ -318,20 +307,7 @@ private static boolean isBetween(Range range)
public static ExtractionResult getExtractionResult(PlannerContext plannerContext, Session session, Expression predicate, TypeProvider types)
{
// This is a limited type analyzer for the simple expressions used in this method
TypeAnalyzer typeAnalyzer = new TypeAnalyzer(
plannerContext,
new StatementAnalyzerFactory(
plannerContext,
new SqlParser(),
SessionTimeProvider.DEFAULT,
new AllowAllAccessControl(),
new NoOpTransactionManager(),
user -> ImmutableSet.of(),
new TableProceduresRegistry(CatalogServiceProvider.fail("procedures are not supported in domain translator")),
new TableFunctionRegistry(CatalogServiceProvider.fail("table functions are not supported in domain translator")),
new TablePropertyManager(CatalogServiceProvider.fail("table properties not supported in domain translator")),
new AnalyzePropertyManager(CatalogServiceProvider.fail("analyze properties not supported in domain translator")),
new TableProceduresPropertyManager(CatalogServiceProvider.fail("procedures are not supported in domain translator"))));
IrTypeAnalyzer typeAnalyzer = new IrTypeAnalyzer(plannerContext);
return new Visitor(plannerContext, session, types, typeAnalyzer).process(predicate, false);
}

Expand All @@ -343,10 +319,10 @@ private static class Visitor
private final Session session;
private final TypeProvider types;
private final InterpretedFunctionInvoker functionInvoker;
private final TypeAnalyzer typeAnalyzer;
private final IrTypeAnalyzer typeAnalyzer;
private final TypeCoercion typeCoercion;

private Visitor(PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer)
private Visitor(PlannerContext plannerContext, Session session, TypeProvider types, IrTypeAnalyzer typeAnalyzer)
{
this.plannerContext = requireNonNull(plannerContext, "plannerContext is null");
this.literalEncoder = new LiteralEncoder(plannerContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public EffectivePredicateExtractor(DomainTranslator domainTranslator, PlannerCon
this.useTableProperties = useTableProperties;
}

public Expression extract(Session session, PlanNode node, TypeProvider types, TypeAnalyzer typeAnalyzer)
public Expression extract(Session session, PlanNode node, TypeProvider types, IrTypeAnalyzer typeAnalyzer)
{
return node.accept(new Visitor(domainTranslator, plannerContext, session, types, typeAnalyzer, useTableProperties), null);
}
Expand All @@ -122,10 +122,10 @@ private static class Visitor
private final Metadata metadata;
private final Session session;
private final TypeProvider types;
private final TypeAnalyzer typeAnalyzer;
private final IrTypeAnalyzer typeAnalyzer;
private final boolean useTableProperties;

public Visitor(DomainTranslator domainTranslator, PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer, boolean useTableProperties)
public Visitor(DomainTranslator domainTranslator, PlannerContext plannerContext, Session session, TypeProvider types, IrTypeAnalyzer typeAnalyzer, boolean useTableProperties)
{
this.domainTranslator = requireNonNull(domainTranslator, "domainTranslator is null");
this.plannerContext = requireNonNull(plannerContext, "plannerContext is null");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,9 @@ private boolean isEqual(Object operand1, Type type1, Object operand2, Type type2

private Type type(Expression expression)
{
return expressionTypes.get(NodeRef.of(expression));
Type type = expressionTypes.get(NodeRef.of(expression));
checkState(type != null, "Type not found for expression: %s", expression);
return type;
}

@Override
Expand Down
Loading

0 comments on commit bee5789

Please sign in to comment.