diff --git a/core/trino-main/src/main/java/io/trino/connector/ConnectorManager.java b/core/trino-main/src/main/java/io/trino/connector/ConnectorManager.java index 145f461fd49d..89628885ab01 100644 --- a/core/trino-main/src/main/java/io/trino/connector/ConnectorManager.java +++ b/core/trino-main/src/main/java/io/trino/connector/ConnectorManager.java @@ -25,12 +25,21 @@ import io.trino.eventlistener.EventListenerManager; import io.trino.execution.scheduler.NodeSchedulerConfig; import io.trino.index.IndexManager; +import io.trino.metadata.AnalyzePropertyManager; import io.trino.metadata.Catalog; import io.trino.metadata.Catalog.SecurityManagement; import io.trino.metadata.CatalogManager; +import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.HandleResolver; import io.trino.metadata.InternalNodeManager; +import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.MetadataManager; +import io.trino.metadata.ProcedureRegistry; +import io.trino.metadata.SchemaPropertyManager; +import io.trino.metadata.SessionPropertyManager; +import io.trino.metadata.TableProceduresPropertyManager; +import io.trino.metadata.TableProceduresRegistry; +import io.trino.metadata.TablePropertyManager; import io.trino.security.AccessControlManager; import io.trino.spi.PageIndexerFactory; import io.trino.spi.PageSorter; @@ -52,14 +61,13 @@ import io.trino.spi.eventlistener.EventListener; import io.trino.spi.procedure.Procedure; import io.trino.spi.session.PropertyMetadata; -import io.trino.spi.type.TypeOperators; +import io.trino.spi.type.TypeManager; import io.trino.split.PageSinkManager; import io.trino.split.PageSourceManager; import io.trino.split.RecordPageSourceProvider; import io.trino.split.SplitManager; import io.trino.sql.planner.NodePartitioningManager; import io.trino.transaction.TransactionManager; -import io.trino.type.InternalTypeManager; import javax.annotation.PreDestroy; import javax.annotation.concurrent.GuardedBy; @@ -107,7 +115,16 @@ public class ConnectorManager private final VersionEmbedder versionEmbedder; private final TransactionManager transactionManager; private final EventListenerManager eventListenerManager; - private final TypeOperators typeOperators; + private final TypeManager typeManager; + private final ProcedureRegistry procedureRegistry; + private final TableProceduresRegistry tableProceduresRegistry; + private final SessionPropertyManager sessionPropertyManager; + private final SchemaPropertyManager schemaPropertyManager; + private final ColumnPropertyManager columnPropertyManager; + private final TablePropertyManager tablePropertyManager; + private final MaterializedViewPropertyManager materializedViewPropertyManager; + private final AnalyzePropertyManager analyzePropertyManager; + private final TableProceduresPropertyManager tableProceduresPropertyManager; private final boolean schedulerIncludeCoordinator; @@ -137,7 +154,16 @@ public ConnectorManager( PageIndexerFactory pageIndexerFactory, TransactionManager transactionManager, EventListenerManager eventListenerManager, - TypeOperators typeOperators, + TypeManager typeManager, + ProcedureRegistry procedureRegistry, + TableProceduresRegistry tableProceduresRegistry, + SessionPropertyManager sessionPropertyManager, + SchemaPropertyManager schemaPropertyManager, + ColumnPropertyManager columnPropertyManager, + TablePropertyManager tablePropertyManager, + MaterializedViewPropertyManager materializedViewPropertyManager, + AnalyzePropertyManager analyzePropertyManager, + TableProceduresPropertyManager tableProceduresPropertyManager, NodeSchedulerConfig nodeSchedulerConfig) { this.metadataManager = metadataManager; @@ -156,7 +182,16 @@ public ConnectorManager( this.versionEmbedder = versionEmbedder; this.transactionManager = transactionManager; this.eventListenerManager = eventListenerManager; - this.typeOperators = typeOperators; + this.typeManager = typeManager; + this.procedureRegistry = procedureRegistry; + this.tableProceduresRegistry = tableProceduresRegistry; + this.sessionPropertyManager = sessionPropertyManager; + this.schemaPropertyManager = schemaPropertyManager; + this.columnPropertyManager = columnPropertyManager; + this.tablePropertyManager = tablePropertyManager; + this.materializedViewPropertyManager = materializedViewPropertyManager; + this.analyzePropertyManager = analyzePropertyManager; + this.tableProceduresPropertyManager = tableProceduresPropertyManager; this.schedulerIncludeCoordinator = nodeSchedulerConfig.isIncludeCoordinator(); } @@ -300,22 +335,22 @@ private synchronized void addConnectorInternal(MaterializedConnector connector) connector.getPartitioningProvider() .ifPresent(partitioningProvider -> nodePartitioningManager.addPartitioningProvider(catalogName, partitioningProvider)); - metadataManager.getProcedureRegistry().addProcedures(catalogName, connector.getProcedures()); + procedureRegistry.addProcedures(catalogName, connector.getProcedures()); Set tableProcedures = connector.getTableProcedures(); - metadataManager.getTableProcedureRegistry().addTableProcedures(catalogName, tableProcedures); + tableProceduresRegistry.addTableProcedures(catalogName, tableProcedures); connector.getAccessControl() .ifPresent(accessControl -> accessControlManager.addCatalogAccessControl(catalogName, accessControl)); - metadataManager.getTablePropertyManager().addProperties(catalogName, connector.getTableProperties()); - metadataManager.getMaterializedViewPropertyManager().addProperties(catalogName, connector.getMaterializedViewProperties()); - metadataManager.getColumnPropertyManager().addProperties(catalogName, connector.getColumnProperties()); - metadataManager.getSchemaPropertyManager().addProperties(catalogName, connector.getSchemaProperties()); - metadataManager.getAnalyzePropertyManager().addProperties(catalogName, connector.getAnalyzeProperties()); + tablePropertyManager.addProperties(catalogName, connector.getTableProperties()); + materializedViewPropertyManager.addProperties(catalogName, connector.getMaterializedViewProperties()); + columnPropertyManager.addProperties(catalogName, connector.getColumnProperties()); + schemaPropertyManager.addProperties(catalogName, connector.getSchemaProperties()); + analyzePropertyManager.addProperties(catalogName, connector.getAnalyzeProperties()); for (TableProcedureMetadata tableProcedure : tableProcedures) { - metadataManager.getTableProceduresPropertyManager().addProperties(catalogName, tableProcedure.getName(), tableProcedure.getProperties()); + tableProceduresPropertyManager.addProperties(catalogName, tableProcedure.getName(), tableProcedure.getProperties()); } - metadataManager.getSessionPropertyManager().addConnectorSessionProperties(catalogName, connector.getSessionProperties()); + sessionPropertyManager.addConnectorSessionProperties(catalogName, connector.getSessionProperties()); } public synchronized void dropConnection(String catalogName) @@ -338,16 +373,16 @@ private synchronized void removeConnectorInternal(CatalogName catalogName) pageSinkManager.removeConnectorPageSinkProvider(catalogName); indexManager.removeIndexProvider(catalogName); nodePartitioningManager.removePartitioningProvider(catalogName); - metadataManager.getProcedureRegistry().removeProcedures(catalogName); - metadataManager.getTableProcedureRegistry().removeProcedures(catalogName); + procedureRegistry.removeProcedures(catalogName); + tableProceduresRegistry.removeProcedures(catalogName); accessControlManager.removeCatalogAccessControl(catalogName); - metadataManager.getTablePropertyManager().removeProperties(catalogName); - metadataManager.getMaterializedViewPropertyManager().removeProperties(catalogName); - metadataManager.getColumnPropertyManager().removeProperties(catalogName); - metadataManager.getSchemaPropertyManager().removeProperties(catalogName); - metadataManager.getAnalyzePropertyManager().removeProperties(catalogName); - metadataManager.getTableProceduresPropertyManager().removeProperties(catalogName); - metadataManager.getSessionPropertyManager().removeConnectorSessionProperties(catalogName); + tablePropertyManager.removeProperties(catalogName); + materializedViewPropertyManager.removeProperties(catalogName); + columnPropertyManager.removeProperties(catalogName); + schemaPropertyManager.removeProperties(catalogName); + analyzePropertyManager.removeProperties(catalogName); + tableProceduresPropertyManager.removeProperties(catalogName); + sessionPropertyManager.removeConnectorSessionProperties(catalogName); MaterializedConnector materializedConnector = connectors.remove(catalogName); if (materializedConnector != null) { @@ -366,8 +401,8 @@ private Connector createConnector(CatalogName catalogName, InternalConnectorFact ConnectorContext context = new ConnectorContextInstance( new ConnectorAwareNodeManager(nodeManager, nodeInfo.getEnvironment(), catalogName, schedulerIncludeCoordinator), versionEmbedder, - new InternalTypeManager(metadataManager, typeOperators), - new InternalMetadataProvider(metadataManager), + typeManager, + new InternalMetadataProvider(metadataManager, typeManager), pageSorter, pageIndexerFactory, factory.getDuplicatePluginClassLoaderFactory()); diff --git a/core/trino-main/src/main/java/io/trino/connector/InternalMetadataProvider.java b/core/trino-main/src/main/java/io/trino/connector/InternalMetadataProvider.java index 7fcf9be90de5..e038b6664356 100644 --- a/core/trino-main/src/main/java/io/trino/connector/InternalMetadataProvider.java +++ b/core/trino-main/src/main/java/io/trino/connector/InternalMetadataProvider.java @@ -26,6 +26,7 @@ import io.trino.spi.connector.ConnectorSession; import io.trino.spi.connector.ConnectorTableSchema; import io.trino.spi.connector.MetadataProvider; +import io.trino.spi.type.TypeManager; import java.util.List; import java.util.Optional; @@ -37,10 +38,12 @@ public class InternalMetadataProvider implements MetadataProvider { private final MetadataManager metadataManager; + private final TypeManager typeManager; - public InternalMetadataProvider(MetadataManager metadataManager) + public InternalMetadataProvider(MetadataManager metadataManager, TypeManager typeManager) { this.metadataManager = requireNonNull(metadataManager, "metadataManager is null"); + this.typeManager = requireNonNull(typeManager, "typeManager is null"); } @Override @@ -73,7 +76,7 @@ private List toColumnSchema(List viewColumns) .map(viewColumn -> ColumnSchema.builder() .setName(viewColumn.getName()) - .setType(metadataManager.getType(viewColumn.getType())) + .setType(typeManager.getType(viewColumn.getType())) .build()) .collect(toImmutableList()); } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/AnalyzePropertiesSystemTable.java b/core/trino-main/src/main/java/io/trino/connector/system/AnalyzePropertiesSystemTable.java index 7f9fe8477877..3a59dca9eb1f 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/AnalyzePropertiesSystemTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/AnalyzePropertiesSystemTable.java @@ -13,7 +13,7 @@ */ package io.trino.connector.system; -import io.trino.metadata.Metadata; +import io.trino.metadata.AnalyzePropertyManager; import io.trino.transaction.TransactionManager; import javax.inject.Inject; @@ -22,8 +22,8 @@ public class AnalyzePropertiesSystemTable extends AbstractPropertiesSystemTable { @Inject - public AnalyzePropertiesSystemTable(TransactionManager transactionManager, Metadata metadata) + public AnalyzePropertiesSystemTable(TransactionManager transactionManager, AnalyzePropertyManager analyzePropertyManager) { - super("analyze_properties", transactionManager, () -> metadata.getAnalyzePropertyManager().getAllProperties()); + super("analyze_properties", transactionManager, analyzePropertyManager::getAllProperties); } } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/ColumnPropertiesSystemTable.java b/core/trino-main/src/main/java/io/trino/connector/system/ColumnPropertiesSystemTable.java index 55dec67b4fe0..7bc152ed8ff5 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/ColumnPropertiesSystemTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/ColumnPropertiesSystemTable.java @@ -13,7 +13,7 @@ */ package io.trino.connector.system; -import io.trino.metadata.Metadata; +import io.trino.metadata.ColumnPropertyManager; import io.trino.transaction.TransactionManager; import javax.inject.Inject; @@ -22,8 +22,8 @@ public class ColumnPropertiesSystemTable extends AbstractPropertiesSystemTable { @Inject - public ColumnPropertiesSystemTable(TransactionManager transactionManager, Metadata metadata) + public ColumnPropertiesSystemTable(TransactionManager transactionManager, ColumnPropertyManager columnPropertyManager) { - super("column_properties", transactionManager, () -> metadata.getColumnPropertyManager().getAllProperties()); + super("column_properties", transactionManager, columnPropertyManager::getAllProperties); } } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/MaterializedViewPropertiesSystemTable.java b/core/trino-main/src/main/java/io/trino/connector/system/MaterializedViewPropertiesSystemTable.java index 907c6a8ff066..166013f475a3 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/MaterializedViewPropertiesSystemTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/MaterializedViewPropertiesSystemTable.java @@ -13,7 +13,7 @@ */ package io.trino.connector.system; -import io.trino.metadata.Metadata; +import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.transaction.TransactionManager; import javax.inject.Inject; @@ -22,8 +22,8 @@ public class MaterializedViewPropertiesSystemTable extends AbstractPropertiesSystemTable { @Inject - public MaterializedViewPropertiesSystemTable(TransactionManager transactionManager, Metadata metadata) + public MaterializedViewPropertiesSystemTable(TransactionManager transactionManager, MaterializedViewPropertyManager materializedViewPropertyManager) { - super("materialized_view_properties", transactionManager, () -> metadata.getMaterializedViewPropertyManager().getAllProperties()); + super("materialized_view_properties", transactionManager, materializedViewPropertyManager::getAllProperties); } } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/RuleStatsSystemTable.java b/core/trino-main/src/main/java/io/trino/connector/system/RuleStatsSystemTable.java index da63a6612378..3051dd6e71ea 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/RuleStatsSystemTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/RuleStatsSystemTable.java @@ -14,7 +14,6 @@ package io.trino.connector.system; import com.google.common.collect.ImmutableList; -import io.trino.metadata.Metadata; import io.trino.spi.Page; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; @@ -27,6 +26,7 @@ import io.trino.spi.connector.SchemaTableName; import io.trino.spi.connector.SystemTable; import io.trino.spi.predicate.TupleDomain; +import io.trino.spi.type.TypeManager; import io.trino.sql.planner.RuleStatsRecorder; import io.trino.sql.planner.iterative.RuleStats; @@ -53,10 +53,10 @@ public class RuleStatsSystemTable private final Optional ruleStatsRecorder; @Inject - public RuleStatsSystemTable(Optional ruleStatsRecorder, Metadata metadata) + public RuleStatsSystemTable(Optional ruleStatsRecorder, TypeManager typeManager) { this.ruleStatsRecorder = requireNonNull(ruleStatsRecorder, "ruleStatsRecorder is null"); - requireNonNull(metadata, "metadata is null"); + requireNonNull(typeManager, "typeManager is null"); this.ruleStatsTable = tableMetadataBuilder(TABLE_NAME) .column("rule_name", VARCHAR) @@ -64,7 +64,7 @@ public RuleStatsSystemTable(Optional ruleStatsRecorder, Metad .column("matches", BIGINT) .column("failures", BIGINT) .column("average_time", DOUBLE) - .column("time_distribution_percentiles", metadata.getType(mapType(DOUBLE.getTypeSignature(), DOUBLE.getTypeSignature()))) + .column("time_distribution_percentiles", typeManager.getType(mapType(DOUBLE.getTypeSignature(), DOUBLE.getTypeSignature()))) .build(); } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/SchemaPropertiesSystemTable.java b/core/trino-main/src/main/java/io/trino/connector/system/SchemaPropertiesSystemTable.java index efff5bdea6e4..56ad1df13de6 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/SchemaPropertiesSystemTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/SchemaPropertiesSystemTable.java @@ -13,7 +13,7 @@ */ package io.trino.connector.system; -import io.trino.metadata.Metadata; +import io.trino.metadata.SchemaPropertyManager; import io.trino.transaction.TransactionManager; import javax.inject.Inject; @@ -22,8 +22,8 @@ public class SchemaPropertiesSystemTable extends AbstractPropertiesSystemTable { @Inject - public SchemaPropertiesSystemTable(TransactionManager transactionManager, Metadata metadata) + public SchemaPropertiesSystemTable(TransactionManager transactionManager, SchemaPropertyManager schemaPropertyManager) { - super("schema_properties", transactionManager, () -> metadata.getSchemaPropertyManager().getAllProperties()); + super("schema_properties", transactionManager, schemaPropertyManager::getAllProperties); } } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/TablePropertiesSystemTable.java b/core/trino-main/src/main/java/io/trino/connector/system/TablePropertiesSystemTable.java index f04302253d58..41caa3975d6c 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/TablePropertiesSystemTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/TablePropertiesSystemTable.java @@ -13,7 +13,7 @@ */ package io.trino.connector.system; -import io.trino.metadata.Metadata; +import io.trino.metadata.TablePropertyManager; import io.trino.transaction.TransactionManager; import javax.inject.Inject; @@ -22,8 +22,8 @@ public class TablePropertiesSystemTable extends AbstractPropertiesSystemTable { @Inject - public TablePropertiesSystemTable(TransactionManager transactionManager, Metadata metadata) + public TablePropertiesSystemTable(TransactionManager transactionManager, TablePropertyManager tablePropertyManager) { - super("table_properties", transactionManager, () -> metadata.getTablePropertyManager().getAllProperties()); + super("table_properties", transactionManager, tablePropertyManager::getAllProperties); } } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/TransactionsSystemTable.java b/core/trino-main/src/main/java/io/trino/connector/system/TransactionsSystemTable.java index 8301e526c10f..61c88475040c 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/TransactionsSystemTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/TransactionsSystemTable.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import io.trino.connector.CatalogName; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.connector.ConnectorSession; @@ -27,6 +26,7 @@ import io.trino.spi.connector.SchemaTableName; import io.trino.spi.connector.SystemTable; import io.trino.spi.predicate.TupleDomain; +import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeSignatureParameter; import io.trino.spi.type.VarcharType; import io.trino.transaction.TransactionInfo; @@ -58,7 +58,7 @@ public class TransactionsSystemTable private final TransactionManager transactionManager; @Inject - public TransactionsSystemTable(Metadata metadata, TransactionManager transactionManager) + public TransactionsSystemTable(TypeManager typeManager, TransactionManager transactionManager) { this.transactionsTable = tableMetadataBuilder(TRANSACTIONS_TABLE_NAME) .column("transaction_id", createUnboundedVarcharType()) @@ -68,7 +68,7 @@ public TransactionsSystemTable(Metadata metadata, TransactionManager transaction .column("create_time", TIMESTAMP_TZ_MILLIS) .column("idle_time_secs", BIGINT) .column("written_catalog", createUnboundedVarcharType()) - .column("catalogs", metadata.getParameterizedType(ARRAY, ImmutableList.of(TypeSignatureParameter.typeParameter(createUnboundedVarcharType().getTypeSignature())))) + .column("catalogs", typeManager.getParameterizedType(ARRAY, ImmutableList.of(TypeSignatureParameter.typeParameter(createUnboundedVarcharType().getTypeSignature())))) .build(); this.transactionManager = requireNonNull(transactionManager, "transactionManager is null"); } diff --git a/core/trino-main/src/main/java/io/trino/connector/system/jdbc/TypesJdbcTable.java b/core/trino-main/src/main/java/io/trino/connector/system/jdbc/TypesJdbcTable.java index 73de8a791500..ba5027b4ebf6 100644 --- a/core/trino-main/src/main/java/io/trino/connector/system/jdbc/TypesJdbcTable.java +++ b/core/trino-main/src/main/java/io/trino/connector/system/jdbc/TypesJdbcTable.java @@ -13,7 +13,7 @@ */ package io.trino.connector.system.jdbc; -import io.trino.metadata.Metadata; +import io.trino.metadata.TypeRegistry; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.connector.ConnectorTableMetadata; import io.trino.spi.connector.ConnectorTransactionHandle; @@ -65,12 +65,12 @@ public class TypesJdbcTable .column("num_prec_radix", BIGINT) .build(); - private final Metadata metadata; + private final TypeRegistry typeRegistry; @Inject - public TypesJdbcTable(Metadata metadata) + public TypesJdbcTable(TypeRegistry typeRegistry) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.typeRegistry = requireNonNull(typeRegistry, "typeRegistry is null"); } @Override @@ -83,10 +83,10 @@ public ConnectorTableMetadata getTableMetadata() public RecordCursor cursor(ConnectorTransactionHandle transactionHandle, ConnectorSession connectorSession, TupleDomain constraint) { Builder table = InMemoryRecordSet.builder(METADATA); - for (Type type : metadata.getTypes()) { + for (Type type : typeRegistry.getTypes()) { addTypeRow(table, type); } - for (ParametricType type : metadata.getParametricTypes()) { + for (ParametricType type : typeRegistry.getParametricTypes()) { addTypeRow(table, type); } return table.build().cursor(); diff --git a/core/trino-main/src/main/java/io/trino/cost/FilterStatsCalculator.java b/core/trino-main/src/main/java/io/trino/cost/FilterStatsCalculator.java index 4dbf9404c62d..56776ce6f3a6 100644 --- a/core/trino-main/src/main/java/io/trino/cost/FilterStatsCalculator.java +++ b/core/trino-main/src/main/java/io/trino/cost/FilterStatsCalculator.java @@ -18,9 +18,9 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.ExpressionAnalyzer; import io.trino.sql.analyzer.Scope; import io.trino.sql.planner.ExpressionInterpreter; @@ -81,14 +81,14 @@ public class FilterStatsCalculator { static final double UNKNOWN_FILTER_COEFFICIENT = 0.9; - private final Metadata metadata; + private final PlannerContext plannerContext; private final ScalarStatsCalculator scalarStatsCalculator; private final StatsNormalizer normalizer; @Inject - public FilterStatsCalculator(Metadata metadata, ScalarStatsCalculator scalarStatsCalculator, StatsNormalizer normalizer) + public FilterStatsCalculator(PlannerContext plannerContext, ScalarStatsCalculator scalarStatsCalculator, StatsNormalizer normalizer) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.scalarStatsCalculator = requireNonNull(scalarStatsCalculator, "scalarStatsCalculator is null"); this.normalizer = requireNonNull(normalizer, "normalizer is null"); } @@ -109,20 +109,20 @@ private Expression simplifyExpression(Session session, Expression predicate, Typ // TODO reuse io.trino.sql.planner.iterative.rule.SimplifyExpressions.rewrite Map, Type> expressionTypes = getExpressionTypes(session, predicate, types); - ExpressionInterpreter interpreter = new ExpressionInterpreter(predicate, metadata, session, expressionTypes); + ExpressionInterpreter interpreter = new ExpressionInterpreter(predicate, plannerContext, session, expressionTypes); Object value = interpreter.optimize(NoOpSymbolResolver.INSTANCE); if (value == null) { // Expression evaluates to SQL null, which in Filter is equivalent to false. This assumes the expression is a top-level expression (eg. not in NOT). value = false; } - return new LiteralEncoder(session, metadata).toExpression(value, BOOLEAN); + return new LiteralEncoder(plannerContext).toExpression(session, value, BOOLEAN); } private Map, Type> getExpressionTypes(Session session, Expression expression, TypeProvider types) { ExpressionAnalyzer expressionAnalyzer = ExpressionAnalyzer.createWithoutSubqueries( - metadata, + plannerContext, new AllowAllAccessControl(), session, types, @@ -417,7 +417,7 @@ private Type getType(Expression expression) } ExpressionAnalyzer expressionAnalyzer = ExpressionAnalyzer.createWithoutSubqueries( - metadata, + plannerContext, new AllowAllAccessControl(), session, types, @@ -440,7 +440,7 @@ private SymbolStatsEstimate getExpressionStats(Expression expression) private OptionalDouble doubleValueFromLiteral(Type type, Literal literal) { - Object literalValue = LiteralInterpreter.evaluate(metadata, session, getExpressionTypes(session, literal, types), literal); + Object literalValue = LiteralInterpreter.evaluate(plannerContext, session, getExpressionTypes(session, literal, types), literal); return toStatsRepresentation(type, literalValue); } } diff --git a/core/trino-main/src/main/java/io/trino/cost/ScalarStatsCalculator.java b/core/trino-main/src/main/java/io/trino/cost/ScalarStatsCalculator.java index fd8d25cc5f5b..66cb569d39e1 100644 --- a/core/trino-main/src/main/java/io/trino/cost/ScalarStatsCalculator.java +++ b/core/trino-main/src/main/java/io/trino/cost/ScalarStatsCalculator.java @@ -16,7 +16,6 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.BigintType; import io.trino.spi.type.DecimalType; @@ -24,6 +23,7 @@ import io.trino.spi.type.SmallintType; import io.trino.spi.type.TinyintType; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.ExpressionAnalyzer; import io.trino.sql.analyzer.Scope; import io.trino.sql.planner.ExpressionInterpreter; @@ -63,13 +63,13 @@ public class ScalarStatsCalculator { - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; @Inject - public ScalarStatsCalculator(Metadata metadata, TypeAnalyzer typeAnalyzer) + public ScalarStatsCalculator(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - this.metadata = requireNonNull(metadata, "metadata cannot be null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext cannot be null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); } @@ -113,9 +113,9 @@ protected SymbolStatsEstimate visitNullLiteral(NullLiteral node, Void context) @Override protected SymbolStatsEstimate visitLiteral(Literal node, Void context) { - ExpressionAnalyzer analyzer = createConstantAnalyzer(metadata, new AllowAllAccessControl(), session, ImmutableMap.of(), WarningCollector.NOOP); + ExpressionAnalyzer analyzer = createConstantAnalyzer(plannerContext, new AllowAllAccessControl(), session, ImmutableMap.of(), WarningCollector.NOOP); Type type = analyzer.analyze(node, Scope.create()); - Object value = evaluate(metadata, session, analyzer.getExpressionTypes(), node); + Object value = evaluate(plannerContext, session, analyzer.getExpressionTypes(), node); OptionalDouble doubleValue = toStatsRepresentation(type, value); SymbolStatsEstimate.Builder estimate = SymbolStatsEstimate.builder() @@ -133,7 +133,7 @@ protected SymbolStatsEstimate visitLiteral(Literal node, Void context) protected SymbolStatsEstimate visitFunctionCall(FunctionCall node, Void context) { Map, Type> expressionTypes = getExpressionTypes(session, node, types); - ExpressionInterpreter interpreter = new ExpressionInterpreter(node, metadata, session, expressionTypes); + ExpressionInterpreter interpreter = new ExpressionInterpreter(node, plannerContext, session, expressionTypes); Object value = interpreter.optimize(NoOpSymbolResolver.INSTANCE); if (value == null || value instanceof NullLiteral) { @@ -155,7 +155,7 @@ protected SymbolStatsEstimate visitFunctionCall(FunctionCall node, Void context) private Map, Type> getExpressionTypes(Session session, Expression expression, TypeProvider types) { ExpressionAnalyzer expressionAnalyzer = ExpressionAnalyzer.createWithoutSubqueries( - metadata, + plannerContext, new AllowAllAccessControl(), session, types, diff --git a/core/trino-main/src/main/java/io/trino/cost/StatsCalculatorModule.java b/core/trino-main/src/main/java/io/trino/cost/StatsCalculatorModule.java index 24e9628c3bfe..2a7c502854ca 100644 --- a/core/trino-main/src/main/java/io/trino/cost/StatsCalculatorModule.java +++ b/core/trino-main/src/main/java/io/trino/cost/StatsCalculatorModule.java @@ -18,7 +18,7 @@ import com.google.inject.Module; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import javax.inject.Inject; import javax.inject.Provider; @@ -45,15 +45,15 @@ public void configure(Binder binder) public static class StatsRulesProvider implements Provider>> { - private final Metadata metadata; + private final PlannerContext plannerContext; private final ScalarStatsCalculator scalarStatsCalculator; private final FilterStatsCalculator filterStatsCalculator; private final StatsNormalizer normalizer; @Inject - public StatsRulesProvider(Metadata metadata, ScalarStatsCalculator scalarStatsCalculator, FilterStatsCalculator filterStatsCalculator, StatsNormalizer normalizer) + public StatsRulesProvider(PlannerContext plannerContext, ScalarStatsCalculator scalarStatsCalculator, FilterStatsCalculator filterStatsCalculator, StatsNormalizer normalizer) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.scalarStatsCalculator = requireNonNull(scalarStatsCalculator, "scalarStatsCalculator is null"); this.filterStatsCalculator = requireNonNull(filterStatsCalculator, "filterStatsCalculator is null"); this.normalizer = requireNonNull(normalizer, "normalizer is null"); @@ -65,10 +65,10 @@ public List> get() ImmutableList.Builder> rules = ImmutableList.builder(); rules.add(new OutputStatsRule()); - rules.add(new TableScanStatsRule(metadata, normalizer)); - rules.add(new SimpleFilterProjectSemiJoinStatsRule(metadata, normalizer, filterStatsCalculator)); // this must be before FilterStatsRule + rules.add(new TableScanStatsRule(plannerContext.getMetadata(), normalizer)); + rules.add(new SimpleFilterProjectSemiJoinStatsRule(plannerContext.getMetadata(), normalizer, filterStatsCalculator)); // this must be before FilterStatsRule rules.add(new FilterStatsRule(normalizer, filterStatsCalculator)); - rules.add(new ValuesStatsRule(metadata)); + rules.add(new ValuesStatsRule(plannerContext)); rules.add(new LimitStatsRule(normalizer)); rules.add(new TopNStatsRule(normalizer)); rules.add(new EnforceSingleRowStatsRule(normalizer)); diff --git a/core/trino-main/src/main/java/io/trino/cost/ValuesStatsRule.java b/core/trino-main/src/main/java/io/trino/cost/ValuesStatsRule.java index 6825f01c696c..513542754e15 100644 --- a/core/trino-main/src/main/java/io/trino/cost/ValuesStatsRule.java +++ b/core/trino-main/src/main/java/io/trino/cost/ValuesStatsRule.java @@ -17,11 +17,11 @@ import io.trino.Session; import io.trino.cost.ComposableStatsCalculator.Rule; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.security.AllowAllAccessControl; import io.trino.spi.block.SingleRowBlock; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.iterative.Lookup; @@ -41,6 +41,7 @@ import static io.trino.sql.planner.ExpressionInterpreter.evaluateConstantExpression; import static io.trino.sql.planner.plan.Patterns.values; import static io.trino.type.UnknownType.UNKNOWN; +import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toList; public class ValuesStatsRule @@ -48,11 +49,11 @@ public class ValuesStatsRule { private static final Pattern PATTERN = values(); - private final Metadata metadata; + private final PlannerContext plannerContext; - public ValuesStatsRule(Metadata metadata) + public ValuesStatsRule(PlannerContext plannerContext) { - this.metadata = metadata; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -94,7 +95,7 @@ private List getSymbolValues(ValuesNode valuesNode, int symbolId, Sessio checkState(valuesNode.getRows().isPresent(), "rows is empty"); return valuesNode.getRows().get().stream() .map(row -> { - Object rowValue = evaluateConstantExpression(row, rowType, metadata, session, new AllowAllAccessControl(), ImmutableMap.of()); + Object rowValue = evaluateConstantExpression(row, rowType, plannerContext, session, new AllowAllAccessControl(), ImmutableMap.of()); return readNativeValue(symbolType, (SingleRowBlock) rowValue, symbolId); }) .collect(toList()); diff --git a/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java b/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java index 8974ecde4e11..c6993df95ea2 100644 --- a/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/AddColumnTask.java @@ -17,7 +17,7 @@ import io.trino.Session; import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; +import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.TableHandle; import io.trino.security.AccessControl; @@ -25,6 +25,7 @@ import io.trino.spi.connector.ColumnMetadata; import io.trino.spi.type.Type; import io.trino.spi.type.TypeNotFoundException; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.AddColumn; import io.trino.sql.tree.ColumnDefinition; import io.trino.sql.tree.Expression; @@ -55,14 +56,16 @@ public class AddColumnTask implements DataDefinitionTask { - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; + private final ColumnPropertyManager columnPropertyManager; @Inject - public AddColumnTask(Metadata metadata, AccessControl accessControl) + public AddColumnTask(PlannerContext plannerContext, AccessControl accessControl, ColumnPropertyManager columnPropertyManager) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.columnPropertyManager = requireNonNull(columnPropertyManager, "columnPropertyManager is null"); } @Override @@ -80,7 +83,7 @@ public ListenableFuture execute( { Session session = stateMachine.getSession(); QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getName()); - Optional tableHandle = metadata.getTableHandle(session, tableName); + Optional tableHandle = plannerContext.getMetadata().getTableHandle(session, tableName); if (tableHandle.isEmpty()) { if (!statement.isTableExists()) { throw semanticException(TABLE_NOT_FOUND, statement, "Table '%s' does not exist", tableName); @@ -88,16 +91,16 @@ public ListenableFuture execute( return immediateVoidFuture(); } - CatalogName catalogName = getRequiredCatalogHandle(metadata, session, statement, tableName.getCatalogName()); + CatalogName catalogName = getRequiredCatalogHandle(plannerContext.getMetadata(), session, statement, tableName.getCatalogName()); accessControl.checkCanAddColumns(session.toSecurityContext(), tableName); - Map columnHandles = metadata.getColumnHandles(session, tableHandle.get()); + Map columnHandles = plannerContext.getMetadata().getColumnHandles(session, tableHandle.get()); ColumnDefinition element = statement.getColumn(); Type type; try { - type = metadata.getType(toTypeSignature(element.getType())); + type = plannerContext.getTypeManager().getType(toTypeSignature(element.getType())); } catch (TypeNotFoundException e) { throw semanticException(TYPE_NOT_FOUND, element, "Unknown type '%s' for column '%s'", element.getType(), element.getName()); @@ -111,17 +114,17 @@ public ListenableFuture execute( } return immediateVoidFuture(); } - if (!element.isNullable() && !metadata.getConnectorCapabilities(session, catalogName).contains(NOT_NULL_COLUMN_CONSTRAINT)) { + if (!element.isNullable() && !plannerContext.getMetadata().getConnectorCapabilities(session, catalogName).contains(NOT_NULL_COLUMN_CONSTRAINT)) { throw semanticException(NOT_SUPPORTED, element, "Catalog '%s' does not support NOT NULL for column '%s'", catalogName.getCatalogName(), element.getName()); } Map sqlProperties = mapFromProperties(element.getProperties()); - Map columnProperties = metadata.getColumnPropertyManager().getProperties( + Map columnProperties = columnPropertyManager.getProperties( catalogName, tableName.getCatalogName(), sqlProperties, session, - metadata, + plannerContext, accessControl, parameterExtractor(statement, parameters), true); @@ -134,7 +137,7 @@ public ListenableFuture execute( .setProperties(columnProperties) .build(); - metadata.addColumn(session, tableHandle.get(), column); + plannerContext.getMetadata().addColumn(session, tableHandle.get(), column); return immediateVoidFuture(); } diff --git a/core/trino-main/src/main/java/io/trino/execution/CallTask.java b/core/trino-main/src/main/java/io/trino/execution/CallTask.java index e41902e6d179..5aa5aa9f99fa 100644 --- a/core/trino-main/src/main/java/io/trino/execution/CallTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/CallTask.java @@ -18,7 +18,7 @@ import io.trino.Session; import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; +import io.trino.metadata.ProcedureRegistry; import io.trino.metadata.QualifiedObjectName; import io.trino.security.AccessControl; import io.trino.security.InjectedConnectorAccessControl; @@ -30,6 +30,7 @@ import io.trino.spi.procedure.Procedure; import io.trino.spi.procedure.Procedure.Argument; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ParameterRewriter; import io.trino.sql.tree.Call; import io.trino.sql.tree.CallArgument; @@ -71,15 +72,17 @@ public class CallTask implements DataDefinitionTask { private final TransactionManager transactionManager; - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; + private final ProcedureRegistry procedureRegistry; @Inject - public CallTask(TransactionManager transactionManager, Metadata metadata, AccessControl accessControl) + public CallTask(TransactionManager transactionManager, PlannerContext plannerContext, AccessControl accessControl, ProcedureRegistry procedureRegistry) { this.transactionManager = requireNonNull(transactionManager, "transactionManager is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.procedureRegistry = requireNonNull(procedureRegistry, "procedureRegistry is null"); } @Override @@ -101,9 +104,9 @@ public ListenableFuture execute( Session session = stateMachine.getSession(); QualifiedObjectName procedureName = createQualifiedObjectName(session, call, call.getName()); - CatalogName catalogName = metadata.getCatalogHandle(stateMachine.getSession(), procedureName.getCatalogName()) + CatalogName catalogName = plannerContext.getMetadata().getCatalogHandle(stateMachine.getSession(), procedureName.getCatalogName()) .orElseThrow(() -> semanticException(CATALOG_NOT_FOUND, call, "Catalog '%s' does not exist", procedureName.getCatalogName())); - Procedure procedure = metadata.getProcedureRegistry().resolve(catalogName, procedureName.asSchemaTableName()); + Procedure procedure = procedureRegistry.resolve(catalogName, procedureName.asSchemaTableName()); // map declared argument names to positions Map positions = new HashMap<>(); @@ -160,7 +163,7 @@ else if (i < procedure.getArguments().size()) { Expression expression = ExpressionTreeRewriter.rewriteWith(new ParameterRewriter(parameterLookup), callArgument.getValue()); Type type = argument.getType(); - Object value = evaluateConstantExpression(expression, type, metadata, session, accessControl, parameterLookup); + Object value = evaluateConstantExpression(expression, type, plannerContext, session, accessControl, parameterLookup); values[index] = toTypeObjectValue(session, type, value); } diff --git a/core/trino-main/src/main/java/io/trino/execution/CreateMaterializedViewTask.java b/core/trino-main/src/main/java/io/trino/execution/CreateMaterializedViewTask.java index 1ef593a3aacb..03df88d8fc32 100644 --- a/core/trino-main/src/main/java/io/trino/execution/CreateMaterializedViewTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/CreateMaterializedViewTask.java @@ -18,10 +18,11 @@ import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.MaterializedViewDefinition; -import io.trino.metadata.Metadata; +import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.ViewColumn; import io.trino.security.AccessControl; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Analysis; import io.trino.sql.analyzer.AnalyzerFactory; import io.trino.sql.parser.SqlParser; @@ -48,18 +49,25 @@ public class CreateMaterializedViewTask implements DataDefinitionTask { - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; private final SqlParser sqlParser; private final AnalyzerFactory analyzerFactory; + private final MaterializedViewPropertyManager materializedViewPropertyManager; @Inject - public CreateMaterializedViewTask(Metadata metadata, AccessControl accessControl, SqlParser sqlParser, AnalyzerFactory analyzerFactory) + public CreateMaterializedViewTask( + PlannerContext plannerContext, + AccessControl accessControl, + SqlParser sqlParser, + AnalyzerFactory analyzerFactory, + MaterializedViewPropertyManager materializedViewPropertyManager) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); this.analyzerFactory = requireNonNull(analyzerFactory, "analyzerFactory is null"); + this.materializedViewPropertyManager = requireNonNull(materializedViewPropertyManager, "materializedViewPropertyManager is null"); } @Override @@ -89,15 +97,15 @@ public ListenableFuture execute( .map(field -> new ViewColumn(field.getName().get(), field.getType().getTypeId())) .collect(toImmutableList()); - CatalogName catalogName = getRequiredCatalogHandle(metadata, session, statement, name.getCatalogName()); + CatalogName catalogName = getRequiredCatalogHandle(plannerContext.getMetadata(), session, statement, name.getCatalogName()); Map sqlProperties = mapFromProperties(statement.getProperties()); - Map properties = metadata.getMaterializedViewPropertyManager().getProperties( + Map properties = materializedViewPropertyManager.getProperties( catalogName, name.getCatalogName(), sqlProperties, session, - metadata, + plannerContext, accessControl, parameterLookup, true); @@ -112,7 +120,7 @@ public ListenableFuture execute( Optional.empty(), properties); - metadata.createMaterializedView(session, name, definition, statement.isReplace(), statement.isNotExists()); + plannerContext.getMetadata().createMaterializedView(session, name, definition, statement.isReplace(), statement.isNotExists()); stateMachine.setOutput(analysis.getTarget()); stateMachine.setReferencedTables(analysis.getReferencedTables()); diff --git a/core/trino-main/src/main/java/io/trino/execution/CreateSchemaTask.java b/core/trino-main/src/main/java/io/trino/execution/CreateSchemaTask.java index e8dee93d9970..37bd3cd41ec1 100644 --- a/core/trino-main/src/main/java/io/trino/execution/CreateSchemaTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/CreateSchemaTask.java @@ -19,11 +19,13 @@ import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.Metadata; +import io.trino.metadata.SchemaPropertyManager; import io.trino.security.AccessControl; import io.trino.spi.TrinoException; import io.trino.spi.connector.CatalogSchemaName; import io.trino.spi.security.PrincipalType; import io.trino.spi.security.TrinoPrincipal; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.CreateSchema; import io.trino.sql.tree.Expression; @@ -48,14 +50,16 @@ public class CreateSchemaTask implements DataDefinitionTask { - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; + private final SchemaPropertyManager schemaPropertyManager; @Inject - public CreateSchemaTask(Metadata metadata, AccessControl accessControl) + public CreateSchemaTask(PlannerContext plannerContext, AccessControl accessControl, SchemaPropertyManager schemaPropertyManager) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.schemaPropertyManager = requireNonNull(schemaPropertyManager, "schemaPropertyManager is null"); } @Override @@ -71,11 +75,17 @@ public ListenableFuture execute( List parameters, WarningCollector warningCollector) { - return internalExecute(statement, metadata, accessControl, stateMachine.getSession(), parameters); + return internalExecute(statement, plannerContext, accessControl, schemaPropertyManager, stateMachine.getSession(), parameters); } @VisibleForTesting - static ListenableFuture internalExecute(CreateSchema statement, Metadata metadata, AccessControl accessControl, Session session, List parameters) + static ListenableFuture internalExecute( + CreateSchema statement, + PlannerContext plannerContext, + AccessControl accessControl, + SchemaPropertyManager schemaPropertyManager, + Session session, + List parameters) { CatalogSchemaName schema = createCatalogSchemaName(session, statement, Optional.of(statement.getSchemaName())); @@ -83,28 +93,28 @@ static ListenableFuture internalExecute(CreateSchema statement, Metadata m accessControl.checkCanCreateSchema(session.toSecurityContext(), schema); - if (metadata.schemaExists(session, schema)) { + if (plannerContext.getMetadata().schemaExists(session, schema)) { if (!statement.isNotExists()) { throw semanticException(SCHEMA_ALREADY_EXISTS, statement, "Schema '%s' already exists", schema); } return immediateVoidFuture(); } - CatalogName catalogName = getRequiredCatalogHandle(metadata, session, statement, schema.getCatalogName()); + CatalogName catalogName = getRequiredCatalogHandle(plannerContext.getMetadata(), session, statement, schema.getCatalogName()); - Map properties = metadata.getSchemaPropertyManager().getProperties( + Map properties = schemaPropertyManager.getProperties( catalogName, schema.getCatalogName(), mapFromProperties(statement.getProperties()), session, - metadata, + plannerContext, accessControl, parameterExtractor(statement, parameters), true); - TrinoPrincipal principal = getCreatePrincipal(statement, session, metadata, catalogName.getCatalogName()); + TrinoPrincipal principal = getCreatePrincipal(statement, session, plannerContext.getMetadata(), catalogName.getCatalogName()); try { - metadata.createSchema(session, schema, properties, principal); + plannerContext.getMetadata().createSchema(session, schema, properties, principal); } catch (TrinoException e) { // connectors are not required to handle the ignoreExisting flag diff --git a/core/trino-main/src/main/java/io/trino/execution/CreateTableTask.java b/core/trino-main/src/main/java/io/trino/execution/CreateTableTask.java index 3e87f7965cb9..4f984a13a3d5 100644 --- a/core/trino-main/src/main/java/io/trino/execution/CreateTableTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/CreateTableTask.java @@ -22,11 +22,12 @@ import io.trino.Session; import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; +import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.RedirectionAwareTableHandle; import io.trino.metadata.TableHandle; import io.trino.metadata.TableMetadata; +import io.trino.metadata.TablePropertyManager; import io.trino.security.AccessControl; import io.trino.spi.TrinoException; import io.trino.spi.connector.ColumnMetadata; @@ -34,6 +35,7 @@ import io.trino.spi.security.AccessDeniedException; import io.trino.spi.type.Type; import io.trino.spi.type.TypeNotFoundException; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Output; import io.trino.sql.analyzer.OutputColumn; import io.trino.sql.tree.ColumnDefinition; @@ -84,15 +86,24 @@ public class CreateTableTask implements DataDefinitionTask { - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; + private final ColumnPropertyManager columnPropertyManager; + private final TablePropertyManager tablePropertyManager; private final boolean disableSetPropertiesSecurityCheckForCreateDdl; @Inject - public CreateTableTask(Metadata metadata, AccessControl accessControl, FeaturesConfig featuresConfig) + public CreateTableTask( + PlannerContext plannerContext, + AccessControl accessControl, + ColumnPropertyManager columnPropertyManager, + TablePropertyManager tablePropertyManager, + FeaturesConfig featuresConfig) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.columnPropertyManager = requireNonNull(columnPropertyManager, "columnPropertyManager is null"); + this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); this.disableSetPropertiesSecurityCheckForCreateDdl = featuresConfig.isDisableSetPropertiesSecurityCheckForCreateDdl(); } @@ -119,7 +130,7 @@ ListenableFuture internalExecute(CreateTable statement, Session session, L Map, Expression> parameterLookup = parameterExtractor(statement, parameters); QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getName()); - Optional tableHandle = metadata.getTableHandle(session, tableName); + Optional tableHandle = plannerContext.getMetadata().getTableHandle(session, tableName); if (tableHandle.isPresent()) { if (!statement.isNotExists()) { throw semanticException(TABLE_ALREADY_EXISTS, statement, "Table '%s' already exists", tableName); @@ -127,7 +138,7 @@ ListenableFuture internalExecute(CreateTable statement, Session session, L return immediateVoidFuture(); } - CatalogName catalogName = getRequiredCatalogHandle(metadata, session, statement, tableName.getCatalogName()); + CatalogName catalogName = getRequiredCatalogHandle(plannerContext.getMetadata(), session, statement, tableName.getCatalogName()); LinkedHashMap columns = new LinkedHashMap<>(); Map inheritedProperties = ImmutableMap.of(); @@ -138,7 +149,7 @@ ListenableFuture internalExecute(CreateTable statement, Session session, L String name = column.getName().getValue().toLowerCase(Locale.ENGLISH); Type type; try { - type = metadata.getType(toTypeSignature(column.getType())); + type = plannerContext.getTypeManager().getType(toTypeSignature(column.getType())); } catch (TypeNotFoundException e) { throw semanticException(TYPE_NOT_FOUND, element, "Unknown type '%s' for column '%s'", column.getType(), column.getName()); @@ -149,17 +160,17 @@ ListenableFuture internalExecute(CreateTable statement, Session session, L if (columns.containsKey(name)) { throw semanticException(DUPLICATE_COLUMN_NAME, column, "Column name '%s' specified more than once", column.getName()); } - if (!column.isNullable() && !metadata.getConnectorCapabilities(session, catalogName).contains(NOT_NULL_COLUMN_CONSTRAINT)) { + if (!column.isNullable() && !plannerContext.getMetadata().getConnectorCapabilities(session, catalogName).contains(NOT_NULL_COLUMN_CONSTRAINT)) { throw semanticException(NOT_SUPPORTED, column, "Catalog '%s' does not support non-null column for column name '%s'", catalogName.getCatalogName(), column.getName()); } Map sqlProperties = mapFromProperties(column.getProperties()); - Map columnProperties = metadata.getColumnPropertyManager().getProperties( + Map columnProperties = columnPropertyManager.getProperties( catalogName, tableName.getCatalogName(), sqlProperties, session, - metadata, + plannerContext, accessControl, parameterLookup, true); @@ -175,11 +186,11 @@ ListenableFuture internalExecute(CreateTable statement, Session session, L else if (element instanceof LikeClause) { LikeClause likeClause = (LikeClause) element; QualifiedObjectName originalLikeTableName = createQualifiedObjectName(session, statement, likeClause.getTableName()); - if (metadata.getCatalogHandle(session, originalLikeTableName.getCatalogName()).isEmpty()) { + if (plannerContext.getMetadata().getCatalogHandle(session, originalLikeTableName.getCatalogName()).isEmpty()) { throw semanticException(CATALOG_NOT_FOUND, statement, "LIKE table catalog '%s' does not exist", originalLikeTableName.getCatalogName()); } - RedirectionAwareTableHandle redirection = metadata.getRedirectionAwareTableHandle(session, originalLikeTableName); + RedirectionAwareTableHandle redirection = plannerContext.getMetadata().getRedirectionAwareTableHandle(session, originalLikeTableName); TableHandle likeTable = redirection.getTableHandle() .orElseThrow(() -> semanticException(TABLE_NOT_FOUND, statement, "LIKE table '%s' does not exist", originalLikeTableName)); @@ -192,7 +203,7 @@ else if (element instanceof LikeClause) { throw semanticException(NOT_SUPPORTED, statement, message); } - TableMetadata likeTableMetadata = metadata.getTableMetadata(session, likeTable); + TableMetadata likeTableMetadata = plannerContext.getMetadata().getTableMetadata(session, likeTable); Optional propertiesOption = likeClause.getPropertiesOption(); if (propertiesOption.isPresent() && propertiesOption.get() == LikeClause.PropertiesOption.INCLUDING) { @@ -238,12 +249,12 @@ else if (element instanceof LikeClause) { } Map sqlProperties = mapFromProperties(statement.getProperties()); - Map properties = metadata.getTablePropertyManager().getProperties( + Map properties = tablePropertyManager.getProperties( catalogName, tableName.getCatalogName(), sqlProperties, session, - metadata, + plannerContext, accessControl, parameterLookup, true); @@ -259,7 +270,7 @@ else if (element instanceof LikeClause) { ConnectorTableMetadata tableMetadata = new ConnectorTableMetadata(tableName.asSchemaTableName(), ImmutableList.copyOf(columns.values()), finalProperties, statement.getComment()); try { - metadata.createTable(session, tableName.getCatalogName(), tableMetadata, statement.isNotExists()); + plannerContext.getMetadata().createTable(session, tableName.getCatalogName(), tableMetadata, statement.isNotExists()); } catch (TrinoException e) { // connectors are not required to handle the ignoreExisting flag diff --git a/core/trino-main/src/main/java/io/trino/execution/ResetSessionTask.java b/core/trino-main/src/main/java/io/trino/execution/ResetSessionTask.java index c7fe63c2fca8..1922c0c6b6e3 100644 --- a/core/trino-main/src/main/java/io/trino/execution/ResetSessionTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/ResetSessionTask.java @@ -17,6 +17,7 @@ import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.Metadata; +import io.trino.metadata.SessionPropertyManager; import io.trino.sql.tree.Expression; import io.trino.sql.tree.ResetSession; @@ -34,11 +35,13 @@ public class ResetSessionTask implements DataDefinitionTask { private final Metadata metadata; + private final SessionPropertyManager sessionPropertyManager; @Inject - public ResetSessionTask(Metadata metadata) + public ResetSessionTask(Metadata metadata, SessionPropertyManager sessionPropertyManager) { this.metadata = requireNonNull(metadata, "metadata is null"); + this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); } @Override @@ -61,14 +64,14 @@ public ListenableFuture execute( // validate the property name if (parts.size() == 1) { - if (metadata.getSessionPropertyManager().getSystemSessionPropertyMetadata(parts.get(0)).isEmpty()) { + if (sessionPropertyManager.getSystemSessionPropertyMetadata(parts.get(0)).isEmpty()) { throw semanticException(INVALID_SESSION_PROPERTY, statement, "Session property '%s' does not exist", statement.getName()); } } else { CatalogName catalogName = metadata.getCatalogHandle(stateMachine.getSession(), parts.get(0)) .orElseThrow(() -> semanticException(CATALOG_NOT_FOUND, statement, "Catalog '%s' does not exist", parts.get(0))); - if (metadata.getSessionPropertyManager().getConnectorSessionPropertyMetadata(catalogName, parts.get(1)).isEmpty()) { + if (sessionPropertyManager.getConnectorSessionPropertyMetadata(catalogName, parts.get(1)).isEmpty()) { throw semanticException(INVALID_SESSION_PROPERTY, statement, "Session property '%s' does not exist", statement.getName()); } } diff --git a/core/trino-main/src/main/java/io/trino/execution/SetPropertiesTask.java b/core/trino-main/src/main/java/io/trino/execution/SetPropertiesTask.java index 57d7df829382..63a62ee921ce 100644 --- a/core/trino-main/src/main/java/io/trino/execution/SetPropertiesTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/SetPropertiesTask.java @@ -16,10 +16,11 @@ import com.google.common.util.concurrent.ListenableFuture; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.TableHandle; +import io.trino.metadata.TablePropertyManager; import io.trino.security.AccessControl; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.Expression; import io.trino.sql.tree.SetProperties; @@ -42,14 +43,16 @@ public class SetPropertiesTask implements DataDefinitionTask { - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; + private final TablePropertyManager tablePropertyManager; @Inject - public SetPropertiesTask(Metadata metadata, AccessControl accessControl) + public SetPropertiesTask(PlannerContext plannerContext, AccessControl accessControl, TablePropertyManager tablePropertyManager) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); } @Override @@ -71,12 +74,12 @@ public ListenableFuture execute( Map sqlProperties = mapFromProperties(statement.getProperties()); if (statement.getType() == SetProperties.Type.TABLE) { - Map properties = metadata.getTablePropertyManager().getProperties( - getRequiredCatalogHandle(metadata, session, statement, tableName.getCatalogName()), + Map properties = tablePropertyManager.getProperties( + getRequiredCatalogHandle(plannerContext.getMetadata(), session, statement, tableName.getCatalogName()), tableName.getCatalogName(), sqlProperties, session, - metadata, + plannerContext, accessControl, parameterExtractor(statement, parameters), false); // skip setting of default properties since they should not be stored explicitly @@ -91,21 +94,21 @@ public ListenableFuture execute( private void setTableProperties(SetProperties statement, QualifiedObjectName tableName, Session session, Map properties) { - if (metadata.isMaterializedView(session, tableName)) { + if (plannerContext.getMetadata().isMaterializedView(session, tableName)) { throw semanticException(NOT_SUPPORTED, statement, "Cannot set properties to a materialized view in ALTER TABLE"); } - if (metadata.isView(session, tableName)) { + if (plannerContext.getMetadata().isView(session, tableName)) { throw semanticException(NOT_SUPPORTED, statement, "Cannot set properties to a view in ALTER TABLE"); } - Optional tableHandle = metadata.getTableHandle(session, tableName); + Optional tableHandle = plannerContext.getMetadata().getTableHandle(session, tableName); if (tableHandle.isEmpty()) { throw semanticException(TABLE_NOT_FOUND, statement, "Table does not exist: %s", tableName); } accessControl.checkCanSetTableProperties(session.toSecurityContext(), tableName, properties); - metadata.setTableProperties(session, tableHandle.get(), properties); + plannerContext.getMetadata().setTableProperties(session, tableHandle.get(), properties); } } diff --git a/core/trino-main/src/main/java/io/trino/execution/SetSessionTask.java b/core/trino-main/src/main/java/io/trino/execution/SetSessionTask.java index 84e040eaa503..5d7d988c5235 100644 --- a/core/trino-main/src/main/java/io/trino/execution/SetSessionTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/SetSessionTask.java @@ -17,12 +17,13 @@ import io.trino.Session; import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; +import io.trino.metadata.SessionPropertyManager; import io.trino.security.AccessControl; import io.trino.security.SecurityContext; import io.trino.spi.TrinoException; import io.trino.spi.session.PropertyMetadata; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.Expression; import io.trino.sql.tree.QualifiedName; import io.trino.sql.tree.SetSession; @@ -44,14 +45,16 @@ public class SetSessionTask implements DataDefinitionTask { - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; + private final SessionPropertyManager sessionPropertyManager; @Inject - public SetSessionTask(Metadata metadata, AccessControl accessControl) + public SetSessionTask(PlannerContext plannerContext, AccessControl accessControl, SessionPropertyManager sessionPropertyManager) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); } @Override @@ -78,14 +81,14 @@ public ListenableFuture execute( PropertyMetadata propertyMetadata; if (parts.size() == 1) { accessControl.checkCanSetSystemSessionProperty(session.getIdentity(), parts.get(0)); - propertyMetadata = metadata.getSessionPropertyManager().getSystemSessionPropertyMetadata(parts.get(0)) + propertyMetadata = sessionPropertyManager.getSystemSessionPropertyMetadata(parts.get(0)) .orElseThrow(() -> semanticException(INVALID_SESSION_PROPERTY, statement, "Session property '%s' does not exist", statement.getName())); } else { - CatalogName catalogName = metadata.getCatalogHandle(stateMachine.getSession(), parts.get(0)) + CatalogName catalogName = plannerContext.getMetadata().getCatalogHandle(stateMachine.getSession(), parts.get(0)) .orElseThrow(() -> semanticException(CATALOG_NOT_FOUND, statement, "Catalog '%s' does not exist", parts.get(0))); accessControl.checkCanSetCatalogSessionProperty(SecurityContext.of(session), parts.get(0), parts.get(1)); - propertyMetadata = metadata.getSessionPropertyManager().getConnectorSessionPropertyMetadata(catalogName, parts.get(1)) + propertyMetadata = sessionPropertyManager.getConnectorSessionPropertyMetadata(catalogName, parts.get(1)) .orElseThrow(() -> semanticException(INVALID_SESSION_PROPERTY, statement, "Session property '%s' does not exist", statement.getName())); } @@ -93,7 +96,7 @@ public ListenableFuture execute( Object objectValue; try { - objectValue = evaluatePropertyValue(statement.getValue(), type, session, metadata, accessControl, parameterExtractor(statement, parameters)); + objectValue = evaluatePropertyValue(statement.getValue(), type, session, plannerContext, accessControl, parameterExtractor(statement, parameters)); } catch (TrinoException e) { throw new TrinoException( diff --git a/core/trino-main/src/main/java/io/trino/execution/SetTimeZoneTask.java b/core/trino-main/src/main/java/io/trino/execution/SetTimeZoneTask.java index e75bb177dcdb..a13beb0099ec 100644 --- a/core/trino-main/src/main/java/io/trino/execution/SetTimeZoneTask.java +++ b/core/trino-main/src/main/java/io/trino/execution/SetTimeZoneTask.java @@ -13,34 +13,21 @@ */ package io.trino.execution; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.ListenableFuture; import io.airlift.slice.Slice; -import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.metadata.ResolvedFunction; import io.trino.security.AccessControl; import io.trino.spi.TrinoException; -import io.trino.spi.security.GroupProvider; import io.trino.spi.type.TimeZoneKey; import io.trino.spi.type.Type; import io.trino.spi.type.VarcharType; -import io.trino.sql.analyzer.Analysis; -import io.trino.sql.analyzer.AnalyzerFactory; -import io.trino.sql.analyzer.CorrelationSupport; -import io.trino.sql.analyzer.ExpressionAnalysis; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.ExpressionAnalyzer; -import io.trino.sql.analyzer.RelationId; -import io.trino.sql.analyzer.RelationType; import io.trino.sql.analyzer.Scope; -import io.trino.sql.parser.SqlParser; -import io.trino.sql.planner.ExpressionInterpreter; import io.trino.sql.tree.Expression; -import io.trino.sql.tree.ExpressionRewriter; -import io.trino.sql.tree.ExpressionTreeRewriter; -import io.trino.sql.tree.FunctionCall; import io.trino.sql.tree.NodeRef; +import io.trino.sql.tree.Parameter; import io.trino.sql.tree.SetTimeZone; import io.trino.type.IntervalDayTimeType; @@ -50,7 +37,6 @@ import java.util.Map; import java.util.TimeZone; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.util.concurrent.Futures.immediateVoidFuture; import static io.trino.SystemSessionProperties.TIME_ZONE_ID; import static io.trino.spi.StandardErrorCode.INVALID_LITERAL; @@ -58,6 +44,8 @@ import static io.trino.spi.type.TimeZoneKey.getTimeZoneKey; import static io.trino.spi.type.TimeZoneKey.getTimeZoneKeyForOffset; import static io.trino.sql.ParameterUtils.parameterExtractor; +import static io.trino.sql.analyzer.ExpressionAnalyzer.createConstantAnalyzer; +import static io.trino.sql.planner.ExpressionInterpreter.evaluateConstantExpression; import static io.trino.util.Failures.checkCondition; import static java.lang.String.format; import static java.util.Objects.requireNonNull; @@ -65,20 +53,14 @@ public class SetTimeZoneTask implements DataDefinitionTask { - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; - private final SqlParser sqlParser; - private final AnalyzerFactory analyzerFactory; - private final GroupProvider groupProvider; @Inject - public SetTimeZoneTask(Metadata metadata, AccessControl accessControl, SqlParser sqlParser, AnalyzerFactory analyzerFactory, GroupProvider groupProvider) + public SetTimeZoneTask(PlannerContext plannerContext, AccessControl accessControl) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); - this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); - this.analyzerFactory = requireNonNull(analyzerFactory, "analyzerFactory is null"); - this.groupProvider = requireNonNull(groupProvider, "groupProvider is null"); } @Override @@ -109,33 +91,28 @@ private String getTimeZoneId( List parameters, WarningCollector warningCollector) { - Session session = stateMachine.getSession(); - Analysis analysis = analyzeStatement(statement, stateMachine, parameters, session); - Scope scope = Scope.builder() - .withRelationType(RelationId.anonymous(), new RelationType()) - .build(); - ExpressionAnalysis expressionAnalysis = ExpressionAnalyzer.analyzeExpression( - session, - metadata, - groupProvider, + Map, Expression> parameterLookup = parameterExtractor(statement, parameters); + ExpressionAnalyzer analyzer = createConstantAnalyzer( + plannerContext, accessControl, - sqlParser, - scope, - analysis, - expression, - warningCollector, - CorrelationSupport.ALLOWED); - Expression rewrittenExpression = rewriteExpression(expression, analysis); - Type type = expressionAnalysis.getType(expression); + stateMachine.getSession(), + parameterLookup, + warningCollector); + + Type type = analyzer.analyze(expression, Scope.create()); if (!(type instanceof VarcharType || type instanceof IntervalDayTimeType)) { throw new TrinoException(TYPE_MISMATCH, format("Expected expression of varchar or interval day-time type, but '%s' has %s type", expression, type.getDisplayName())); } - Map, Type> expressionTypes = ImmutableMap., Type>builder() - .put(NodeRef.of(rewrittenExpression), type) - .build(); - ExpressionInterpreter interpreter = new ExpressionInterpreter(rewrittenExpression, metadata, session, expressionTypes); - Object timeZoneValue = interpreter.evaluate(); + Object timeZoneValue = evaluateConstantExpression( + expression, + analyzer.getExpressionCoercions(), + analyzer.getTypeOnlyCoercions(), + plannerContext, + stateMachine.getSession(), + accessControl, + ImmutableSet.of(), + parameterLookup); TimeZoneKey timeZoneKey; if (timeZoneValue instanceof Slice) { @@ -150,46 +127,6 @@ else if (timeZoneValue instanceof Long) { return timeZoneKey.getId(); } - private Analysis analyzeStatement( - SetTimeZone statement, - QueryStateMachine stateMachine, - List parameters, - Session session) - { - return analyzerFactory.createAnalyzer( - session, - parameters, - parameterExtractor(statement, parameters), - stateMachine.getWarningCollector()) - .analyze(statement); - } - - private static Expression rewriteExpression(Expression expression, Analysis analysis) - { - return ExpressionTreeRewriter.rewriteWith(new ExpressionRewriter() - { - @Override - public Expression rewriteFunctionCall(FunctionCall node, Void context, ExpressionTreeRewriter treeRewriter) - { - ResolvedFunction resolvedFunction = analysis.getResolvedFunction(node); - checkArgument(resolvedFunction != null, "Function has not been analyzed: %s", node); - - FunctionCall rewritten = treeRewriter.defaultRewrite(node, context); - rewritten = new FunctionCall( - rewritten.getLocation(), - resolvedFunction.toQualifiedName(), - rewritten.getWindow(), - rewritten.getFilter(), - rewritten.getOrderBy(), - rewritten.isDistinct(), - rewritten.getNullTreatment(), - rewritten.getProcessingMode(), - rewritten.getArguments()); - return rewritten; - } - }, expression, null); - } - private static long getZoneOffsetMinutes(long interval) { checkCondition((interval % 60_000L) == 0L, INVALID_LITERAL, "Invalid time zone offset interval: interval contains seconds"); diff --git a/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java b/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java index 8a57d58844bb..31c43a53530b 100644 --- a/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java +++ b/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java @@ -31,7 +31,6 @@ import io.trino.execution.warnings.WarningCollector; import io.trino.failuredetector.FailureDetector; import io.trino.memory.VersionedMemoryPoolId; -import io.trino.metadata.Metadata; import io.trino.metadata.TableHandle; import io.trino.operator.ForScheduler; import io.trino.server.BasicQueryInfo; @@ -39,7 +38,7 @@ import io.trino.server.protocol.Slug; import io.trino.spi.QueryId; import io.trino.spi.TrinoException; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Analysis; import io.trino.sql.analyzer.Analyzer; import io.trino.sql.analyzer.AnalyzerFactory; @@ -94,8 +93,7 @@ public class SqlQueryExecution { private final QueryStateMachine stateMachine; private final Slug slug; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final SplitSourceFactory splitSourceFactory; private final NodePartitioningManager nodePartitioningManager; private final NodeScheduler nodeScheduler; @@ -124,8 +122,7 @@ private SqlQueryExecution( PreparedQuery preparedQuery, QueryStateMachine stateMachine, Slug slug, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, AnalyzerFactory analyzerFactory, SplitSourceFactory splitSourceFactory, NodePartitioningManager nodePartitioningManager, @@ -150,8 +147,7 @@ private SqlQueryExecution( { try (SetThreadName ignored = new SetThreadName("Query-%s", stateMachine.getQueryId())) { this.slug = requireNonNull(slug, "slug is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.splitSourceFactory = requireNonNull(splitSourceFactory, "splitSourceFactory is null"); this.nodePartitioningManager = requireNonNull(nodePartitioningManager, "nodePartitioningManager is null"); this.nodeScheduler = requireNonNull(nodeScheduler, "nodeScheduler is null"); @@ -462,8 +458,7 @@ private PlanRoot doPlanQuery() LogicalPlanner logicalPlanner = new LogicalPlanner(stateMachine.getSession(), planOptimizers, idAllocator, - metadata, - typeOperators, + plannerContext, typeAnalyzer, statsCalculator, costCalculator, @@ -475,7 +470,7 @@ private PlanRoot doPlanQuery() SubPlan fragmentedPlan = planFragmenter.createSubPlans(stateMachine.getSession(), plan, false, stateMachine.getWarningCollector()); // extract inputs - List inputs = new InputExtractor(metadata, stateMachine.getSession()).extractInputs(fragmentedPlan); + List inputs = new InputExtractor(plannerContext.getMetadata(), stateMachine.getSession()).extractInputs(fragmentedPlan); stateMachine.setInputs(inputs); stateMachine.setOutput(analysis.getTarget()); @@ -514,7 +509,7 @@ private void planDistribution(PlanRoot plan) schedulerStats, dynamicFilterService, tableExecuteContextManager, - metadata, + plannerContext.getMetadata(), splitSourceFactory, coordinatorTaskManager); @@ -683,8 +678,7 @@ public static class SqlQueryExecutionFactory { private final SplitSchedulerStats schedulerStats; private final int scheduleSplitBatchSize; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final AnalyzerFactory analyzerFactory; private final SplitSourceFactory splitSourceFactory; private final NodePartitioningManager nodePartitioningManager; @@ -707,8 +701,7 @@ public static class SqlQueryExecutionFactory @Inject SqlQueryExecutionFactory( QueryManagerConfig config, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, AnalyzerFactory analyzerFactory, SplitSourceFactory splitSourceFactory, NodePartitioningManager nodePartitioningManager, @@ -732,8 +725,7 @@ public static class SqlQueryExecutionFactory requireNonNull(config, "config is null"); this.schedulerStats = requireNonNull(schedulerStats, "schedulerStats is null"); this.scheduleSplitBatchSize = config.getScheduleSplitBatchSize(); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.analyzerFactory = requireNonNull(analyzerFactory, "analyzerFactory is null"); this.splitSourceFactory = requireNonNull(splitSourceFactory, "splitSourceFactory is null"); this.nodePartitioningManager = requireNonNull(nodePartitioningManager, "nodePartitioningManager is null"); @@ -769,8 +761,7 @@ public QueryExecution createQueryExecution( preparedQuery, stateMachine, slug, - metadata, - typeOperators, + plannerContext, analyzerFactory, splitSourceFactory, nodePartitioningManager, diff --git a/core/trino-main/src/main/java/io/trino/metadata/AbstractCatalogPropertyManager.java b/core/trino-main/src/main/java/io/trino/metadata/AbstractCatalogPropertyManager.java index f2f0fb1eeb11..cedc93bc5caa 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/AbstractCatalogPropertyManager.java +++ b/core/trino-main/src/main/java/io/trino/metadata/AbstractCatalogPropertyManager.java @@ -18,6 +18,7 @@ import io.trino.security.AccessControl; import io.trino.spi.ErrorCodeSupplier; import io.trino.spi.session.PropertyMetadata; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.Expression; import io.trino.sql.tree.NodeRef; import io.trino.sql.tree.Parameter; @@ -48,7 +49,7 @@ public Map getProperties( String catalogNameForDiagnostics, Map sqlPropertyValues, Session session, - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Map, Expression> parameters, boolean setDefaultProperties) @@ -58,7 +59,7 @@ public Map getProperties( catalogNameForDiagnostics, sqlPropertyValues, session, - metadata, + plannerContext, accessControl, parameters, setDefaultProperties); diff --git a/core/trino-main/src/main/java/io/trino/metadata/AbstractPropertyManager.java b/core/trino-main/src/main/java/io/trino/metadata/AbstractPropertyManager.java index 2ae570782bbd..874ded5dab1f 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/AbstractPropertyManager.java +++ b/core/trino-main/src/main/java/io/trino/metadata/AbstractPropertyManager.java @@ -22,6 +22,7 @@ import io.trino.spi.block.BlockBuilder; import io.trino.spi.session.PropertyMetadata; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ParameterRewriter; import io.trino.sql.tree.Expression; import io.trino.sql.tree.ExpressionTreeRewriter; @@ -74,7 +75,7 @@ protected final Map doGetProperties( String catalogNameForDiagnostics, Map sqlPropertyValues, Session session, - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Map, Expression> parameters, boolean setDefaultProperties) @@ -101,7 +102,7 @@ protected final Map doGetProperties( Object sqlObjectValue; try { - sqlObjectValue = evaluatePropertyValue(sqlProperty.getValue(), property.getSqlType(), session, metadata, accessControl, parameters); + sqlObjectValue = evaluatePropertyValue(sqlProperty.getValue(), property.getSqlType(), session, plannerContext, accessControl, parameters); } catch (TrinoException e) { throw new TrinoException( @@ -158,12 +159,12 @@ private Object evaluatePropertyValue( Expression expression, Type expectedType, Session session, - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Map, Expression> parameters) { Expression rewritten = ExpressionTreeRewriter.rewriteWith(new ParameterRewriter(parameters), expression); - Object value = evaluateConstantExpression(rewritten, expectedType, metadata, session, accessControl, parameters); + Object value = evaluateConstantExpression(rewritten, expectedType, plannerContext, session, accessControl, parameters); // convert to object value type of SQL type BlockBuilder blockBuilder = expectedType.createBlockBuilder(null, 1); diff --git a/core/trino-main/src/main/java/io/trino/metadata/BlockEncodingManager.java b/core/trino-main/src/main/java/io/trino/metadata/BlockEncodingManager.java new file mode 100644 index 000000000000..fe79fba4dcc2 --- /dev/null +++ b/core/trino-main/src/main/java/io/trino/metadata/BlockEncodingManager.java @@ -0,0 +1,76 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.trino.metadata; + +import io.trino.spi.block.ArrayBlockEncoding; +import io.trino.spi.block.BlockEncoding; +import io.trino.spi.block.ByteArrayBlockEncoding; +import io.trino.spi.block.DictionaryBlockEncoding; +import io.trino.spi.block.Int128ArrayBlockEncoding; +import io.trino.spi.block.Int96ArrayBlockEncoding; +import io.trino.spi.block.IntArrayBlockEncoding; +import io.trino.spi.block.LazyBlockEncoding; +import io.trino.spi.block.LongArrayBlockEncoding; +import io.trino.spi.block.MapBlockEncoding; +import io.trino.spi.block.RowBlockEncoding; +import io.trino.spi.block.RunLengthBlockEncoding; +import io.trino.spi.block.ShortArrayBlockEncoding; +import io.trino.spi.block.SingleMapBlockEncoding; +import io.trino.spi.block.SingleRowBlockEncoding; +import io.trino.spi.block.VariableWidthBlockEncoding; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import static com.google.common.base.Preconditions.checkArgument; +import static java.util.Objects.requireNonNull; + +public final class BlockEncodingManager +{ + private final Map blockEncodings = new ConcurrentHashMap<>(); + + public BlockEncodingManager() + { + // add the built-in BlockEncodings + addBlockEncoding(new VariableWidthBlockEncoding()); + addBlockEncoding(new ByteArrayBlockEncoding()); + addBlockEncoding(new ShortArrayBlockEncoding()); + addBlockEncoding(new IntArrayBlockEncoding()); + addBlockEncoding(new LongArrayBlockEncoding()); + addBlockEncoding(new Int96ArrayBlockEncoding()); + addBlockEncoding(new Int128ArrayBlockEncoding()); + addBlockEncoding(new DictionaryBlockEncoding()); + addBlockEncoding(new ArrayBlockEncoding()); + addBlockEncoding(new MapBlockEncoding()); + addBlockEncoding(new SingleMapBlockEncoding()); + addBlockEncoding(new RowBlockEncoding()); + addBlockEncoding(new SingleRowBlockEncoding()); + addBlockEncoding(new RunLengthBlockEncoding()); + addBlockEncoding(new LazyBlockEncoding()); + } + + public BlockEncoding getBlockEncoding(String encodingName) + { + BlockEncoding blockEncoding = blockEncodings.get(encodingName); + checkArgument(blockEncoding != null, "Unknown block encoding: %s", encodingName); + return blockEncoding; + } + + public void addBlockEncoding(BlockEncoding blockEncoding) + { + requireNonNull(blockEncoding, "blockEncoding is null"); + BlockEncoding existingEntry = blockEncodings.putIfAbsent(blockEncoding.getName(), blockEncoding); + checkArgument(existingEntry == null, "Encoding already registered: %s", blockEncoding.getName()); + } +} diff --git a/core/trino-main/src/main/java/io/trino/metadata/FunctionRegistry.java b/core/trino-main/src/main/java/io/trino/metadata/FunctionRegistry.java index d5b2f840128e..bf8c22d67ac9 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/FunctionRegistry.java +++ b/core/trino-main/src/main/java/io/trino/metadata/FunctionRegistry.java @@ -276,7 +276,6 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.ExecutionException; -import java.util.function.Supplier; import static com.google.common.base.MoreObjects.toStringHelper; import static com.google.common.base.Preconditions.checkArgument; @@ -387,7 +386,7 @@ public class FunctionRegistry private volatile FunctionMap functions = new FunctionMap(); public FunctionRegistry( - Supplier blockEncodingSerdeSupplier, + BlockEncodingSerde blockEncodingSerde, FeaturesConfig featuresConfig, TypeOperators typeOperators, BlockTypeOperators blockTypeOperators, @@ -615,7 +614,7 @@ public FunctionRegistry( .functions(MAP_FILTER_FUNCTION, new MapTransformKeysFunction(blockTypeOperators), MAP_TRANSFORM_VALUES_FUNCTION) .function(FORMAT_FUNCTION) .function(TRY_CAST) - .function(new LiteralFunction(blockEncodingSerdeSupplier)) + .function(new LiteralFunction(blockEncodingSerde)) .function(new GenericEqualOperator(typeOperators)) .function(new GenericHashCodeOperator(typeOperators)) .function(new GenericXxHash64Operator(typeOperators)) diff --git a/core/trino-main/src/main/java/io/trino/metadata/FunctionResolver.java b/core/trino-main/src/main/java/io/trino/metadata/FunctionResolver.java index 68cdd9b4e537..569c8f47bac3 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/FunctionResolver.java +++ b/core/trino-main/src/main/java/io/trino/metadata/FunctionResolver.java @@ -19,6 +19,7 @@ import io.trino.Session; import io.trino.spi.TrinoException; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import io.trino.sql.analyzer.TypeSignatureProvider; import io.trino.sql.tree.QualifiedName; @@ -41,14 +42,17 @@ import static io.trino.sql.analyzer.TypeSignatureProvider.fromTypeSignatures; import static io.trino.type.UnknownType.UNKNOWN; import static java.lang.String.format; +import static java.util.Objects.requireNonNull; public class FunctionResolver { private final Metadata metadata; + private final TypeManager typeManager; - public FunctionResolver(Metadata metadata) + public FunctionResolver(Metadata metadata, TypeManager typeManager) { - this.metadata = metadata; + this.metadata = requireNonNull(metadata, "metadata is null"); + this.typeManager = requireNonNull(typeManager, "typeManager is null"); } FunctionBinding resolveCoercion(Session session, Collection allCandidates, Signature signature) @@ -77,7 +81,7 @@ FunctionBinding resolveCoercion(Session session, Collection al private boolean canBindSignature(Session session, Signature declaredSignature, Signature actualSignature) { - return new SignatureBinder(session, metadata, declaredSignature, false) + return new SignatureBinder(session, metadata, typeManager, declaredSignature, false) .canBind(fromTypeSignatures(actualSignature.getArgumentTypes()), actualSignature.getReturnType()); } @@ -85,9 +89,9 @@ private FunctionBinding toFunctionBinding(FunctionMetadata functionMetadata, Sig { BoundSignature boundSignature = new BoundSignature( signature.getName(), - metadata.getType(signature.getReturnType()), + typeManager.getType(signature.getReturnType()), signature.getArgumentTypes().stream() - .map(metadata::getType) + .map(typeManager::getType) .collect(toImmutableList())); return SignatureBinder.bindFunction( functionMetadata.getFunctionId(), @@ -194,7 +198,7 @@ private List identifyApplicableFunctions(Session session, Co { ImmutableList.Builder applicableFunctions = ImmutableList.builder(); for (FunctionMetadata function : candidates) { - new SignatureBinder(session, metadata, function.getSignature(), allowCoercion) + new SignatureBinder(session, metadata, typeManager, function.getSignature(), allowCoercion) .bind(actualParameters) .ifPresent(signature -> applicableFunctions.add(new ApplicableFunction(function, signature))); } @@ -285,7 +289,7 @@ private List getUnknownOnlyCastFunctions(List actualParameters) { List boundTypes = applicableFunction.getBoundSignature().getArgumentTypes().stream() - .map(metadata::getType) + .map(typeManager::getType) .collect(toImmutableList()); checkState(actualParameters.size() == boundTypes.size(), "type lists are of different lengths"); for (int i = 0; i < actualParameters.size(); i++) { @@ -299,7 +303,7 @@ private boolean onlyCastsUnknown(ApplicableFunction applicableFunction, List applicableFunctions) { Set returnTypes = applicableFunctions.stream() - .map(function -> metadata.getType(function.getBoundSignature().getReturnType())) + .map(function -> typeManager.getType(function.getBoundSignature().getReturnType())) .collect(Collectors.toSet()); return returnTypes.size() == 1; } @@ -335,7 +339,7 @@ private Optional> toTypes(List typeSignaturePr if (typeSignatureProvider.hasDependency()) { return Optional.empty(); } - resultBuilder.add(metadata.getType(typeSignatureProvider.getTypeSignature())); + resultBuilder.add(typeManager.getType(typeSignatureProvider.getTypeSignature())); } return Optional.of(resultBuilder.build()); } @@ -346,7 +350,7 @@ private Optional> toTypes(List typeSignaturePr private boolean isMoreSpecificThan(Session session, ApplicableFunction left, ApplicableFunction right) { List resolvedTypes = fromTypeSignatures(left.getBoundSignature().getArgumentTypes()); - return new SignatureBinder(session, metadata, right.getDeclaredSignature(), true) + return new SignatureBinder(session, metadata, typeManager, right.getDeclaredSignature(), true) .canBind(resolvedTypes); } diff --git a/core/trino-main/src/main/java/io/trino/metadata/InternalBlockEncodingSerde.java b/core/trino-main/src/main/java/io/trino/metadata/InternalBlockEncodingSerde.java index 24d53cf1b1ed..31a0e2b213f6 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/InternalBlockEncodingSerde.java +++ b/core/trino-main/src/main/java/io/trino/metadata/InternalBlockEncodingSerde.java @@ -20,6 +20,10 @@ import io.trino.spi.block.BlockEncodingSerde; import io.trino.spi.type.Type; import io.trino.spi.type.TypeId; +import io.trino.spi.type.TypeManager; +import org.assertj.core.util.VisibleForTesting; + +import javax.inject.Inject; import java.util.Optional; import java.util.function.Function; @@ -27,13 +31,20 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Objects.requireNonNull; -final class InternalBlockEncodingSerde +public final class InternalBlockEncodingSerde implements BlockEncodingSerde { private final Function blockEncodings; private final Function types; - public InternalBlockEncodingSerde(Function blockEncodings, Function types) + @Inject + public InternalBlockEncodingSerde(BlockEncodingManager blockEncodingManager, TypeManager typeManager) + { + this(blockEncodingManager::getBlockEncoding, typeManager::getType); + } + + @VisibleForTesting + InternalBlockEncodingSerde(Function blockEncodings, Function types) { this.blockEncodings = requireNonNull(blockEncodings, "blockEncodings is null"); this.types = requireNonNull(types, "types is null"); diff --git a/core/trino-main/src/main/java/io/trino/metadata/LiteralFunction.java b/core/trino-main/src/main/java/io/trino/metadata/LiteralFunction.java index 6b27fdcb5ddb..bf911fd67cd2 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/LiteralFunction.java +++ b/core/trino-main/src/main/java/io/trino/metadata/LiteralFunction.java @@ -26,7 +26,6 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; -import java.util.function.Supplier; import static com.google.common.base.Preconditions.checkArgument; import static io.trino.block.BlockSerdeUtil.READ_BLOCK; @@ -39,15 +38,16 @@ import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.VarbinaryType.VARBINARY; +import static java.util.Objects.requireNonNull; public class LiteralFunction extends SqlScalarFunction { public static final String LITERAL_FUNCTION_NAME = "$literal$"; - private final Supplier blockEncodingSerdeSupplier; + private final BlockEncodingSerde blockEncodingSerde; - public LiteralFunction(Supplier blockEncodingSerdeSupplier) + public LiteralFunction(BlockEncodingSerde blockEncodingSerde) { super(new FunctionMetadata( new Signature( @@ -62,7 +62,7 @@ public LiteralFunction(Supplier blockEncodingSerdeSupplier) true, "literal", SCALAR)); - this.blockEncodingSerdeSupplier = blockEncodingSerdeSupplier; + this.blockEncodingSerde = requireNonNull(blockEncodingSerde, "blockEncodingSerde is null"); } @Override @@ -78,10 +78,10 @@ public ScalarFunctionImplementation specialize(BoundSignature boundSignature) if (parameterType.getJavaType() == Slice.class) { if (type.getJavaType() == Block.class) { - methodHandle = READ_BLOCK.bindTo(blockEncodingSerdeSupplier.get()); + methodHandle = READ_BLOCK.bindTo(blockEncodingSerde); } else if (type.getJavaType() != Slice.class) { - methodHandle = READ_BLOCK_VALUE.bindTo(blockEncodingSerdeSupplier.get()).bindTo(type); + methodHandle = READ_BLOCK_VALUE.bindTo(blockEncodingSerde).bindTo(type); } } diff --git a/core/trino-main/src/main/java/io/trino/metadata/Metadata.java b/core/trino-main/src/main/java/io/trino/metadata/Metadata.java index a89c6c0af7d4..6315468a251a 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/Metadata.java +++ b/core/trino-main/src/main/java/io/trino/metadata/Metadata.java @@ -20,7 +20,6 @@ import io.trino.operator.aggregation.AggregationMetadata; import io.trino.operator.window.WindowFunctionSupplier; import io.trino.spi.TrinoException; -import io.trino.spi.block.BlockEncodingSerde; import io.trino.spi.connector.AggregateFunction; import io.trino.spi.connector.AggregationApplicationResult; import io.trino.spi.connector.BeginTableExecuteResult; @@ -59,11 +58,7 @@ import io.trino.spi.statistics.ComputedStatistics; import io.trino.spi.statistics.TableStatistics; import io.trino.spi.statistics.TableStatisticsMetadata; -import io.trino.spi.type.ParametricType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeId; -import io.trino.spi.type.TypeSignature; -import io.trino.spi.type.TypeSignatureParameter; import io.trino.sql.analyzer.TypeSignatureProvider; import io.trino.sql.planner.PartitioningHandle; import io.trino.sql.tree.QualifiedName; @@ -614,27 +609,6 @@ default void validateScan(Session session, TableHandle table) {} */ List listTablePrivileges(Session session, QualifiedTablePrefix prefix); - // - // Types - // - - Type getType(TypeSignature signature); - - Type fromSqlType(String sqlType); - - Type getType(TypeId id); - - default Type getParameterizedType(String baseTypeName, List typeParameters) - { - return getType(new TypeSignature(baseTypeName, typeParameters)); - } - - Collection getTypes(); - - Collection getParametricTypes(); - - void verifyTypes(); - // // Functions // @@ -675,34 +649,6 @@ default ResolvedFunction getCoercion(Session session, Type fromType, Type toType FunctionInvoker getScalarFunctionInvoker(ResolvedFunction resolvedFunction, InvocationConvention invocationConvention); - ProcedureRegistry getProcedureRegistry(); - - TableProceduresRegistry getTableProcedureRegistry(); - - // - // Blocks - // - - BlockEncodingSerde getBlockEncodingSerde(); - - // - // Properties - // - - SessionPropertyManager getSessionPropertyManager(); - - SchemaPropertyManager getSchemaPropertyManager(); - - TablePropertyManager getTablePropertyManager(); - - MaterializedViewPropertyManager getMaterializedViewPropertyManager(); - - ColumnPropertyManager getColumnPropertyManager(); - - AnalyzePropertyManager getAnalyzePropertyManager(); - - TableProceduresPropertyManager getTableProceduresPropertyManager(); - /** * Creates the specified materialized view with the specified view definition. */ diff --git a/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java b/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java index ed831bb25fe5..1ae3ce8f2a68 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java +++ b/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java @@ -14,14 +14,11 @@ package io.trino.metadata; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Joiner; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; import com.google.common.collect.Streams; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -37,24 +34,8 @@ import io.trino.operator.window.WindowFunctionSupplier; import io.trino.spi.QueryId; import io.trino.spi.TrinoException; -import io.trino.spi.block.ArrayBlockEncoding; import io.trino.spi.block.Block; -import io.trino.spi.block.BlockEncoding; import io.trino.spi.block.BlockEncodingSerde; -import io.trino.spi.block.ByteArrayBlockEncoding; -import io.trino.spi.block.DictionaryBlockEncoding; -import io.trino.spi.block.Int128ArrayBlockEncoding; -import io.trino.spi.block.Int96ArrayBlockEncoding; -import io.trino.spi.block.IntArrayBlockEncoding; -import io.trino.spi.block.LazyBlockEncoding; -import io.trino.spi.block.LongArrayBlockEncoding; -import io.trino.spi.block.MapBlockEncoding; -import io.trino.spi.block.RowBlockEncoding; -import io.trino.spi.block.RunLengthBlockEncoding; -import io.trino.spi.block.ShortArrayBlockEncoding; -import io.trino.spi.block.SingleMapBlockEncoding; -import io.trino.spi.block.SingleRowBlockEncoding; -import io.trino.spi.block.VariableWidthBlockEncoding; import io.trino.spi.connector.AggregateFunction; import io.trino.spi.connector.AggregationApplicationResult; import io.trino.spi.connector.Assignment; @@ -115,9 +96,8 @@ import io.trino.spi.statistics.ComputedStatistics; import io.trino.spi.statistics.TableStatistics; import io.trino.spi.statistics.TableStatisticsMetadata; -import io.trino.spi.type.ParametricType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeId; +import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeNotFoundException; import io.trino.spi.type.TypeOperators; import io.trino.spi.type.TypeSignature; @@ -137,7 +117,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -179,20 +158,6 @@ import static io.trino.spi.StandardErrorCode.SCHEMA_NOT_FOUND; import static io.trino.spi.StandardErrorCode.SYNTAX_ERROR; import static io.trino.spi.StandardErrorCode.TABLE_REDIRECTION_ERROR; -import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.BOXED_NULLABLE; -import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.NEVER_NULL; -import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.FAIL_ON_NULL; -import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.NULLABLE_RETURN; -import static io.trino.spi.function.InvocationConvention.simpleConvention; -import static io.trino.spi.function.OperatorType.COMPARISON_UNORDERED_FIRST; -import static io.trino.spi.function.OperatorType.COMPARISON_UNORDERED_LAST; -import static io.trino.spi.function.OperatorType.EQUAL; -import static io.trino.spi.function.OperatorType.HASH_CODE; -import static io.trino.spi.function.OperatorType.INDETERMINATE; -import static io.trino.spi.function.OperatorType.IS_DISTINCT_FROM; -import static io.trino.spi.function.OperatorType.LESS_THAN; -import static io.trino.spi.function.OperatorType.LESS_THAN_OR_EQUAL; -import static io.trino.spi.function.OperatorType.XX_HASH_64; import static io.trino.sql.analyzer.TypeSignatureProvider.fromTypeSignatures; import static io.trino.sql.analyzer.TypeSignatureProvider.fromTypes; import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; @@ -209,22 +174,11 @@ public final class MetadataManager public static final int MAX_TABLE_REDIRECTIONS = 10; private final FunctionRegistry functions; - private final TypeOperators typeOperators; private final FunctionResolver functionResolver; - private final ProcedureRegistry procedures; - private final TableProceduresRegistry tableProcedures; - private final SessionPropertyManager sessionPropertyManager; - private final SchemaPropertyManager schemaPropertyManager; - private final TablePropertyManager tablePropertyManager; - private final MaterializedViewPropertyManager materializedViewPropertyManager; - private final ColumnPropertyManager columnPropertyManager; - private final AnalyzePropertyManager analyzePropertyManager; - private final TableProceduresPropertyManager tableProceduresPropertyManager; private final SystemSecurityMetadata systemSecurityMetadata; private final TransactionManager transactionManager; - private final TypeRegistry typeRegistry; + private final TypeManager typeManager; - private final ConcurrentMap blockEncodings = new ConcurrentHashMap<>(); private final ConcurrentMap catalogsByQueryId = new ConcurrentHashMap<>(); private final ResolvedFunctionDecoder functionDecoder; @@ -235,57 +189,23 @@ public final class MetadataManager @Inject public MetadataManager( FeaturesConfig featuresConfig, - SessionPropertyManager sessionPropertyManager, - SchemaPropertyManager schemaPropertyManager, - TablePropertyManager tablePropertyManager, - MaterializedViewPropertyManager materializedViewPropertyManager, - ColumnPropertyManager columnPropertyManager, - AnalyzePropertyManager analyzePropertyManager, - TableProceduresPropertyManager tableProceduresPropertyManager, SystemSecurityMetadata systemSecurityMetadata, TransactionManager transactionManager, TypeOperators typeOperators, BlockTypeOperators blockTypeOperators, + TypeManager typeManager, + BlockEncodingSerde blockEncodingSerde, NodeVersion nodeVersion) { requireNonNull(nodeVersion, "nodeVersion is null"); - typeRegistry = new TypeRegistry(featuresConfig); - functions = new FunctionRegistry(this::getBlockEncodingSerde, featuresConfig, typeOperators, blockTypeOperators, nodeVersion.getVersion()); - functionResolver = new FunctionResolver(this); - - this.procedures = new ProcedureRegistry(); - this.tableProcedures = new TableProceduresRegistry(); - this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); - this.schemaPropertyManager = requireNonNull(schemaPropertyManager, "schemaPropertyManager is null"); - this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); - this.materializedViewPropertyManager = requireNonNull(materializedViewPropertyManager, "materializedViewPropertyManager is null"); - this.columnPropertyManager = requireNonNull(columnPropertyManager, "columnPropertyManager is null"); - this.analyzePropertyManager = requireNonNull(analyzePropertyManager, "analyzePropertyManager is null"); - this.tableProceduresPropertyManager = requireNonNull(tableProceduresPropertyManager, "tableProceduresPropertyManager is null"); + this.typeManager = requireNonNull(typeManager, "typeManager is null"); + functions = new FunctionRegistry(blockEncodingSerde, featuresConfig, typeOperators, blockTypeOperators, nodeVersion.getVersion()); + functionResolver = new FunctionResolver(this, typeManager); + this.systemSecurityMetadata = requireNonNull(systemSecurityMetadata, "systemSecurityMetadata is null"); this.transactionManager = requireNonNull(transactionManager, "transactionManager is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); - - // add the built-in BlockEncodings - addBlockEncoding(new VariableWidthBlockEncoding()); - addBlockEncoding(new ByteArrayBlockEncoding()); - addBlockEncoding(new ShortArrayBlockEncoding()); - addBlockEncoding(new IntArrayBlockEncoding()); - addBlockEncoding(new LongArrayBlockEncoding()); - addBlockEncoding(new Int96ArrayBlockEncoding()); - addBlockEncoding(new Int128ArrayBlockEncoding()); - addBlockEncoding(new DictionaryBlockEncoding()); - addBlockEncoding(new ArrayBlockEncoding()); - addBlockEncoding(new MapBlockEncoding()); - addBlockEncoding(new SingleMapBlockEncoding()); - addBlockEncoding(new RowBlockEncoding()); - addBlockEncoding(new SingleRowBlockEncoding()); - addBlockEncoding(new RunLengthBlockEncoding()); - addBlockEncoding(new LazyBlockEncoding()); - - verifyTypes(); - - functionDecoder = new ResolvedFunctionDecoder(this::getType); + + functionDecoder = new ResolvedFunctionDecoder(typeManager::getType); operatorCache = CacheBuilder.newBuilder() .maximumSize(1000) @@ -319,19 +239,16 @@ public static MetadataManager createTestMetadataManager(CatalogManager catalogMa public static MetadataManager createTestMetadataManager(TransactionManager transactionManager, FeaturesConfig featuresConfig) { TypeOperators typeOperators = new TypeOperators(); + TypeRegistry typeRegistry = new TypeRegistry(typeOperators, featuresConfig); + TypeManager typeManager = new InternalTypeManager(typeRegistry); return new MetadataManager( featuresConfig, - new SessionPropertyManager(), - new SchemaPropertyManager(), - new TablePropertyManager(), - new MaterializedViewPropertyManager(), - new ColumnPropertyManager(), - new AnalyzePropertyManager(), - new TableProceduresPropertyManager(), new DisabledSystemSecurityMetadata(), transactionManager, typeOperators, new BlockTypeOperators(typeOperators), + typeManager, + new InternalBlockEncodingSerde(new BlockEncodingManager(), typeManager), NodeVersion.UNKNOWN); } @@ -763,7 +680,7 @@ public Map> listTableColumns(Session ses ImmutableList.Builder columns = ImmutableList.builder(); for (ViewColumn column : entry.getValue().getColumns()) { try { - columns.add(new ColumnMetadata(column.getName(), getType(column.getType()))); + columns.add(new ColumnMetadata(column.getName(), typeManager.getType(column.getType()))); } catch (TypeNotFoundException e) { throw new TrinoException(INVALID_VIEW, format("Unknown type '%s' for column '%s' in view: %s", column.getType(), column.getName(), entry.getKey())); @@ -777,7 +694,7 @@ public Map> listTableColumns(Session ses ImmutableList.Builder columns = ImmutableList.builder(); for (ViewColumn column : entry.getValue().getColumns()) { try { - columns.add(new ColumnMetadata(column.getName(), getType(column.getType()))); + columns.add(new ColumnMetadata(column.getName(), typeManager.getType(column.getType()))); } catch (TypeNotFoundException e) { throw new TrinoException(INVALID_VIEW, format("Unknown type '%s' for column '%s' in materialized view: %s", column.getType(), column.getName(), entry.getKey())); @@ -2249,204 +2166,6 @@ public List listTablePrivileges(Session session, QualifiedTablePrefix return ImmutableList.copyOf(grantInfos.build()); } - // - // Types - // - - @Override - public Type getType(TypeSignature signature) - { - return typeRegistry.getType(new InternalTypeManager(this, typeOperators), signature); - } - - @Override - public Type fromSqlType(String sqlType) - { - return typeRegistry.fromSqlType(new InternalTypeManager(this, typeOperators), sqlType); - } - - @Override - public Type getType(TypeId id) - { - return typeRegistry.getType(new InternalTypeManager(this, typeOperators), id); - } - - @Override - public Collection getTypes() - { - return typeRegistry.getTypes(); - } - - @Override - public Collection getParametricTypes() - { - return typeRegistry.getParametricTypes(); - } - - public void addType(Type type) - { - typeRegistry.addType(type); - } - - public void addParametricType(ParametricType parametricType) - { - typeRegistry.addParametricType(parametricType); - } - - @Override - public void verifyTypes() - { - Set missingOperatorDeclaration = new HashSet<>(); - Multimap missingOperators = HashMultimap.create(); - for (Type type : typeRegistry.getTypes()) { - if (type.getTypeOperatorDeclaration(typeOperators) == null) { - missingOperatorDeclaration.add(type); - continue; - } - if (type.isComparable()) { - if (!hasEqualMethod(type)) { - missingOperators.put(type, EQUAL); - } - if (!hasHashCodeMethod(type)) { - missingOperators.put(type, HASH_CODE); - } - if (!hasXxHash64Method(type)) { - missingOperators.put(type, XX_HASH_64); - } - if (!hasDistinctFromMethod(type)) { - missingOperators.put(type, IS_DISTINCT_FROM); - } - if (!hasIndeterminateMethod(type)) { - missingOperators.put(type, INDETERMINATE); - } - } - if (type.isOrderable()) { - if (!hasComparisonUnorderedLastMethod(type)) { - missingOperators.put(type, COMPARISON_UNORDERED_LAST); - } - if (!hasComparisonUnorderedFirstMethod(type)) { - missingOperators.put(type, COMPARISON_UNORDERED_FIRST); - } - if (!hasLessThanMethod(type)) { - missingOperators.put(type, LESS_THAN); - } - if (!hasLessThanOrEqualMethod(type)) { - missingOperators.put(type, LESS_THAN_OR_EQUAL); - } - } - } - // TODO: verify the parametric types too - if (!missingOperators.isEmpty()) { - List messages = new ArrayList<>(); - for (Type type : missingOperatorDeclaration) { - messages.add(format("%s types operators is null", type)); - } - for (Type type : missingOperators.keySet()) { - messages.add(format("%s missing for %s", missingOperators.get(type), type)); - } - throw new IllegalStateException(Joiner.on(", ").join(messages)); - } - } - - private boolean hasEqualMethod(Type type) - { - try { - typeOperators.getEqualOperator(type, simpleConvention(NULLABLE_RETURN, NEVER_NULL, NEVER_NULL)); - return true; - } - catch (RuntimeException e) { - return false; - } - } - - private boolean hasHashCodeMethod(Type type) - { - try { - typeOperators.getHashCodeOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL)); - return true; - } - catch (RuntimeException e) { - return false; - } - } - - private boolean hasXxHash64Method(Type type) - { - try { - typeOperators.getXxHash64Operator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL)); - return true; - } - catch (RuntimeException e) { - return false; - } - } - - private boolean hasDistinctFromMethod(Type type) - { - try { - typeOperators.getDistinctFromOperator(type, simpleConvention(FAIL_ON_NULL, BOXED_NULLABLE, BOXED_NULLABLE)); - return true; - } - catch (RuntimeException e) { - return false; - } - } - - private boolean hasIndeterminateMethod(Type type) - { - try { - typeOperators.getIndeterminateOperator(type, simpleConvention(FAIL_ON_NULL, BOXED_NULLABLE)); - return true; - } - catch (RuntimeException e) { - return false; - } - } - - private boolean hasComparisonUnorderedLastMethod(Type type) - { - try { - typeOperators.getComparisonUnorderedLastOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); - return true; - } - catch (UnsupportedOperationException e) { - return false; - } - } - - private boolean hasComparisonUnorderedFirstMethod(Type type) - { - try { - typeOperators.getComparisonUnorderedFirstOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); - return true; - } - catch (UnsupportedOperationException e) { - return false; - } - } - - private boolean hasLessThanMethod(Type type) - { - try { - typeOperators.getLessThanOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); - return true; - } - catch (UnsupportedOperationException e) { - return false; - } - } - - private boolean hasLessThanOrEqualMethod(Type type) - { - try { - typeOperators.getLessThanOrEqualOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); - return true; - } - catch (UnsupportedOperationException e) { - return false; - } - } - // // Functions // @@ -2558,7 +2277,7 @@ public ResolvedFunction resolve(Session session, FunctionBinding functionBinding { Map dependentTypes = declaration.getTypeDependencies().stream() .map(typeSignature -> applyBoundVariables(typeSignature, functionBinding)) - .collect(toImmutableMap(Function.identity(), this::getType, (left, right) -> left)); + .collect(toImmutableMap(Function.identity(), typeManager::getType, (left, right) -> left)); ImmutableSet.Builder functions = ImmutableSet.builder(); declaration.getFunctionDependencies().stream() @@ -2596,8 +2315,8 @@ public ResolvedFunction resolve(Session session, FunctionBinding functionBinding declaration.getCastDependencies().stream() .map(castDependency -> { try { - Type fromType = getType(applyBoundVariables(castDependency.getFromType(), functionBinding)); - Type toType = getType(applyBoundVariables(castDependency.getToType(), functionBinding)); + Type fromType = typeManager.getType(applyBoundVariables(castDependency.getFromType(), functionBinding)); + Type toType = typeManager.getType(applyBoundVariables(castDependency.getToType(), functionBinding)); return getCoercion(session, fromType, toType); } catch (TrinoException e) { @@ -2803,88 +2522,10 @@ public static FunctionBinding toFunctionBinding(FunctionId functionId, BoundSign boundSignature); } - @Override - public ProcedureRegistry getProcedureRegistry() - { - return procedures; - } - - @Override - public TableProceduresRegistry getTableProcedureRegistry() - { - return tableProcedures; - } - // // Blocks // - private BlockEncoding getBlockEncoding(String encodingName) - { - BlockEncoding blockEncoding = blockEncodings.get(encodingName); - checkArgument(blockEncoding != null, "Unknown block encoding: %s", encodingName); - return blockEncoding; - } - - @Override - public BlockEncodingSerde getBlockEncodingSerde() - { - return new InternalBlockEncodingSerde(this::getBlockEncoding, this::getType); - } - - public void addBlockEncoding(BlockEncoding blockEncoding) - { - requireNonNull(blockEncoding, "blockEncoding is null"); - BlockEncoding existingEntry = blockEncodings.putIfAbsent(blockEncoding.getName(), blockEncoding); - checkArgument(existingEntry == null, "Encoding already registered: %s", blockEncoding.getName()); - } - - // - // Properties - // - - @Override - public SessionPropertyManager getSessionPropertyManager() - { - return sessionPropertyManager; - } - - @Override - public SchemaPropertyManager getSchemaPropertyManager() - { - return schemaPropertyManager; - } - - @Override - public TablePropertyManager getTablePropertyManager() - { - return tablePropertyManager; - } - - @Override - public MaterializedViewPropertyManager getMaterializedViewPropertyManager() - { - return materializedViewPropertyManager; - } - - @Override - public ColumnPropertyManager getColumnPropertyManager() - { - return columnPropertyManager; - } - - @Override - public AnalyzePropertyManager getAnalyzePropertyManager() - { - return analyzePropertyManager; - } - - @Override - public TableProceduresPropertyManager getTableProceduresPropertyManager() - { - return tableProceduresPropertyManager; - } - // // Helpers // diff --git a/core/trino-main/src/main/java/io/trino/metadata/ProcedureRegistry.java b/core/trino-main/src/main/java/io/trino/metadata/ProcedureRegistry.java index eab3fb3c4d51..dceee0b4cb4d 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/ProcedureRegistry.java +++ b/core/trino-main/src/main/java/io/trino/metadata/ProcedureRegistry.java @@ -48,10 +48,6 @@ public class ProcedureRegistry { private final Map> connectorProcedures = new ConcurrentHashMap<>(); - public ProcedureRegistry() - { - } - public void addProcedures(CatalogName catalogName, Collection procedures) { requireNonNull(catalogName, "catalogName is null"); diff --git a/core/trino-main/src/main/java/io/trino/metadata/SessionPropertyManager.java b/core/trino-main/src/main/java/io/trino/metadata/SessionPropertyManager.java index ce45fbbc5a41..279141b68880 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/SessionPropertyManager.java +++ b/core/trino-main/src/main/java/io/trino/metadata/SessionPropertyManager.java @@ -34,6 +34,7 @@ import io.trino.spi.type.MapType; import io.trino.spi.type.Type; import io.trino.spi.type.VarcharType; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ParameterRewriter; import io.trino.sql.tree.Expression; import io.trino.sql.tree.ExpressionTreeRewriter; @@ -241,10 +242,10 @@ private static T decodePropertyValue(String fullPropertyName, @Nullable Stri } } - public static Object evaluatePropertyValue(Expression expression, Type expectedType, Session session, Metadata metadata, AccessControl accessControl, Map, Expression> parameters) + public static Object evaluatePropertyValue(Expression expression, Type expectedType, Session session, PlannerContext plannerContext, AccessControl accessControl, Map, Expression> parameters) { Expression rewritten = ExpressionTreeRewriter.rewriteWith(new ParameterRewriter(parameters), expression); - Object value = evaluateConstantExpression(rewritten, expectedType, metadata, session, accessControl, parameters); + Object value = evaluateConstantExpression(rewritten, expectedType, plannerContext, session, accessControl, parameters); // convert to object value type of SQL type BlockBuilder blockBuilder = expectedType.createBlockBuilder(null, 1); diff --git a/core/trino-main/src/main/java/io/trino/metadata/SignatureBinder.java b/core/trino-main/src/main/java/io/trino/metadata/SignatureBinder.java index 27dc4d7975b7..ff5a08a312a0 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/SignatureBinder.java +++ b/core/trino-main/src/main/java/io/trino/metadata/SignatureBinder.java @@ -23,6 +23,7 @@ import io.trino.spi.type.ParameterKind; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeSignature; import io.trino.spi.type.TypeSignatureParameter; import io.trino.sql.analyzer.TypeSignatureProvider; @@ -83,17 +84,19 @@ public class SignatureBinder private final Session session; private final Metadata metadata; + private final TypeManager typeManager; private final TypeCoercion typeCoercion; private final Signature declaredSignature; private final boolean allowCoercion; private final Map typeVariableConstraints; - SignatureBinder(Session session, Metadata metadata, Signature declaredSignature, boolean allowCoercion) + SignatureBinder(Session session, Metadata metadata, TypeManager typeManager, Signature declaredSignature, boolean allowCoercion) { checkNoLiteralVariableUsageAcrossTypes(declaredSignature); this.session = requireNonNull(session, "session is null"); this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.typeManager = requireNonNull(typeManager, "typeManager is null"); + this.typeCoercion = new TypeCoercion(typeManager::getType); this.declaredSignature = requireNonNull(declaredSignature, "declaredSignature is null"); this.allowCoercion = allowCoercion; @@ -438,7 +441,7 @@ private boolean appendConstraintSolvers( if (typeVariableConstraint == null) { return true; } - Type actualType = metadata.getType(actualTypeSignatureProvider.getTypeSignature()); + Type actualType = typeManager.getType(actualTypeSignatureProvider.getTypeSignature()); for (TypeSignature castToSignature : typeVariableConstraint.getCastableTo()) { appendTypeRelationshipConstraintSolver(resultBuilder, castToSignature, actualTypeSignatureProvider, EXPLICIT_COERCION_TO); } @@ -457,7 +460,7 @@ private boolean appendConstraintSolvers( return true; } - Type actualType = metadata.getType(actualTypeSignatureProvider.getTypeSignature()); + Type actualType = typeManager.getType(actualTypeSignatureProvider.getTypeSignature()); if (isTypeWithLiteralParameters(formalTypeSignature)) { resultBuilder.add(new TypeWithLiteralParametersSolver(formalTypeSignature, actualType)); return true; @@ -658,11 +661,11 @@ private boolean satisfiesCoercion(RelationshipType relationshipType, Type actual case EXACT: return actualType.getTypeSignature().equals(constraintTypeSignature); case IMPLICIT_COERCION: - return typeCoercion.canCoerce(actualType, metadata.getType(constraintTypeSignature)); + return typeCoercion.canCoerce(actualType, typeManager.getType(constraintTypeSignature)); case EXPLICIT_COERCION_TO: - return canCast(actualType, metadata.getType(constraintTypeSignature)); + return canCast(actualType, typeManager.getType(constraintTypeSignature)); case EXPLICIT_COERCION_FROM: - return canCast(metadata.getType(constraintTypeSignature), actualType); + return canCast(typeManager.getType(constraintTypeSignature), actualType); } throw new IllegalArgumentException("Unsupported relationshipType " + relationshipType); } @@ -869,7 +872,7 @@ public SolverReturnStatus update(BoundVariables bindings) originalTypeTypeParametersBuilder.add(typeSignatureParameter); } } - Type originalType = metadata.getType(new TypeSignature(formalTypeSignature.getBase(), originalTypeTypeParametersBuilder.build())); + Type originalType = typeManager.getType(new TypeSignature(formalTypeSignature.getBase(), originalTypeTypeParametersBuilder.build())); Optional commonSuperType = typeCoercion.getCommonSuperType(originalType, actualType); if (commonSuperType.isEmpty()) { return SolverReturnStatus.UNSOLVABLE; @@ -939,7 +942,7 @@ public SolverReturnStatus update(BoundVariables bindings) verify(getLambdaArgumentTypeSignatures(actualLambdaTypeSignature).equals(toTypeSignatures(lambdaArgumentTypes.get()))); } - Type actualLambdaType = metadata.getType(actualLambdaTypeSignature); + Type actualLambdaType = typeManager.getType(actualLambdaTypeSignature); Type actualReturnType = ((FunctionType) actualLambdaType).getReturnType(); ImmutableList.Builder constraintsBuilder = ImmutableList.builder(); @@ -974,7 +977,7 @@ private Optional> synthesizeLambdaArgumentTypes( lambdaArgumentTypesBuilder.add(typeVariable); } else { - lambdaArgumentTypesBuilder.add(metadata.getType(lambdaArgument)); + lambdaArgumentTypesBuilder.add(typeManager.getType(lambdaArgument)); } } return Optional.of(lambdaArgumentTypesBuilder.build()); @@ -1005,7 +1008,7 @@ private boolean appendTypeRelationshipConstraintSolver( formalTypeSignature, typeVariables, longVariables, - metadata.getType(actualTypeSignatureProvider.getTypeSignature()), + typeManager.getType(actualTypeSignatureProvider.getTypeSignature()), relationshipType)); return true; } diff --git a/core/trino-main/src/main/java/io/trino/metadata/TableProceduresPropertyManager.java b/core/trino-main/src/main/java/io/trino/metadata/TableProceduresPropertyManager.java index 43ccae91ec72..00b0d3b4bd64 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/TableProceduresPropertyManager.java +++ b/core/trino-main/src/main/java/io/trino/metadata/TableProceduresPropertyManager.java @@ -17,6 +17,7 @@ import io.trino.connector.CatalogName; import io.trino.security.AccessControl; import io.trino.spi.session.PropertyMetadata; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.Expression; import io.trino.sql.tree.NodeRef; import io.trino.sql.tree.Parameter; @@ -60,7 +61,7 @@ public Map getProperties( String catalogNameForDiagnostics, Map sqlPropertyValues, Session session, - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Map, Expression> parameters, boolean setDefaultProperties) @@ -70,7 +71,7 @@ public Map getProperties( catalogNameForDiagnostics, sqlPropertyValues, session, - metadata, + plannerContext, accessControl, parameters, setDefaultProperties); diff --git a/core/trino-main/src/main/java/io/trino/metadata/TableProceduresRegistry.java b/core/trino-main/src/main/java/io/trino/metadata/TableProceduresRegistry.java index a01d512d9792..87ed2a4e175b 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/TableProceduresRegistry.java +++ b/core/trino-main/src/main/java/io/trino/metadata/TableProceduresRegistry.java @@ -32,10 +32,6 @@ public class TableProceduresRegistry { private final Map> tableProcedures = new ConcurrentHashMap<>(); - public TableProceduresRegistry() - { - } - public void addTableProcedures(CatalogName catalogName, Collection procedures) { requireNonNull(catalogName, "catalogName is null"); diff --git a/core/trino-main/src/main/java/io/trino/metadata/TypeRegistry.java b/core/trino-main/src/main/java/io/trino/metadata/TypeRegistry.java index a803cfdc8534..3898bf0b3c5e 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/TypeRegistry.java +++ b/core/trino-main/src/main/java/io/trino/metadata/TypeRegistry.java @@ -13,16 +13,21 @@ */ package io.trino.metadata; +import com.google.common.base.Joiner; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; import com.google.common.util.concurrent.UncheckedExecutionException; import io.trino.FeaturesConfig; +import io.trino.spi.function.OperatorType; import io.trino.spi.type.ParametricType; import io.trino.spi.type.Type; import io.trino.spi.type.TypeId; import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeNotFoundException; +import io.trino.spi.type.TypeOperators; import io.trino.spi.type.TypeParameter; import io.trino.spi.type.TypeSignature; import io.trino.spi.type.TypeSignatureParameter; @@ -33,11 +38,14 @@ import io.trino.type.VarcharParametricType; import javax.annotation.concurrent.ThreadSafe; +import javax.inject.Inject; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; @@ -45,6 +53,20 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Throwables.throwIfUnchecked; +import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.BOXED_NULLABLE; +import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.NEVER_NULL; +import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.FAIL_ON_NULL; +import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.NULLABLE_RETURN; +import static io.trino.spi.function.InvocationConvention.simpleConvention; +import static io.trino.spi.function.OperatorType.COMPARISON_UNORDERED_FIRST; +import static io.trino.spi.function.OperatorType.COMPARISON_UNORDERED_LAST; +import static io.trino.spi.function.OperatorType.EQUAL; +import static io.trino.spi.function.OperatorType.HASH_CODE; +import static io.trino.spi.function.OperatorType.INDETERMINATE; +import static io.trino.spi.function.OperatorType.IS_DISTINCT_FROM; +import static io.trino.spi.function.OperatorType.LESS_THAN; +import static io.trino.spi.function.OperatorType.LESS_THAN_OR_EQUAL; +import static io.trino.spi.function.OperatorType.XX_HASH_64; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DateType.DATE; @@ -79,10 +101,11 @@ import static io.trino.type.TDigestType.TDIGEST; import static io.trino.type.UnknownType.UNKNOWN; import static io.trino.type.setdigest.SetDigestType.SET_DIGEST; +import static java.lang.String.format; import static java.util.Objects.requireNonNull; @ThreadSafe -final class TypeRegistry +public final class TypeRegistry { private static final SqlParser SQL_PARSER = new SqlParser(); @@ -90,9 +113,15 @@ final class TypeRegistry private final ConcurrentMap parametricTypes = new ConcurrentHashMap<>(); private final Cache parametricTypeCache; + private final TypeManager typeManager; + private final TypeOperators typeOperators; - public TypeRegistry(FeaturesConfig featuresConfig) + @Inject + public TypeRegistry(TypeOperators typeOperators, FeaturesConfig featuresConfig) { + this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + requireNonNull(featuresConfig, "featuresConfig is null"); + // Manually register UNKNOWN type without a verifyTypeClass call since it is a special type that cannot be used by functions this.types.put(UNKNOWN.getTypeSignature(), UNKNOWN); @@ -138,14 +167,18 @@ public TypeRegistry(FeaturesConfig featuresConfig) parametricTypeCache = CacheBuilder.newBuilder() .maximumSize(1000) .build(); + + typeManager = new InternalTypeManager(this, typeOperators); + + verifyTypes(); } - public Type getType(TypeManager typeManager, TypeSignature signature) + public Type getType(TypeSignature signature) { Type type = types.get(signature); if (type == null) { try { - return parametricTypeCache.get(signature, () -> instantiateParametricType(typeManager, signature)); + return parametricTypeCache.get(signature, () -> instantiateParametricType(signature)); } catch (ExecutionException | UncheckedExecutionException e) { throwIfUnchecked(e.getCause()); @@ -155,18 +188,18 @@ public Type getType(TypeManager typeManager, TypeSignature signature) return type; } - public Type getType(TypeManager typeManager, TypeId id) + public Type getType(TypeId id) { // TODO: ID should be encoded in a more canonical form than SQL - return fromSqlType(typeManager, id.getId()); + return fromSqlType(id.getId()); } - public Type fromSqlType(TypeManager typeManager, String sqlType) + public Type fromSqlType(String sqlType) { - return getType(typeManager, toTypeSignature(SQL_PARSER.createType(sqlType))); + return getType(toTypeSignature(SQL_PARSER.createType(sqlType))); } - private Type instantiateParametricType(TypeManager typeManager, TypeSignature signature) + private Type instantiateParametricType(TypeSignature signature) { List parameters = new ArrayList<>(); @@ -225,4 +258,200 @@ public void addParametricType(ParametricType parametricType) checkArgument(!parametricTypes.containsKey(name), "Parametric type already registered: %s", name); parametricTypes.putIfAbsent(name, parametricType); } + + public TypeOperators getTypeOperators() + { + return typeOperators; + } + + public void verifyTypes() + { + Set missingOperatorDeclaration = new HashSet<>(); + Multimap missingOperators = HashMultimap.create(); + for (Type type : ImmutableList.copyOf(types.values())) { + if (type.getTypeOperatorDeclaration(typeOperators) == null) { + missingOperatorDeclaration.add(type); + continue; + } + if (type.isComparable()) { + if (!hasEqualMethod(type)) { + missingOperators.put(type, EQUAL); + } + if (!hasHashCodeMethod(type)) { + missingOperators.put(type, HASH_CODE); + } + if (!hasXxHash64Method(type)) { + missingOperators.put(type, XX_HASH_64); + } + if (!hasDistinctFromMethod(type)) { + missingOperators.put(type, IS_DISTINCT_FROM); + } + if (!hasIndeterminateMethod(type)) { + missingOperators.put(type, INDETERMINATE); + } + } + if (type.isOrderable()) { + if (!hasComparisonUnorderedLastMethod(type)) { + missingOperators.put(type, COMPARISON_UNORDERED_LAST); + } + if (!hasComparisonUnorderedFirstMethod(type)) { + missingOperators.put(type, COMPARISON_UNORDERED_FIRST); + } + if (!hasLessThanMethod(type)) { + missingOperators.put(type, LESS_THAN); + } + if (!hasLessThanOrEqualMethod(type)) { + missingOperators.put(type, LESS_THAN_OR_EQUAL); + } + } + } + // TODO: verify the parametric types too + if (!missingOperators.isEmpty()) { + List messages = new ArrayList<>(); + for (Type type : missingOperatorDeclaration) { + messages.add(format("%s types operators is null", type)); + } + for (Type type : missingOperators.keySet()) { + messages.add(format("%s missing for %s", missingOperators.get(type), type)); + } + throw new IllegalStateException(Joiner.on(", ").join(messages)); + } + } + + private boolean hasEqualMethod(Type type) + { + try { + typeOperators.getEqualOperator(type, simpleConvention(NULLABLE_RETURN, NEVER_NULL, NEVER_NULL)); + return true; + } + catch (RuntimeException e) { + return false; + } + } + + private boolean hasHashCodeMethod(Type type) + { + try { + typeOperators.getHashCodeOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL)); + return true; + } + catch (RuntimeException e) { + return false; + } + } + + private boolean hasXxHash64Method(Type type) + { + try { + typeOperators.getXxHash64Operator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL)); + return true; + } + catch (RuntimeException e) { + return false; + } + } + + private boolean hasDistinctFromMethod(Type type) + { + try { + typeOperators.getDistinctFromOperator(type, simpleConvention(FAIL_ON_NULL, BOXED_NULLABLE, BOXED_NULLABLE)); + return true; + } + catch (RuntimeException e) { + return false; + } + } + + private boolean hasIndeterminateMethod(Type type) + { + try { + typeOperators.getIndeterminateOperator(type, simpleConvention(FAIL_ON_NULL, BOXED_NULLABLE)); + return true; + } + catch (RuntimeException e) { + return false; + } + } + + private boolean hasComparisonUnorderedLastMethod(Type type) + { + try { + typeOperators.getComparisonUnorderedLastOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); + return true; + } + catch (UnsupportedOperationException e) { + return false; + } + } + + private boolean hasComparisonUnorderedFirstMethod(Type type) + { + try { + typeOperators.getComparisonUnorderedFirstOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); + return true; + } + catch (UnsupportedOperationException e) { + return false; + } + } + + private boolean hasLessThanMethod(Type type) + { + try { + typeOperators.getLessThanOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); + return true; + } + catch (UnsupportedOperationException e) { + return false; + } + } + + private boolean hasLessThanOrEqualMethod(Type type) + { + try { + typeOperators.getLessThanOrEqualOperator(type, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); + return true; + } + catch (UnsupportedOperationException e) { + return false; + } + } + + private static final class InternalTypeManager + implements TypeManager + { + private final TypeRegistry typeRegistry; + private final TypeOperators typeOperators; + + @Inject + public InternalTypeManager(TypeRegistry typeRegistry, TypeOperators typeOperators) + { + this.typeRegistry = requireNonNull(typeRegistry, "typeRegistry is null"); + this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + } + + @Override + public Type getType(TypeSignature signature) + { + return typeRegistry.getType(signature); + } + + @Override + public Type fromSqlType(String type) + { + return typeRegistry.fromSqlType(type); + } + + @Override + public Type getType(TypeId id) + { + return typeRegistry.getType(id); + } + + @Override + public TypeOperators getTypeOperators() + { + return typeOperators; + } + } } diff --git a/core/trino-main/src/main/java/io/trino/server/PluginManager.java b/core/trino-main/src/main/java/io/trino/server/PluginManager.java index c357b4c13128..fca3cb46efd5 100644 --- a/core/trino-main/src/main/java/io/trino/server/PluginManager.java +++ b/core/trino-main/src/main/java/io/trino/server/PluginManager.java @@ -18,7 +18,9 @@ import io.trino.connector.ConnectorManager; import io.trino.eventlistener.EventListenerManager; import io.trino.execution.resourcegroups.ResourceGroupManager; +import io.trino.metadata.BlockEncodingManager; import io.trino.metadata.MetadataManager; +import io.trino.metadata.TypeRegistry; import io.trino.security.AccessControlManager; import io.trino.security.GroupProviderManager; import io.trino.server.security.CertificateAuthenticatorManager; @@ -77,6 +79,8 @@ public class PluginManager private final EventListenerManager eventListenerManager; private final GroupProviderManager groupProviderManager; private final SessionPropertyDefaults sessionPropertyDefaults; + private final TypeRegistry typeRegistry; + private final BlockEncodingManager blockEncodingManager; private final AtomicBoolean pluginsLoading = new AtomicBoolean(); private final AtomicBoolean pluginsLoaded = new AtomicBoolean(); @@ -92,7 +96,9 @@ public PluginManager( Optional headerAuthenticatorManager, EventListenerManager eventListenerManager, GroupProviderManager groupProviderManager, - SessionPropertyDefaults sessionPropertyDefaults) + SessionPropertyDefaults sessionPropertyDefaults, + TypeRegistry typeRegistry, + BlockEncodingManager blockEncodingManager) { this.pluginsProvider = requireNonNull(pluginsProvider, "pluginsProvider is null"); this.connectorManager = requireNonNull(connectorManager, "connectorManager is null"); @@ -105,6 +111,8 @@ public PluginManager( this.eventListenerManager = requireNonNull(eventListenerManager, "eventListenerManager is null"); this.groupProviderManager = requireNonNull(groupProviderManager, "groupProviderManager is null"); this.sessionPropertyDefaults = requireNonNull(sessionPropertyDefaults, "sessionPropertyDefaults is null"); + this.typeRegistry = requireNonNull(typeRegistry, "typeRegistry is null"); + this.blockEncodingManager = requireNonNull(blockEncodingManager, "blockEncodingManager is null"); } public void loadPlugins() @@ -115,7 +123,7 @@ public void loadPlugins() pluginsProvider.loadPlugins(this::loadPlugin, PluginManager::createClassLoader); - metadataManager.verifyTypes(); + typeRegistry.verifyTypes(); pluginsLoaded.set(true); } @@ -153,24 +161,24 @@ private void loadPlugin(PluginClassLoader pluginClassLoader) public void installPlugin(Plugin plugin, Supplier duplicatePluginClassLoaderFactory) { installPluginInternal(plugin, duplicatePluginClassLoaderFactory); - metadataManager.verifyTypes(); + typeRegistry.verifyTypes(); } private void installPluginInternal(Plugin plugin, Supplier duplicatePluginClassLoaderFactory) { for (BlockEncoding blockEncoding : plugin.getBlockEncodings()) { log.info("Registering block encoding %s", blockEncoding.getName()); - metadataManager.addBlockEncoding(blockEncoding); + blockEncodingManager.addBlockEncoding(blockEncoding); } for (Type type : plugin.getTypes()) { log.info("Registering type %s", type.getTypeSignature()); - metadataManager.addType(type); + typeRegistry.addType(type); } for (ParametricType parametricType : plugin.getParametricTypes()) { log.info("Registering parametric type %s", parametricType.getName()); - metadataManager.addParametricType(parametricType); + typeRegistry.addParametricType(parametricType); } for (ConnectorFactory connectorFactory : plugin.getConnectorFactories()) { diff --git a/core/trino-main/src/main/java/io/trino/server/ServerMainModule.java b/core/trino-main/src/main/java/io/trino/server/ServerMainModule.java index 4bd96f692b31..70887082ba3e 100644 --- a/core/trino-main/src/main/java/io/trino/server/ServerMainModule.java +++ b/core/trino-main/src/main/java/io/trino/server/ServerMainModule.java @@ -64,23 +64,28 @@ import io.trino.memory.MemoryResource; import io.trino.memory.NodeMemoryConfig; import io.trino.metadata.AnalyzePropertyManager; +import io.trino.metadata.BlockEncodingManager; import io.trino.metadata.CatalogManager; import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.DisabledSystemSecurityMetadata; import io.trino.metadata.DiscoveryNodeManager; import io.trino.metadata.ForNodeManager; import io.trino.metadata.HandleJsonModule; +import io.trino.metadata.InternalBlockEncodingSerde; import io.trino.metadata.InternalNodeManager; import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.Metadata; import io.trino.metadata.MetadataManager; +import io.trino.metadata.ProcedureRegistry; import io.trino.metadata.SchemaPropertyManager; import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.StaticCatalogStore; import io.trino.metadata.StaticCatalogStoreConfig; import io.trino.metadata.SystemSecurityMetadata; import io.trino.metadata.TableProceduresPropertyManager; +import io.trino.metadata.TableProceduresRegistry; import io.trino.metadata.TablePropertyManager; +import io.trino.metadata.TypeRegistry; import io.trino.operator.ExchangeClientConfig; import io.trino.operator.ExchangeClientFactory; import io.trino.operator.ExchangeClientSupplier; @@ -103,6 +108,7 @@ import io.trino.spi.block.Block; import io.trino.spi.block.BlockEncodingSerde; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeOperators; import io.trino.spi.type.TypeSignature; import io.trino.spiller.FileSingleStreamSpillerFactory; @@ -119,7 +125,9 @@ import io.trino.split.PageSourceManager; import io.trino.split.PageSourceProvider; import io.trino.split.SplitManager; +import io.trino.sql.PlannerContext; import io.trino.sql.SqlEnvironmentConfig; +import io.trino.sql.analyzer.StatementAnalyzerFactory; import io.trino.sql.gen.ExpressionCompiler; import io.trino.sql.gen.JoinCompiler; import io.trino.sql.gen.JoinFilterFunctionCompiler; @@ -134,6 +142,7 @@ import io.trino.sql.tree.Expression; import io.trino.transaction.TransactionManagerConfig; import io.trino.type.BlockTypeOperators; +import io.trino.type.InternalTypeManager; import io.trino.type.TypeDeserializer; import io.trino.type.TypeOperatorsCache; import io.trino.type.TypeSignatureDeserializer; @@ -211,6 +220,7 @@ protected void setup(Binder binder) configBinder(binder).bindConfig(SqlEnvironmentConfig.class); newOptionalBinder(binder, ExplainAnalyzeContext.class); + binder.bind(StatementAnalyzerFactory.class).in(Scopes.SINGLETON); // GC Monitor binder.bind(GcMonitor.class).to(JmxGcMonitor.class).in(Scopes.SINGLETON); @@ -369,12 +379,17 @@ protected void setup(Binder binder) newExporter(binder).export(TypeOperatorsCache.class).as(factory -> factory.generatedNameOf(TypeOperators.class)); binder.bind(BlockTypeOperators.class).in(Scopes.SINGLETON); newExporter(binder).export(TypeOperatorsCache.class).withGeneratedName(); + binder.bind(ProcedureRegistry.class).in(Scopes.SINGLETON); + binder.bind(TableProceduresRegistry.class).in(Scopes.SINGLETON); + binder.bind(PlannerContext.class).in(Scopes.SINGLETON); // type binder.bind(TypeAnalyzer.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); + binder.bind(TypeRegistry.class).in(Scopes.SINGLETON); + binder.bind(TypeManager.class).to(InternalTypeManager.class).in(Scopes.SINGLETON); newSetBinder(binder, Type.class); // split manager @@ -427,8 +442,10 @@ protected void setup(Binder binder) binder.bind(CatalogManager.class).in(Scopes.SINGLETON); // block encodings + binder.bind(BlockEncodingManager.class).in(Scopes.SINGLETON); jsonBinder(binder).addSerializerBinding(Block.class).to(BlockJsonSerde.Serializer.class); jsonBinder(binder).addDeserializerBinding(Block.class).to(BlockJsonSerde.Deserializer.class); + binder.bind(BlockEncodingSerde.class).to(InternalBlockEncodingSerde.class).in(Scopes.SINGLETON); // thread visualizer jaxrsBinder(binder).bind(ThreadResource.class); @@ -518,13 +535,6 @@ public static ScheduledExecutorService createAsyncHttpTimeoutExecutor(TaskManage return newScheduledThreadPool(config.getHttpTimeoutThreads(), daemonThreadsNamed("async-http-timeout-%s")); } - @Provides - @Singleton - public static BlockEncodingSerde createBlockEncodingSerde(Metadata metadata) - { - return metadata.getBlockEncodingSerde(); - } - public static class ExecutorCleanup { private final List executors; diff --git a/core/trino-main/src/main/java/io/trino/server/testing/TestingTrinoServer.java b/core/trino-main/src/main/java/io/trino/server/testing/TestingTrinoServer.java index 75e6778eeed2..581efd306991 100644 --- a/core/trino-main/src/main/java/io/trino/server/testing/TestingTrinoServer.java +++ b/core/trino-main/src/main/java/io/trino/server/testing/TestingTrinoServer.java @@ -59,6 +59,8 @@ import io.trino.metadata.InternalNode; import io.trino.metadata.InternalNodeManager; import io.trino.metadata.Metadata; +import io.trino.metadata.ProcedureRegistry; +import io.trino.metadata.SessionPropertyManager; import io.trino.security.AccessControl; import io.trino.security.AccessControlConfig; import io.trino.security.AccessControlManager; @@ -76,9 +78,12 @@ import io.trino.spi.eventlistener.EventListener; import io.trino.spi.security.GroupProvider; import io.trino.spi.security.SystemAccessControl; +import io.trino.spi.type.TypeManager; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; import io.trino.sql.analyzer.AnalyzerFactory; +import io.trino.sql.analyzer.QueryExplainer; +import io.trino.sql.analyzer.QueryExplainerFactory; import io.trino.sql.planner.NodePartitioningManager; import io.trino.sql.planner.Plan; import io.trino.testing.ProcedureTester; @@ -144,8 +149,11 @@ public static Builder builder() private final CatalogManager catalogManager; private final TransactionManager transactionManager; private final Metadata metadata; - private final AnalyzerFactory analyzerFactory; + private final TypeManager typeManager; + private final QueryExplainer queryExplainer; + private final SessionPropertyManager sessionPropertyManager; private final StatsCalculator statsCalculator; + private final ProcedureRegistry procedureRegistry; private final TestingAccessControlManager accessControl; private final TestingGroupProvider groupProvider; private final ProcedureTester procedureTester; @@ -293,31 +301,36 @@ private TestingTrinoServer( catalogManager = injector.getInstance(CatalogManager.class); transactionManager = injector.getInstance(TransactionManager.class); metadata = injector.getInstance(Metadata.class); + typeManager = injector.getInstance(TypeManager.class); accessControl = injector.getInstance(TestingAccessControlManager.class); groupProvider = injector.getInstance(TestingGroupProvider.class); procedureTester = injector.getInstance(ProcedureTester.class); splitManager = injector.getInstance(SplitManager.class); pageSourceManager = injector.getInstance(PageSourceManager.class); + sessionPropertyManager = injector.getInstance(SessionPropertyManager.class); if (coordinator) { - analyzerFactory = injector.getInstance(AnalyzerFactory.class); dispatchManager = injector.getInstance(DispatchManager.class); queryManager = (SqlQueryManager) injector.getInstance(QueryManager.class); + queryExplainer = injector.getInstance(QueryExplainerFactory.class) + .createQueryExplainer(injector.getInstance(AnalyzerFactory.class)); resourceGroupManager = Optional.of((InternalResourceGroupManager) injector.getInstance(InternalResourceGroupManager.class)); sessionPropertyDefaults = injector.getInstance(SessionPropertyDefaults.class); nodePartitioningManager = injector.getInstance(NodePartitioningManager.class); clusterMemoryManager = injector.getInstance(ClusterMemoryManager.class); statsCalculator = injector.getInstance(StatsCalculator.class); + procedureRegistry = injector.getInstance(ProcedureRegistry.class); injector.getInstance(CertificateAuthenticatorManager.class).useDefaultAuthenticator(); } else { - analyzerFactory = null; dispatchManager = null; queryManager = null; + queryExplainer = null; resourceGroupManager = Optional.empty(); sessionPropertyDefaults = null; nodePartitioningManager = null; clusterMemoryManager = null; statsCalculator = null; + procedureRegistry = null; } localMemoryManager = injector.getInstance(LocalMemoryManager.class); nodeManager = injector.getInstance(InternalNodeManager.class); @@ -446,9 +459,19 @@ public Metadata getMetadata() return metadata; } - public AnalyzerFactory getAnalyzerFactory() + public TypeManager getTypeManager() { - return analyzerFactory; + return typeManager; + } + + public QueryExplainer getQueryExplainer() + { + return queryExplainer; + } + + public SessionPropertyManager getSessionPropertyManager() + { + return sessionPropertyManager; } public StatsCalculator getStatsCalculator() @@ -457,6 +480,11 @@ public StatsCalculator getStatsCalculator() return statsCalculator; } + public ProcedureRegistry getProcedureRegistry() + { + return procedureRegistry; + } + public TestingAccessControlManager getAccessControl() { return accessControl; diff --git a/core/trino-main/src/main/java/io/trino/spiller/FileSingleStreamSpillerFactory.java b/core/trino-main/src/main/java/io/trino/spiller/FileSingleStreamSpillerFactory.java index f9fafa8c8dea..409ab63c6253 100644 --- a/core/trino-main/src/main/java/io/trino/spiller/FileSingleStreamSpillerFactory.java +++ b/core/trino-main/src/main/java/io/trino/spiller/FileSingleStreamSpillerFactory.java @@ -25,7 +25,6 @@ import io.trino.execution.buffer.PagesSerde; import io.trino.execution.buffer.PagesSerdeFactory; import io.trino.memory.context.LocalMemoryContext; -import io.trino.metadata.Metadata; import io.trino.operator.SpillContext; import io.trino.spi.TrinoException; import io.trino.spi.block.BlockEncodingSerde; @@ -81,13 +80,13 @@ public class FileSingleStreamSpillerFactory private final LoadingCache spillPathHealthCache; @Inject - public FileSingleStreamSpillerFactory(Metadata metadata, SpillerStats spillerStats, FeaturesConfig featuresConfig, NodeSpillConfig nodeSpillConfig) + public FileSingleStreamSpillerFactory(BlockEncodingSerde blockEncodingSerde, SpillerStats spillerStats, FeaturesConfig featuresConfig, NodeSpillConfig nodeSpillConfig) { this( listeningDecorator(newFixedThreadPool( requireNonNull(featuresConfig, "featuresConfig is null").getSpillerThreads(), daemonThreadsNamed("binary-spiller-%s"))), - requireNonNull(metadata, "metadata is null").getBlockEncodingSerde(), + requireNonNull(blockEncodingSerde, "blockEncodingSerde is null"), spillerStats, requireNonNull(featuresConfig, "featuresConfig is null").getSpillerSpillPaths(), requireNonNull(featuresConfig, "featuresConfig is null").getSpillMaxUsedSpaceThreshold(), diff --git a/core/trino-main/src/main/java/io/trino/sql/PlannerContext.java b/core/trino-main/src/main/java/io/trino/sql/PlannerContext.java new file mode 100644 index 000000000000..dd283d6c9329 --- /dev/null +++ b/core/trino-main/src/main/java/io/trino/sql/PlannerContext.java @@ -0,0 +1,69 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.trino.sql; + +import io.trino.metadata.Metadata; +import io.trino.spi.block.BlockEncodingSerde; +import io.trino.spi.type.TypeManager; +import io.trino.spi.type.TypeOperators; + +import javax.inject.Inject; + +import static java.util.Objects.requireNonNull; + +/** + * A carrier of core, global, non-derived services for planner and analyzer. + * This is used to ease the addition of new services in the future without + * having to modify large portions the planner and analyzer just to pass around + * the service. + */ +public class PlannerContext +{ + // Be careful when adding services here. This context is used + // throughout the analyzer and planner, so it is easy to create + // circular dependencies, just create a junk drawer of services. + private final Metadata metadata; + private final TypeOperators typeOperators; + private final BlockEncodingSerde blockEncodingSerde; + private final TypeManager typeManager; + + @Inject + public PlannerContext(Metadata metadata, TypeOperators typeOperators, BlockEncodingSerde blockEncodingSerde, TypeManager typeManager) + { + this.metadata = requireNonNull(metadata, "metadata is null"); + this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.blockEncodingSerde = requireNonNull(blockEncodingSerde, "blockEncodingSerde is null"); + this.typeManager = requireNonNull(typeManager, "typeManager is null"); + } + + public Metadata getMetadata() + { + return metadata; + } + + public TypeOperators getTypeOperators() + { + return typeOperators; + } + + public BlockEncodingSerde getBlockEncodingSerde() + { + return blockEncodingSerde; + } + + public TypeManager getTypeManager() + { + return typeManager; + } +} diff --git a/core/trino-main/src/main/java/io/trino/sql/analyzer/Analyzer.java b/core/trino-main/src/main/java/io/trino/sql/analyzer/Analyzer.java index b2b68ec7e894..4ad9e81a02ae 100644 --- a/core/trino-main/src/main/java/io/trino/sql/analyzer/Analyzer.java +++ b/core/trino-main/src/main/java/io/trino/sql/analyzer/Analyzer.java @@ -18,9 +18,6 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.Metadata; -import io.trino.security.AccessControl; -import io.trino.spi.security.GroupProvider; -import io.trino.sql.parser.SqlParser; import io.trino.sql.rewrite.StatementRewrite; import io.trino.sql.tree.Expression; import io.trino.sql.tree.FunctionCall; @@ -43,11 +40,8 @@ public class Analyzer { - private final Metadata metadata; - private final SqlParser sqlParser; private final AnalyzerFactory analyzerFactory; - private final AccessControl accessControl; - private final GroupProvider groupProvider; + private final StatementAnalyzerFactory statementAnalyzerFactory; private final Session session; private final List parameters; private final Map, Expression> parameterLookup; @@ -56,22 +50,16 @@ public class Analyzer Analyzer( Session session, - Metadata metadata, - SqlParser sqlParser, AnalyzerFactory analyzerFactory, - GroupProvider groupProvider, - AccessControl accessControl, + StatementAnalyzerFactory statementAnalyzerFactory, List parameters, Map, Expression> parameterLookup, WarningCollector warningCollector, StatementRewrite statementRewrite) { this.session = requireNonNull(session, "session is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); this.analyzerFactory = requireNonNull(analyzerFactory, "analyzerFactory is null"); - this.groupProvider = requireNonNull(groupProvider, "groupProvider is null"); - this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); this.parameters = parameters; this.parameterLookup = parameterLookup; this.warningCollector = requireNonNull(warningCollector, "warningCollector is null"); @@ -87,7 +75,7 @@ public Analysis analyze(Statement statement, QueryType queryType) { Statement rewrittenStatement = statementRewrite.rewrite(analyzerFactory, session, statement, parameters, parameterLookup, warningCollector); Analysis analysis = new Analysis(rewrittenStatement, parameterLookup, queryType); - StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, groupProvider, accessControl, session, warningCollector, CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED); analyzer.analyze(rewrittenStatement, Optional.empty()); // check column access permissions for each table diff --git a/core/trino-main/src/main/java/io/trino/sql/analyzer/AnalyzerFactory.java b/core/trino-main/src/main/java/io/trino/sql/analyzer/AnalyzerFactory.java index a5043b5dbde0..e3f7fdc3e9fd 100644 --- a/core/trino-main/src/main/java/io/trino/sql/analyzer/AnalyzerFactory.java +++ b/core/trino-main/src/main/java/io/trino/sql/analyzer/AnalyzerFactory.java @@ -15,10 +15,6 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.security.AccessControl; -import io.trino.spi.security.GroupProvider; -import io.trino.sql.parser.SqlParser; import io.trino.sql.rewrite.StatementRewrite; import io.trino.sql.tree.Expression; import io.trino.sql.tree.NodeRef; @@ -33,24 +29,13 @@ public class AnalyzerFactory { - private final Metadata metadata; - private final SqlParser sqlParser; - private final AccessControl accessControl; - private final GroupProvider groupProvider; + private final StatementAnalyzerFactory statementAnalyzerFactory; private final StatementRewrite statementRewrite; @Inject - public AnalyzerFactory( - Metadata metadata, - SqlParser sqlParser, - AccessControl accessControl, - GroupProvider groupProvider, - StatementRewrite statementRewrite) + public AnalyzerFactory(StatementAnalyzerFactory statementAnalyzerFactory, StatementRewrite statementRewrite) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); - this.accessControl = requireNonNull(accessControl, "accessControl is null"); - this.groupProvider = requireNonNull(groupProvider, "groupProvider is null"); + this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); this.statementRewrite = requireNonNull(statementRewrite, "statementRewrite is null"); } @@ -62,11 +47,8 @@ public Analyzer createAnalyzer( { return new Analyzer( session, - metadata, - sqlParser, this, - groupProvider, - accessControl, + statementAnalyzerFactory, parameters, parameterLookup, warningCollector, diff --git a/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java b/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java index 5e69431587d2..53eec241bf1c 100644 --- a/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java +++ b/core/trino-main/src/main/java/io/trino/sql/analyzer/ExpressionAnalyzer.java @@ -24,7 +24,6 @@ import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.BoundSignature; import io.trino.metadata.FunctionMetadata; -import io.trino.metadata.Metadata; import io.trino.metadata.OperatorNotFoundException; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.ResolvedFunction; @@ -36,7 +35,6 @@ import io.trino.spi.TrinoException; import io.trino.spi.TrinoWarning; import io.trino.spi.function.OperatorType; -import io.trino.spi.security.GroupProvider; import io.trino.spi.type.CharType; import io.trino.spi.type.DateType; import io.trino.spi.type.DecimalParseResult; @@ -51,11 +49,11 @@ import io.trino.spi.type.TypeNotFoundException; import io.trino.spi.type.TypeSignatureParameter; import io.trino.spi.type.VarcharType; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Analysis.PredicateCoercions; import io.trino.sql.analyzer.Analysis.Range; import io.trino.sql.analyzer.Analysis.ResolvedWindow; import io.trino.sql.analyzer.PatternRecognitionAnalyzer.PatternRecognitionAnalysis; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeProvider; import io.trino.sql.tree.ArithmeticBinaryExpression; @@ -246,7 +244,7 @@ public class ExpressionAnalyzer private static final int MAX_NUMBER_GROUPING_ARGUMENTS_BIGINT = 63; private static final int MAX_NUMBER_GROUPING_ARGUMENTS_INTEGER = 31; - private final Metadata metadata; + private final PlannerContext plannerContext; private final AccessControl accessControl; private final BiFunction statementAnalyzerFactory; private final TypeProvider symbolTypes; @@ -298,8 +296,34 @@ public class ExpressionAnalyzer private final Function getResolvedWindow; private final List sourceFields = new ArrayList<>(); - public ExpressionAnalyzer( - Metadata metadata, + private ExpressionAnalyzer( + PlannerContext plannerContext, + AccessControl accessControl, + StatementAnalyzerFactory statementAnalyzerFactory, + Analysis analysis, + Session session, + TypeProvider types, + WarningCollector warningCollector) + { + this( + plannerContext, + accessControl, + (node, correlationSupport) -> statementAnalyzerFactory.createStatementAnalyzer( + analysis, + session, + warningCollector, + correlationSupport), + session, + types, + analysis.getParameters(), + warningCollector, + analysis.isDescribe(), + analysis::getType, + analysis::getWindow); + } + + ExpressionAnalyzer( + PlannerContext plannerContext, AccessControl accessControl, BiFunction statementAnalyzerFactory, Session session, @@ -310,7 +334,7 @@ public ExpressionAnalyzer( Function getPreanalyzedType, Function getResolvedWindow) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); this.session = requireNonNull(session, "session is null"); @@ -318,7 +342,7 @@ public ExpressionAnalyzer( this.parameters = requireNonNull(parameters, "parameters is null"); this.isDescribe = isDescribe; this.warningCollector = requireNonNull(warningCollector, "warningCollector is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); this.getPreanalyzedType = requireNonNull(getPreanalyzedType, "getPreanalyzedType is null"); this.getResolvedWindow = requireNonNull(getResolvedWindow, "getResolvedWindow is null"); } @@ -949,7 +973,7 @@ protected Type visitSubscriptExpression(SubscriptExpression node, StackableAstVi protected Type visitArrayConstructor(ArrayConstructor node, StackableAstVisitorContext context) { Type type = coerceToSingleType(context, "All ARRAY elements must be the same type: %s", node.getValues()); - Type arrayType = metadata.getParameterizedType(ARRAY.getName(), ImmutableList.of(TypeSignatureParameter.typeParameter(type.getTypeSignature()))); + Type arrayType = plannerContext.getTypeManager().getParameterizedType(ARRAY.getName(), ImmutableList.of(TypeSignatureParameter.typeParameter(type.getTypeSignature()))); return setExpressionType(node, arrayType); } @@ -1007,7 +1031,7 @@ protected Type visitGenericLiteral(GenericLiteral node, StackableAstVisitorConte { Type type; try { - type = metadata.fromSqlType(node.getType()); + type = plannerContext.getTypeManager().fromSqlType(node.getType()); } catch (TypeNotFoundException e) { throw semanticException(TYPE_NOT_FOUND, node, "Unknown type: %s", node.getType()); @@ -1015,7 +1039,7 @@ protected Type visitGenericLiteral(GenericLiteral node, StackableAstVisitorConte if (!JSON.equals(type)) { try { - metadata.getCoercion(session, VARCHAR, type); + plannerContext.getMetadata().getCoercion(session, VARCHAR, type); } catch (IllegalArgumentException e) { throw semanticException(INVALID_LITERAL, node, "No literal form for type %s", type); @@ -1100,7 +1124,7 @@ protected Type visitNullLiteral(NullLiteral node, StackableAstVisitorContext context) { boolean isRowPatternCount = context.getContext().isPatternRecognition() && - metadata.isAggregationFunction(node.getName()) && + plannerContext.getMetadata().isAggregationFunction(node.getName()) && node.getName().getSuffix().equalsIgnoreCase("count"); // argument of the form `label.*` is only allowed for row pattern count function node.getArguments().stream() @@ -1114,7 +1138,7 @@ protected Type visitFunctionCall(FunctionCall node, StackableAstVisitorContext 127) { process(expression, new StackableAstVisitorContext<>(context.getContext().expectingLambda(expectedFunctionType.getArgumentTypes()))); } else { - Type actualType = metadata.getType(argumentTypes.get(i).getTypeSignature()); + Type actualType = plannerContext.getTypeManager().getType(argumentTypes.get(i).getTypeSignature()); coerceType(expression, actualType, expectedType, format("Function %s argument %d", function, i)); } } @@ -1223,7 +1247,7 @@ else if (node.getArguments().size() > 127) { resolvedFunctions.put(NodeRef.of(node), function); - FunctionMetadata functionMetadata = metadata.getFunctionMetadata(function); + FunctionMetadata functionMetadata = plannerContext.getMetadata().getFunctionMetadata(function); if (functionMetadata.isDeprecated()) { warningCollector.add(new TrinoWarning(DEPRECATED_FUNCTION, format("Use of deprecated function: %s: %s", @@ -1454,7 +1478,7 @@ private void analyzeFrameRangeOffset(Expression offsetValue, FrameBound.Type bou operatorType = ADD; } try { - function = metadata.resolveOperator(session, operatorType, ImmutableList.of(sortKeyType, offsetValueType)); + function = plannerContext.getMetadata().resolveOperator(session, operatorType, ImmutableList.of(sortKeyType, offsetValueType)); } catch (TrinoException e) { ErrorCode errorCode = e.getErrorCode(); @@ -1524,7 +1548,7 @@ public List getCallArgumentTypes(List argumen argumentTypesBuilder.add(new TypeSignatureProvider( types -> { ExpressionAnalyzer innerExpressionAnalyzer = new ExpressionAnalyzer( - metadata, + plannerContext, accessControl, statementAnalyzerFactory, session, @@ -1849,7 +1873,7 @@ private void analyzePatternAggregation(FunctionCall node) private void checkNoNestedAggregations(FunctionCall node) { extractExpressions(node.getArguments(), FunctionCall.class).stream() - .filter(function -> metadata.isAggregationFunction(function.getName())) + .filter(function -> plannerContext.getMetadata().isAggregationFunction(function.getName())) .findFirst() .ifPresent(aggregation -> { throw semanticException( @@ -1932,7 +1956,7 @@ protected Type visitFormat(Format node, StackableAstVisitorContext cont for (int i = 1; i < arguments.size(); i++) { try { - metadata.resolveFunction(session, QualifiedName.of(FormatFunction.NAME), fromTypes(arguments.get(0), RowType.anonymous(arguments.subList(1, arguments.size())))); + plannerContext.getMetadata().resolveFunction(session, QualifiedName.of(FormatFunction.NAME), fromTypes(arguments.get(0), RowType.anonymous(arguments.subList(1, arguments.size())))); } catch (TrinoException e) { ErrorCode errorCode = e.getErrorCode(); @@ -2089,7 +2113,7 @@ public Type visitCast(Cast node, StackableAstVisitorContext context) { Type type; try { - type = metadata.getType(toTypeSignature(node.getType())); + type = plannerContext.getTypeManager().getType(toTypeSignature(node.getType())); } catch (TypeNotFoundException e) { throw semanticException(TYPE_MISMATCH, node, "Unknown type: %s", node.getType()); @@ -2102,7 +2126,7 @@ public Type visitCast(Cast node, StackableAstVisitorContext context) Type value = process(node.getExpression(), context); if (!value.equals(UNKNOWN) && !node.isTypeOnly()) { try { - metadata.getCoercion(session, value, type); + plannerContext.getMetadata().getCoercion(session, value, type); } catch (OperatorNotFoundException e) { throw semanticException(TYPE_MISMATCH, node, "Cannot cast %s to %s", value, type); @@ -2327,7 +2351,7 @@ protected Type visitLambdaExpression(LambdaExpression node, StackableAstVisitorC throw semanticException(NOT_SUPPORTED, node, "Lambda expression in pattern recognition context is not yet supported"); } - verifyNoAggregateWindowOrGroupingFunctions(metadata, node.getBody(), "Lambda expression"); + verifyNoAggregateWindowOrGroupingFunctions(plannerContext.getMetadata(), node.getBody(), "Lambda expression"); if (!context.getContext().isExpectingLambda()) { throw semanticException(TYPE_MISMATCH, node, "Lambda expression should always be used inside a function"); } @@ -2433,7 +2457,7 @@ private Type getOperator(StackableAstVisitorContext context, Expression BoundSignature operatorSignature; try { - operatorSignature = metadata.resolveOperator(session, operatorType, argumentTypes.build()).getSignature(); + operatorSignature = plannerContext.getMetadata().resolveOperator(session, operatorType, argumentTypes.build()).getSignature(); } catch (OperatorNotFoundException e) { throw semanticException(TYPE_MISMATCH, node, e, "%s", e.getMessage()); @@ -2666,17 +2690,16 @@ public static boolean isPatternRecognitionFunction(FunctionCall node) public static ExpressionAnalysis analyzePatternRecognitionExpression( Session session, - Metadata metadata, - GroupProvider groupProvider, + PlannerContext plannerContext, + StatementAnalyzerFactory statementAnalyzerFactory, AccessControl accessControl, - SqlParser sqlParser, Scope scope, Analysis analysis, Expression expression, WarningCollector warningCollector, Set labels) { - ExpressionAnalyzer analyzer = create(analysis, session, metadata, sqlParser, groupProvider, accessControl, TypeProvider.empty(), warningCollector); + ExpressionAnalyzer analyzer = new ExpressionAnalyzer(plannerContext, accessControl, statementAnalyzerFactory, analysis, session, TypeProvider.empty(), warningCollector); analyzer.analyze(expression, scope, labels); updateAnalysis(analysis, analyzer, session, accessControl); @@ -2695,10 +2718,9 @@ public static ExpressionAnalysis analyzePatternRecognitionExpression( public static ExpressionAnalysis analyzeExpressions( Session session, - Metadata metadata, - GroupProvider groupProvider, + PlannerContext plannerContext, + StatementAnalyzerFactory statementAnalyzerFactory, AccessControl accessControl, - SqlParser sqlParser, TypeProvider types, Iterable expressions, Map, Expression> parameters, @@ -2706,7 +2728,7 @@ public static ExpressionAnalysis analyzeExpressions( QueryType queryType) { Analysis analysis = new Analysis(null, parameters, queryType); - ExpressionAnalyzer analyzer = create(analysis, session, metadata, sqlParser, groupProvider, accessControl, types, warningCollector); + ExpressionAnalyzer analyzer = new ExpressionAnalyzer(plannerContext, accessControl, statementAnalyzerFactory, analysis, session, types, warningCollector); for (Expression expression : expressions) { analyzer.analyze( expression, @@ -2729,17 +2751,16 @@ public static ExpressionAnalysis analyzeExpressions( public static ExpressionAnalysis analyzeExpression( Session session, - Metadata metadata, - GroupProvider groupProvider, + PlannerContext plannerContext, + StatementAnalyzerFactory statementAnalyzerFactory, AccessControl accessControl, - SqlParser sqlParser, Scope scope, Analysis analysis, Expression expression, WarningCollector warningCollector, CorrelationSupport correlationSupport) { - ExpressionAnalyzer analyzer = create(analysis, session, metadata, sqlParser, groupProvider, accessControl, TypeProvider.empty(), warningCollector); + ExpressionAnalyzer analyzer = new ExpressionAnalyzer(plannerContext, accessControl, statementAnalyzerFactory, analysis, session, TypeProvider.empty(), warningCollector); analyzer.analyze(expression, scope, correlationSupport); updateAnalysis(analysis, analyzer, session, accessControl); @@ -2759,10 +2780,9 @@ public static ExpressionAnalysis analyzeExpression( public static ExpressionAnalysis analyzeWindow( Session session, - Metadata metadata, - GroupProvider groupProvider, + PlannerContext plannerContext, + StatementAnalyzerFactory statementAnalyzerFactory, AccessControl accessControl, - SqlParser sqlParser, Scope scope, Analysis analysis, WarningCollector warningCollector, @@ -2770,7 +2790,7 @@ public static ExpressionAnalysis analyzeWindow( ResolvedWindow window, Node originalNode) { - ExpressionAnalyzer analyzer = create(analysis, session, metadata, sqlParser, groupProvider, accessControl, TypeProvider.empty(), warningCollector); + ExpressionAnalyzer analyzer = new ExpressionAnalyzer(plannerContext, accessControl, statementAnalyzerFactory, analysis, session, TypeProvider.empty(), warningCollector); analyzer.analyzeWindow(window, scope, originalNode, correlationSupport); updateAnalysis(analysis, analyzer, session, accessControl); @@ -2810,38 +2830,15 @@ private static void updateAnalysis(Analysis analysis, ExpressionAnalyzer analyze analysis.addPredicateCoercions(analyzer.getPredicateCoercions()); } - public static ExpressionAnalyzer create( - Analysis analysis, - Session session, - Metadata metadata, - SqlParser sqlParser, - GroupProvider groupProvider, - AccessControl accessControl, - TypeProvider types, - WarningCollector warningCollector) - { - return new ExpressionAnalyzer( - metadata, - accessControl, - (node, correlationSupport) -> new StatementAnalyzer(analysis, metadata, sqlParser, groupProvider, accessControl, session, warningCollector, correlationSupport), - session, - types, - analysis.getParameters(), - warningCollector, - analysis.isDescribe(), - analysis::getType, - analysis::getWindow); - } - public static ExpressionAnalyzer createConstantAnalyzer( - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Session session, Map, Expression> parameters, WarningCollector warningCollector) { return createWithoutSubqueries( - metadata, + plannerContext, accessControl, session, parameters, @@ -2852,7 +2849,7 @@ public static ExpressionAnalyzer createConstantAnalyzer( } public static ExpressionAnalyzer createConstantAnalyzer( - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Session session, Map, Expression> parameters, @@ -2860,7 +2857,7 @@ public static ExpressionAnalyzer createConstantAnalyzer( boolean isDescribe) { return createWithoutSubqueries( - metadata, + plannerContext, accessControl, session, parameters, @@ -2871,7 +2868,7 @@ public static ExpressionAnalyzer createConstantAnalyzer( } public static ExpressionAnalyzer createWithoutSubqueries( - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Session session, Map, Expression> parameters, @@ -2881,7 +2878,7 @@ public static ExpressionAnalyzer createWithoutSubqueries( boolean isDescribe) { return createWithoutSubqueries( - metadata, + plannerContext, accessControl, session, TypeProvider.empty(), @@ -2892,7 +2889,7 @@ public static ExpressionAnalyzer createWithoutSubqueries( } public static ExpressionAnalyzer createWithoutSubqueries( - Metadata metadata, + PlannerContext plannerContext, AccessControl accessControl, Session session, TypeProvider symbolTypes, @@ -2902,7 +2899,7 @@ public static ExpressionAnalyzer createWithoutSubqueries( boolean isDescribe) { return new ExpressionAnalyzer( - metadata, + plannerContext, accessControl, (node, correlationSupport) -> { throw statementAnalyzerRejection.apply(node); diff --git a/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java b/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java index d9d52eead871..9feb4823405c 100644 --- a/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java +++ b/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java @@ -17,11 +17,10 @@ import io.trino.cost.CostCalculator; import io.trino.cost.StatsCalculator; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; +import io.trino.security.AccessControl; import io.trino.spi.TrinoException; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.SqlFormatter; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.LogicalPlanner; import io.trino.sql.planner.Plan; import io.trino.sql.planner.PlanFragmenter; @@ -57,29 +56,29 @@ public class QueryExplainer { private final List planOptimizers; private final PlanFragmenter planFragmenter; - private final Metadata metadata; - private final TypeOperators typeOperators; - private final SqlParser sqlParser; + private final PlannerContext plannerContext; private final AnalyzerFactory analyzerFactory; + private final StatementAnalyzerFactory statementAnalyzerFactory; + private final AccessControl accessControl; private final StatsCalculator statsCalculator; private final CostCalculator costCalculator; QueryExplainer( PlanOptimizersFactory planOptimizersFactory, PlanFragmenter planFragmenter, - Metadata metadata, - TypeOperators typeOperators, - SqlParser sqlParser, + PlannerContext plannerContext, AnalyzerFactory analyzerFactory, + StatementAnalyzerFactory statementAnalyzerFactory, + AccessControl accessControl, StatsCalculator statsCalculator, CostCalculator costCalculator) { this.planOptimizers = requireNonNull(planOptimizersFactory.get(), "planOptimizers is null"); this.planFragmenter = requireNonNull(planFragmenter, "planFragmenter is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); - this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.analyzerFactory = requireNonNull(analyzerFactory, "analyzerFactory is null"); + this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); + this.accessControl = requireNonNull(accessControl, "accessControl is null"); this.statsCalculator = requireNonNull(statsCalculator, "statsCalculator is null"); this.costCalculator = requireNonNull(costCalculator, "costCalculator is null"); } @@ -99,12 +98,12 @@ public String getPlan(Session session, Statement statement, Type planType, List< switch (planType) { case LOGICAL: Plan plan = getLogicalPlan(session, statement, parameters, warningCollector); - return PlanPrinter.textLogicalPlan(plan.getRoot(), plan.getTypes(), metadata, plan.getStatsAndCosts(), session, 0, false); + return PlanPrinter.textLogicalPlan(plan.getRoot(), plan.getTypes(), plannerContext.getMetadata(), plan.getStatsAndCosts(), session, 0, false); case DISTRIBUTED: SubPlan subPlan = getDistributedPlan(session, statement, parameters, warningCollector); - return PlanPrinter.textDistributedPlan(subPlan, metadata, session, false); + return PlanPrinter.textDistributedPlan(subPlan, plannerContext.getMetadata(), session, false); case IO: - return textIoPlan(getLogicalPlan(session, statement, parameters, warningCollector), metadata, typeOperators, session); + return textIoPlan(getLogicalPlan(session, statement, parameters, warningCollector), plannerContext, session); case VALIDATE: // unsupported break; @@ -145,7 +144,7 @@ public String getJsonPlan(Session session, Statement statement, Type planType, L switch (planType) { case IO: Plan plan = getLogicalPlan(session, statement, parameters, warningCollector); - return textIoPlan(plan, metadata, typeOperators, session); + return textIoPlan(plan, plannerContext, session); case LOGICAL: case DISTRIBUTED: case VALIDATE: @@ -167,9 +166,8 @@ public Plan getLogicalPlan(Session session, Statement statement, List WINDOW_VALUE_FUNCTIONS = ImmutableSet.of("lead", "lag", "first_value", "last_value", "nth_value"); + private final StatementAnalyzerFactory statementAnalyzerFactory; private final Analysis analysis; private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeCoercion typeCoercion; private final Session session; private final SqlParser sqlParser; private final GroupProvider groupProvider; private final AccessControl accessControl; + private final TableProceduresRegistry tableProceduresRegistry; + private final SessionPropertyManager sessionPropertyManager; + private final TablePropertyManager tablePropertyManager; + private final AnalyzePropertyManager analyzePropertyManager; + private final TableProceduresPropertyManager tableProceduresPropertyManager; + private final WarningCollector warningCollector; private final CorrelationSupport correlationSupport; - public StatementAnalyzer( + StatementAnalyzer( + StatementAnalyzerFactory statementAnalyzerFactory, Analysis analysis, - Metadata metadata, + PlannerContext plannerContext, SqlParser sqlParser, GroupProvider groupProvider, AccessControl accessControl, Session session, + TableProceduresRegistry tableProceduresRegistry, + SessionPropertyManager sessionPropertyManager, + TablePropertyManager tablePropertyManager, + AnalyzePropertyManager analyzePropertyManager, + TableProceduresPropertyManager tableProceduresPropertyManager, WarningCollector warningCollector, CorrelationSupport correlationSupport) { + this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); this.analysis = requireNonNull(analysis, "analysis is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.metadata = plannerContext.getMetadata(); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); this.groupProvider = requireNonNull(groupProvider, "groupProvider is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); this.session = requireNonNull(session, "session is null"); + this.tableProceduresRegistry = requireNonNull(tableProceduresRegistry, "tableProceduresRegistry is null"); + this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); + this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); + this.analyzePropertyManager = requireNonNull(analyzePropertyManager, "analyzePropertyManager is null"); + this.tableProceduresPropertyManager = tableProceduresPropertyManager; this.warningCollector = requireNonNull(warningCollector, "warningCollector is null"); this.correlationSupport = requireNonNull(correlationSupport, "correlationSupport is null"); } @@ -696,15 +723,9 @@ protected Scope visitDelete(Delete node, Optional scope) // Analyzer checks for select permissions but DELETE has a separate permission, so disable access checks // TODO: we shouldn't need to create a new analyzer. The access control should be carried in the context object - StatementAnalyzer analyzer = new StatementAnalyzer( - analysis, - metadata, - sqlParser, - groupProvider, - new AllowAllAccessControl(), - session, - warningCollector, - CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory + .withSpecializedAccessControl(new AllowAllAccessControl()) + .createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED); Scope tableScope = analyzer.analyzeForUpdate(table, scope, UpdateKind.DELETE); node.getWhere().ifPresent(where -> analyzeWhere(node, tableScope, where)); @@ -731,12 +752,12 @@ protected Scope visitAnalyze(Analyze node, Optional scope) validateProperties(node.getProperties(), scope); CatalogName catalogName = getRequiredCatalogHandle(metadata, session, node, tableName.getCatalogName()); - Map analyzeProperties = metadata.getAnalyzePropertyManager().getProperties( + Map analyzeProperties = analyzePropertyManager.getProperties( catalogName, catalogName.getCatalogName(), mapFromProperties(node.getProperties()), session, - metadata, + plannerContext, accessControl, analysis.getParameters(), true); @@ -821,12 +842,12 @@ protected Scope visitCreateTableAsSelect(CreateTableAsSelect node, Optional properties = metadata.getTablePropertyManager().getProperties( + Map properties = tablePropertyManager.getProperties( catalogName, targetTable.getCatalogName(), mapFromProperties(node.getProperties()), session, - metadata, + plannerContext, accessControl, analysis.getParameters(), true); @@ -875,7 +896,7 @@ protected Scope visitCreateView(CreateView node, Optional scope) QualifiedObjectName viewName = createQualifiedObjectName(session, node, node.getName()); // analyze the query that creates the view - StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, groupProvider, accessControl, session, warningCollector, CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED); Scope queryScope = analyzer.analyze(node.getQuery(), scope); @@ -948,7 +969,7 @@ protected Scope visitCreateTable(CreateTable node, Optional scope) protected Scope visitProperty(Property node, Optional scope) { // Property value expressions must be constant - createConstantAnalyzer(metadata, accessControl, session, analysis.getParameters(), WarningCollector.NOOP, analysis.isDescribe()) + createConstantAnalyzer(plannerContext, accessControl, session, analysis.getParameters(), WarningCollector.NOOP, analysis.isDescribe()) .analyze(node.getValue(), createScope(scope)); return createAndAssignScope(node, scope); } @@ -957,7 +978,7 @@ protected Scope visitProperty(Property node, Optional scope) protected Scope visitCallArgument(CallArgument node, Optional scope) { // CallArgument value expressions must be constant - createConstantAnalyzer(metadata, accessControl, session, analysis.getParameters(), WarningCollector.NOOP, analysis.isDescribe()) + createConstantAnalyzer(plannerContext, accessControl, session, analysis.getParameters(), WarningCollector.NOOP, analysis.isDescribe()) .analyze(node.getValue(), createScope(scope)); return createAndAssignScope(node, scope); } @@ -1049,7 +1070,7 @@ protected Scope visitTableExecute(TableExecute node, Optional scope) Scope tableScope = analyze(table, scope); CatalogName catalogName = getRequiredCatalogHandle(metadata, session, node, tableName.getCatalogName()); - TableProcedureMetadata procedureMetadata = metadata.getTableProcedureRegistry().resolve(catalogName, procedureName); + TableProcedureMetadata procedureMetadata = tableProceduresRegistry.resolve(catalogName, procedureName); // analyze WHERE if (!procedureMetadata.getExecutionMode().supportsFilter() && node.getWhere().isPresent()) { @@ -1060,13 +1081,13 @@ protected Scope visitTableExecute(TableExecute node, Optional scope) // analyze arguments Map propertiesMap = processTableExecuteArguments(node, procedureMetadata, scope); - Map tableProperties = metadata.getTableProceduresPropertyManager().getProperties( + Map tableProperties = tableProceduresPropertyManager.getProperties( catalogName, procedureName, catalogName.getCatalogName(), propertiesMap, session, - metadata, + plannerContext, accessControl, analysis.getParameters(), true); @@ -1220,7 +1241,7 @@ protected Scope visitCreateMaterializedView(CreateMaterializedView node, Optiona } // analyze the query that creates the view - StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, groupProvider, accessControl, session, warningCollector, CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED); Scope queryScope = analyzer.analyze(node.getQuery(), scope); @@ -1420,7 +1441,7 @@ else if (expressionType instanceof MapType) { @Override protected Scope visitLateral(Lateral node, Optional scope) { - StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, groupProvider, accessControl, session, warningCollector, CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED); Scope queryScope = analyzer.analyze(node.getQuery(), scope); return createAndAssignScope(node, scope, queryScope.getRelationType()); } @@ -2004,10 +2025,9 @@ private ExpressionAnalysis analyzePatternRecognitionExpression(Expression expres return ExpressionAnalyzer.analyzePatternRecognitionExpression( session, - metadata, - groupProvider, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, scope, analysis, expression, @@ -2051,10 +2071,9 @@ protected Scope visitSampledRelation(SampledRelation relation, Optional s Map, Type> expressionTypes = ExpressionAnalyzer.analyzeExpressions( session, - metadata, - groupProvider, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, TypeProvider.empty(), ImmutableList.of(samplePercentage), analysis.getParameters(), @@ -2067,7 +2086,7 @@ protected Scope visitSampledRelation(SampledRelation relation, Optional s throw semanticException(TYPE_MISMATCH, samplePercentage, "Sample percentage should be a numeric expression"); } - ExpressionInterpreter samplePercentageEval = new ExpressionInterpreter(samplePercentage, metadata, session, expressionTypes); + ExpressionInterpreter samplePercentageEval = new ExpressionInterpreter(samplePercentage, plannerContext, session, expressionTypes); Object samplePercentageObject = samplePercentageEval.optimize(symbol -> { throw semanticException(EXPRESSION_NOT_CONSTANT, samplePercentage, "Sample percentage cannot contain column references"); @@ -2101,7 +2120,7 @@ protected Scope visitSampledRelation(SampledRelation relation, Optional s @Override protected Scope visitTableSubquery(TableSubquery node, Optional scope) { - StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, groupProvider, accessControl, session, warningCollector, CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED); Scope queryScope = analyzer.analyze(node.getQuery(), scope); return createAndAssignScope(node, scope, queryScope.getRelationType()); } @@ -2421,15 +2440,9 @@ protected Scope visitUpdate(Update update, Optional scope) analysis.setUpdatedColumns(updatedColumns); // Analyzer checks for select permissions but UPDATE has a separate permission, so disable access checks - StatementAnalyzer analyzer = new StatementAnalyzer( - analysis, - metadata, - sqlParser, - groupProvider, - new AllowAllAccessControl(), - session, - warningCollector, - CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory + .withSpecializedAccessControl(new AllowAllAccessControl()) + .createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED); Scope tableScope = analyzer.analyzeForUpdate(table, scope, UpdateKind.UPDATE); update.getWhere().ifPresent(where -> analyzeWhere(update, tableScope, where)); @@ -2747,10 +2760,9 @@ private void analyzeWindow(QuerySpecification querySpecification, ResolvedWindow { ExpressionAnalysis expressionAnalysis = ExpressionAnalyzer.analyzeWindow( session, - metadata, - groupProvider, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, scope, analysis, WarningCollector.NOOP, @@ -3454,7 +3466,9 @@ private RelationType analyzeView(Query query, QualifiedObjectName name, Optional // TODO: record path in view definition (?) (check spec) and feed it into the session object we use to evaluate the query defined by the view Session viewSession = createViewSession(catalog, schema, identity, session.getPath()); - StatementAnalyzer analyzer = new StatementAnalyzer(analysis, metadata, sqlParser, groupProvider, viewAccessControl, viewSession, warningCollector, CorrelationSupport.ALLOWED); + StatementAnalyzer analyzer = statementAnalyzerFactory + .withSpecializedAccessControl(viewAccessControl) + .createStatementAnalyzer(analysis, viewSession, warningCollector, CorrelationSupport.ALLOWED); Scope queryScope = analyzer.analyze(query, Scope.create()); return queryScope.getRelationType().withAlias(name.getObjectName(), null); } @@ -3520,7 +3534,7 @@ private Optional checkViewStaleness(List columns, Collection private Type getViewColumnType(ViewColumn column, QualifiedObjectName name, Node node) { try { - return metadata.getType(column.getType()); + return plannerContext.getTypeManager().getType(column.getType()); } catch (TypeNotFoundException e) { throw semanticException(INVALID_VIEW, node, e, "Unknown type '%s' for column '%s' in view: %s", column.getType(), column.getName(), name); @@ -3531,10 +3545,9 @@ private ExpressionAnalysis analyzeExpression(Expression expression, Scope scope) { return ExpressionAnalyzer.analyzeExpression( session, - metadata, - groupProvider, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, scope, analysis, expression, @@ -3546,10 +3559,9 @@ private ExpressionAnalysis analyzeExpression(Expression expression, Scope scope, { return ExpressionAnalyzer.analyzeExpression( session, - metadata, - groupProvider, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, scope, analysis, expression, @@ -3579,10 +3591,9 @@ private void analyzeRowFilter(String currentIdentity, Table table, QualifiedObje try { expressionAnalysis = ExpressionAnalyzer.analyzeExpression( createViewSession(filter.getCatalog(), filter.getSchema(), Identity.forUser(filter.getIdentity()).build(), session.getPath()), // TODO: path should be included in row filter - metadata, - groupProvider, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, scope, analysis, expression, @@ -3600,7 +3611,7 @@ private void analyzeRowFilter(String currentIdentity, Table table, QualifiedObje Type actualType = expressionAnalysis.getType(expression); if (!actualType.equals(BOOLEAN)) { - TypeCoercion coercion = new TypeCoercion(metadata::getType); + TypeCoercion coercion = new TypeCoercion(plannerContext.getTypeManager()::getType); if (!coercion.canCoerce(actualType, BOOLEAN)) { throw new TrinoException(TYPE_MISMATCH, extractLocation(table), format("Expected row filter for '%s' to be of type BOOLEAN, but was %s", name, actualType), null); @@ -3635,10 +3646,9 @@ private void analyzeColumnMask(String currentIdentity, Table table, QualifiedObj try { expressionAnalysis = ExpressionAnalyzer.analyzeExpression( createViewSession(mask.getCatalog(), mask.getSchema(), Identity.forUser(mask.getIdentity()).build(), session.getPath()), // TODO: path should be included in row filter - metadata, - groupProvider, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, scope, analysis, expression, @@ -3657,7 +3667,7 @@ private void analyzeColumnMask(String currentIdentity, Table table, QualifiedObj Type expectedType = field.getType(); Type actualType = expressionAnalysis.getType(expression); if (!actualType.equals(expectedType)) { - TypeCoercion coercion = new TypeCoercion(metadata::getType); + TypeCoercion coercion = new TypeCoercion(plannerContext.getTypeManager()::getType); if (!coercion.canCoerce(actualType, field.getType())) { throw new TrinoException(TYPE_MISMATCH, extractLocation(table), format("Expected column mask for '%s.%s' to be of type %s, but was %s", tableName, column, field.getType(), actualType), null); @@ -4059,11 +4069,11 @@ private List analyzeOrderBy(Node node, List sortItems, Sco expression = new FieldReference(toIntExact(ordinal - 1)); } - ExpressionAnalysis expressionAnalysis = ExpressionAnalyzer.analyzeExpression(session, - metadata, - groupProvider, + ExpressionAnalysis expressionAnalysis = ExpressionAnalyzer.analyzeExpression( + session, + plannerContext, + statementAnalyzerFactory, accessControl, - sqlParser, orderByScope, analysis, expression, @@ -4180,7 +4190,7 @@ private OptionalLong analyzeParameterAsRowCount(Parameter parameter, Scope scope value = evaluateConstantExpression( providedValue, BIGINT, - metadata, + plannerContext, session, accessControl, analysis.getParameters()); @@ -4275,7 +4285,7 @@ private Optional extractTableVersion(Table table, QualifiedObjectN // Once the range value is analyzed, we can evaluate it Type versionType = expressionAnalysis.getType(version.get()); PointerType pointerType = toPointerType(table.getQueryPeriod().get().getRangeType()); - Object evaluatedVersion = evaluateConstantExpression(version.get(), versionType, metadata, session, accessControl, ImmutableMap.of()); + Object evaluatedVersion = evaluateConstantExpression(version.get(), versionType, plannerContext, session, accessControl, ImmutableMap.of()); TableVersion extractedVersion = new TableVersion(pointerType, versionType, evaluatedVersion); // Before checking if the connector supports the version type, verify that version is a valid time-based type @@ -4326,7 +4336,7 @@ private PointerType toPointerType(QueryPeriod.RangeType type) private Session createViewSession(Optional catalog, Optional schema, Identity identity, SqlPath path) { - return Session.builder(metadata.getSessionPropertyManager()) + return Session.builder(sessionPropertyManager) .setQueryId(session.getQueryId()) .setTransactionId(session.getTransactionId().orElse(null)) .setIdentity(identity) diff --git a/core/trino-main/src/main/java/io/trino/sql/analyzer/StatementAnalyzerFactory.java b/core/trino-main/src/main/java/io/trino/sql/analyzer/StatementAnalyzerFactory.java new file mode 100644 index 000000000000..323c1b2ad4a6 --- /dev/null +++ b/core/trino-main/src/main/java/io/trino/sql/analyzer/StatementAnalyzerFactory.java @@ -0,0 +1,122 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.trino.sql.analyzer; + +import com.google.common.collect.ImmutableSet; +import io.trino.Session; +import io.trino.execution.warnings.WarningCollector; +import io.trino.metadata.AnalyzePropertyManager; +import io.trino.metadata.SessionPropertyManager; +import io.trino.metadata.TableProceduresPropertyManager; +import io.trino.metadata.TableProceduresRegistry; +import io.trino.metadata.TablePropertyManager; +import io.trino.security.AccessControl; +import io.trino.spi.security.GroupProvider; +import io.trino.sql.PlannerContext; +import io.trino.sql.parser.SqlParser; + +import javax.inject.Inject; + +import static java.util.Objects.requireNonNull; + +public class StatementAnalyzerFactory +{ + private final PlannerContext plannerContext; + private final SqlParser sqlParser; + private final AccessControl accessControl; + private final GroupProvider groupProvider; + private final TableProceduresRegistry tableProceduresRegistry; + private final SessionPropertyManager sessionPropertyManager; + private final TablePropertyManager tablePropertyManager; + private final AnalyzePropertyManager analyzePropertyManager; + private final TableProceduresPropertyManager tableProceduresPropertyManager; + + @Inject + public StatementAnalyzerFactory( + PlannerContext plannerContext, + SqlParser sqlParser, + AccessControl accessControl, + GroupProvider groupProvider, + TableProceduresRegistry tableProceduresRegistry, + SessionPropertyManager sessionPropertyManager, + TablePropertyManager tablePropertyManager, + AnalyzePropertyManager analyzePropertyManager, + TableProceduresPropertyManager tableProceduresPropertyManager) + { + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); + this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.groupProvider = requireNonNull(groupProvider, "groupProvider is null"); + this.tableProceduresRegistry = requireNonNull(tableProceduresRegistry, "tableProceduresRegistry is null"); + this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); + this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); + this.analyzePropertyManager = requireNonNull(analyzePropertyManager, "analyzePropertyManager is null"); + this.tableProceduresPropertyManager = requireNonNull(tableProceduresPropertyManager, "tableProceduresPropertyManager is null"); + } + + public StatementAnalyzerFactory withSpecializedAccessControl(AccessControl accessControl) + { + return new StatementAnalyzerFactory( + plannerContext, + sqlParser, + accessControl, + groupProvider, + tableProceduresRegistry, + sessionPropertyManager, + tablePropertyManager, + analyzePropertyManager, + tableProceduresPropertyManager); + } + + public StatementAnalyzer createStatementAnalyzer( + Analysis analysis, + Session session, + WarningCollector warningCollector, + CorrelationSupport correlationSupport) + { + return new StatementAnalyzer( + this, + analysis, + plannerContext, + sqlParser, + groupProvider, + accessControl, + session, + tableProceduresRegistry, + sessionPropertyManager, + tablePropertyManager, + analyzePropertyManager, + tableProceduresPropertyManager, + warningCollector, + correlationSupport); + } + + public static StatementAnalyzerFactory createTestingStatementAnalyzerFactory( + PlannerContext plannerContext, + AccessControl accessControl, + TablePropertyManager tablePropertyManager, + AnalyzePropertyManager analyzePropertyManager) + { + return new StatementAnalyzerFactory( + plannerContext, + new SqlParser(), + accessControl, + user -> ImmutableSet.of(), + new TableProceduresRegistry(), + new SessionPropertyManager(), + tablePropertyManager, + analyzePropertyManager, + new TableProceduresPropertyManager()); + } +} diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/ConnectorExpressionTranslator.java b/core/trino-main/src/main/java/io/trino/sql/planner/ConnectorExpressionTranslator.java index 39a1c0dc4e91..1ab84420c680 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/ConnectorExpressionTranslator.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/ConnectorExpressionTranslator.java @@ -44,9 +44,9 @@ public final class ConnectorExpressionTranslator { private ConnectorExpressionTranslator() {} - public static Expression translate(ConnectorExpression expression, Map variableMappings, LiteralEncoder literalEncoder) + public static Expression translate(Session session, ConnectorExpression expression, Map variableMappings, LiteralEncoder literalEncoder) { - return new ConnectorToSqlExpressionTranslator(variableMappings, literalEncoder).translate(expression); + return new ConnectorToSqlExpressionTranslator(variableMappings, literalEncoder).translate(session, expression); } public static Optional translate(Session session, Expression expression, TypeAnalyzer types, TypeProvider inputTypes) @@ -66,19 +66,19 @@ public ConnectorToSqlExpressionTranslator(Map variableMappings, this.literalEncoder = requireNonNull(literalEncoder, "literalEncoder is null"); } - public Expression translate(ConnectorExpression expression) + public Expression translate(Session session, ConnectorExpression expression) { if (expression instanceof Variable) { return variableMappings.get(((Variable) expression).getName()).toSymbolReference(); } if (expression instanceof Constant) { - return literalEncoder.toExpression(((Constant) expression).getValue(), expression.getType()); + return literalEncoder.toExpression(session, ((Constant) expression).getValue(), expression.getType()); } if (expression instanceof FieldDereference) { FieldDereference dereference = (FieldDereference) expression; - return new SubscriptExpression(translate(dereference.getTarget()), new LongLiteral(Long.toString(dereference.getField() + 1))); + return new SubscriptExpression(translate(session, dereference.getTarget()), new LongLiteral(Long.toString(dereference.getField() + 1))); } throw new UnsupportedOperationException("Expression type not supported: " + expression.getClass().getName()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/DomainTranslator.java b/core/trino-main/src/main/java/io/trino/sql/planner/DomainTranslator.java index 26a5cc58d143..48d1f55f8faf 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/DomainTranslator.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/DomainTranslator.java @@ -16,15 +16,20 @@ 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.metadata.Metadata; +import io.trino.metadata.AnalyzePropertyManager; import io.trino.metadata.OperatorNotFoundException; import io.trino.metadata.ResolvedFunction; +import io.trino.metadata.SessionPropertyManager; +import io.trino.metadata.TableProceduresPropertyManager; +import io.trino.metadata.TableProceduresRegistry; +import io.trino.metadata.TablePropertyManager; +import io.trino.security.AllowAllAccessControl; import io.trino.spi.TrinoException; -import io.trino.spi.function.InvocationConvention; import io.trino.spi.predicate.DiscreteValues; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.NullableValue; @@ -36,10 +41,10 @@ import io.trino.spi.type.DoubleType; import io.trino.spi.type.RealType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; import io.trino.spi.type.VarcharType; -import io.trino.sql.ExpressionUtils; import io.trino.sql.InterpretedFunctionInvoker; +import io.trino.sql.PlannerContext; +import io.trino.sql.analyzer.StatementAnalyzerFactory; import io.trino.sql.parser.SqlParser; import io.trino.sql.tree.AstVisitor; import io.trino.sql.tree.BetweenPredicate; @@ -83,6 +88,7 @@ import static io.trino.spi.StandardErrorCode.GENERIC_INTERNAL_ERROR; import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.NEVER_NULL; import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.FAIL_ON_NULL; +import static io.trino.spi.function.InvocationConvention.simpleConvention; import static io.trino.spi.function.OperatorType.SATURATED_FLOOR_CAST; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.TypeUtils.isFloatingPointNaN; @@ -104,16 +110,16 @@ public final class DomainTranslator { - private final Metadata metadata; + private final PlannerContext plannerContext; private final LiteralEncoder literalEncoder; - public DomainTranslator(Session session, Metadata metadata) + public DomainTranslator(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.literalEncoder = new LiteralEncoder(session, metadata); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.literalEncoder = new LiteralEncoder(plannerContext); } - public Expression toPredicate(TupleDomain tupleDomain) + public Expression toPredicate(Session session, TupleDomain tupleDomain) { if (tupleDomain.isNone()) { return FALSE_LITERAL; @@ -121,11 +127,11 @@ public Expression toPredicate(TupleDomain tupleDomain) Map domains = tupleDomain.getDomains().get(); return domains.entrySet().stream() - .map(entry -> toPredicate(entry.getValue(), entry.getKey().toSymbolReference())) - .collect(collectingAndThen(toImmutableList(), expressions -> ExpressionUtils.combineConjuncts(metadata, expressions))); + .map(entry -> toPredicate(session, entry.getValue(), entry.getKey().toSymbolReference())) + .collect(collectingAndThen(toImmutableList(), expressions -> combineConjuncts(plannerContext.getMetadata(), expressions))); } - private Expression toPredicate(Domain domain, SymbolReference reference) + private Expression toPredicate(Session session, Domain domain, SymbolReference reference) { if (domain.getValues().isNone()) { return domain.isNullAllowed() ? new IsNullPredicate(reference) : FALSE_LITERAL; @@ -138,8 +144,8 @@ private Expression toPredicate(Domain domain, SymbolReference reference) List disjuncts = new ArrayList<>(); disjuncts.addAll(domain.getValues().getValuesProcessor().transform( - ranges -> extractDisjuncts(domain.getType(), ranges, reference), - discreteValues -> extractDisjuncts(domain.getType(), discreteValues, reference), + ranges -> extractDisjuncts(session, domain.getType(), ranges, reference), + discreteValues -> extractDisjuncts(session, domain.getType(), discreteValues, reference), allOrNone -> { throw new IllegalStateException("Case should not be reachable"); })); @@ -149,10 +155,10 @@ private Expression toPredicate(Domain domain, SymbolReference reference) disjuncts.add(new IsNullPredicate(reference)); } - return combineDisjunctsWithDefault(metadata, disjuncts, TRUE_LITERAL); + return combineDisjunctsWithDefault(plannerContext.getMetadata(), disjuncts, TRUE_LITERAL); } - private Expression processRange(Type type, Range range, SymbolReference reference) + private Expression processRange(Session session, Type type, Range range, SymbolReference reference) { if (range.isAll()) { return TRUE_LITERAL; @@ -160,7 +166,10 @@ private Expression processRange(Type type, Range range, SymbolReference referenc if (isBetween(range)) { // specialize the range with BETWEEN expression if possible b/c it is currently more efficient - return new BetweenPredicate(reference, literalEncoder.toExpression(range.getLowBoundedValue(), type), literalEncoder.toExpression(range.getHighBoundedValue(), type)); + return new BetweenPredicate( + reference, + literalEncoder.toExpression(session, range.getLowBoundedValue(), type), + literalEncoder.toExpression(session, range.getHighBoundedValue(), type)); } List rangeConjuncts = new ArrayList<>(); @@ -168,23 +177,23 @@ private Expression processRange(Type type, Range range, SymbolReference referenc rangeConjuncts.add(new ComparisonExpression( range.isLowInclusive() ? GREATER_THAN_OR_EQUAL : GREATER_THAN, reference, - literalEncoder.toExpression(range.getLowBoundedValue(), type))); + literalEncoder.toExpression(session, range.getLowBoundedValue(), type))); } if (!range.isHighUnbounded()) { rangeConjuncts.add(new ComparisonExpression( range.isHighInclusive() ? LESS_THAN_OR_EQUAL : LESS_THAN, reference, - literalEncoder.toExpression(range.getHighBoundedValue(), type))); + literalEncoder.toExpression(session, range.getHighBoundedValue(), type))); } // If rangeConjuncts is null, then the range was ALL, which should already have been checked for checkState(!rangeConjuncts.isEmpty()); - return combineConjuncts(metadata, rangeConjuncts); + return combineConjuncts(plannerContext.getMetadata(), rangeConjuncts); } - private Expression combineRangeWithExcludedPoints(Type type, SymbolReference reference, Range range, List excludedPoints) + private Expression combineRangeWithExcludedPoints(Session session, Type type, SymbolReference reference, Range range, List excludedPoints) { if (excludedPoints.isEmpty()) { - return processRange(type, range, reference); + return processRange(session, type, range, reference); } Expression excludedPointsExpression = new NotExpression(new InPredicate(reference, new InListExpression(excludedPoints))); @@ -192,10 +201,10 @@ private Expression combineRangeWithExcludedPoints(Type type, SymbolReference ref excludedPointsExpression = new ComparisonExpression(NOT_EQUAL, reference, getOnlyElement(excludedPoints)); } - return combineConjuncts(metadata, processRange(type, range, reference), excludedPointsExpression); + return combineConjuncts(plannerContext.getMetadata(), processRange(session, type, range, reference), excludedPointsExpression); } - private List extractDisjuncts(Type type, Ranges ranges, SymbolReference reference) + private List extractDisjuncts(Session session, Type type, Ranges ranges, SymbolReference reference) { List disjuncts = new ArrayList<>(); List singleValues = new ArrayList<>(); @@ -221,7 +230,7 @@ private List extractDisjuncts(Type type, Ranges ranges, SymbolRefere boolean coalescedRangeIsAll = originalUnionSingleValues.stream().anyMatch(Range::isAll); if (!originalRangeIsAll && coalescedRangeIsAll) { for (Range range : orderedRanges) { - disjuncts.add(processRange(type, range, reference)); + disjuncts.add(processRange(session, type, range, reference)); } return disjuncts; } @@ -229,22 +238,22 @@ private List extractDisjuncts(Type type, Ranges ranges, SymbolRefere for (Range range : originalUnionSingleValues) { if (range.isSingleValue()) { - singleValues.add(literalEncoder.toExpression(range.getSingleValue(), type)); + singleValues.add(literalEncoder.toExpression(session, range.getSingleValue(), type)); continue; } // attempt to optimize ranges that can be coalesced as long as single value points are excluded List singleValuesInRange = new ArrayList<>(); while (singleValueExclusions.hasNext() && range.contains(singleValueExclusions.peek())) { - singleValuesInRange.add(literalEncoder.toExpression(singleValueExclusions.next().getSingleValue(), type)); + singleValuesInRange.add(literalEncoder.toExpression(session, singleValueExclusions.next().getSingleValue(), type)); } if (!singleValuesInRange.isEmpty()) { - disjuncts.add(combineRangeWithExcludedPoints(type, reference, range, singleValuesInRange)); + disjuncts.add(combineRangeWithExcludedPoints(session, type, reference, range, singleValuesInRange)); continue; } - disjuncts.add(processRange(type, range, reference)); + disjuncts.add(processRange(session, type, range, reference)); } // Add back all of the possible single values either as an equality or an IN predicate @@ -257,10 +266,10 @@ else if (singleValues.size() > 1) { return disjuncts; } - private List extractDisjuncts(Type type, DiscreteValues discreteValues, SymbolReference reference) + private List extractDisjuncts(Session session, Type type, DiscreteValues discreteValues, SymbolReference reference) { List values = discreteValues.getValues().stream() - .map(object -> literalEncoder.toExpression(object, type)) + .map(object -> literalEncoder.toExpression(session, object, type)) .collect(toList()); // If values is empty, then the equatableValues was either ALL or NONE, both of which should already have been checked for @@ -292,21 +301,29 @@ private static boolean isBetween(Range range) * 2) An Expression fragment which represents the part of the original Expression that will need to be re-evaluated * after filtering with the TupleDomain. */ - public static ExtractionResult fromPredicate( - Metadata metadata, - TypeOperators typeOperators, - Session session, - Expression predicate, - TypeProvider types) + public static ExtractionResult getExtractionResult(PlannerContext plannerContext, Session session, Expression predicate, TypeProvider types) { - return new Visitor(metadata, typeOperators, session, types, new TypeAnalyzer(new SqlParser(), metadata)).process(predicate, false); + // This is a limited type analyzer for the simple expressions used in this method + TypeAnalyzer typeAnalyzer = new TypeAnalyzer( + plannerContext, + new StatementAnalyzerFactory( + plannerContext, + new SqlParser(), + new AllowAllAccessControl(), + user -> ImmutableSet.of(), + new TableProceduresRegistry(), + new SessionPropertyManager(), + new TablePropertyManager(), + new AnalyzePropertyManager(), + new TableProceduresPropertyManager()), + new AllowAllAccessControl()); + return new Visitor(plannerContext, session, types, typeAnalyzer).process(predicate, false); } private static class Visitor extends AstVisitor { - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final LiteralEncoder literalEncoder; private final Session session; private final TypeProvider types; @@ -314,16 +331,15 @@ private static class Visitor private final TypeAnalyzer typeAnalyzer; private final TypeCoercion typeCoercion; - private Visitor(Metadata metadata, TypeOperators typeOperators, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) + private Visitor(PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.literalEncoder = new LiteralEncoder(session, metadata); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.literalEncoder = new LiteralEncoder(plannerContext); this.session = requireNonNull(session, "session is null"); this.types = requireNonNull(types, "types is null"); - this.functionInvoker = new InterpretedFunctionInvoker(metadata); + this.functionInvoker = new InterpretedFunctionInvoker(plannerContext.getMetadata()); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); } private Type checkedTypeLookup(Symbol symbol) @@ -375,7 +391,7 @@ protected ExtractionResult visitLogicalExpression(LogicalExpression node, Boolea case AND: return new ExtractionResult( TupleDomain.intersect(tupleDomains), - combineConjuncts(metadata, residuals)); + combineConjuncts(plannerContext.getMetadata(), residuals)); case OR: TupleDomain columnUnionedTupleDomain = TupleDomain.columnWiseUnion(tupleDomains); @@ -388,7 +404,7 @@ protected ExtractionResult visitLogicalExpression(LogicalExpression node, Boolea // some of these cases, we won't have to double check the bounds unnecessarily at execution time. // We can only make inferences if the remaining expressions on all terms are equal and deterministic - if (Set.copyOf(residuals).size() == 1 && DeterminismEvaluator.isDeterministic(residuals.get(0), metadata)) { + if (Set.copyOf(residuals).size() == 1 && DeterminismEvaluator.isDeterministic(residuals.get(0), plannerContext.getMetadata())) { // NONE are no-op for the purpose of OR tupleDomains = tupleDomains.stream() .filter(domain -> !domain.isNone()) @@ -524,8 +540,8 @@ protected ExtractionResult visitComparisonExpression(ComparisonExpression node, private Optional toNormalizedSimpleComparison(ComparisonExpression comparison) { Map, Type> expressionTypes = analyzeExpression(comparison); - Object left = new ExpressionInterpreter(comparison.getLeft(), metadata, session, expressionTypes).optimize(NoOpSymbolResolver.INSTANCE); - Object right = new ExpressionInterpreter(comparison.getRight(), metadata, session, expressionTypes).optimize(NoOpSymbolResolver.INSTANCE); + Object left = new ExpressionInterpreter(comparison.getLeft(), plannerContext, session, expressionTypes).optimize(NoOpSymbolResolver.INSTANCE); + Object right = new ExpressionInterpreter(comparison.getRight(), plannerContext, session, expressionTypes).optimize(NoOpSymbolResolver.INSTANCE); Type leftType = expressionTypes.get(NodeRef.of(comparison.getLeft())); Type rightType = expressionTypes.get(NodeRef.of(comparison.getRight())); @@ -763,7 +779,7 @@ private Expression rewriteComparisonExpression( boolean coercedValueIsEqualToOriginal = originalComparedToCoerced == 0; boolean coercedValueIsLessThanOriginal = originalComparedToCoerced > 0; boolean coercedValueIsGreaterThanOriginal = originalComparedToCoerced < 0; - Expression coercedLiteral = literalEncoder.toExpression(coercedValue, symbolExpressionType); + Expression coercedLiteral = literalEncoder.toExpression(session, coercedValue, symbolExpressionType); switch (comparisonOperator) { case GREATER_THAN_OR_EQUAL: @@ -824,7 +840,7 @@ private Optional floorValue(Type fromType, Type toType, Object value) private Optional getSaturatedFloorCastOperator(Type fromType, Type toType) { try { - return Optional.of(metadata.getCoercion(session, SATURATED_FLOOR_CAST, fromType, toType)); + return Optional.of(plannerContext.getMetadata().getCoercion(session, SATURATED_FLOOR_CAST, fromType, toType)); } catch (OperatorNotFoundException e) { return Optional.empty(); @@ -835,10 +851,10 @@ private int compareOriginalValueToCoerced(Type originalValueType, Object origina { requireNonNull(originalValueType, "originalValueType is null"); requireNonNull(coercedValue, "coercedValue is null"); - ResolvedFunction castToOriginalTypeOperator = metadata.getCoercion(session, coercedValueType, originalValueType); + ResolvedFunction castToOriginalTypeOperator = plannerContext.getMetadata().getCoercion(session, coercedValueType, originalValueType); Object coercedValueInOriginalType = functionInvoker.invoke(castToOriginalTypeOperator, session.toConnectorSession(), coercedValue); // choice of placing unordered values first or last does not matter for this code - MethodHandle comparisonOperator = typeOperators.getComparisonUnorderedLastOperator(originalValueType, InvocationConvention.simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); + MethodHandle comparisonOperator = plannerContext.getTypeOperators().getComparisonUnorderedLastOperator(originalValueType, simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); try { return (int) (long) comparisonOperator.invoke(originalValue, coercedValueInOriginalType); } @@ -893,7 +909,7 @@ private Optional processSimpleInPredicate(InPredicate node, Bo List excludedExpressions = new ArrayList<>(); for (Expression expression : valueList.getValues()) { - Object value = new ExpressionInterpreter(expression, metadata, session, expressionTypes) + Object value = new ExpressionInterpreter(expression, plannerContext, session, expressionTypes) .optimize(NoOpSymbolResolver.INSTANCE); if (value == null || value instanceof NullLiteral) { if (!complement) { diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/EffectivePredicateExtractor.java b/core/trino-main/src/main/java/io/trino/sql/planner/EffectivePredicateExtractor.java index 445016bdec07..bb07230e7094 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/EffectivePredicateExtractor.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/EffectivePredicateExtractor.java @@ -25,6 +25,7 @@ import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.plan.AggregationNode; import io.trino.sql.planner.plan.AssignUniqueId; import io.trino.sql.planner.plan.DistinctLimitNode; @@ -94,36 +95,38 @@ public class EffectivePredicateExtractor return new ComparisonExpression(EQUAL, reference, expression); }; + private final PlannerContext plannerContext; private final DomainTranslator domainTranslator; - private final Metadata metadata; private final boolean useTableProperties; - public EffectivePredicateExtractor(DomainTranslator domainTranslator, Metadata metadata, boolean useTableProperties) + public EffectivePredicateExtractor(DomainTranslator domainTranslator, PlannerContext plannerContext, boolean useTableProperties) { + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.domainTranslator = requireNonNull(domainTranslator, "domainTranslator is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); this.useTableProperties = useTableProperties; } public Expression extract(Session session, PlanNode node, TypeProvider types, TypeAnalyzer typeAnalyzer) { - return node.accept(new Visitor(domainTranslator, metadata, session, types, typeAnalyzer, useTableProperties), null); + return node.accept(new Visitor(domainTranslator, plannerContext, session, types, typeAnalyzer, useTableProperties), null); } private static class Visitor extends PlanVisitor { private final DomainTranslator domainTranslator; + private final PlannerContext plannerContext; private final Metadata metadata; private final Session session; private final TypeProvider types; private final TypeAnalyzer typeAnalyzer; private final boolean useTableProperties; - public Visitor(DomainTranslator domainTranslator, Metadata metadata, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer, boolean useTableProperties) + public Visitor(DomainTranslator domainTranslator, PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer, boolean useTableProperties) { this.domainTranslator = requireNonNull(domainTranslator, "domainTranslator is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.metadata = plannerContext.getMetadata(); this.session = requireNonNull(session, "session is null"); this.types = requireNonNull(types, "types is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); @@ -253,7 +256,7 @@ public Expression visitTableScan(TableScanNode node, Void context) } // TODO: replace with metadata.getTableProperties() when table layouts are fully removed - return domainTranslator.toPredicate(predicate.simplify() + return domainTranslator.toPredicate(session, predicate.simplify() .filter((columnHandle, domain) -> assignments.containsKey(columnHandle)) .transformKeys(assignments::get)); } @@ -380,7 +383,7 @@ public Expression visitValues(ValuesNode node, Void context) nonDeterministic[i] = true; } else { - ExpressionInterpreter interpreter = new ExpressionInterpreter(value, metadata, session, expressionTypes); + ExpressionInterpreter interpreter = new ExpressionInterpreter(value, plannerContext, session, expressionTypes); Object item = interpreter.optimize(NoOpSymbolResolver.INSTANCE); if (item instanceof Expression) { return TRUE_LITERAL; @@ -402,7 +405,7 @@ public Expression visitValues(ValuesNode node, Void context) if (!DeterminismEvaluator.isDeterministic(row, metadata)) { return TRUE_LITERAL; } - ExpressionInterpreter interpreter = new ExpressionInterpreter(row, metadata, session, expressionTypes); + ExpressionInterpreter interpreter = new ExpressionInterpreter(row, plannerContext, session, expressionTypes); Object evaluated = interpreter.optimize(NoOpSymbolResolver.INSTANCE); if (evaluated instanceof Expression) { return TRUE_LITERAL; @@ -455,7 +458,7 @@ else if (hasNaN[i]) { } // simplify to avoid a large expression if there are many rows in ValuesNode - return domainTranslator.toPredicate(TupleDomain.withColumnDomains(domains.build()).simplify()); + return domainTranslator.toPredicate(session, TupleDomain.withColumnDomains(domains.build()).simplify()); } @SafeVarargs diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionInterpreter.java b/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionInterpreter.java index 9561935a7e1f..36e7edf80a22 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionInterpreter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/ExpressionInterpreter.java @@ -40,6 +40,7 @@ import io.trino.spi.type.Type; import io.trino.spi.type.VarcharType; import io.trino.sql.InterpretedFunctionInvoker; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.ExpressionAnalyzer; import io.trino.sql.analyzer.Scope; import io.trino.sql.planner.iterative.rule.DesugarCurrentPath; @@ -156,6 +157,7 @@ public class ExpressionInterpreter { private final Expression expression; + private final PlannerContext plannerContext; private final Metadata metadata; private final LiteralEncoder literalEncoder; private final Session session; @@ -168,32 +170,33 @@ public class ExpressionInterpreter private final IdentityHashMap likePatternCache = new IdentityHashMap<>(); private final IdentityHashMap> inListCache = new IdentityHashMap<>(); - public ExpressionInterpreter(Expression expression, Metadata metadata, Session session, Map, Type> expressionTypes) + public ExpressionInterpreter(Expression expression, PlannerContext plannerContext, Session session, Map, Type> expressionTypes) { this.expression = requireNonNull(expression, "expression is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.literalEncoder = new LiteralEncoder(session, metadata); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.metadata = plannerContext.getMetadata(); + this.literalEncoder = new LiteralEncoder(plannerContext); this.session = requireNonNull(session, "session is null"); this.connectorSession = session.toConnectorSession(); this.expressionTypes = ImmutableMap.copyOf(requireNonNull(expressionTypes, "expressionTypes is null")); verify((expressionTypes.containsKey(NodeRef.of(expression)))); this.functionInvoker = new InterpretedFunctionInvoker(metadata); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); } public static Object evaluateConstantExpression( Expression expression, Type expectedType, - Metadata metadata, + PlannerContext plannerContext, Session session, AccessControl accessControl, Map, Expression> parameters) { - ExpressionAnalyzer analyzer = createConstantAnalyzer(metadata, accessControl, session, parameters, WarningCollector.NOOP); + ExpressionAnalyzer analyzer = createConstantAnalyzer(plannerContext, accessControl, session, parameters, WarningCollector.NOOP); analyzer.analyze(expression, Scope.create()); Type actualType = analyzer.getExpressionTypes().get(NodeRef.of(expression)); - if (!new TypeCoercion(metadata::getType).canCoerce(actualType, expectedType)) { + if (!new TypeCoercion(plannerContext.getTypeManager()::getType).canCoerce(actualType, expectedType)) { throw semanticException(TYPE_MISMATCH, expression, "Cannot cast type %s to %s", actualType.getDisplayName(), expectedType.getDisplayName()); } @@ -201,14 +204,14 @@ public static Object evaluateConstantExpression( .putAll(analyzer.getExpressionCoercions()) .put(NodeRef.of(expression), expectedType) .build(); - return evaluateConstantExpression(expression, coercions, analyzer.getTypeOnlyCoercions(), metadata, session, accessControl, ImmutableSet.of(), parameters); + return evaluateConstantExpression(expression, coercions, analyzer.getTypeOnlyCoercions(), plannerContext, session, accessControl, ImmutableSet.of(), parameters); } - private static Object evaluateConstantExpression( + public static Object evaluateConstantExpression( Expression expression, Map, Type> coercions, Set> typeOnlyCoercions, - Metadata metadata, + PlannerContext plannerContext, Session session, AccessControl accessControl, Set> columnReferences, @@ -222,24 +225,24 @@ private static Object evaluateConstantExpression( Expression rewrite = Coercer.addCoercions(expression, coercions, typeOnlyCoercions); // redo the analysis since above expression rewriter might create new expressions which do not have entries in the type map - ExpressionAnalyzer analyzer = createConstantAnalyzer(metadata, accessControl, session, parameters, WarningCollector.NOOP); + ExpressionAnalyzer analyzer = createConstantAnalyzer(plannerContext, accessControl, session, parameters, WarningCollector.NOOP); analyzer.analyze(rewrite, Scope.create()); // remove syntax sugar - rewrite = DesugarAtTimeZoneRewriter.rewrite(rewrite, analyzer.getExpressionTypes(), metadata, session); + rewrite = DesugarAtTimeZoneRewriter.rewrite(rewrite, analyzer.getExpressionTypes(), plannerContext.getMetadata(), session); // The optimization above may have rewritten the expression tree which breaks all the identity maps, so redo the analysis // to re-analyze coercions that might be necessary - analyzer = createConstantAnalyzer(metadata, accessControl, session, parameters, WarningCollector.NOOP); + analyzer = createConstantAnalyzer(plannerContext, accessControl, session, parameters, WarningCollector.NOOP); analyzer.analyze(rewrite, Scope.create()); // expressionInterpreter/optimizer only understands a subset of expression types // TODO: remove this when the new expression tree is implemented - Expression canonicalized = canonicalizeExpression(rewrite, analyzer.getExpressionTypes(), metadata, session); + Expression canonicalized = canonicalizeExpression(rewrite, analyzer.getExpressionTypes(), plannerContext.getMetadata(), session); // The optimization above may have rewritten the expression tree which breaks all the identity maps, so redo the analysis // to re-analyze coercions that might be necessary - analyzer = createConstantAnalyzer(metadata, accessControl, session, parameters, WarningCollector.NOOP); + analyzer = createConstantAnalyzer(plannerContext, accessControl, session, parameters, WarningCollector.NOOP); analyzer.analyze(canonicalized, Scope.create()); // resolve functions @@ -247,11 +250,11 @@ private static Object evaluateConstantExpression( // The optimization above may have rewritten the expression tree which breaks all the identity maps, so redo the analysis // to re-analyze coercions that might be necessary - analyzer = createConstantAnalyzer(metadata, accessControl, session, parameters, WarningCollector.NOOP); + analyzer = createConstantAnalyzer(plannerContext, accessControl, session, parameters, WarningCollector.NOOP); analyzer.analyze(resolved, Scope.create()); // evaluate the expression - return new ExpressionInterpreter(resolved, metadata, session, analyzer.getExpressionTypes()).evaluate(); + return new ExpressionInterpreter(resolved, plannerContext, session, analyzer.getExpressionTypes()).evaluate(); } public Type getType() @@ -382,7 +385,7 @@ protected Object visitSymbolReference(SymbolReference node, Object context) @Override protected Object visitLiteral(Literal node, Object context) { - return LiteralInterpreter.evaluate(metadata, session, expressionTypes, node); + return LiteralInterpreter.evaluate(plannerContext, session, expressionTypes, node); } @Override @@ -1221,7 +1224,7 @@ private JoniRegexp getConstantPattern(LikePredicate node) public Object visitCast(Cast node, Object context) { Object value = processWithExceptionHandling(node.getExpression(), context); - Type targetType = metadata.getType(toTypeSignature(node.getType())); + Type targetType = plannerContext.getTypeManager().getType(toTypeSignature(node.getType())); Type sourceType = type(node.getExpression()); if (value instanceof Expression) { if (targetType.equals(sourceType)) { @@ -1412,12 +1415,12 @@ private Object invokeOperator(OperatorType operatorType, List ar private Expression toExpression(Object base, Type type) { - return literalEncoder.toExpression(base, type); + return literalEncoder.toExpression(session, base, type); } private List toExpressions(List values, List types) { - return literalEncoder.toExpressions(values, types); + return literalEncoder.toExpressions(session, values, types); } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LayoutConstraintEvaluator.java b/core/trino-main/src/main/java/io/trino/sql/planner/LayoutConstraintEvaluator.java index e773f761908d..8b8851c4128d 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LayoutConstraintEvaluator.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LayoutConstraintEvaluator.java @@ -15,10 +15,10 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.operator.scalar.TryFunction; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.predicate.NullableValue; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.Expression; import io.trino.sql.tree.NullLiteral; @@ -35,10 +35,10 @@ public class LayoutConstraintEvaluator private final ExpressionInterpreter evaluator; private final Set arguments; - public LayoutConstraintEvaluator(Metadata metadata, TypeAnalyzer typeAnalyzer, Session session, TypeProvider types, Map assignments, Expression expression) + public LayoutConstraintEvaluator(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, Session session, TypeProvider types, Map assignments, Expression expression) { this.assignments = ImmutableMap.copyOf(requireNonNull(assignments, "assignments is null")); - evaluator = new ExpressionInterpreter(expression, metadata, session, typeAnalyzer.getTypes(session, types, expression)); + evaluator = new ExpressionInterpreter(expression, plannerContext, session, typeAnalyzer.getTypes(session, types, expression)); arguments = SymbolsExtractor.extractUnique(expression).stream() .map(assignments::get) .collect(toImmutableSet()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LiteralEncoder.java b/core/trino-main/src/main/java/io/trino/sql/planner/LiteralEncoder.java index 6b78c7875ec3..a1ae126559df 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LiteralEncoder.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LiteralEncoder.java @@ -21,7 +21,6 @@ import io.airlift.slice.SliceUtf8; import io.trino.Session; import io.trino.block.BlockSerdeUtil; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.operator.scalar.VarbinaryFunctions; import io.trino.operator.scalar.timestamp.TimestampToVarcharCast; @@ -37,6 +36,7 @@ import io.trino.spi.type.TimestampWithTimeZoneType; import io.trino.spi.type.Type; import io.trino.spi.type.VarcharType; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.ArithmeticUnaryExpression; import io.trino.sql.tree.BooleanLiteral; import io.trino.sql.tree.Cast; @@ -76,16 +76,14 @@ public final class LiteralEncoder { - private final Session session; - private final Metadata metadata; + private final PlannerContext plannerContext; - public LiteralEncoder(Session session, Metadata metadata) + public LiteralEncoder(PlannerContext plannerContext) { - this.session = requireNonNull(session, "session is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } - public List toExpressions(List objects, List types) + public List toExpressions(Session session, List objects, List types) { requireNonNull(objects, "objects is null"); requireNonNull(types, "types is null"); @@ -95,12 +93,12 @@ public List toExpressions(List objects, List type for (int i = 0; i < objects.size(); i++) { Object object = objects.get(i); Type type = types.get(i); - expressions.add(toExpression(object, type)); + expressions.add(toExpression(session, object, type)); } return expressions.build(); } - public Expression toExpression(Object object, Type type) + public Expression toExpression(Session session, Object object, Type type) { requireNonNull(type, "type is null"); @@ -143,17 +141,17 @@ public Expression toExpression(Object object, Type type) // if you remove this, you will need to update the TupleDomainOrcPredicate // When changing this, don't forget about similar code for REAL below if (value.isNaN()) { - return FunctionCallBuilder.resolve(session, metadata) + return FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(QualifiedName.of("nan")) .build(); } if (value.equals(Double.NEGATIVE_INFINITY)) { - return ArithmeticUnaryExpression.negative(FunctionCallBuilder.resolve(session, metadata) + return ArithmeticUnaryExpression.negative(FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(QualifiedName.of("infinity")) .build()); } if (value.equals(Double.POSITIVE_INFINITY)) { - return FunctionCallBuilder.resolve(session, metadata) + return FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(QualifiedName.of("infinity")) .build(); } @@ -165,21 +163,21 @@ public Expression toExpression(Object object, Type type) // WARNING for ORC predicate code as above (for double) if (value.isNaN()) { return new Cast( - FunctionCallBuilder.resolve(session, metadata) + FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(QualifiedName.of("nan")) .build(), toSqlType(REAL)); } if (value.equals(Float.NEGATIVE_INFINITY)) { return ArithmeticUnaryExpression.negative(new Cast( - FunctionCallBuilder.resolve(session, metadata) + FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(QualifiedName.of("infinity")) .build(), toSqlType(REAL))); } if (value.equals(Float.POSITIVE_INFINITY)) { return new Cast( - FunctionCallBuilder.resolve(session, metadata) + FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(QualifiedName.of("infinity")) .build(), toSqlType(REAL)); @@ -271,7 +269,7 @@ public Expression toExpression(Object object, Type type) if (object instanceof Block) { SliceOutput output = new DynamicSliceOutput(toIntExact(((Block) object).getSizeInBytes())); - BlockSerdeUtil.writeBlock(metadata.getBlockEncodingSerde(), output, (Block) object); + BlockSerdeUtil.writeBlock(plannerContext.getBlockEncodingSerde(), output, (Block) object); object = output.slice(); // This if condition will evaluate to true: object instanceof Slice && !type.equals(VARCHAR) } @@ -283,17 +281,17 @@ public Expression toExpression(Object object, Type type) // able to encode it in the plan that gets sent to workers. // We do this by transforming the in-memory varbinary into a call to from_base64() Slice encoded = VarbinaryFunctions.toBase64((Slice) object); - argument = FunctionCallBuilder.resolve(session, metadata) + argument = FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(QualifiedName.of("from_base64")) .addArgument(VARCHAR, new StringLiteral(encoded.toStringUtf8())) .build(); } else { - argument = toExpression(object, argumentType); + argument = toExpression(session, object, argumentType); } - ResolvedFunction resolvedFunction = metadata.getCoercion(session, QualifiedName.of(LITERAL_FUNCTION_NAME), argumentType, type); - return FunctionCallBuilder.resolve(session, metadata) + ResolvedFunction resolvedFunction = plannerContext.getMetadata().getCoercion(session, QualifiedName.of(LITERAL_FUNCTION_NAME), argumentType, type); + return FunctionCallBuilder.resolve(session, plannerContext.getMetadata()) .setName(resolvedFunction.toQualifiedName()) .addArgument(argumentType, argument) .build(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LiteralInterpreter.java b/core/trino-main/src/main/java/io/trino/sql/planner/LiteralInterpreter.java index f80ee68bb6b2..a344109d9173 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LiteralInterpreter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LiteralInterpreter.java @@ -16,7 +16,6 @@ import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.type.Decimals; @@ -27,6 +26,7 @@ import io.trino.spi.type.Type; import io.trino.spi.type.TypeNotFoundException; import io.trino.sql.InterpretedFunctionInvoker; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.AstVisitor; import io.trino.sql.tree.BinaryLiteral; import io.trino.sql.tree.BooleanLiteral; @@ -66,12 +66,12 @@ public final class LiteralInterpreter { private LiteralInterpreter() {} - public static Object evaluate(Metadata metadata, Session session, Map, Type> types, Expression node) + public static Object evaluate(PlannerContext plannerContext, Session session, Map, Type> types, Expression node) { if (!(node instanceof Literal)) { throw new IllegalArgumentException("node must be a Literal"); } - return new LiteralVisitor(session, metadata, types).process(node, null); + return new LiteralVisitor(session, plannerContext, types).process(node, null); } private static class LiteralVisitor @@ -79,16 +79,16 @@ private static class LiteralVisitor { private final Session session; private final ConnectorSession connectorSession; - private final Metadata metadata; + private final PlannerContext plannerContext; private final InterpretedFunctionInvoker functionInvoker; private final Map, Type> types; - private LiteralVisitor(Session session, Metadata metadata, Map, Type> types) + private LiteralVisitor(Session session, PlannerContext plannerContext, Map, Type> types) { this.session = requireNonNull(session, "session is null"); this.connectorSession = session.toConnectorSession(); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.functionInvoker = new InterpretedFunctionInvoker(metadata); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.functionInvoker = new InterpretedFunctionInvoker(plannerContext.getMetadata()); this.types = requireNonNull(types, "types is null"); } @@ -145,19 +145,19 @@ protected Object visitGenericLiteral(GenericLiteral node, Void context) { Type type; try { - type = metadata.fromSqlType(node.getType()); + type = plannerContext.getTypeManager().fromSqlType(node.getType()); } catch (TypeNotFoundException e) { throw semanticException(TYPE_NOT_FOUND, node, "Unknown type: %s", node.getType()); } if (JSON.equals(type)) { - ResolvedFunction resolvedFunction = metadata.resolveFunction(session, QualifiedName.of("json_parse"), fromTypes(VARCHAR)); + ResolvedFunction resolvedFunction = plannerContext.getMetadata().resolveFunction(session, QualifiedName.of("json_parse"), fromTypes(VARCHAR)); return functionInvoker.invoke(resolvedFunction, connectorSession, ImmutableList.of(utf8Slice(node.getValue()))); } try { - ResolvedFunction resolvedFunction = metadata.getCoercion(session, VARCHAR, type); + ResolvedFunction resolvedFunction = plannerContext.getMetadata().getCoercion(session, VARCHAR, type); return functionInvoker.invoke(resolvedFunction, connectorSession, ImmutableList.of(utf8Slice(node.getValue()))); } catch (IllegalArgumentException e) { diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java index 65e3ae7d571f..03305cc9fe7e 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LocalExecutionPlanner.java @@ -157,7 +157,6 @@ import io.trino.spi.predicate.NullableValue; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; import io.trino.spiller.PartitioningSpillerFactory; import io.trino.spiller.SingleStreamSpillerFactory; import io.trino.spiller.SpillerFactory; @@ -165,6 +164,7 @@ import io.trino.split.PageSinkManager; import io.trino.split.PageSourceProvider; import io.trino.sql.DynamicFilters; +import io.trino.sql.PlannerContext; import io.trino.sql.gen.ExpressionCompiler; import io.trino.sql.gen.JoinCompiler; import io.trino.sql.gen.JoinFilterFunctionCompiler; @@ -358,6 +358,7 @@ public class LocalExecutionPlanner { private static final Logger log = Logger.get(LocalExecutionPlanner.class); + private final PlannerContext plannerContext; private final Metadata metadata; private final TypeAnalyzer typeAnalyzer; private final Optional explainAnalyzeContext; @@ -382,13 +383,12 @@ public class LocalExecutionPlanner private final OperatorFactories operatorFactories; private final OrderingCompiler orderingCompiler; private final DynamicFilterConfig dynamicFilterConfig; - private final TypeOperators typeOperators; private final BlockTypeOperators blockTypeOperators; private final TableExecuteContextManager tableExecuteContextManager; @Inject public LocalExecutionPlanner( - Metadata metadata, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, Optional explainAnalyzeContext, PageSourceProvider pageSourceProvider, @@ -409,16 +409,16 @@ public LocalExecutionPlanner( OperatorFactories operatorFactories, OrderingCompiler orderingCompiler, DynamicFilterConfig dynamicFilterConfig, - TypeOperators typeOperators, BlockTypeOperators blockTypeOperators, TableExecuteContextManager tableExecuteContextManager) { + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.metadata = plannerContext.getMetadata(); this.explainAnalyzeContext = requireNonNull(explainAnalyzeContext, "explainAnalyzeContext is null"); this.pageSourceProvider = requireNonNull(pageSourceProvider, "pageSourceProvider is null"); this.indexManager = requireNonNull(indexManager, "indexManager is null"); this.nodePartitioningManager = requireNonNull(nodePartitioningManager, "nodePartitioningManager is null"); this.exchangeClientSupplier = exchangeClientSupplier; - this.metadata = requireNonNull(metadata, "metadata is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.pageSinkManager = requireNonNull(pageSinkManager, "pageSinkManager is null"); this.expressionCompiler = requireNonNull(expressionCompiler, "expressionCompiler is null"); @@ -437,7 +437,6 @@ public LocalExecutionPlanner( this.operatorFactories = requireNonNull(operatorFactories, "operatorFactories is null"); this.orderingCompiler = requireNonNull(orderingCompiler, "orderingCompiler is null"); this.dynamicFilterConfig = requireNonNull(dynamicFilterConfig, "dynamicFilterConfig is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); this.blockTypeOperators = requireNonNull(blockTypeOperators, "blockTypeOperators is null"); this.tableExecuteContextManager = requireNonNull(tableExecuteContextManager, "tableExecuteContextManager is null"); } @@ -554,7 +553,7 @@ public LocalExecutionPlan plan( plan.getId(), outputTypes, pagePreprocessor, - new PagesSerdeFactory(metadata.getBlockEncodingSerde(), isExchangeCompressionEnabled(session))), + new PagesSerdeFactory(plannerContext.getBlockEncodingSerde(), isExchangeCompressionEnabled(session))), physicalOperation), context.getDriverInstanceCount()); @@ -885,7 +884,7 @@ private PhysicalOperation createMergeSource(RemoteSourceNode node, LocalExecutio context.getNextOperatorId(), node.getId(), exchangeClientSupplier, - new PagesSerdeFactory(metadata.getBlockEncodingSerde(), isExchangeCompressionEnabled(session)), + new PagesSerdeFactory(plannerContext.getBlockEncodingSerde(), isExchangeCompressionEnabled(session)), orderingCompiler, types, outputChannels, @@ -905,7 +904,7 @@ private PhysicalOperation createRemoteSource(RemoteSourceNode node, LocalExecuti context.getNextOperatorId(), node.getId(), exchangeClientSupplier, - new PagesSerdeFactory(metadata.getBlockEncodingSerde(), isExchangeCompressionEnabled(session)), + new PagesSerdeFactory(plannerContext.getBlockEncodingSerde(), isExchangeCompressionEnabled(session)), node.getRetryPolicy()); return new PhysicalOperation(operatorFactory, makeLayout(node), context, UNGROUPED_EXECUTION); @@ -1025,7 +1024,7 @@ public PhysicalOperation visitTopNRanking(TopNRankingNode node, LocalExecutionPl 1000, maxPartialTopNMemorySize, joinCompiler, - typeOperators, + plannerContext.getTypeOperators(), blockTypeOperators); return new PhysicalOperation(operatorFactory, makeLayout(node), context, source); @@ -1631,7 +1630,7 @@ public PhysicalOperation visitTopN(TopNNode node, LocalExecutionPlanContext cont (int) node.getCount(), sortChannels, sortOrders, - typeOperators); + plannerContext.getTypeOperators()); return new PhysicalOperation(operator, source.getLayout(), context, source); } @@ -2000,7 +1999,7 @@ private DynamicFilter getDynamicFilter( tableScanNode.getAssignments(), context.getTypes(), metadata, - typeOperators); + plannerContext.getTypeOperators()); } @Override @@ -2025,7 +2024,7 @@ public PhysicalOperation visitValues(ValuesNode node, LocalExecutionPlanContext Map, Type> types = typeAnalyzer.getTypes(session, TypeProvider.empty(), row); checkState(types.get(NodeRef.of(row)) instanceof RowType, "unexpected type of Values row: %s", types); // evaluate the literal value - Object result = new ExpressionInterpreter(row, metadata, session, types).evaluate(); + Object result = new ExpressionInterpreter(row, plannerContext, session, types).evaluate(); for (int j = 0; j < outputTypes.size(); j++) { // divide row into fields writeNativeValue(outputTypes.get(j), pageBuilder.getBlockBuilder(j), readNativeValue(outputTypes.get(j), (SingleRowBlock) result, j)); @@ -2139,7 +2138,7 @@ public PhysicalOperation visitIndexSource(IndexSourceNode node, LocalExecutionPl List remappedProbeKeyChannels = remappedProbeKeyChannelsBuilder.build(); Function probeKeyNormalizer = recordSet -> { if (!overlappingFieldSets.isEmpty()) { - recordSet = new FieldSetFilteringRecordSet(typeOperators, recordSet, overlappingFieldSets); + recordSet = new FieldSetFilteringRecordSet(plannerContext.getTypeOperators(), recordSet, overlappingFieldSets); } return new MappedRecordSet(recordSet, remappedProbeKeyChannels); }; diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/LogicalPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/LogicalPlanner.java index 5e1e9c66a575..901366c3df41 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/LogicalPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/LogicalPlanner.java @@ -41,8 +41,8 @@ import io.trino.spi.statistics.TableStatisticsMetadata; import io.trino.spi.type.CharType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; import io.trino.spi.type.VarcharType; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Analysis; import io.trino.sql.analyzer.Field; import io.trino.sql.analyzer.RelationId; @@ -159,7 +159,7 @@ public enum Stage private final PlanSanityChecker planSanityChecker; private final SymbolAllocator symbolAllocator = new SymbolAllocator(); private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final TypeCoercion typeCoercion; private final TypeAnalyzer typeAnalyzer; private final StatisticsAggregationPlanner statisticsAggregationPlanner; @@ -171,14 +171,13 @@ public LogicalPlanner( Session session, List planOptimizers, PlanNodeIdAllocator idAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, StatsCalculator statsCalculator, CostCalculator costCalculator, WarningCollector warningCollector) { - this(session, planOptimizers, DISTRIBUTED_PLAN_SANITY_CHECKER, idAllocator, metadata, typeOperators, typeAnalyzer, statsCalculator, costCalculator, warningCollector); + this(session, planOptimizers, DISTRIBUTED_PLAN_SANITY_CHECKER, idAllocator, plannerContext, typeAnalyzer, statsCalculator, costCalculator, warningCollector); } public LogicalPlanner( @@ -186,8 +185,7 @@ public LogicalPlanner( List planOptimizers, PlanSanityChecker planSanityChecker, PlanNodeIdAllocator idAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, StatsCalculator statsCalculator, CostCalculator costCalculator, @@ -197,9 +195,9 @@ public LogicalPlanner( this.planOptimizers = requireNonNull(planOptimizers, "planOptimizers is null"); this.planSanityChecker = requireNonNull(planSanityChecker, "planSanityChecker is null"); this.idAllocator = requireNonNull(idAllocator, "idAllocator is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); - this.typeOperators = typeOperators; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.metadata = plannerContext.getMetadata(); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.statisticsAggregationPlanner = new StatisticsAggregationPlanner(symbolAllocator, metadata, session); this.statsCalculator = requireNonNull(statsCalculator, "statsCalculator is null"); @@ -225,7 +223,7 @@ public Plan plan(Analysis analysis, Stage stage, boolean collectPlanStatistics) LOG.debug("Initial plan:\n%s", PlanPrinter.textLogicalPlan(root, symbolAllocator.getTypes(), metadata, StatsAndCosts.empty(), session, 0, false)); } - planSanityChecker.validateIntermediatePlan(root, session, metadata, typeOperators, typeAnalyzer, symbolAllocator.getTypes(), warningCollector); + planSanityChecker.validateIntermediatePlan(root, session, plannerContext, typeAnalyzer, symbolAllocator.getTypes(), warningCollector); if (stage.ordinal() >= OPTIMIZED.ordinal()) { for (PlanOptimizer optimizer : planOptimizers) { @@ -240,7 +238,7 @@ public Plan plan(Analysis analysis, Stage stage, boolean collectPlanStatistics) if (stage.ordinal() >= OPTIMIZED_AND_VALIDATED.ordinal()) { // make sure we produce a valid plan after optimizations run. This is mainly to catch programming errors - planSanityChecker.validateFinalPlan(root, session, metadata, typeOperators, typeAnalyzer, symbolAllocator.getTypes(), warningCollector); + planSanityChecker.validateFinalPlan(root, session, plannerContext, typeAnalyzer, symbolAllocator.getTypes(), warningCollector); } TypeProvider types = symbolAllocator.getTypes(); @@ -408,7 +406,7 @@ private RelationPlan getInsertPlan( TableMetadata tableMetadata = metadata.getTableMetadata(session, tableHandle); Map, Symbol> lambdaDeclarationToSymbolMap = buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator); - RelationPlanner planner = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, Optional.empty(), session, ImmutableMap.of()); + RelationPlanner planner = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, Optional.empty(), session, ImmutableMap.of()); RelationPlan plan = planner.process(query, null); ImmutableList.Builder builder = ImmutableList.builder(); @@ -606,7 +604,7 @@ private RelationPlan createTableWriterPlan( if (!statisticsMetadata.isEmpty()) { TableStatisticAggregation result = statisticsAggregationPlanner.createStatisticsAggregation(statisticsMetadata, columnToSymbolMap); - StatisticAggregations.Parts aggregations = result.getAggregations().createPartialAggregations(symbolAllocator, metadata); + StatisticAggregations.Parts aggregations = result.getAggregations().createPartialAggregations(symbolAllocator, plannerContext); // partial aggregation is run within the TableWriteOperator to calculate the statistics for // the data consumed by the TableWriteOperator @@ -715,7 +713,7 @@ private Expression noTruncationCast(Expression expression, Type fromType, Type t private RelationPlan createDeletePlan(Analysis analysis, Delete node) { - DeleteNode deleteNode = new QueryPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), metadata, Optional.empty(), session, ImmutableMap.of()) + DeleteNode deleteNode = new QueryPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), plannerContext, Optional.empty(), session, ImmutableMap.of()) .plan(node); TableFinishNode commitNode = new TableFinishNode( @@ -731,7 +729,7 @@ private RelationPlan createDeletePlan(Analysis analysis, Delete node) private RelationPlan createUpdatePlan(Analysis analysis, Update node) { - UpdateNode updateNode = new QueryPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), metadata, Optional.empty(), session, ImmutableMap.of()) + UpdateNode updateNode = new QueryPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), plannerContext, Optional.empty(), session, ImmutableMap.of()) .plan(node); TableFinishNode commitNode = new TableFinishNode( @@ -778,7 +776,7 @@ private RelationPlan createRelationPlan(Analysis analysis, Table table) private RelationPlanner getRelationPlanner(Analysis analysis) { - return new RelationPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), metadata, Optional.empty(), session, ImmutableMap.of()); + return new RelationPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), plannerContext, Optional.empty(), session, ImmutableMap.of()); } private static Map, Symbol> buildLambdaDeclarationToSymbolMap(Analysis analysis, SymbolAllocator symbolAllocator) @@ -819,7 +817,7 @@ private RelationPlan createTableExecutePlan(Analysis analysis, TableExecute stat RelationPlan tableScanPlan = createRelationPlan(analysis, table); PlanBuilder sourcePlanBuilder = newPlanBuilder(tableScanPlan, analysis, ImmutableMap.of(), ImmutableMap.of()); if (statement.getWhere().isPresent()) { - SubqueryPlanner subqueryPlanner = new SubqueryPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), metadata, typeCoercion, Optional.empty(), session, ImmutableMap.of()); + SubqueryPlanner subqueryPlanner = new SubqueryPlanner(analysis, symbolAllocator, idAllocator, buildLambdaDeclarationToSymbolMap(analysis, symbolAllocator), plannerContext, typeCoercion, Optional.empty(), session, ImmutableMap.of()); Expression whereExpression = statement.getWhere().get(); sourcePlanBuilder = subqueryPlanner.handleSubqueries(sourcePlanBuilder, whereExpression, analysis.getSubqueries(statement)); sourcePlanBuilder = sourcePlanBuilder.withNewRoot(new FilterNode(idAllocator.getNextId(), sourcePlanBuilder.getRoot(), sourcePlanBuilder.rewrite(whereExpression))); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/PlanOptimizers.java b/core/trino-main/src/main/java/io/trino/sql/planner/PlanOptimizers.java index 410f253584fc..33b4401ddff4 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/PlanOptimizers.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/PlanOptimizers.java @@ -25,9 +25,9 @@ import io.trino.cost.TaskCountEstimator; import io.trino.execution.TaskManagerConfig; import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.iterative.IterativeOptimizer; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.iterative.RuleStats; @@ -266,8 +266,7 @@ public class PlanOptimizers @Inject public PlanOptimizers( - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TaskManagerConfig taskManagerConfig, SplitManager splitManager, @@ -281,8 +280,7 @@ public PlanOptimizers( NodePartitioningManager nodePartitioningManager, RuleStatsRecorder ruleStats) { - this(metadata, - typeOperators, + this(plannerContext, typeAnalyzer, taskManagerConfig, false, @@ -299,8 +297,7 @@ public PlanOptimizers( } public PlanOptimizers( - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TaskManagerConfig taskManagerConfig, boolean forceSingleNode, @@ -318,6 +315,7 @@ public PlanOptimizers( this.ruleStats = requireNonNull(ruleStats, "ruleStats is null"); ImmutableList.Builder builder = ImmutableList.builder(); + Metadata metadata = plannerContext.getMetadata(); Set> columnPruningRules = columnPruningRules(metadata); Set> projectionPushdownRules = ImmutableSet.of( @@ -356,10 +354,10 @@ public PlanOptimizers( new RemoveRedundantIdentityProjections())); Set> simplifyOptimizerRules = ImmutableSet.>builder() - .addAll(new SimplifyExpressions(metadata, typeAnalyzer).rules()) + .addAll(new SimplifyExpressions(plannerContext, typeAnalyzer).rules()) .addAll(new UnwrapRowSubscript().rules()) .addAll(new PushCastIntoRow().rules()) - .addAll(new UnwrapCastInComparison(metadata, typeOperators, typeAnalyzer).rules()) + .addAll(new UnwrapCastInComparison(plannerContext, typeAnalyzer).rules()) .addAll(new RemoveDuplicateConditions(metadata).rules()) .addAll(new CanonicalizeExpressions(metadata, typeAnalyzer).rules()) .add(new RemoveTrivialFilters()) @@ -446,7 +444,7 @@ public PlanOptimizers( new MergeLimitWithDistinct(), new PruneCountAggregationOverScalar(metadata), new PruneOrderByInAggregation(metadata), - new RewriteSpatialPartitioningAggregation(metadata), + new RewriteSpatialPartitioningAggregation(plannerContext), new SimplifyCountOverConstant(metadata))) .build()), new IterativeOptimizer( @@ -497,7 +495,7 @@ public PlanOptimizers( ruleStats, statsCalculator, estimatedExchangesCostCalculator, - ImmutableSet.of(new TransformExistsApplyToCorrelatedJoin(metadata))), + ImmutableSet.of(new TransformExistsApplyToCorrelatedJoin(plannerContext))), new TransformQuantifiedComparisonApplyToCorrelatedJoin(metadata), new IterativeOptimizer( metadata, @@ -509,16 +507,16 @@ public PlanOptimizers( new RemoveUnreferencedScalarSubqueries(), new TransformUncorrelatedSubqueryToJoin(), new TransformUncorrelatedInPredicateSubqueryToSemiJoin(), - new TransformCorrelatedJoinToJoin(metadata), + new TransformCorrelatedJoinToJoin(plannerContext), new DecorrelateInnerUnnestWithGlobalAggregation(), new DecorrelateLeftUnnestWithGlobalAggregation(), new DecorrelateUnnest(metadata), - new TransformCorrelatedGlobalAggregationWithProjection(metadata), - new TransformCorrelatedGlobalAggregationWithoutProjection(metadata), - new TransformCorrelatedDistinctAggregationWithProjection(metadata), - new TransformCorrelatedDistinctAggregationWithoutProjection(metadata), - new TransformCorrelatedGroupedAggregationWithProjection(metadata), - new TransformCorrelatedGroupedAggregationWithoutProjection(metadata))), + new TransformCorrelatedGlobalAggregationWithProjection(plannerContext), + new TransformCorrelatedGlobalAggregationWithoutProjection(plannerContext), + new TransformCorrelatedDistinctAggregationWithProjection(plannerContext), + new TransformCorrelatedDistinctAggregationWithoutProjection(plannerContext), + new TransformCorrelatedGroupedAggregationWithProjection(plannerContext), + new TransformCorrelatedGroupedAggregationWithoutProjection(plannerContext))), new IterativeOptimizer( metadata, ruleStats, @@ -529,7 +527,7 @@ public PlanOptimizers( new RemoveUnreferencedScalarApplyNodes(), new TransformCorrelatedInPredicateToJoin(metadata), // must be run after columnPruningOptimizer new TransformCorrelatedScalarSubquery(metadata), // must be run after TransformCorrelatedAggregation rules - new TransformCorrelatedJoinToJoin(metadata), + new TransformCorrelatedJoinToJoin(plannerContext), new ImplementFilteredAggregations(metadata))), new IterativeOptimizer( metadata, @@ -547,7 +545,7 @@ public PlanOptimizers( simplifyOptimizer, // Should run after MergeProjectWithValues new StatsRecordingPlanOptimizer( optimizerStats, - new PredicatePushDown(metadata, typeOperators, typeAnalyzer, false, false)), + new PredicatePushDown(plannerContext, typeAnalyzer, false, false)), new IterativeOptimizer( metadata, ruleStats, @@ -575,20 +573,20 @@ public PlanOptimizers( statsCalculator, estimatedExchangesCostCalculator, ImmutableSet.of( - new ApplyTableScanRedirection(metadata), + new ApplyTableScanRedirection(plannerContext), new PruneTableScanColumns(metadata), - new PushPredicateIntoTableScan(metadata, typeOperators, typeAnalyzer)))); + new PushPredicateIntoTableScan(plannerContext, typeAnalyzer)))); Set> pushIntoTableScanRulesExceptJoins = ImmutableSet.>builder() .addAll(columnPruningRules) .addAll(projectionPushdownRules) - .add(new PushProjectionIntoTableScan(metadata, typeAnalyzer, scalarStatsCalculator)) + .add(new PushProjectionIntoTableScan(plannerContext, typeAnalyzer, scalarStatsCalculator)) .add(new RemoveRedundantIdentityProjections()) .add(new PushLimitIntoTableScan(metadata)) - .add(new PushPredicateIntoTableScan(metadata, typeOperators, typeAnalyzer)) + .add(new PushPredicateIntoTableScan(plannerContext, typeAnalyzer)) .add(new PushSampleIntoTableScan(metadata)) - .add(new PushAggregationIntoTableScan(metadata)) - .add(new PushDistinctLimitIntoTableScan(metadata)) + .add(new PushAggregationIntoTableScan(plannerContext)) + .add(new PushDistinctLimitIntoTableScan(plannerContext)) .add(new PushTopNIntoTableScan(metadata)) .build(); IterativeOptimizer pushIntoTableScanOptimizer = new IterativeOptimizer( @@ -608,7 +606,7 @@ public PlanOptimizers( estimatedExchangesCostCalculator, ImmutableSet.>builder() .addAll(projectionPushdownRules) - .add(new PushProjectionIntoTableScan(metadata, typeAnalyzer, scalarStatsCalculator)) + .add(new PushProjectionIntoTableScan(plannerContext, typeAnalyzer, scalarStatsCalculator)) .build()); builder.add( @@ -640,7 +638,7 @@ public PlanOptimizers( // Projection pushdown rules may push reducing projections (e.g. dereferences) below filters for potential // pushdown into the connectors. We invoke PredicatePushdown and PushPredicateIntoTableScan after this // to leverage predicate pushdown on projected columns. - new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(metadata, typeOperators, typeAnalyzer, true, false)), + new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(plannerContext, typeAnalyzer, true, false)), new IterativeOptimizer( metadata, ruleStats, @@ -648,11 +646,11 @@ public PlanOptimizers( estimatedExchangesCostCalculator, ImmutableSet.>builder() .addAll(simplifyOptimizerRules) // Should be always run after PredicatePushDown - .add(new PushPredicateIntoTableScan(metadata, typeOperators, typeAnalyzer)) + .add(new PushPredicateIntoTableScan(plannerContext, typeAnalyzer)) .build()), new UnaliasSymbolReferences(metadata), // Run again because predicate pushdown and projection pushdown might add more projections columnPruningOptimizer, // Make sure to run this before index join. Filtered projections may not have all the columns. - new IndexJoinOptimizer(metadata, typeOperators), // Run this after projections and filters have been fully simplified and pushed down + new IndexJoinOptimizer(plannerContext), // Run this after projections and filters have been fully simplified and pushed down new LimitPushDown(), // Run LimitPushDown before WindowFilterPushDown // This must run after PredicatePushDown and LimitPushDown so that it squashes any successive filter nodes and limits new IterativeOptimizer( @@ -661,15 +659,15 @@ public PlanOptimizers( statsCalculator, estimatedExchangesCostCalculator, SystemSessionProperties::useLegacyWindowFilterPushdown, - ImmutableList.of(new WindowFilterPushDown(metadata, typeOperators)), + ImmutableList.of(new WindowFilterPushDown(plannerContext)), ImmutableSet.of(// should run after DecorrelateUnnest and ImplementLimitWithTies new RemoveEmptyUnionBranches(), new EvaluateEmptyIntersect(), new RemoveEmptyExceptBranches(), new PushdownLimitIntoRowNumber(), new PushdownLimitIntoWindow(), - new PushdownFilterIntoRowNumber(metadata, typeOperators), - new PushdownFilterIntoWindow(metadata, typeOperators), + new PushdownFilterIntoRowNumber(plannerContext), + new PushdownFilterIntoWindow(plannerContext), new ReplaceWindowWithRowNumber(metadata))), new IterativeOptimizer( metadata, @@ -681,8 +679,8 @@ public PlanOptimizers( .add(new RemoveRedundantIdentityProjections()) .addAll(GatherAndMergeWindows.rules()) .addAll(MergePatternRecognitionNodes.rules()) - .add(new PushPredicateThroughProjectIntoRowNumber(metadata, typeOperators)) - .add(new PushPredicateThroughProjectIntoWindow(metadata, typeOperators)) + .add(new PushPredicateThroughProjectIntoRowNumber(plannerContext)) + .add(new PushPredicateThroughProjectIntoWindow(plannerContext)) .build()), inlineProjections, columnPruningOptimizer, // Make sure to run this at the end to help clean the plan for logging/execution and not remove info that other optimizers might need at an earlier point @@ -694,7 +692,7 @@ public PlanOptimizers( ImmutableSet.of( new RemoveRedundantIdentityProjections(), new PushDownProjectionsFromPatternRecognition())), - new MetadataQueryOptimizer(metadata), + new MetadataQueryOptimizer(plannerContext), new IterativeOptimizer( metadata, ruleStats, @@ -703,7 +701,7 @@ public PlanOptimizers( ImmutableSet.of(new EliminateCrossJoins(metadata, typeAnalyzer))), // This can pull up Filter and Project nodes from between Joins, so we need to push them down again new StatsRecordingPlanOptimizer( optimizerStats, - new PredicatePushDown(metadata, typeOperators, typeAnalyzer, true, false)), + new PredicatePushDown(plannerContext, typeAnalyzer, true, false)), new IterativeOptimizer( metadata, ruleStats, @@ -711,13 +709,13 @@ public PlanOptimizers( estimatedExchangesCostCalculator, ImmutableSet.>builder() .addAll(simplifyOptimizerRules) // Should be always run after PredicatePushDown - .add(new PushPredicateIntoTableScan(metadata, typeOperators, typeAnalyzer)) + .add(new PushPredicateIntoTableScan(plannerContext, typeAnalyzer)) .build()), pushProjectionIntoTableScanOptimizer, // Projection pushdown rules may push reducing projections (e.g. dereferences) below filters for potential // pushdown into the connectors. Invoke PredicatePushdown and PushPredicateIntoTableScan after this // to leverage predicate pushdown on projected columns. - new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(metadata, typeOperators, typeAnalyzer, true, false)), + new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(plannerContext, typeAnalyzer, true, false)), new IterativeOptimizer( metadata, ruleStats, @@ -725,7 +723,7 @@ public PlanOptimizers( estimatedExchangesCostCalculator, ImmutableSet.>builder() .addAll(simplifyOptimizerRules) // Should be always run after PredicatePushDown - .add(new PushPredicateIntoTableScan(metadata, typeOperators, typeAnalyzer)) + .add(new PushPredicateIntoTableScan(plannerContext, typeAnalyzer)) .build()), columnPruningOptimizer, new IterativeOptimizer( @@ -774,7 +772,7 @@ public PlanOptimizers( costCalculator, ImmutableSet.>builder() .add(new RemoveRedundantIdentityProjections()) - .addAll(new ExtractSpatialJoins(metadata, splitManager, pageSourceManager, typeAnalyzer).rules()) + .addAll(new ExtractSpatialJoins(plannerContext, splitManager, pageSourceManager, typeAnalyzer).rules()) .add(new InlineProjections(typeAnalyzer)) .build())); @@ -829,7 +827,7 @@ public PlanOptimizers( // unalias symbols before adding exchanges to use same partitioning symbols in joins, aggregations and other // operators that require node partitioning builder.add(new UnaliasSymbolReferences(metadata)); - builder.add(new StatsRecordingPlanOptimizer(optimizerStats, new AddExchanges(metadata, typeOperators, typeAnalyzer, statsCalculator))); + builder.add(new StatsRecordingPlanOptimizer(optimizerStats, new AddExchanges(plannerContext, typeAnalyzer, statsCalculator))); } //noinspection UnusedAssignment estimatedExchangesCostCalculator = null; // Prevent accidental use after AddExchanges @@ -850,7 +848,7 @@ public PlanOptimizers( // and to pushdown dynamic filters builder.add(new StatsRecordingPlanOptimizer( optimizerStats, - new PredicatePushDown(metadata, typeOperators, typeAnalyzer, true, false))); + new PredicatePushDown(plannerContext, typeAnalyzer, true, false))); builder.add(new IterativeOptimizer( metadata, ruleStats, @@ -858,14 +856,14 @@ public PlanOptimizers( costCalculator, ImmutableSet.>builder() .addAll(simplifyOptimizerRules) // Should be always run after PredicatePushDown - .add(new RemoveRedundantTableScanPredicate(metadata, typeOperators, typeAnalyzer)) + .add(new RemoveRedundantTableScanPredicate(plannerContext, typeAnalyzer)) .build())); builder.add(pushProjectionIntoTableScanOptimizer); // Projection pushdown rules may push reducing projections (e.g. dereferences) below filters for potential // pushdown into the connectors. Invoke PredicatePushdown and PushPredicateIntoTableScan after this // to leverage predicate pushdown on projected columns. - builder.add(new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(metadata, typeOperators, typeAnalyzer, true, true))); - builder.add(new RemoveUnsupportedDynamicFilters(metadata)); // Remove unsupported dynamic filters introduced by PredicatePushdown + builder.add(new StatsRecordingPlanOptimizer(optimizerStats, new PredicatePushDown(plannerContext, typeAnalyzer, true, true))); + builder.add(new RemoveUnsupportedDynamicFilters(plannerContext)); // Remove unsupported dynamic filters introduced by PredicatePushdown builder.add(new IterativeOptimizer( metadata, ruleStats, @@ -873,7 +871,7 @@ public PlanOptimizers( costCalculator, ImmutableSet.>builder() .addAll(simplifyOptimizerRules) // Should be always run after PredicatePushDown - .add(new PushPredicateIntoTableScan(metadata, typeOperators, typeAnalyzer)) + .add(new PushPredicateIntoTableScan(plannerContext, typeAnalyzer)) .build())); builder.add(inlineProjections); builder.add(new UnaliasSymbolReferences(metadata)); // Run unalias after merging projections to simplify projections more efficiently @@ -891,7 +889,7 @@ public PlanOptimizers( .build())); // Optimizers above this don't understand local exchanges, so be careful moving this. - builder.add(new AddLocalExchanges(metadata, typeOperators, typeAnalyzer)); + builder.add(new AddLocalExchanges(plannerContext, typeAnalyzer)); // Optimizers above this do not need to care about aggregations with the type other than SINGLE // This optimizer must be run after all exchange-related optimizers @@ -902,7 +900,7 @@ public PlanOptimizers( costCalculator, ImmutableSet.of( new PushPartialAggregationThroughJoin(), - new PushPartialAggregationThroughExchange(metadata), + new PushPartialAggregationThroughExchange(plannerContext), new PruneJoinColumns(), new PruneJoinChildrenColumns()))); builder.add(new IterativeOptimizer( @@ -910,7 +908,7 @@ public PlanOptimizers( ruleStats, statsCalculator, costCalculator, - new AddExchangesBelowPartialAggregationOverGroupIdRuleSet(metadata, typeOperators, typeAnalyzer, taskCountEstimator, taskManagerConfig).rules())); + new AddExchangesBelowPartialAggregationOverGroupIdRuleSet(plannerContext, typeAnalyzer, taskCountEstimator, taskManagerConfig).rules())); builder.add(new IterativeOptimizer( metadata, ruleStats, diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java index 30c87aa2ae0d..494cc69adc01 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java @@ -20,7 +20,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.metadata.TableHandle; import io.trino.metadata.TableSchema; @@ -30,6 +29,7 @@ import io.trino.spi.type.DecimalType; import io.trino.spi.type.Type; import io.trino.sql.NodeUtils; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Analysis; import io.trino.sql.analyzer.Analysis.GroupingSetAnalysis; import io.trino.sql.analyzer.Analysis.ResolvedWindow; @@ -150,7 +150,7 @@ class QueryPlanner private final SymbolAllocator symbolAllocator; private final PlanNodeIdAllocator idAllocator; private final Map, Symbol> lambdaDeclarationToSymbolMap; - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeCoercion typeCoercion; private final Session session; private final SubqueryPlanner subqueryPlanner; @@ -162,7 +162,7 @@ class QueryPlanner SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, Map, Symbol> lambdaDeclarationToSymbolMap, - Metadata metadata, + PlannerContext plannerContext, Optional outerContext, Session session, Map, RelationPlan> recursiveSubqueries) @@ -171,7 +171,7 @@ class QueryPlanner requireNonNull(symbolAllocator, "symbolAllocator is null"); requireNonNull(idAllocator, "idAllocator is null"); requireNonNull(lambdaDeclarationToSymbolMap, "lambdaDeclarationToSymbolMap is null"); - requireNonNull(metadata, "metadata is null"); + requireNonNull(plannerContext, "plannerContext is null"); requireNonNull(session, "session is null"); requireNonNull(outerContext, "outerContext is null"); requireNonNull(recursiveSubqueries, "recursiveSubqueries is null"); @@ -180,11 +180,11 @@ class QueryPlanner this.symbolAllocator = symbolAllocator; this.idAllocator = idAllocator; this.lambdaDeclarationToSymbolMap = lambdaDeclarationToSymbolMap; - this.metadata = metadata; - this.typeCoercion = new TypeCoercion(metadata::getType); + this.plannerContext = plannerContext; + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); this.session = session; this.outerContext = outerContext; - this.subqueryPlanner = new SubqueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, typeCoercion, outerContext, session, recursiveSubqueries); + this.subqueryPlanner = new SubqueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, typeCoercion, outerContext, session, recursiveSubqueries); this.recursiveSubqueries = recursiveSubqueries; } @@ -223,7 +223,7 @@ public RelationPlan planExpand(Query query) // plan anchor relation Relation anchorNode = union.getRelations().get(0); - RelationPlan anchorPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + RelationPlan anchorPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .process(anchorNode, null); // prune anchor plan outputs to contain only the symbols exposed in the scope @@ -244,7 +244,7 @@ public RelationPlan planExpand(Query query) symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, - metadata, + plannerContext, outerContext, session, ImmutableMap.of(NodeRef.of(analysis.getRecursiveReference(query)), anchorPlan)) @@ -282,7 +282,7 @@ public RelationPlan planExpand(Query query) // 1. append window to count rows NodeAndMappings checkConvergenceStep = copy(recursionStep, mappings); Symbol countSymbol = symbolAllocator.newSymbol("count", BIGINT); - ResolvedFunction function = metadata.resolveFunction(session, QualifiedName.of("count"), ImmutableList.of()); + ResolvedFunction function = plannerContext.getMetadata().resolveFunction(session, QualifiedName.of("count"), ImmutableList.of()); WindowNode.Function countFunction = new WindowNode.Function(function, ImmutableList.of(), DEFAULT_FRAME, false); WindowNode windowNode = new WindowNode( @@ -295,7 +295,7 @@ public RelationPlan planExpand(Query query) 0); // 2. append filter to fail on non-empty result - ResolvedFunction fail = metadata.resolveFunction(session, QualifiedName.of("fail"), fromTypes(VARCHAR)); + ResolvedFunction fail = plannerContext.getMetadata().resolveFunction(session, QualifiedName.of("fail"), fromTypes(VARCHAR)); String recursionLimitExceededMessage = format("Recursion depth limit exceeded (%s). Use 'max_recursion_depth' session property to modify the limit.", maxRecursionDepth); Expression predicate = new IfExpression( new ComparisonExpression( @@ -354,7 +354,7 @@ public RelationPlan planExpand(Query query) // order and might be used to identify the original output symbols with their copies. private NodeAndMappings copy(PlanNode plan, List fields) { - return PlanCopier.copyPlan(plan, fields, metadata, symbolAllocator, idAllocator); + return PlanCopier.copyPlan(plan, fields, plannerContext.getMetadata(), symbolAllocator, idAllocator); } private PlanNode replace(PlanNode plan, NodeAndMappings replacementSpot, NodeAndMappings replacement) @@ -483,7 +483,7 @@ public DeleteNode plan(Delete node) TableHandle handle = analysis.getTableHandle(table); // create table scan - RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .process(table, null); PlanBuilder builder = newPlanBuilder(relationPlan, analysis, lambdaDeclarationToSymbolMap); @@ -502,7 +502,7 @@ public DeleteNode plan(Delete node) builder.getRoot(), new DeleteTarget( Optional.empty(), - metadata.getTableMetadata(session, handle).getTable()), + plannerContext.getMetadata().getTableMetadata(session, handle).getTable()), rowId, outputs); } @@ -512,8 +512,8 @@ public UpdateNode plan(Update node) Table table = node.getTable(); TableHandle handle = analysis.getTableHandle(table); - TableSchema tableSchema = metadata.getTableSchema(session, handle); - Map columnMap = metadata.getColumnHandles(session, handle); + TableSchema tableSchema = plannerContext.getMetadata().getTableSchema(session, handle); + Map columnMap = plannerContext.getMetadata().getColumnHandles(session, handle); List columnsSchemas = tableSchema.getColumns(); List targetColumnNames = node.getAssignments().stream() @@ -538,7 +538,7 @@ public UpdateNode plan(Update node) List orderedColumnValues = orderedColumnValuesBuilder.build(); // create table scan - RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .process(table, null); PlanBuilder builder = newPlanBuilder(relationPlan, analysis, lambdaDeclarationToSymbolMap); @@ -571,7 +571,7 @@ public UpdateNode plan(Update node) builder.getRoot(), new UpdateTarget( Optional.empty(), - metadata.getTableMetadata(session, handle).getTable(), + plannerContext.getMetadata().getTableMetadata(session, handle).getTable(), updatedColumnNames, updatedColumnHandles), rowId, @@ -602,7 +602,7 @@ private static List computeOutputs(PlanBuilder builder, List private PlanBuilder planQueryBody(Query query) { - RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .process(query.getQueryBody(), null); return newPlanBuilder(relationPlan, analysis, lambdaDeclarationToSymbolMap); @@ -611,7 +611,7 @@ private PlanBuilder planQueryBody(Query query) private PlanBuilder planFrom(QuerySpecification node) { if (node.getFrom().isPresent()) { - RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + RelationPlan relationPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .process(node.getFrom().get(), null); return newPlanBuilder(relationPlan, analysis, lambdaDeclarationToSymbolMap); } @@ -1055,7 +1055,7 @@ private FrameBoundPlanAndSymbols planFrameBound(PlanBuilder subPlan, PlanAndMapp // First, append filter to validate offset values. They mustn't be negative or null. Symbol offsetSymbol = coercions.get(frameOffset.get()); Expression zeroOffset = zeroOfType(symbolAllocator.getTypes().get(offsetSymbol)); - ResolvedFunction fail = metadata.resolveFunction(session, QualifiedName.of("fail"), fromTypes(VARCHAR)); + ResolvedFunction fail = plannerContext.getMetadata().resolveFunction(session, QualifiedName.of("fail"), fromTypes(VARCHAR)); Expression predicate = new IfExpression( new ComparisonExpression( GREATER_THAN_OR_EQUAL, @@ -1161,7 +1161,7 @@ private FrameOffsetPlanAndSymbol planFrameOffset(PlanBuilder subPlan, Optional, Symbol> lambdaDeclarationToSymbolMap; - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeCoercion typeCoercion; private final Optional outerContext; private final Session session; @@ -147,7 +147,7 @@ class RelationPlanner SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, Map, Symbol> lambdaDeclarationToSymbolMap, - Metadata metadata, + PlannerContext plannerContext, Optional outerContext, Session session, Map, RelationPlan> recursiveSubqueries) @@ -156,7 +156,7 @@ class RelationPlanner requireNonNull(symbolAllocator, "symbolAllocator is null"); requireNonNull(idAllocator, "idAllocator is null"); requireNonNull(lambdaDeclarationToSymbolMap, "lambdaDeclarationToSymbolMap is null"); - requireNonNull(metadata, "metadata is null"); + requireNonNull(plannerContext, "plannerContext is null"); requireNonNull(outerContext, "outerContext is null"); requireNonNull(session, "session is null"); requireNonNull(recursiveSubqueries, "recursiveSubqueries is null"); @@ -165,11 +165,11 @@ class RelationPlanner this.symbolAllocator = symbolAllocator; this.idAllocator = idAllocator; this.lambdaDeclarationToSymbolMap = lambdaDeclarationToSymbolMap; - this.metadata = metadata; - this.typeCoercion = new TypeCoercion(metadata::getType); + this.plannerContext = plannerContext; + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); this.outerContext = outerContext; this.session = session; - this.subqueryPlanner = new SubqueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, typeCoercion, outerContext, session, recursiveSubqueries); + this.subqueryPlanner = new SubqueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, typeCoercion, outerContext, session, recursiveSubqueries); this.recursiveSubqueries = recursiveSubqueries; } @@ -196,7 +196,7 @@ protected RelationPlan visitTable(Table node, Void context) if (namedQuery != null) { RelationPlan subPlan; if (analysis.isExpandableQuery(namedQuery)) { - subPlan = new QueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + subPlan = new QueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .planExpand(namedQuery); } else { @@ -450,7 +450,7 @@ public PatternRecognitionComponents planPatternRecognitionComponents( Type type = analysis.getType(measureDefinition.getExpression()); Symbol symbol = symbolAllocator.newSymbol(measureDefinition.getName().getValue().toLowerCase(ENGLISH), type); Expression expression = expressionRewrite.apply(measureDefinition.getExpression()); - ExpressionAndValuePointers measure = LogicalIndexExtractor.rewrite(expression, rewrittenSubsets.build(), symbolAllocator, metadata); + ExpressionAndValuePointers measure = LogicalIndexExtractor.rewrite(expression, rewrittenSubsets.build(), symbolAllocator, plannerContext.getMetadata()); rewrittenMeasures.put(symbol, new Measure(measure, type)); measureOutputs.add(symbol); } @@ -463,7 +463,7 @@ public PatternRecognitionComponents planPatternRecognitionComponents( for (VariableDefinition variableDefinition : variableDefinitions) { IrLabel label = irLabel(variableDefinition.getName()); Expression expression = expressionRewrite.apply(variableDefinition.getExpression()); - ExpressionAndValuePointers definition = LogicalIndexExtractor.rewrite(expression, rewrittenSubsets.build(), symbolAllocator, metadata); + ExpressionAndValuePointers definition = LogicalIndexExtractor.rewrite(expression, rewrittenSubsets.build(), symbolAllocator, plannerContext.getMetadata()); rewrittenVariableDefinitions.put(label, definition); } // add `true` definition for undefined labels @@ -855,7 +855,7 @@ private RelationPlan planCorrelatedJoin(Join join, RelationPlan leftPlan, Latera { PlanBuilder leftPlanBuilder = newPlanBuilder(leftPlan, analysis, lambdaDeclarationToSymbolMap); - RelationPlan rightPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, Optional.of(leftPlanBuilder.getTranslations()), session, recursiveSubqueries) + RelationPlan rightPlan = new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, Optional.of(leftPlanBuilder.getTranslations()), session, recursiveSubqueries) .process(lateral.getQuery(), null); PlanBuilder rightPlanBuilder = newPlanBuilder(rightPlan, analysis, lambdaDeclarationToSymbolMap); @@ -972,14 +972,14 @@ protected RelationPlan visitTableSubquery(TableSubquery node, Void context) @Override protected RelationPlan visitQuery(Query node, Void context) { - return new QueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + return new QueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .plan(node); } @Override protected RelationPlan visitQuerySpecification(QuerySpecification node, Void context) { - return new QueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, outerContext, session, recursiveSubqueries) + return new QueryPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, outerContext, session, recursiveSubqueries) .plan(node); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/SplitSourceFactory.java b/core/trino-main/src/main/java/io/trino/sql/planner/SplitSourceFactory.java index f1c70db748c0..0bcfc53b1ed0 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/SplitSourceFactory.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/SplitSourceFactory.java @@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableMap; import io.airlift.log.Logger; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.operator.StageExecutionDescriptor; import io.trino.server.DynamicFilterService; import io.trino.spi.connector.Constraint; @@ -27,6 +26,7 @@ import io.trino.split.SplitManager; import io.trino.split.SplitSource; import io.trino.sql.DynamicFilters; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.plan.AggregationNode; import io.trino.sql.planner.plan.AssignUniqueId; import io.trino.sql.planner.plan.DeleteNode; @@ -87,16 +87,16 @@ public class SplitSourceFactory private static final Logger log = Logger.get(SplitSourceFactory.class); private final SplitManager splitManager; + private final PlannerContext plannerContext; private final DynamicFilterService dynamicFilterService; - private final Metadata metadata; private final TypeAnalyzer typeAnalyzer; @Inject - public SplitSourceFactory(SplitManager splitManager, DynamicFilterService dynamicFilterService, Metadata metadata, TypeAnalyzer typeAnalyzer) + public SplitSourceFactory(SplitManager splitManager, PlannerContext plannerContext, DynamicFilterService dynamicFilterService, TypeAnalyzer typeAnalyzer) { this.splitManager = requireNonNull(splitManager, "splitManager is null"); + this.plannerContext = requireNonNull(plannerContext, "metadata is null"); this.dynamicFilterService = requireNonNull(dynamicFilterService, "dynamicFilterService is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); } @@ -174,9 +174,9 @@ private Map visitScanAndFilter(TableScanNode node, Opti } Constraint constraint = filterPredicate - .map(predicate -> filterConjuncts(metadata, predicate, expression -> !DynamicFilters.isDynamicFilter(expression))) - .map(predicate -> new LayoutConstraintEvaluator(metadata, typeAnalyzer, session, typeProvider, node.getAssignments(), predicate)) - .map(evaluator -> new Constraint(TupleDomain.all(), evaluator::isCandidate, evaluator.getArguments())) // we are interested only in functional predicate here so we set the summary to ALL. + .map(predicate -> filterConjuncts(plannerContext.getMetadata(), predicate, expression -> !DynamicFilters.isDynamicFilter(expression))) + .map(predicate -> new LayoutConstraintEvaluator(plannerContext, typeAnalyzer, session, typeProvider, node.getAssignments(), predicate)) + .map(evaluator -> new Constraint(TupleDomain.all(), evaluator::isCandidate, evaluator.getArguments())) // we are interested only in functional predicate here, so we set the summary to ALL. .orElse(alwaysTrue()); // get dataSource for table diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/SubqueryPlanner.java b/core/trino-main/src/main/java/io/trino/sql/planner/SubqueryPlanner.java index 22825ae7db89..0be9271763e6 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/SubqueryPlanner.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/SubqueryPlanner.java @@ -18,8 +18,8 @@ import com.google.common.graph.SuccessorsFunction; import com.google.common.graph.Traverser; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Analysis; import io.trino.sql.analyzer.Field; import io.trino.sql.analyzer.RelationType; @@ -75,7 +75,7 @@ class SubqueryPlanner private final SymbolAllocator symbolAllocator; private final PlanNodeIdAllocator idAllocator; private final Map, Symbol> lambdaDeclarationToSymbolMap; - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeCoercion typeCoercion; private final Session session; private final Map, RelationPlan> recursiveSubqueries; @@ -85,7 +85,7 @@ class SubqueryPlanner SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, Map, Symbol> lambdaDeclarationToSymbolMap, - Metadata metadata, + PlannerContext plannerContext, TypeCoercion typeCoercion, Optional outerContext, Session session, @@ -95,7 +95,7 @@ class SubqueryPlanner requireNonNull(symbolAllocator, "symbolAllocator is null"); requireNonNull(idAllocator, "idAllocator is null"); requireNonNull(lambdaDeclarationToSymbolMap, "lambdaDeclarationToSymbolMap is null"); - requireNonNull(metadata, "metadata is null"); + requireNonNull(plannerContext, "plannerContext is null"); requireNonNull(typeCoercion, "typeCoercion is null"); requireNonNull(outerContext, "outerContext is null"); requireNonNull(session, "session is null"); @@ -105,7 +105,7 @@ class SubqueryPlanner this.symbolAllocator = symbolAllocator; this.idAllocator = idAllocator; this.lambdaDeclarationToSymbolMap = lambdaDeclarationToSymbolMap; - this.metadata = metadata; + this.plannerContext = plannerContext; this.typeCoercion = typeCoercion; this.session = session; this.recursiveSubqueries = recursiveSubqueries; @@ -308,7 +308,7 @@ private PlanBuilder planExists(PlanBuilder subPlan, Cluster clu private RelationPlan planSubquery(Expression subquery, TranslationMap outerContext) { - return new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, metadata, Optional.of(outerContext), session, recursiveSubqueries) + return new RelationPlanner(analysis, symbolAllocator, idAllocator, lambdaDeclarationToSymbolMap, plannerContext, Optional.of(outerContext), session, recursiveSubqueries) .process(subquery, null); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/TypeAnalyzer.java b/core/trino-main/src/main/java/io/trino/sql/planner/TypeAnalyzer.java index 0bdbc1c40bb6..a73bef389aba 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/TypeAnalyzer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/TypeAnalyzer.java @@ -15,13 +15,15 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; +import io.trino.metadata.AnalyzePropertyManager; +import io.trino.metadata.TablePropertyManager; +import io.trino.security.AccessControl; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; +import io.trino.sql.PlannerContext; +import io.trino.sql.analyzer.StatementAnalyzerFactory; import io.trino.sql.tree.Expression; import io.trino.sql.tree.NodeRef; @@ -31,6 +33,8 @@ import static io.trino.sql.analyzer.ExpressionAnalyzer.analyzeExpressions; import static io.trino.sql.analyzer.QueryType.OTHERS; +import static io.trino.sql.analyzer.StatementAnalyzerFactory.createTestingStatementAnalyzerFactory; +import static java.util.Objects.requireNonNull; /** * This class is to facilitate obtaining the type of an expression and its subexpressions @@ -39,23 +43,25 @@ */ public class TypeAnalyzer { - private final SqlParser parser; - private final Metadata metadata; + private final PlannerContext plannerContext; + private final StatementAnalyzerFactory statementAnalyzerFactory; + private final AccessControl accessControl; @Inject - public TypeAnalyzer(SqlParser parser, Metadata metadata) + public TypeAnalyzer(PlannerContext plannerContext, StatementAnalyzerFactory statementAnalyzerFactory, AccessControl accessControl) { - this.parser = parser; - this.metadata = metadata; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.statementAnalyzerFactory = requireNonNull(statementAnalyzerFactory, "statementAnalyzerFactory is null"); + this.accessControl = requireNonNull(accessControl, "accessControl is null"); } public Map, Type> getTypes(Session session, TypeProvider inputTypes, Iterable expressions) { - return analyzeExpressions(session, - metadata, - user -> ImmutableSet.of(), - new AllowAllAccessControl(), - parser, + return analyzeExpressions( + session, + plannerContext, + statementAnalyzerFactory, + accessControl, inputTypes, expressions, ImmutableMap.of(), @@ -73,4 +79,16 @@ public Type getType(Session session, TypeProvider inputTypes, Expression express { return getTypes(session, inputTypes, expression).get(NodeRef.of(expression)); } + + public static TypeAnalyzer createTestingTypeAnalyzer(PlannerContext plannerContext) + { + return new TypeAnalyzer( + plannerContext, + createTestingStatementAnalyzerFactory( + plannerContext, + new AllowAllAccessControl(), + new TablePropertyManager(), + new AnalyzePropertyManager()), + new AllowAllAccessControl()); + } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/AddExchangesBelowPartialAggregationOverGroupIdRuleSet.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/AddExchangesBelowPartialAggregationOverGroupIdRuleSet.java index ce86e488adb7..18b794729b37 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/AddExchangesBelowPartialAggregationOverGroupIdRuleSet.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/AddExchangesBelowPartialAggregationOverGroupIdRuleSet.java @@ -25,8 +25,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Partitioning; import io.trino.sql.planner.PartitioningScheme; import io.trino.sql.planner.Symbol; @@ -128,21 +127,18 @@ public class AddExchangesBelowPartialAggregationOverGroupIdRuleSet private static final double GROUPING_SETS_SYMBOL_REQUIRED_FREQUENCY = 0.5; private static final double ANTI_SKEWNESS_MARGIN = 3; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; private final TaskCountEstimator taskCountEstimator; private final DataSize maxPartialAggregationMemoryUsage; public AddExchangesBelowPartialAggregationOverGroupIdRuleSet( - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TaskCountEstimator taskCountEstimator, TaskManagerConfig taskManagerConfig) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.taskCountEstimator = requireNonNull(taskCountEstimator, "taskCountEstimator is null"); this.maxPartialAggregationMemoryUsage = requireNonNull(taskManagerConfig, "taskManagerConfig is null").getMaxPartialAggregationMemoryUsage(); @@ -346,7 +342,7 @@ private StreamProperties derivePropertiesRecursively(PlanNode node, Context cont List inputProperties = resolvedPlanNode.getSources().stream() .map(source -> derivePropertiesRecursively(source, context)) .collect(toImmutableList()); - return deriveProperties(resolvedPlanNode, inputProperties, metadata, typeOperators, context.getSession(), context.getSymbolAllocator().getTypes(), typeAnalyzer); + return deriveProperties(resolvedPlanNode, inputProperties, plannerContext, context.getSession(), context.getSymbolAllocator().getTypes(), typeAnalyzer); } } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ApplyTableScanRedirection.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ApplyTableScanRedirection.java index fc4532c5ae52..ee77e7e8f466 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ApplyTableScanRedirection.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ApplyTableScanRedirection.java @@ -21,7 +21,6 @@ import io.trino.Session; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.TableHandle; import io.trino.metadata.TableMetadata; @@ -31,6 +30,7 @@ import io.trino.spi.connector.TableScanRedirectApplicationResult; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; @@ -63,13 +63,13 @@ public class ApplyTableScanRedirection private static final Pattern PATTERN = tableScan() .matching(node -> !node.isUpdateTarget()); - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeCoercion typeCoercion; - public ApplyTableScanRedirection(Metadata metadata) + public ApplyTableScanRedirection(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); } @Override @@ -81,7 +81,7 @@ public Pattern getPattern() @Override public Result apply(TableScanNode scanNode, Captures captures, Context context) { - Optional tableScanRedirectApplicationResult = metadata.applyTableScanRedirect(context.getSession(), scanNode.getTable()); + Optional tableScanRedirectApplicationResult = plannerContext.getMetadata().applyTableScanRedirect(context.getSession(), scanNode.getTable()); if (tableScanRedirectApplicationResult.isEmpty()) { return Result.empty(); } @@ -89,19 +89,19 @@ public Result apply(TableScanNode scanNode, Captures captures, Context context) CatalogSchemaTableName destinationTable = tableScanRedirectApplicationResult.get().getDestinationTable(); QualifiedObjectName destinationObjectName = convertFromSchemaTableName(destinationTable.getCatalogName()).apply(destinationTable.getSchemaTableName()); - Optional redirectedObjectName = metadata.getRedirectionAwareTableHandle(context.getSession(), destinationObjectName).getRedirectedTableName(); + Optional redirectedObjectName = plannerContext.getMetadata().getRedirectionAwareTableHandle(context.getSession(), destinationObjectName).getRedirectedTableName(); redirectedObjectName.ifPresent(name -> { throw new TrinoException(NOT_SUPPORTED, format("Further redirection of destination table '%s' to '%s' is not supported", destinationObjectName, name)); }); - TableMetadata tableMetadata = metadata.getTableMetadata(context.getSession(), scanNode.getTable()); + TableMetadata tableMetadata = plannerContext.getMetadata().getTableMetadata(context.getSession(), scanNode.getTable()); CatalogSchemaTableName sourceTable = new CatalogSchemaTableName(tableMetadata.getCatalogName().getCatalogName(), tableMetadata.getTable()); if (destinationTable.equals(sourceTable)) { return Result.empty(); } - Optional destinationTableHandle = metadata.getTableHandle( + Optional destinationTableHandle = plannerContext.getMetadata().getTableHandle( context.getSession(), convertFromSchemaTableName(destinationTable.getCatalogName()).apply(destinationTable.getSchemaTableName())); if (destinationTableHandle.isEmpty()) { @@ -109,7 +109,7 @@ public Result apply(TableScanNode scanNode, Captures captures, Context context) } Map columnMapping = tableScanRedirectApplicationResult.get().getDestinationColumns(); - Map destinationColumnHandles = metadata.getColumnHandles(context.getSession(), destinationTableHandle.get()); + Map destinationColumnHandles = plannerContext.getMetadata().getColumnHandles(context.getSession(), destinationTableHandle.get()); ImmutableMap.Builder casts = ImmutableMap.builder(); ImmutableMap.Builder newAssignmentsBuilder = ImmutableMap.builder(); for (Map.Entry assignment : scanNode.getAssignments().entrySet()) { @@ -124,7 +124,7 @@ public Result apply(TableScanNode scanNode, Captures captures, Context context) // insert ts if redirected types don't match source types Type sourceType = context.getSymbolAllocator().getTypes().get(assignment.getKey()); - Type redirectedType = metadata.getColumnMetadata(context.getSession(), destinationTableHandle.get(), destinationColumnHandle).getType(); + Type redirectedType = plannerContext.getMetadata().getColumnMetadata(context.getSession(), destinationTableHandle.get(), destinationColumnHandle).getType(); if (!sourceType.equals(redirectedType)) { Symbol redirectedSymbol = context.getSymbolAllocator().newSymbol(destinationColumn, redirectedType); Cast cast = getCast( @@ -185,7 +185,7 @@ public Result apply(TableScanNode scanNode, Captures captures, Context context) } // insert casts if redirected types don't match domain types - Type redirectedType = metadata.getColumnMetadata(context.getSession(), destinationTableHandle.get(), destinationColumnHandle).getType(); + Type redirectedType = plannerContext.getMetadata().getColumnMetadata(context.getSession(), destinationTableHandle.get(), destinationColumnHandle).getType(); if (!domainType.equals(redirectedType)) { Symbol redirectedSymbol = context.getSymbolAllocator().newSymbol(destinationColumn, redirectedType); Cast cast = getCast( @@ -218,7 +218,7 @@ public Result apply(TableScanNode scanNode, Captures captures, Context context) scanNode.isUpdateTarget(), Optional.empty()); - DomainTranslator domainTranslator = new DomainTranslator(context.getSession(), metadata); + DomainTranslator domainTranslator = new DomainTranslator(plannerContext); FilterNode filterNode = new FilterNode( context.getIdAllocator().getNextId(), applyProjection( @@ -226,7 +226,7 @@ public Result apply(TableScanNode scanNode, Captures captures, Context context) newAssignments.keySet(), casts.build(), newScanNode), - domainTranslator.toPredicate(transformedConstraint)); + domainTranslator.toPredicate(context.getSession(), transformedConstraint)); return Result.ofPlanNode(applyProjection( context.getIdAllocator(), @@ -265,7 +265,7 @@ private Cast getCast( Type sourceType) { try { - metadata.getCoercion(session, destinationType, sourceType); + plannerContext.getMetadata().getCoercion(session, destinationType, sourceType); } catch (TrinoException e) { throw new TrinoException(FUNCTION_NOT_FOUND, format( diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractSpatialJoins.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractSpatialJoins.java index 3846762c9485..88bd7043475d 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractSpatialJoins.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/ExtractSpatialJoins.java @@ -37,11 +37,13 @@ import io.trino.spi.connector.DynamicFilter; import io.trino.spi.type.ArrayType; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeSignature; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; import io.trino.split.SplitSource; import io.trino.split.SplitSource.SplitBatch; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.FunctionCallBuilder; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; @@ -155,14 +157,14 @@ public class ExtractSpatialJoins private static final TypeSignature SPHERICAL_GEOGRAPHY_TYPE_SIGNATURE = new TypeSignature("SphericalGeography"); private static final String KDB_TREE_TYPENAME = "KdbTree"; - private final Metadata metadata; + private final PlannerContext plannerContext; private final SplitManager splitManager; private final PageSourceManager pageSourceManager; private final TypeAnalyzer typeAnalyzer; - public ExtractSpatialJoins(Metadata metadata, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) + public ExtractSpatialJoins(PlannerContext plannerContext, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.splitManager = requireNonNull(splitManager, "splitManager is null"); this.pageSourceManager = requireNonNull(pageSourceManager, "pageSourceManager is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); @@ -171,8 +173,8 @@ public ExtractSpatialJoins(Metadata metadata, SplitManager splitManager, PageSou public Set> rules() { return ImmutableSet.of( - new ExtractSpatialInnerJoin(metadata, splitManager, pageSourceManager, typeAnalyzer), - new ExtractSpatialLeftJoin(metadata, splitManager, pageSourceManager, typeAnalyzer)); + new ExtractSpatialInnerJoin(plannerContext, splitManager, pageSourceManager, typeAnalyzer), + new ExtractSpatialLeftJoin(plannerContext, splitManager, pageSourceManager, typeAnalyzer)); } @VisibleForTesting @@ -183,14 +185,14 @@ public static final class ExtractSpatialInnerJoin private static final Pattern PATTERN = filter() .with(source().matching(join().capturedAs(JOIN).matching(JoinNode::isCrossJoin))); - private final Metadata metadata; + private final PlannerContext plannerContext; private final SplitManager splitManager; private final PageSourceManager pageSourceManager; private final TypeAnalyzer typeAnalyzer; - public ExtractSpatialInnerJoin(Metadata metadata, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) + public ExtractSpatialInnerJoin(PlannerContext plannerContext, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.splitManager = requireNonNull(splitManager, "splitManager is null"); this.pageSourceManager = requireNonNull(pageSourceManager, "pageSourceManager is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); @@ -215,7 +217,7 @@ public Result apply(FilterNode node, Captures captures, Context context) Expression filter = node.getPredicate(); List spatialFunctions = extractSupportedSpatialFunctions(filter); for (FunctionCall spatialFunction : spatialFunctions) { - Result result = tryCreateSpatialJoin(context, joinNode, filter, node.getId(), node.getOutputSymbols(), spatialFunction, Optional.empty(), metadata, splitManager, pageSourceManager, typeAnalyzer); + Result result = tryCreateSpatialJoin(context, joinNode, filter, node.getId(), node.getOutputSymbols(), spatialFunction, Optional.empty(), plannerContext, splitManager, pageSourceManager, typeAnalyzer); if (!result.isEmpty()) { return result; } @@ -223,7 +225,7 @@ public Result apply(FilterNode node, Captures captures, Context context) List spatialComparisons = extractSupportedSpatialComparisons(filter); for (ComparisonExpression spatialComparison : spatialComparisons) { - Result result = tryCreateSpatialJoin(context, joinNode, filter, node.getId(), node.getOutputSymbols(), spatialComparison, metadata, splitManager, pageSourceManager, typeAnalyzer); + Result result = tryCreateSpatialJoin(context, joinNode, filter, node.getId(), node.getOutputSymbols(), spatialComparison, plannerContext, splitManager, pageSourceManager, typeAnalyzer); if (!result.isEmpty()) { return result; } @@ -239,14 +241,14 @@ public static final class ExtractSpatialLeftJoin { private static final Pattern PATTERN = join().matching(node -> node.getCriteria().isEmpty() && node.getFilter().isPresent() && node.getType() == LEFT); - private final Metadata metadata; + private final PlannerContext plannerContext; private final SplitManager splitManager; private final PageSourceManager pageSourceManager; private final TypeAnalyzer typeAnalyzer; - public ExtractSpatialLeftJoin(Metadata metadata, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) + public ExtractSpatialLeftJoin(PlannerContext plannerContext, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.splitManager = requireNonNull(splitManager, "splitManager is null"); this.pageSourceManager = requireNonNull(pageSourceManager, "pageSourceManager is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); @@ -270,7 +272,7 @@ public Result apply(JoinNode joinNode, Captures captures, Context context) Expression filter = joinNode.getFilter().get(); List spatialFunctions = extractSupportedSpatialFunctions(filter); for (FunctionCall spatialFunction : spatialFunctions) { - Result result = tryCreateSpatialJoin(context, joinNode, filter, joinNode.getId(), joinNode.getOutputSymbols(), spatialFunction, Optional.empty(), metadata, splitManager, pageSourceManager, typeAnalyzer); + Result result = tryCreateSpatialJoin(context, joinNode, filter, joinNode.getId(), joinNode.getOutputSymbols(), spatialFunction, Optional.empty(), plannerContext, splitManager, pageSourceManager, typeAnalyzer); if (!result.isEmpty()) { return result; } @@ -278,7 +280,7 @@ public Result apply(JoinNode joinNode, Captures captures, Context context) List spatialComparisons = extractSupportedSpatialComparisons(filter); for (ComparisonExpression spatialComparison : spatialComparisons) { - Result result = tryCreateSpatialJoin(context, joinNode, filter, joinNode.getId(), joinNode.getOutputSymbols(), spatialComparison, metadata, splitManager, pageSourceManager, typeAnalyzer); + Result result = tryCreateSpatialJoin(context, joinNode, filter, joinNode.getId(), joinNode.getOutputSymbols(), spatialComparison, plannerContext, splitManager, pageSourceManager, typeAnalyzer); if (!result.isEmpty()) { return result; } @@ -295,7 +297,7 @@ private static Result tryCreateSpatialJoin( PlanNodeId nodeId, List outputSymbols, ComparisonExpression spatialComparison, - Metadata metadata, + PlannerContext plannerContext, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) @@ -354,7 +356,7 @@ private static Result tryCreateSpatialJoin( joinNode.getDynamicFilters(), joinNode.getReorderJoinStatsAndCost()); - return tryCreateSpatialJoin(context, newJoinNode, newFilter, nodeId, outputSymbols, (FunctionCall) newComparison.getLeft(), Optional.of(newComparison.getRight()), metadata, splitManager, pageSourceManager, typeAnalyzer); + return tryCreateSpatialJoin(context, newJoinNode, newFilter, nodeId, outputSymbols, (FunctionCall) newComparison.getLeft(), Optional.of(newComparison.getRight()), plannerContext, splitManager, pageSourceManager, typeAnalyzer); } private static Result tryCreateSpatialJoin( @@ -365,14 +367,14 @@ private static Result tryCreateSpatialJoin( List outputSymbols, FunctionCall spatialFunction, Optional radius, - Metadata metadata, + PlannerContext plannerContext, SplitManager splitManager, PageSourceManager pageSourceManager, TypeAnalyzer typeAnalyzer) { // TODO Add support for distributed left spatial joins Optional spatialPartitioningTableName = joinNode.getType() == INNER ? getSpatialPartitioningTableName(context.getSession()) : Optional.empty(); - Optional kdbTree = spatialPartitioningTableName.map(tableName -> loadKdbTree(tableName, context.getSession(), metadata, splitManager, pageSourceManager)); + Optional kdbTree = spatialPartitioningTableName.map(tableName -> loadKdbTree(tableName, context.getSession(), plannerContext.getMetadata(), splitManager, pageSourceManager)); List arguments = spatialFunction.getArguments(); verify(arguments.size() == 2); @@ -380,7 +382,7 @@ private static Result tryCreateSpatialJoin( Expression firstArgument = arguments.get(0); Expression secondArgument = arguments.get(1); - Type sphericalGeographyType = metadata.getType(SPHERICAL_GEOGRAPHY_TYPE_SIGNATURE); + Type sphericalGeographyType = plannerContext.getTypeManager().getType(SPHERICAL_GEOGRAPHY_TYPE_SIGNATURE); if (typeAnalyzer.getType(context.getSession(), context.getSymbolAllocator().getTypes(), firstArgument).equals(sphericalGeographyType) || typeAnalyzer.getType(context.getSession(), context.getSymbolAllocator().getTypes(), secondArgument).equals(sphericalGeographyType)) { return Result.empty(); @@ -393,8 +395,8 @@ private static Result tryCreateSpatialJoin( return Result.empty(); } - Optional newFirstSymbol = newGeometrySymbol(context, firstArgument, metadata); - Optional newSecondSymbol = newGeometrySymbol(context, secondArgument, metadata); + Optional newFirstSymbol = newGeometrySymbol(context, firstArgument, plannerContext.getTypeManager()); + Optional newSecondSymbol = newGeometrySymbol(context, secondArgument, plannerContext.getTypeManager()); PlanNode leftNode = joinNode.getLeft(); PlanNode rightNode = joinNode.getRight(); @@ -426,16 +428,16 @@ else if (alignment < 0) { rightPartitionSymbol = Optional.of(context.getSymbolAllocator().newSymbol("pid", INTEGER)); if (alignment > 0) { - newLeftNode = addPartitioningNodes(metadata, context, newLeftNode, leftPartitionSymbol.get(), kdbTree.get(), newFirstArgument, Optional.empty()); - newRightNode = addPartitioningNodes(metadata, context, newRightNode, rightPartitionSymbol.get(), kdbTree.get(), newSecondArgument, radius); + newLeftNode = addPartitioningNodes(plannerContext, context, newLeftNode, leftPartitionSymbol.get(), kdbTree.get(), newFirstArgument, Optional.empty()); + newRightNode = addPartitioningNodes(plannerContext, context, newRightNode, rightPartitionSymbol.get(), kdbTree.get(), newSecondArgument, radius); } else { - newLeftNode = addPartitioningNodes(metadata, context, newLeftNode, leftPartitionSymbol.get(), kdbTree.get(), newSecondArgument, Optional.empty()); - newRightNode = addPartitioningNodes(metadata, context, newRightNode, rightPartitionSymbol.get(), kdbTree.get(), newFirstArgument, radius); + newLeftNode = addPartitioningNodes(plannerContext, context, newLeftNode, leftPartitionSymbol.get(), kdbTree.get(), newSecondArgument, Optional.empty()); + newRightNode = addPartitioningNodes(plannerContext, context, newRightNode, rightPartitionSymbol.get(), kdbTree.get(), newFirstArgument, radius); } } - Expression newSpatialFunction = FunctionCallBuilder.resolve(context.getSession(), metadata) + Expression newSpatialFunction = FunctionCallBuilder.resolve(context.getSession(), plannerContext.getMetadata()) .setName(spatialFunction.getName()) .addArgument(GEOMETRY_TYPE_SIGNATURE, newFirstArgument) .addArgument(GEOMETRY_TYPE_SIGNATURE, newSecondArgument) @@ -559,13 +561,13 @@ private static Expression toExpression(Optional optionalSymbol, Expressi return optionalSymbol.map(symbol -> (Expression) symbol.toSymbolReference()).orElse(defaultExpression); } - private static Optional newGeometrySymbol(Context context, Expression expression, Metadata metadata) + private static Optional newGeometrySymbol(Context context, Expression expression, TypeManager typeManager) { if (expression instanceof SymbolReference) { return Optional.empty(); } - return Optional.of(context.getSymbolAllocator().newSymbol(expression, metadata.getType(GEOMETRY_TYPE_SIGNATURE))); + return Optional.of(context.getSymbolAllocator().newSymbol(expression, typeManager.getType(GEOMETRY_TYPE_SIGNATURE))); } private static Optional newRadiusSymbol(Context context, Expression expression) @@ -588,7 +590,7 @@ private static PlanNode addProjection(Context context, PlanNode node, Symbol sym return new ProjectNode(context.getIdAllocator().getNextId(), node, projections.build()); } - private static PlanNode addPartitioningNodes(Metadata metadata, Context context, PlanNode node, Symbol partitionSymbol, KdbTree kdbTree, Expression geometry, Optional radius) + private static PlanNode addPartitioningNodes(PlannerContext plannerContext, Context context, PlanNode node, Symbol partitionSymbol, KdbTree kdbTree, Expression geometry, Optional radius) { Assignments.Builder projections = Assignments.builder(); for (Symbol outputSymbol : node.getOutputSymbols()) { @@ -596,9 +598,9 @@ private static PlanNode addPartitioningNodes(Metadata metadata, Context context, } TypeSignature typeSignature = new TypeSignature(KDB_TREE_TYPENAME); - FunctionCallBuilder spatialPartitionsCall = FunctionCallBuilder.resolve(context.getSession(), metadata) + FunctionCallBuilder spatialPartitionsCall = FunctionCallBuilder.resolve(context.getSession(), plannerContext.getMetadata()) .setName(QualifiedName.of("spatial_partitions")) - .addArgument(typeSignature, new Cast(new StringLiteral(KdbTreeUtils.toJson(kdbTree)), toSqlType(metadata.getType(typeSignature)))) + .addArgument(typeSignature, new Cast(new StringLiteral(KdbTreeUtils.toJson(kdbTree)), toSqlType(plannerContext.getTypeManager().getType(typeSignature)))) .addArgument(GEOMETRY_TYPE_SIGNATURE, geometry); radius.ifPresent(value -> spatialPartitionsCall.addArgument(DOUBLE, value)); FunctionCall partitioningFunction = spatialPartitionsCall.build(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushAggregationIntoTableScan.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushAggregationIntoTableScan.java index 332a2932a5c6..3540a8c57991 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushAggregationIntoTableScan.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushAggregationIntoTableScan.java @@ -30,6 +30,7 @@ import io.trino.spi.expression.ConnectorExpression; import io.trino.spi.expression.Variable; import io.trino.spi.predicate.TupleDomain; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ConnectorExpressionTranslator; import io.trino.sql.planner.LiteralEncoder; import io.trino.sql.planner.OrderingScheme; @@ -60,6 +61,7 @@ import static io.trino.sql.planner.plan.Patterns.aggregation; import static io.trino.sql.planner.plan.Patterns.source; import static io.trino.sql.planner.plan.Patterns.tableScan; +import static java.util.Objects.requireNonNull; public class PushAggregationIntoTableScan implements Rule @@ -75,11 +77,11 @@ public class PushAggregationIntoTableScan .matching(PushAggregationIntoTableScan::hasNoMasks) .with(source().matching(tableScan().capturedAs(TABLE_SCAN))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public PushAggregationIntoTableScan(Metadata metadata) + public PushAggregationIntoTableScan(PlannerContext plannerContext) { - this.metadata = metadata; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -112,13 +114,13 @@ private static boolean hasNoMasks(AggregationNode node) @Override public Result apply(AggregationNode node, Captures captures, Context context) { - return pushAggregationIntoTableScan(metadata, context, node, captures.get(TABLE_SCAN), node.getAggregations(), node.getGroupingSets().getGroupingKeys()) + return pushAggregationIntoTableScan(plannerContext, context, node, captures.get(TABLE_SCAN), node.getAggregations(), node.getGroupingSets().getGroupingKeys()) .map(Rule.Result::ofPlanNode) .orElseGet(Rule.Result::empty); } public static Optional pushAggregationIntoTableScan( - Metadata metadata, + PlannerContext plannerContext, Context context, PlanNode aggregationNode, TableScanNode tableScan, @@ -135,7 +137,7 @@ public static Optional pushAggregationIntoTableScan( List aggregateFunctions = aggregationsList.stream() .map(Entry::getValue) - .map(aggregation -> toAggregateFunction(metadata, context, aggregation)) + .map(aggregation -> toAggregateFunction(plannerContext.getMetadata(), context, aggregation)) .collect(toImmutableList()); List aggregationOutputSymbols = aggregationsList.stream() @@ -146,7 +148,7 @@ public static Optional pushAggregationIntoTableScan( .map(groupByColumn -> assignments.get(groupByColumn.getName())) .collect(toImmutableList()); - Optional> aggregationPushdownResult = metadata.applyAggregation( + Optional> aggregationPushdownResult = plannerContext.getMetadata().applyAggregation( context.getSession(), tableScan.getTable(), aggregateFunctions, @@ -177,7 +179,7 @@ public static Optional pushAggregationIntoTableScan( } List newProjections = result.getProjections().stream() - .map(expression -> ConnectorExpressionTranslator.translate(expression, variableMappings, new LiteralEncoder(context.getSession(), metadata))) + .map(expression -> ConnectorExpressionTranslator.translate(context.getSession(), expression, variableMappings, new LiteralEncoder(plannerContext))) .collect(toImmutableList()); verify(aggregationOutputSymbols.size() == newProjections.size()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDistinctLimitIntoTableScan.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDistinctLimitIntoTableScan.java index f685f6866611..9582d94357c0 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDistinctLimitIntoTableScan.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushDistinctLimitIntoTableScan.java @@ -18,7 +18,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.plan.DistinctLimitNode; import io.trino.sql.planner.plan.LimitNode; @@ -46,11 +46,11 @@ public class PushDistinctLimitIntoTableScan .with(isPartial().equalTo(false)) .with(source().matching(tableScan().capturedAs(TABLE_SCAN))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public PushDistinctLimitIntoTableScan(Metadata metadata) + public PushDistinctLimitIntoTableScan(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -69,7 +69,7 @@ public boolean isEnabled(Session session) public Result apply(DistinctLimitNode node, Captures captures, Context context) { Optional result = pushAggregationIntoTableScan( - metadata, + plannerContext, context, node, captures.get(TABLE_SCAN), diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java index eee25886bc1c..46a2ae62c8f8 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPartialAggregationThroughExchange.java @@ -18,10 +18,10 @@ import io.trino.matching.Captures; import io.trino.matching.Pattern; import io.trino.metadata.AggregationFunctionMetadata; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Partitioning; import io.trino.sql.planner.PartitioningScheme; import io.trino.sql.planner.Symbol; @@ -60,11 +60,11 @@ public class PushPartialAggregationThroughExchange implements Rule { - private final Metadata metadata; + private final PlannerContext plannerContext; - public PushPartialAggregationThroughExchange(Metadata metadata) + public PushPartialAggregationThroughExchange(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } private static final Capture EXCHANGE_NODE = Capture.newCapture(); @@ -86,7 +86,7 @@ public Result apply(AggregationNode aggregationNode, Captures captures, Context { ExchangeNode exchangeNode = captures.get(EXCHANGE_NODE); - boolean decomposable = aggregationNode.isDecomposable(metadata); + boolean decomposable = aggregationNode.isDecomposable(plannerContext.getMetadata()); if (aggregationNode.getStep() == SINGLE && aggregationNode.hasEmptyGroupingSet() && @@ -203,9 +203,9 @@ private PlanNode split(AggregationNode node, Context context) for (Map.Entry entry : node.getAggregations().entrySet()) { AggregationNode.Aggregation originalAggregation = entry.getValue(); ResolvedFunction resolvedFunction = originalAggregation.getResolvedFunction(); - AggregationFunctionMetadata functionMetadata = metadata.getAggregationFunctionMetadata(resolvedFunction); + AggregationFunctionMetadata functionMetadata = plannerContext.getMetadata().getAggregationFunctionMetadata(resolvedFunction); List intermediateTypes = functionMetadata.getIntermediateTypes().stream() - .map(metadata::getType) + .map(plannerContext.getTypeManager()::getType) .collect(toImmutableList()); Type intermediateType = intermediateTypes.size() == 1 ? intermediateTypes.get(0) : RowType.anonymous(intermediateTypes); Symbol intermediateSymbol = context.getSymbolAllocator().newSymbol(resolvedFunction.getSignature().getName(), intermediateType); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateIntoTableScan.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateIntoTableScan.java index 3db018f58fc3..08d39e099995 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateIntoTableScan.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateIntoTableScan.java @@ -29,7 +29,7 @@ import io.trino.spi.connector.Constraint; import io.trino.spi.connector.ConstraintApplicationResult; import io.trino.spi.predicate.TupleDomain; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.LayoutConstraintEvaluator; import io.trino.sql.planner.Symbol; @@ -73,14 +73,12 @@ public class PushPredicateIntoTableScan private static final Pattern PATTERN = filter().with(source().matching( tableScan().capturedAs(TABLE_SCAN))); - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; - public PushPredicateIntoTableScan(Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer) + public PushPredicateIntoTableScan(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); } @@ -107,12 +105,10 @@ public Result apply(FilterNode filterNode, Captures captures, Context context) false, context.getSession(), context.getSymbolAllocator(), - metadata, - typeOperators, + plannerContext, typeAnalyzer, context.getStatsProvider(), - new DomainTranslator(context.getSession(), - metadata)); + new DomainTranslator(plannerContext)); if (rewritten.isEmpty() || arePlansSame(filterNode, tableScan, rewritten.get())) { return Result.empty(); @@ -148,8 +144,7 @@ public static Optional pushFilterIntoTableScan( boolean pruneWithPredicateExpression, Session session, SymbolAllocator symbolAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, StatsProvider statsProvider, DomainTranslator domainTranslator) @@ -161,12 +156,11 @@ public static Optional pushFilterIntoTableScan( Expression predicate = filterNode.getPredicate(); // don't include non-deterministic predicates - Expression deterministicPredicate = filterDeterministicConjuncts(metadata, predicate); - Expression nonDeterministicPredicate = filterNonDeterministicConjuncts(metadata, predicate); + Expression deterministicPredicate = filterDeterministicConjuncts(plannerContext.getMetadata(), predicate); + Expression nonDeterministicPredicate = filterNonDeterministicConjuncts(plannerContext.getMetadata(), predicate); - DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.fromPredicate( - metadata, - typeOperators, + DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.getExtractionResult( + plannerContext, session, deterministicPredicate, symbolAllocator.getTypes()); @@ -181,17 +175,17 @@ public static Optional pushFilterIntoTableScan( // use evaluator only when there is some predicate which could not be translated into tuple domain if (pruneWithPredicateExpression && !TRUE_LITERAL.equals(decomposedPredicate.getRemainingExpression())) { LayoutConstraintEvaluator evaluator = new LayoutConstraintEvaluator( - metadata, + plannerContext, typeAnalyzer, session, symbolAllocator.getTypes(), node.getAssignments(), combineConjuncts( - metadata, + plannerContext.getMetadata(), deterministicPredicate, // Simplify the tuple domain to avoid creating an expression with too many nodes, // which would be expensive to evaluate in the call to isCandidate below. - domainTranslator.toPredicate(newDomain.simplify().transformKeys(assignments::get)))); + domainTranslator.toPredicate(session, newDomain.simplify().transformKeys(assignments::get)))); constraint = new Constraint(newDomain, evaluator::isCandidate, evaluator.getArguments()); } else { @@ -204,11 +198,11 @@ public static Optional pushFilterIntoTableScan( Optional newTablePartitioning; TupleDomain remainingFilter; boolean precalculateStatistics; - if (!metadata.usesLegacyTableLayouts(session, node.getTable())) { + if (!plannerContext.getMetadata().usesLegacyTableLayouts(session, node.getTable())) { // check if new domain is wider than domain already provided by table scan if (constraint.predicate().isEmpty() && newDomain.contains(node.getEnforcedConstraint())) { Expression resultingPredicate = createResultingPredicate( - metadata, + plannerContext, session, symbolAllocator, typeAnalyzer, @@ -230,7 +224,7 @@ public static Optional pushFilterIntoTableScan( return Optional.of(new ValuesNode(node.getId(), node.getOutputSymbols(), ImmutableList.of())); } - Optional> result = metadata.applyFilter(session, node.getTable(), constraint); + Optional> result = plannerContext.getMetadata().applyFilter(session, node.getTable(), constraint); if (result.isEmpty()) { return Optional.empty(); @@ -238,7 +232,7 @@ public static Optional pushFilterIntoTableScan( newTable = result.get().getHandle(); - TableProperties newTableProperties = metadata.getTableProperties(session, newTable); + TableProperties newTableProperties = plannerContext.getMetadata().getTableProperties(session, newTable); newTablePartitioning = newTableProperties.getTablePartitioning(); if (newTableProperties.getPredicate().isNone()) { return Optional.of(new ValuesNode(node.getId(), node.getOutputSymbols(), ImmutableList.of())); @@ -248,7 +242,7 @@ public static Optional pushFilterIntoTableScan( precalculateStatistics = result.get().isPrecalculateStatistics(); } else { - Optional layout = metadata.getLayout( + Optional layout = plannerContext.getMetadata().getLayout( session, node.getTable(), constraint, @@ -266,7 +260,7 @@ public static Optional pushFilterIntoTableScan( precalculateStatistics = false; } - verifyTablePartitioning(session, metadata, node, newTablePartitioning); + verifyTablePartitioning(session, plannerContext.getMetadata(), node, newTablePartitioning); TableScanNode tableScan = new TableScanNode( node.getId(), @@ -280,11 +274,11 @@ public static Optional pushFilterIntoTableScan( node.getUseConnectorNodePartitioning()); Expression resultingPredicate = createResultingPredicate( - metadata, + plannerContext, session, symbolAllocator, typeAnalyzer, - domainTranslator.toPredicate(remainingFilter.transformKeys(assignments::get)), + domainTranslator.toPredicate(session, remainingFilter.transformKeys(assignments::get)), nonDeterministicPredicate, decomposedPredicate.getRemainingExpression()); @@ -314,7 +308,7 @@ private static void verifyTablePartitioning( } static Expression createResultingPredicate( - Metadata metadata, + PlannerContext plannerContext, Session session, SymbolAllocator symbolAllocator, TypeAnalyzer typeAnalyzer, @@ -330,11 +324,11 @@ static Expression createResultingPredicate( // * Short of implementing the previous bullet point, the current order of non-deterministic expressions // and non-TupleDomain-expressible expressions should be retained. Changing the order can lead // to failures of previously successful queries. - Expression expression = combineConjuncts(metadata, unenforcedConstraints, nonDeterministicPredicate, remainingDecomposedPredicate); + Expression expression = combineConjuncts(plannerContext.getMetadata(), unenforcedConstraints, nonDeterministicPredicate, remainingDecomposedPredicate); // Make sure we produce an expression whose terms are consistent with the canonical form used in other optimizations // Otherwise, we'll end up ping-ponging among rules - expression = SimplifyExpressions.rewrite(expression, session, symbolAllocator, metadata, typeAnalyzer); + expression = SimplifyExpressions.rewrite(expression, session, symbolAllocator, plannerContext, typeAnalyzer); return expression; } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java index b7bd61e26490..515bf9b5f2d2 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoRowNumber.java @@ -17,13 +17,12 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.Range; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.predicate.ValueSet; -import io.trino.spi.type.TypeOperators; import io.trino.sql.ExpressionUtils; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.DomainTranslator.ExtractionResult; import io.trino.sql.planner.Symbol; @@ -39,7 +38,6 @@ import static io.trino.matching.Capture.newCapture; import static io.trino.spi.predicate.Range.range; -import static io.trino.sql.planner.DomainTranslator.fromPredicate; import static io.trino.sql.planner.plan.Patterns.filter; import static io.trino.sql.planner.plan.Patterns.project; import static io.trino.sql.planner.plan.Patterns.rowNumber; @@ -82,13 +80,11 @@ public class PushPredicateThroughProjectIntoRowNumber .with(source().matching(rowNumber() .capturedAs(ROW_NUMBER))))); - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; - public PushPredicateThroughProjectIntoRowNumber(Metadata metadata, TypeOperators typeOperators) + public PushPredicateThroughProjectIntoRowNumber(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -108,7 +104,11 @@ public Result apply(FilterNode filter, Captures captures, Context context) return Result.empty(); } - ExtractionResult extractionResult = fromPredicate(metadata, typeOperators, context.getSession(), filter.getPredicate(), context.getSymbolAllocator().getTypes()); + ExtractionResult extractionResult = DomainTranslator.getExtractionResult( + plannerContext, + context.getSession(), + filter.getPredicate(), + context.getSymbolAllocator().getTypes()); TupleDomain tupleDomain = extractionResult.getTupleDomain(); OptionalInt upperBound = extractUpperBound(tupleDomain, rowNumberSymbol); if (upperBound.isEmpty()) { @@ -139,9 +139,9 @@ public Result apply(FilterNode filter, Captures captures, Context context) // Remove the row number domain because it is absorbed into the node TupleDomain newTupleDomain = tupleDomain.filter((symbol, domain) -> !symbol.equals(rowNumberSymbol)); Expression newPredicate = ExpressionUtils.combineConjuncts( - metadata, + plannerContext.getMetadata(), extractionResult.getRemainingExpression(), - new DomainTranslator(context.getSession(), metadata).toPredicate(newTupleDomain)); + new DomainTranslator(plannerContext).toPredicate(context.getSession(), newTupleDomain)); if (newPredicate.equals(TRUE_LITERAL)) { return Result.ofPlanNode(project); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java index 65e55e37c5a2..2d8b14694065 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushPredicateThroughProjectIntoWindow.java @@ -18,13 +18,12 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.Range; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.predicate.ValueSet; -import io.trino.spi.type.TypeOperators; import io.trino.sql.ExpressionUtils; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; @@ -43,7 +42,6 @@ import static io.trino.SystemSessionProperties.isOptimizeTopNRanking; import static io.trino.matching.Capture.newCapture; import static io.trino.spi.predicate.Range.range; -import static io.trino.sql.planner.DomainTranslator.fromPredicate; import static io.trino.sql.planner.iterative.rule.Util.toTopNRankingType; import static io.trino.sql.planner.plan.Patterns.filter; import static io.trino.sql.planner.plan.Patterns.project; @@ -80,14 +78,12 @@ public class PushPredicateThroughProjectIntoWindow private static final Capture PROJECT = newCapture(); private static final Capture WINDOW = newCapture(); + private final PlannerContext plannerContext; private final Pattern pattern; - private final Metadata metadata; - private final TypeOperators typeOperators; - public PushPredicateThroughProjectIntoWindow(Metadata metadata, TypeOperators typeOperators) + public PushPredicateThroughProjectIntoWindow(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.pattern = filter() .with(source().matching(project() .matching(ProjectNode::isIdentity) @@ -120,7 +116,11 @@ public Result apply(FilterNode filter, Captures captures, Context context) return Result.empty(); } - DomainTranslator.ExtractionResult extractionResult = fromPredicate(metadata, typeOperators, context.getSession(), filter.getPredicate(), context.getSymbolAllocator().getTypes()); + DomainTranslator.ExtractionResult extractionResult = DomainTranslator.getExtractionResult( + plannerContext, + context.getSession(), + filter.getPredicate(), + context.getSymbolAllocator().getTypes()); TupleDomain tupleDomain = extractionResult.getTupleDomain(); OptionalInt upperBound = extractUpperBound(tupleDomain, rankingSymbol); if (upperBound.isEmpty()) { @@ -145,9 +145,9 @@ public Result apply(FilterNode filter, Captures captures, Context context) // Remove the ranking domain because it is absorbed into the node TupleDomain newTupleDomain = tupleDomain.filter((symbol, domain) -> !symbol.equals(rankingSymbol)); Expression newPredicate = ExpressionUtils.combineConjuncts( - metadata, + plannerContext.getMetadata(), extractionResult.getRemainingExpression(), - new DomainTranslator(context.getSession(), metadata).toPredicate(newTupleDomain)); + new DomainTranslator(plannerContext).toPredicate(context.getSession(), newTupleDomain)); if (newPredicate.equals(TRUE_LITERAL)) { return Result.ofPlanNode(project); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java index 07a9d633ffe9..941b44c71701 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushProjectionIntoTableScan.java @@ -22,7 +22,6 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.metadata.TableHandle; import io.trino.metadata.TableProperties.TablePartitioning; import io.trino.spi.connector.Assignment; @@ -31,6 +30,7 @@ import io.trino.spi.expression.ConnectorExpression; import io.trino.spi.expression.Variable; import io.trino.spi.predicate.TupleDomain; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ConnectorExpressionTranslator; import io.trino.sql.planner.LiteralEncoder; import io.trino.sql.planner.Symbol; @@ -70,13 +70,13 @@ public class PushProjectionIntoTableScan private static final Pattern PATTERN = project().with(source().matching( tableScan().capturedAs(TABLE_SCAN))); - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; private final ScalarStatsCalculator scalarStatsCalculator; - public PushProjectionIntoTableScan(Metadata metadata, TypeAnalyzer typeAnalyzer, ScalarStatsCalculator scalarStatsCalculator) + public PushProjectionIntoTableScan(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, ScalarStatsCalculator scalarStatsCalculator) { - this.metadata = metadata; + this.plannerContext = plannerContext; this.typeAnalyzer = typeAnalyzer; this.scalarStatsCalculator = requireNonNull(scalarStatsCalculator, "scalarStatsCalculator is null"); } @@ -118,7 +118,7 @@ public Result apply(ProjectNode project, Captures captures, Context context) Map assignments = inputVariableMappings.entrySet().stream() .collect(toImmutableMap(Entry::getKey, entry -> tableScan.getAssignments().get(entry.getValue()))); - Optional> result = metadata.applyProjection(context.getSession(), tableScan.getTable(), connectorPartialProjections, assignments); + Optional> result = plannerContext.getMetadata().applyProjection(context.getSession(), tableScan.getTable(), connectorPartialProjections, assignments); if (result.isEmpty()) { return Result.empty(); @@ -143,7 +143,7 @@ public Result apply(ProjectNode project, Captures captures, Context context) // Translate partial connector projections back to new partial projections List newPartialProjections = newConnectorPartialProjections.stream() - .map(expression -> ConnectorExpressionTranslator.translate(expression, variableMappings, new LiteralEncoder(context.getSession(), metadata))) + .map(expression -> ConnectorExpressionTranslator.translate(context.getSession(), expression, variableMappings, new LiteralEncoder(plannerContext))) .collect(toImmutableList()); // Map internal node references to new partial projections @@ -170,7 +170,7 @@ public Result apply(ProjectNode project, Captures captures, Context context) continue; } String resultVariableName = ((Variable) resultConnectorExpression).getName(); - Expression inputExpression = ConnectorExpressionTranslator.translate(inputConnectorExpression, inputVariableMappings, new LiteralEncoder(context.getSession(), metadata)); + Expression inputExpression = ConnectorExpressionTranslator.translate(context.getSession(), inputConnectorExpression, inputVariableMappings, new LiteralEncoder(plannerContext)); SymbolStatsEstimate symbolStatistics = scalarStatsCalculator.calculate(inputExpression, statistics, context.getSession(), context.getSymbolAllocator().getTypes()); builder.addSymbolStatistics(variableMappings.get(resultVariableName), symbolStatistics); } @@ -206,8 +206,8 @@ private void verifyTablePartitioning( return; } - Optional oldTablePartitioning = metadata.getTableProperties(context.getSession(), oldTableScan.getTable()).getTablePartitioning(); - Optional newTablePartitioning = metadata.getTableProperties(context.getSession(), newTable).getTablePartitioning(); + Optional oldTablePartitioning = plannerContext.getMetadata().getTableProperties(context.getSession(), oldTableScan.getTable()).getTablePartitioning(); + Optional newTablePartitioning = plannerContext.getMetadata().getTableProperties(context.getSession(), newTable).getTablePartitioning(); verify(newTablePartitioning.equals(oldTablePartitioning), "Partitioning must not change after projection is pushed down"); } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoRowNumber.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoRowNumber.java index 8f4d065fde3b..cfce0e542cfc 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoRowNumber.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoRowNumber.java @@ -18,13 +18,12 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.Range; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.predicate.ValueSet; -import io.trino.spi.type.TypeOperators; import io.trino.sql.ExpressionUtils; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeProvider; @@ -42,11 +41,11 @@ import static io.trino.matching.Capture.newCapture; import static io.trino.spi.predicate.Range.range; import static io.trino.spi.type.BigintType.BIGINT; -import static io.trino.sql.planner.DomainTranslator.fromPredicate; import static io.trino.sql.planner.plan.Patterns.filter; import static io.trino.sql.planner.plan.Patterns.rowNumber; import static io.trino.sql.planner.plan.Patterns.source; import static java.lang.Math.toIntExact; +import static java.util.Objects.requireNonNull; public class PushdownFilterIntoRowNumber implements Rule @@ -54,13 +53,11 @@ public class PushdownFilterIntoRowNumber private static final Capture CHILD = newCapture(); private static final Pattern PATTERN = filter().with(source().matching(rowNumber().capturedAs(CHILD))); - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; - public PushdownFilterIntoRowNumber(Metadata metadata, TypeOperators typeOperators) + public PushdownFilterIntoRowNumber(PlannerContext plannerContext) { - this.metadata = metadata; - this.typeOperators = typeOperators; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -75,7 +72,7 @@ public Result apply(FilterNode node, Captures captures, Context context) Session session = context.getSession(); TypeProvider types = context.getSymbolAllocator().getTypes(); - DomainTranslator.ExtractionResult extractionResult = fromPredicate(metadata, typeOperators, session, node.getPredicate(), types); + DomainTranslator.ExtractionResult extractionResult = DomainTranslator.getExtractionResult(plannerContext, session, node.getPredicate(), types); TupleDomain tupleDomain = extractionResult.getTupleDomain(); RowNumberNode source = captures.get(CHILD); @@ -107,9 +104,9 @@ public Result apply(FilterNode node, Captures captures, Context context) TupleDomain newTupleDomain = tupleDomain.filter((symbol, domain) -> !symbol.equals(rowNumberSymbol)); Expression newPredicate = ExpressionUtils.combineConjuncts( - metadata, + plannerContext.getMetadata(), extractionResult.getRemainingExpression(), - new DomainTranslator(session, metadata).toPredicate(newTupleDomain)); + new DomainTranslator(plannerContext).toPredicate(session, newTupleDomain)); if (newPredicate.equals(BooleanLiteral.TRUE_LITERAL)) { return Result.ofPlanNode(source); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoWindow.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoWindow.java index de646160f34f..7180c332757d 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoWindow.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/PushdownFilterIntoWindow.java @@ -18,13 +18,12 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.Range; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.predicate.ValueSet; -import io.trino.spi.type.TypeOperators; import io.trino.sql.ExpressionUtils; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeProvider; @@ -46,12 +45,12 @@ import static io.trino.matching.Capture.newCapture; import static io.trino.spi.predicate.Range.range; import static io.trino.spi.type.BigintType.BIGINT; -import static io.trino.sql.planner.DomainTranslator.fromPredicate; import static io.trino.sql.planner.iterative.rule.Util.toTopNRankingType; import static io.trino.sql.planner.plan.Patterns.filter; import static io.trino.sql.planner.plan.Patterns.source; import static io.trino.sql.planner.plan.Patterns.window; import static java.lang.Math.toIntExact; +import static java.util.Objects.requireNonNull; public class PushdownFilterIntoWindow implements Rule @@ -59,18 +58,16 @@ public class PushdownFilterIntoWindow private static final Capture childCapture = newCapture(); private final Pattern pattern; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; - public PushdownFilterIntoWindow(Metadata metadata, TypeOperators typeOperators) + public PushdownFilterIntoWindow(PlannerContext plannerContext) { - this.metadata = metadata; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.pattern = filter() .with(source().matching(window() .matching(window -> window.getOrderingScheme().isPresent()) .matching(window -> toTopNRankingType(window).isPresent()) .capturedAs(childCapture))); - this.typeOperators = typeOperators; } @Override @@ -93,7 +90,7 @@ public Result apply(FilterNode node, Captures captures, Context context) WindowNode windowNode = captures.get(childCapture); - DomainTranslator.ExtractionResult extractionResult = fromPredicate(metadata, typeOperators, session, node.getPredicate(), types); + DomainTranslator.ExtractionResult extractionResult = DomainTranslator.getExtractionResult(plannerContext, session, node.getPredicate(), types); TupleDomain tupleDomain = extractionResult.getTupleDomain(); Optional rankingType = toTopNRankingType(windowNode); @@ -125,9 +122,9 @@ public Result apply(FilterNode node, Captures captures, Context context) // Remove the row number domain because it is absorbed into the node TupleDomain newTupleDomain = tupleDomain.filter((symbol, domain) -> !symbol.equals(rankingSymbol)); Expression newPredicate = ExpressionUtils.combineConjuncts( - metadata, + plannerContext.getMetadata(), extractionResult.getRemainingExpression(), - new DomainTranslator(session, metadata).toPredicate(newTupleDomain)); + new DomainTranslator(plannerContext).toPredicate(session, newTupleDomain)); if (newPredicate.equals(BooleanLiteral.TRUE_LITERAL)) { return Result.ofPlanNode(newSource); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveRedundantTableScanPredicate.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveRedundantTableScanPredicate.java index 6af3d14e31f4..5aaf4bd70318 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveRedundantTableScanPredicate.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveRedundantTableScanPredicate.java @@ -19,12 +19,11 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; @@ -60,14 +59,12 @@ public class RemoveRedundantTableScanPredicate filter().with(source().matching( tableScan().capturedAs(TABLE_SCAN))); - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; - private final TypeOperators typeOperators; - public RemoveRedundantTableScanPredicate(Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer) + public RemoveRedundantTableScanPredicate(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); } @@ -87,8 +84,7 @@ public Result apply(FilterNode filterNode, Captures captures, Context context) filterNode.getPredicate(), context.getSession(), context.getSymbolAllocator(), - context.getIdAllocator(), - typeOperators); + context.getIdAllocator()); if (rewritten instanceof FilterNode && Objects.equals(((FilterNode) rewritten).getPredicate(), filterNode.getPredicate())) { @@ -103,15 +99,13 @@ private PlanNode removeRedundantTableScanPredicate( Expression predicate, Session session, SymbolAllocator symbolAllocator, - PlanNodeIdAllocator idAllocator, - TypeOperators typeOperators) + PlanNodeIdAllocator idAllocator) { - Expression deterministicPredicate = filterDeterministicConjuncts(metadata, predicate); - Expression nonDeterministicPredicate = filterNonDeterministicConjuncts(metadata, predicate); + Expression deterministicPredicate = filterDeterministicConjuncts(plannerContext.getMetadata(), predicate); + Expression nonDeterministicPredicate = filterNonDeterministicConjuncts(plannerContext.getMetadata(), predicate); - DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.fromPredicate( - metadata, - typeOperators, + DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.getExtractionResult( + plannerContext, session, deterministicPredicate, symbolAllocator.getTypes()); @@ -145,11 +139,11 @@ private PlanNode removeRedundantTableScanPredicate( Map assignments = ImmutableBiMap.copyOf(node.getAssignments()).inverse(); Expression resultingPredicate = createResultingPredicate( - metadata, + plannerContext, session, symbolAllocator, typeAnalyzer, - new DomainTranslator(session, metadata).toPredicate(unenforcedDomain.transformKeys(assignments::get)), + new DomainTranslator(plannerContext).toPredicate(session, unenforcedDomain.transformKeys(assignments::get)), nonDeterministicPredicate, decomposedPredicate.getRemainingExpression()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveUnsupportedDynamicFilters.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveUnsupportedDynamicFilters.java index a699b4216aa9..59fe93334fbf 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveUnsupportedDynamicFilters.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RemoveUnsupportedDynamicFilters.java @@ -17,10 +17,17 @@ import com.google.common.collect.ImmutableSet; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; +import io.trino.metadata.AnalyzePropertyManager; import io.trino.metadata.OperatorNotFoundException; +import io.trino.metadata.SessionPropertyManager; +import io.trino.metadata.TableProceduresPropertyManager; +import io.trino.metadata.TableProceduresRegistry; +import io.trino.metadata.TablePropertyManager; +import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Type; import io.trino.sql.DynamicFilters; +import io.trino.sql.PlannerContext; +import io.trino.sql.analyzer.StatementAnalyzerFactory; import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; @@ -75,13 +82,26 @@ public class RemoveUnsupportedDynamicFilters implements PlanOptimizer { - private final Metadata metadata; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; - public RemoveUnsupportedDynamicFilters(Metadata metadata) + public RemoveUnsupportedDynamicFilters(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeAnalyzer = new TypeAnalyzer(new SqlParser(), metadata); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + // This is a limited type analyzer for the simple expressions used in dynamic filters + this.typeAnalyzer = new TypeAnalyzer( + plannerContext, + new StatementAnalyzerFactory( + plannerContext, + new SqlParser(), + new AllowAllAccessControl(), + user -> ImmutableSet.of(), + new TableProceduresRegistry(), + new SessionPropertyManager(), + new TablePropertyManager(), + new AnalyzePropertyManager(), + new TableProceduresPropertyManager()), + new AllowAllAccessControl()); } @Override @@ -102,7 +122,7 @@ public Rewriter(Session session, TypeProvider types) { this.session = requireNonNull(session, "session is null"); this.types = requireNonNull(types, "types is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); } @Override @@ -291,7 +311,7 @@ public PlanWithConsumedDynamicFilters visitFilter(FilterNode node, Set allowedDynamicFilterIds, ImmutableSet.Builder consumedDynamicFilterIds) { - return combineConjuncts(metadata, extractConjuncts(expression) + return combineConjuncts(plannerContext.getMetadata(), extractConjuncts(expression) .stream() .map(this::removeNestedDynamicFilters) .filter(conjunct -> @@ -332,7 +352,7 @@ private boolean isSupportedDynamicFilterExpression(Expression expression) private boolean doesSaturatedFloorCastOperatorExist(Type fromType, Type toType) { try { - metadata.getCoercion(session, SATURATED_FLOOR_CAST, fromType, toType); + plannerContext.getMetadata().getCoercion(session, SATURATED_FLOOR_CAST, fromType, toType); } catch (OperatorNotFoundException e) { return false; @@ -347,7 +367,7 @@ private Expression removeAllDynamicFilters(Expression expression) if (extractResult.getDynamicConjuncts().isEmpty()) { return rewrittenExpression; } - return combineConjuncts(metadata, extractResult.getStaticConjuncts()); + return combineConjuncts(plannerContext.getMetadata(), extractResult.getStaticConjuncts()); } private Expression removeNestedDynamicFilters(Expression expression) @@ -375,7 +395,7 @@ public Expression rewriteLogicalExpression(LogicalExpression node, Void context, if (!modified) { return node; } - return combinePredicates(metadata, node.getOperator(), expressionBuilder.build()); + return combinePredicates(plannerContext.getMetadata(), node.getOperator(), expressionBuilder.build()); } }, expression); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java index 6fce2dfa3ffb..3146152dd829 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/RewriteSpatialPartitioningAggregation.java @@ -17,9 +17,9 @@ import com.google.common.collect.ImmutableMap; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.spi.type.TypeSignature; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.FunctionCallBuilder; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; @@ -65,11 +65,11 @@ public class RewriteSpatialPartitioningAggregation private static final Pattern PATTERN = aggregation() .matching(RewriteSpatialPartitioningAggregation::hasSpatialPartitioningAggregation); - private final Metadata metadata; + private final PlannerContext plannerContext; - public RewriteSpatialPartitioningAggregation(Metadata metadata) + public RewriteSpatialPartitioningAggregation(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } private static boolean hasSpatialPartitioningAggregation(AggregationNode aggregationNode) @@ -87,8 +87,8 @@ public Pattern getPattern() @Override public Result apply(AggregationNode node, Captures captures, Context context) { - ResolvedFunction spatialPartitioningFunction = metadata.resolveFunction(context.getSession(), QualifiedName.of(NAME), fromTypeSignatures(GEOMETRY_TYPE_SIGNATURE, INTEGER.getTypeSignature())); - ResolvedFunction stEnvelopeFunction = metadata.resolveFunction(context.getSession(), QualifiedName.of("ST_Envelope"), fromTypeSignatures(GEOMETRY_TYPE_SIGNATURE)); + ResolvedFunction spatialPartitioningFunction = plannerContext.getMetadata().resolveFunction(context.getSession(), QualifiedName.of(NAME), fromTypeSignatures(GEOMETRY_TYPE_SIGNATURE, INTEGER.getTypeSignature())); + ResolvedFunction stEnvelopeFunction = plannerContext.getMetadata().resolveFunction(context.getSession(), QualifiedName.of("ST_Envelope"), fromTypeSignatures(GEOMETRY_TYPE_SIGNATURE)); ImmutableMap.Builder aggregations = ImmutableMap.builder(); Symbol partitionCountSymbol = context.getSymbolAllocator().newSymbol("partition_count", INTEGER); @@ -98,12 +98,12 @@ public Result apply(AggregationNode node, Captures captures, Context context) String name = aggregation.getResolvedFunction().getSignature().getName(); if (name.equals(NAME) && aggregation.getArguments().size() == 1) { Expression geometry = getOnlyElement(aggregation.getArguments()); - Symbol envelopeSymbol = context.getSymbolAllocator().newSymbol("envelope", metadata.getType(GEOMETRY_TYPE_SIGNATURE)); + Symbol envelopeSymbol = context.getSymbolAllocator().newSymbol("envelope", plannerContext.getTypeManager().getType(GEOMETRY_TYPE_SIGNATURE)); if (isStEnvelopeFunctionCall(geometry, stEnvelopeFunction)) { envelopeAssignments.put(envelopeSymbol, geometry); } else { - envelopeAssignments.put(envelopeSymbol, FunctionCallBuilder.resolve(context.getSession(), metadata) + envelopeAssignments.put(envelopeSymbol, FunctionCallBuilder.resolve(context.getSession(), plannerContext.getMetadata()) .setName(QualifiedName.of("ST_Envelope")) .addArgument(GEOMETRY_TYPE_SIGNATURE, geometry) .build()); @@ -148,7 +148,7 @@ private boolean isStEnvelopeFunctionCall(Expression expression, ResolvedFunction } FunctionCall functionCall = (FunctionCall) expression; - return metadata.decodeFunction(functionCall.getName()) + return plannerContext.getMetadata().decodeFunction(functionCall.getName()) .getFunctionId() .equals(stEnvelopeFunction.getFunctionId()); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/SimplifyExpressions.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/SimplifyExpressions.java index 17cc0de06b84..8759e52b5ddd 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/SimplifyExpressions.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/SimplifyExpressions.java @@ -15,8 +15,8 @@ import com.google.common.collect.ImmutableSet; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ExpressionInterpreter; import io.trino.sql.planner.LiteralEncoder; import io.trino.sql.planner.NoOpSymbolResolver; @@ -37,25 +37,25 @@ public class SimplifyExpressions extends ExpressionRewriteRuleSet { - public static Expression rewrite(Expression expression, Session session, SymbolAllocator symbolAllocator, Metadata metadata, TypeAnalyzer typeAnalyzer) + public static Expression rewrite(Expression expression, Session session, SymbolAllocator symbolAllocator, PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - requireNonNull(metadata, "metadata is null"); + requireNonNull(plannerContext, "plannerContext is null"); requireNonNull(typeAnalyzer, "typeAnalyzer is null"); if (expression instanceof SymbolReference) { return expression; } Map, Type> expressionTypes = typeAnalyzer.getTypes(session, symbolAllocator.getTypes(), expression); - expression = pushDownNegations(metadata, expression, expressionTypes); - expression = extractCommonPredicates(metadata, expression); + expression = pushDownNegations(plannerContext.getMetadata(), expression, expressionTypes); + expression = extractCommonPredicates(plannerContext.getMetadata(), expression); expressionTypes = typeAnalyzer.getTypes(session, symbolAllocator.getTypes(), expression); - ExpressionInterpreter interpreter = new ExpressionInterpreter(expression, metadata, session, expressionTypes); + ExpressionInterpreter interpreter = new ExpressionInterpreter(expression, plannerContext, session, expressionTypes); Object optimized = interpreter.optimize(NoOpSymbolResolver.INSTANCE); - return new LiteralEncoder(session, metadata).toExpression(optimized, expressionTypes.get(NodeRef.of(expression))); + return new LiteralEncoder(plannerContext).toExpression(session, optimized, expressionTypes.get(NodeRef.of(expression))); } - public SimplifyExpressions(Metadata metadata, TypeAnalyzer typeAnalyzer) + public SimplifyExpressions(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - super(createRewrite(metadata, typeAnalyzer)); + super(createRewrite(plannerContext, typeAnalyzer)); } @Override @@ -69,11 +69,11 @@ public Set> rules() patternRecognitionExpressionRewrite()); // ApplyNode and AggregationNode are not supported, because ExpressionInterpreter doesn't support them } - private static ExpressionRewriter createRewrite(Metadata metadata, TypeAnalyzer typeAnalyzer) + private static ExpressionRewriter createRewrite(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - requireNonNull(metadata, "metadata is null"); + requireNonNull(plannerContext, "plannerContext is null"); requireNonNull(typeAnalyzer, "typeAnalyzer is null"); - return (expression, context) -> rewrite(expression, context.getSession(), context.getSymbolAllocator(), metadata, typeAnalyzer); + return (expression, context) -> rewrite(expression, context.getSession(), context.getSymbolAllocator(), plannerContext, typeAnalyzer); } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithProjection.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithProjection.java index 778d522d5dad..41856e4865f0 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithProjection.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithProjection.java @@ -18,7 +18,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; @@ -89,11 +89,11 @@ public class TransformCorrelatedDistinctAggregationWithProjection .matching(AggregationDecorrelation::isDistinctOperator) .capturedAs(AGGREGATION))))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformCorrelatedDistinctAggregationWithProjection(Metadata metadata) + public TransformCorrelatedDistinctAggregationWithProjection(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -106,7 +106,7 @@ public Pattern getPattern() public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Context context) { // decorrelate nested plan - PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); Optional decorrelatedSource = decorrelator.decorrelateFilters(captures.get(AGGREGATION).getSource(), correlatedJoinNode.getCorrelation()); if (decorrelatedSource.isEmpty()) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithoutProjection.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithoutProjection.java index 03e3831b1d91..24fc9970c7ff 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithoutProjection.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedDistinctAggregationWithoutProjection.java @@ -19,7 +19,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; @@ -80,11 +80,11 @@ public class TransformCorrelatedDistinctAggregationWithoutProjection .matching(AggregationDecorrelation::isDistinctOperator) .capturedAs(AGGREGATION))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformCorrelatedDistinctAggregationWithoutProjection(Metadata metadata) + public TransformCorrelatedDistinctAggregationWithoutProjection(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -97,7 +97,7 @@ public Pattern getPattern() public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Context context) { // decorrelate nested plan - PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); Optional decorrelatedSource = decorrelator.decorrelateFilters(captures.get(AGGREGATION).getSource(), correlatedJoinNode.getCorrelation()); if (decorrelatedSource.isEmpty()) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithProjection.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithProjection.java index 3f11447aa9f1..3dba0f49b471 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithProjection.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithProjection.java @@ -18,7 +18,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; @@ -132,11 +132,11 @@ public class TransformCorrelatedGlobalAggregationWithProjection .with(source().capturedAs(SOURCE)) .capturedAs(AGGREGATION))))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformCorrelatedGlobalAggregationWithProjection(Metadata metadata) + public TransformCorrelatedGlobalAggregationWithProjection(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -159,7 +159,7 @@ public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Co } // decorrelate nested plan - PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); Optional decorrelatedSource = decorrelator.decorrelateFilters(source, correlatedJoinNode.getCorrelation()); if (decorrelatedSource.isEmpty()) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithoutProjection.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithoutProjection.java index 76003799030b..96ba71f87b91 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithoutProjection.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGlobalAggregationWithoutProjection.java @@ -19,7 +19,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; @@ -125,11 +125,11 @@ public class TransformCorrelatedGlobalAggregationWithoutProjection .with(source().capturedAs(SOURCE)) .capturedAs(AGGREGATION))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformCorrelatedGlobalAggregationWithoutProjection(Metadata metadata) + public TransformCorrelatedGlobalAggregationWithoutProjection(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -152,7 +152,7 @@ public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Co } // decorrelate nested plan - PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); Optional decorrelatedSource = decorrelator.decorrelateFilters(source, correlatedJoinNode.getCorrelation()); if (decorrelatedSource.isEmpty()) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithProjection.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithProjection.java index 3315f95f8fd5..8ad57dffdeb3 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithProjection.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithProjection.java @@ -18,7 +18,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; @@ -124,11 +124,11 @@ public class TransformCorrelatedGroupedAggregationWithProjection .with(source().capturedAs(SOURCE)) .capturedAs(AGGREGATION))))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformCorrelatedGroupedAggregationWithProjection(Metadata metadata) + public TransformCorrelatedGroupedAggregationWithProjection(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -149,7 +149,7 @@ public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Co } // decorrelate nested plan - PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); Optional decorrelatedSource = decorrelator.decorrelateFilters(source, correlatedJoinNode.getCorrelation()); if (decorrelatedSource.isEmpty()) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithoutProjection.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithoutProjection.java index 17e930c69263..4ebfacd4f882 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithoutProjection.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedGroupedAggregationWithoutProjection.java @@ -19,7 +19,7 @@ import io.trino.matching.Capture; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; @@ -115,11 +115,11 @@ public class TransformCorrelatedGroupedAggregationWithoutProjection .with(source().capturedAs(SOURCE)) .capturedAs(AGGREGATION))); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformCorrelatedGroupedAggregationWithoutProjection(Metadata metadata) + public TransformCorrelatedGroupedAggregationWithoutProjection(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -140,7 +140,7 @@ public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Co } // decorrelate nested plan - PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); Optional decorrelatedSource = decorrelator.decorrelateFilters(source, correlatedJoinNode.getCorrelation()); if (decorrelatedSource.isEmpty()) { return Result.empty(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedJoinToJoin.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedJoinToJoin.java index 7a1d3742fd78..91a307102130 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedJoinToJoin.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformCorrelatedJoinToJoin.java @@ -17,7 +17,7 @@ import com.google.common.collect.ImmutableMap; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator.DecorrelatedNode; @@ -36,6 +36,7 @@ import static io.trino.sql.planner.plan.Patterns.CorrelatedJoin.correlation; import static io.trino.sql.planner.plan.Patterns.correlatedJoin; import static io.trino.sql.tree.BooleanLiteral.TRUE_LITERAL; +import static java.util.Objects.requireNonNull; /** * Tries to decorrelate subquery and rewrite it using normal join. @@ -47,11 +48,11 @@ public class TransformCorrelatedJoinToJoin private static final Pattern PATTERN = correlatedJoin() .with(nonEmpty(correlation())); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformCorrelatedJoinToJoin(Metadata metadata) + public TransformCorrelatedJoinToJoin(PlannerContext plannerContext) { - this.metadata = metadata; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -66,7 +67,7 @@ public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Co checkArgument(correlatedJoinNode.getType() == INNER || correlatedJoinNode.getType() == LEFT, "correlation in %s JOIN", correlatedJoinNode.getType().name()); PlanNode subquery = correlatedJoinNode.getSubquery(); - PlanNodeDecorrelator planNodeDecorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator planNodeDecorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); Optional decorrelatedNodeOptional = planNodeDecorrelator.decorrelateFilters(subquery, correlatedJoinNode.getCorrelation()); if (decorrelatedNodeOptional.isEmpty()) { return Result.empty(); @@ -74,7 +75,7 @@ public Result apply(CorrelatedJoinNode correlatedJoinNode, Captures captures, Co DecorrelatedNode decorrelatedSubquery = decorrelatedNodeOptional.get(); Expression filter = combineConjuncts( - metadata, + plannerContext.getMetadata(), decorrelatedSubquery.getCorrelatedPredicates().orElse(TRUE_LITERAL), correlatedJoinNode.getFilter()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformExistsApplyToCorrelatedJoin.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformExistsApplyToCorrelatedJoin.java index dc898c2d3d7e..19e66ec4990f 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformExistsApplyToCorrelatedJoin.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/TransformExistsApplyToCorrelatedJoin.java @@ -17,8 +17,8 @@ import com.google.common.collect.ImmutableMap; import io.trino.matching.Captures; import io.trino.matching.Pattern; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.Rule; import io.trino.sql.planner.optimizations.PlanNodeDecorrelator; @@ -80,12 +80,11 @@ public class TransformExistsApplyToCorrelatedJoin private static final Pattern PATTERN = applyNode(); private static final QualifiedName COUNT = QualifiedName.of("count"); - private final Metadata metadata; + private final PlannerContext plannerContext; - public TransformExistsApplyToCorrelatedJoin(Metadata metadata) + public TransformExistsApplyToCorrelatedJoin(PlannerContext plannerContext) { - requireNonNull(metadata, "metadata is null"); - this.metadata = metadata; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -142,7 +141,7 @@ private Optional rewriteToNonDefaultAggregation(ApplyNode applyNode, C false), Assignments.of(subqueryTrue, TRUE_LITERAL)); - PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(metadata, context.getSymbolAllocator(), context.getLookup()); + PlanNodeDecorrelator decorrelator = new PlanNodeDecorrelator(plannerContext, context.getSymbolAllocator(), context.getLookup()); if (decorrelator.decorrelateFilters(subquery, applyNode.getCorrelation()).isEmpty()) { return Optional.empty(); } @@ -166,7 +165,7 @@ private Optional rewriteToNonDefaultAggregation(ApplyNode applyNode, C private PlanNode rewriteToDefaultAggregation(ApplyNode applyNode, Context context) { - ResolvedFunction countFunction = metadata.resolveFunction(context.getSession(), COUNT, ImmutableList.of()); + ResolvedFunction countFunction = plannerContext.getMetadata().resolveFunction(context.getSession(), COUNT, ImmutableList.of()); Symbol count = context.getSymbolAllocator().newSymbol(COUNT.toString(), BIGINT); Symbol exists = getOnlyElement(applyNode.getSubqueryAssignments().getSymbols()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/UnwrapCastInComparison.java b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/UnwrapCastInComparison.java index 70afcabfeae1..cb6f37797823 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/UnwrapCastInComparison.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/iterative/rule/UnwrapCastInComparison.java @@ -17,7 +17,6 @@ import com.google.common.base.Throwables; import io.airlift.slice.Slice; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.metadata.OperatorNotFoundException; import io.trino.metadata.ResolvedFunction; import io.trino.spi.TrinoException; @@ -32,9 +31,9 @@ import io.trino.spi.type.TimestampType; import io.trino.spi.type.TimestampWithTimeZoneType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; import io.trino.spi.type.VarcharType; import io.trino.sql.InterpretedFunctionInvoker; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ExpressionInterpreter; import io.trino.sql.planner.LiteralEncoder; import io.trino.sql.planner.NoOpSymbolResolver; @@ -122,49 +121,46 @@ public class UnwrapCastInComparison extends ExpressionRewriteRuleSet { - public UnwrapCastInComparison(Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer) + public UnwrapCastInComparison(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - super(createRewrite(metadata, typeOperators, typeAnalyzer)); + super(createRewrite(plannerContext, typeAnalyzer)); } - private static ExpressionRewriter createRewrite(Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer) + private static ExpressionRewriter createRewrite(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { - requireNonNull(metadata, "metadata is null"); + requireNonNull(plannerContext, "plannerContext is null"); requireNonNull(typeAnalyzer, "typeAnalyzer is null"); - return (expression, context) -> unwrapCasts(context.getSession(), metadata, typeOperators, typeAnalyzer, context.getSymbolAllocator().getTypes(), expression); + return (expression, context) -> unwrapCasts(context.getSession(), plannerContext, typeAnalyzer, context.getSymbolAllocator().getTypes(), expression); } public static Expression unwrapCasts(Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, Expression expression) { - return ExpressionTreeRewriter.rewriteWith(new Visitor(metadata, typeOperators, typeAnalyzer, session, types), expression); + return ExpressionTreeRewriter.rewriteWith(new Visitor(plannerContext, typeAnalyzer, session, types), expression); } private static class Visitor extends io.trino.sql.tree.ExpressionRewriter { - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; private final Session session; private final TypeProvider types; private final InterpretedFunctionInvoker functionInvoker; private final LiteralEncoder literalEncoder; - public Visitor(Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer, Session session, TypeProvider types) + public Visitor(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, Session session, TypeProvider types) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.session = requireNonNull(session, "session is null"); this.types = requireNonNull(types, "types is null"); - this.functionInvoker = new InterpretedFunctionInvoker(metadata); - this.literalEncoder = new LiteralEncoder(session, metadata); + this.functionInvoker = new InterpretedFunctionInvoker(plannerContext.getMetadata()); + this.literalEncoder = new LiteralEncoder(plannerContext); } @Override @@ -181,7 +177,7 @@ private Expression unwrapCast(ComparisonExpression expression) return expression; } - Object right = new ExpressionInterpreter(expression.getRight(), metadata, session, typeAnalyzer.getTypes(session, types, expression.getRight())) + Object right = new ExpressionInterpreter(expression.getRight(), plannerContext, session, typeAnalyzer.getTypes(session, types, expression.getRight())) .optimize(NoOpSymbolResolver.INSTANCE); Cast cast = (Cast) expression.getLeft(); @@ -243,7 +239,7 @@ private Expression unwrapCast(ComparisonExpression expression) } } - ResolvedFunction sourceToTarget = metadata.getCoercion(session, sourceType, targetType); + ResolvedFunction sourceToTarget = plannerContext.getMetadata().getCoercion(session, sourceType, targetType); Optional sourceRange = sourceType.getRange(); if (sourceRange.isPresent()) { @@ -276,15 +272,15 @@ private Expression unwrapCast(ComparisonExpression expression) case GREATER_THAN: return falseIfNotNull(cast.getExpression()); case GREATER_THAN_OR_EQUAL: - return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(max, sourceType)); + return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(session, max, sourceType)); case LESS_THAN_OR_EQUAL: return trueIfNotNull(cast.getExpression()); case LESS_THAN: - return new ComparisonExpression(NOT_EQUAL, cast.getExpression(), literalEncoder.toExpression(max, sourceType)); + return new ComparisonExpression(NOT_EQUAL, cast.getExpression(), literalEncoder.toExpression(session, max, sourceType)); case EQUAL: case NOT_EQUAL: case IS_DISTINCT_FROM: - return new ComparisonExpression(operator, cast.getExpression(), literalEncoder.toExpression(max, sourceType)); + return new ComparisonExpression(operator, cast.getExpression(), literalEncoder.toExpression(session, max, sourceType)); } throw new UnsupportedOperationException("Not yet implemented: " + operator); } @@ -316,15 +312,15 @@ private Expression unwrapCast(ComparisonExpression expression) case LESS_THAN: return falseIfNotNull(cast.getExpression()); case LESS_THAN_OR_EQUAL: - return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(min, sourceType)); + return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(session, min, sourceType)); case GREATER_THAN_OR_EQUAL: return trueIfNotNull(cast.getExpression()); case GREATER_THAN: - return new ComparisonExpression(NOT_EQUAL, cast.getExpression(), literalEncoder.toExpression(min, sourceType)); + return new ComparisonExpression(NOT_EQUAL, cast.getExpression(), literalEncoder.toExpression(session, min, sourceType)); case EQUAL: case NOT_EQUAL: case IS_DISTINCT_FROM: - return new ComparisonExpression(operator, cast.getExpression(), literalEncoder.toExpression(min, sourceType)); + return new ComparisonExpression(operator, cast.getExpression(), literalEncoder.toExpression(session, min, sourceType)); } throw new UnsupportedOperationException("Not yet implemented: " + operator); } @@ -332,7 +328,7 @@ private Expression unwrapCast(ComparisonExpression expression) ResolvedFunction targetToSource; try { - targetToSource = metadata.getCoercion(session, targetType, sourceType); + targetToSource = plannerContext.getMetadata().getCoercion(session, targetType, sourceType); } catch (OperatorNotFoundException e) { // Without a cast between target -> source, there's nothing more we can do @@ -369,14 +365,14 @@ private Expression unwrapCast(ComparisonExpression expression) case LESS_THAN: case LESS_THAN_OR_EQUAL: if (sourceRange.isPresent() && compare(sourceType, sourceRange.get().getMin(), literalInSourceType) == 0) { - return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(literalInSourceType, sourceType)); + return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(session, literalInSourceType, sourceType)); } - return new ComparisonExpression(LESS_THAN_OR_EQUAL, cast.getExpression(), literalEncoder.toExpression(literalInSourceType, sourceType)); + return new ComparisonExpression(LESS_THAN_OR_EQUAL, cast.getExpression(), literalEncoder.toExpression(session, literalInSourceType, sourceType)); case GREATER_THAN: case GREATER_THAN_OR_EQUAL: // We expect implicit coercions to be order-preserving, so the result of converting back from target -> source cannot produce a value // larger than the next value in the source type - return new ComparisonExpression(GREATER_THAN, cast.getExpression(), literalEncoder.toExpression(literalInSourceType, sourceType)); + return new ComparisonExpression(GREATER_THAN, cast.getExpression(), literalEncoder.toExpression(session, literalInSourceType, sourceType)); } throw new UnsupportedOperationException("Not yet implemented: " + operator); } @@ -394,18 +390,18 @@ private Expression unwrapCast(ComparisonExpression expression) case LESS_THAN_OR_EQUAL: // We expect implicit coercions to be order-preserving, so the result of converting back from target -> source cannot produce a value // smaller than the next value in the source type - return new ComparisonExpression(LESS_THAN, cast.getExpression(), literalEncoder.toExpression(literalInSourceType, sourceType)); + return new ComparisonExpression(LESS_THAN, cast.getExpression(), literalEncoder.toExpression(session, literalInSourceType, sourceType)); case GREATER_THAN: case GREATER_THAN_OR_EQUAL: if (sourceRange.isPresent() && compare(sourceType, sourceRange.get().getMax(), literalInSourceType) == 0) { - return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(literalInSourceType, sourceType)); + return new ComparisonExpression(EQUAL, cast.getExpression(), literalEncoder.toExpression(session, literalInSourceType, sourceType)); } - return new ComparisonExpression(GREATER_THAN_OR_EQUAL, cast.getExpression(), literalEncoder.toExpression(literalInSourceType, sourceType)); + return new ComparisonExpression(GREATER_THAN_OR_EQUAL, cast.getExpression(), literalEncoder.toExpression(session, literalInSourceType, sourceType)); } throw new UnsupportedOperationException("Not yet implemented: " + operator); } - return new ComparisonExpression(operator, cast.getExpression(), literalEncoder.toExpression(literalInSourceType, sourceType)); + return new ComparisonExpression(operator, cast.getExpression(), literalEncoder.toExpression(session, literalInSourceType, sourceType)); } private boolean hasInjectiveImplicitCoercion(Type source, Type target, Object value) @@ -473,7 +469,7 @@ private boolean hasInjectiveImplicitCoercion(Type source, Type target, Object va return false; } - boolean coercible = new TypeCoercion(metadata::getType).canCoerce(source, target); + boolean coercible = new TypeCoercion(plannerContext.getTypeManager()::getType).canCoerce(source, target); if (source instanceof VarcharType && target instanceof CharType) { VarcharType sourceVarchar = (VarcharType) source; CharType targetChar = (CharType) target; @@ -512,7 +508,7 @@ private int compare(Type type, Object first, Object second) requireNonNull(first, "first is null"); requireNonNull(second, "second is null"); // choice of placing unordered values first or last does not matter for this code - MethodHandle comparisonOperator = typeOperators.getComparisonUnorderedLastOperator(type, InvocationConvention.simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); + MethodHandle comparisonOperator = plannerContext.getTypeOperators().getComparisonUnorderedLastOperator(type, InvocationConvention.simpleConvention(FAIL_ON_NULL, NEVER_NULL, NEVER_NULL)); try { return (int) (long) comparisonOperator.invoke(first, second); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java index 1673388f0066..5495d62cd4a4 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/AddExchanges.java @@ -25,10 +25,9 @@ import io.trino.cost.StatsCalculator; import io.trino.cost.StatsProvider; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.spi.connector.GroupingProperty; import io.trino.spi.connector.LocalProperty; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.Partitioning; import io.trino.sql.planner.PartitioningScheme; @@ -121,16 +120,14 @@ public class AddExchanges implements PlanOptimizer { + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; - private final Metadata metadata; - private final TypeOperators typeOperators; private final StatsCalculator statsCalculator; - public AddExchanges(Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer, StatsCalculator statsCalculator) + public AddExchanges(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, StatsCalculator statsCalculator) { - this.metadata = metadata; - this.typeOperators = typeOperators; - this.typeAnalyzer = typeAnalyzer; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.statsCalculator = requireNonNull(statsCalculator, "statsCalculator is null"); } @@ -162,7 +159,7 @@ public Rewriter(PlanNodeIdAllocator idAllocator, SymbolAllocator symbolAllocator this.types = symbolAllocator.getTypes(); this.statsProvider = new CachingStatsProvider(statsCalculator, session, types); this.session = session; - this.domainTranslator = new DomainTranslator(session, metadata); + this.domainTranslator = new DomainTranslator(plannerContext); this.distributedIndexJoins = SystemSessionProperties.isDistributedIndexJoinEnabled(session); this.redistributeWrites = SystemSessionProperties.isRedistributeWrites(session); this.scaleWriters = SystemSessionProperties.isScaleWriters(session); @@ -217,7 +214,7 @@ public PlanWithProperties visitAggregation(AggregationNode node, PreferredProper { Set partitioningRequirement = ImmutableSet.copyOf(node.getGroupingKeys()); - boolean preferSingleNode = node.hasSingleNodeExecutionPreference(metadata); + boolean preferSingleNode = node.hasSingleNodeExecutionPreference(plannerContext.getMetadata()); PreferredProperties preferredProperties = preferSingleNode ? PreferredProperties.undistributed() : PreferredProperties.any(); if (!node.getGroupingKeys().isEmpty()) { @@ -567,8 +564,7 @@ public PlanWithProperties visitFilter(FilterNode node, PreferredProperties prefe true, session, symbolAllocator, - metadata, - typeOperators, + plannerContext, typeAnalyzer, statsProvider, domainTranslator); @@ -617,7 +613,7 @@ else if (redistributeWrites) { } } - if (partitioningScheme.isPresent() && !newSource.getProperties().isCompatibleTablePartitioningWith(partitioningScheme.get().getPartitioning(), false, metadata, session)) { + if (partitioningScheme.isPresent() && !newSource.getProperties().isCompatibleTablePartitioningWith(partitioningScheme.get().getPartitioning(), false, plannerContext.getMetadata(), session)) { newSource = withDerivedProperties( partitionedExchange( idAllocator.getNextId(), @@ -768,7 +764,7 @@ private PlanWithProperties planPartitionedJoin(JoinNode node, List leftS if (left.getProperties().isNodePartitionedOn(leftSymbols) && !left.getProperties().isSingleNode()) { Partitioning rightPartitioning = left.getProperties().translate(createTranslator(leftToRight)).getNodePartitioning().get(); right = node.getRight().accept(this, PreferredProperties.partitioned(rightPartitioning)); - if (!right.getProperties().isCompatibleTablePartitioningWith(left.getProperties(), rightToLeft::get, metadata, session)) { + if (!right.getProperties().isCompatibleTablePartitioningWith(left.getProperties(), rightToLeft::get, plannerContext.getMetadata(), session)) { right = withDerivedProperties( partitionedExchange(idAllocator.getNextId(), REMOTE, right.getNode(), new PartitioningScheme(rightPartitioning, right.getNode().getOutputSymbols())), right.getProperties()); @@ -793,7 +789,7 @@ private PlanWithProperties planPartitionedJoin(JoinNode node, List leftS } } - verify(left.getProperties().isCompatibleTablePartitioningWith(right.getProperties(), leftToRight::get, metadata, session)); + verify(left.getProperties().isCompatibleTablePartitioningWith(right.getProperties(), leftToRight::get, plannerContext.getMetadata(), session)); // if colocated joins are disabled, force redistribute when using a custom partitioning if (!isColocatedJoinEnabled(session) && hasMultipleSources(left.getNode(), right.getNode())) { @@ -912,7 +908,7 @@ public PlanWithProperties visitSemiJoin(SemiJoinNode node, PreferredProperties p if (source.getProperties().isNodePartitionedOn(sourceSymbols) && !source.getProperties().isSingleNode()) { Partitioning filteringPartitioning = source.getProperties().translate(createTranslator(sourceToFiltering)).getNodePartitioning().get(); filteringSource = node.getFilteringSource().accept(this, PreferredProperties.partitionedWithNullsAndAnyReplicated(filteringPartitioning)); - if (!source.getProperties().withReplicatedNulls(true).isCompatibleTablePartitioningWith(filteringSource.getProperties(), sourceToFiltering::get, metadata, session)) { + if (!source.getProperties().withReplicatedNulls(true).isCompatibleTablePartitioningWith(filteringSource.getProperties(), sourceToFiltering::get, plannerContext.getMetadata(), session)) { filteringSource = withDerivedProperties( partitionedExchange(idAllocator.getNextId(), REMOTE, filteringSource.getNode(), new PartitioningScheme( filteringPartitioning, @@ -942,7 +938,7 @@ public PlanWithProperties visitSemiJoin(SemiJoinNode node, PreferredProperties p } } - verify(source.getProperties().withReplicatedNulls(true).isCompatibleTablePartitioningWith(filteringSource.getProperties(), sourceToFiltering::get, metadata, session)); + verify(source.getProperties().withReplicatedNulls(true).isCompatibleTablePartitioningWith(filteringSource.getProperties(), sourceToFiltering::get, plannerContext.getMetadata(), session)); // if colocated joins are disabled, force redistribute when using a custom partitioning if (!isColocatedJoinEnabled(session) && hasMultipleSources(source.getNode(), filteringSource.getNode())) { @@ -1112,7 +1108,7 @@ public PlanWithProperties visitUnion(UnionNode node, PreferredProperties parentP .build(); PlanWithProperties source = node.getSources().get(sourceIndex).accept(this, childPreferred); - if (!source.getProperties().isCompatibleTablePartitioningWith(childPartitioning, nullsAndAnyReplicated, metadata, session)) { + if (!source.getProperties().isCompatibleTablePartitioningWith(childPartitioning, nullsAndAnyReplicated, plannerContext.getMetadata(), session)) { source = withDerivedProperties( partitionedExchange( idAllocator.getNextId(), @@ -1301,7 +1297,7 @@ private ActualProperties deriveProperties(PlanNode result, ActualProperties inpu private ActualProperties deriveProperties(PlanNode result, List inputProperties) { // TODO: move this logic to PlanSanityChecker once PropertyDerivations.deriveProperties fully supports local exchanges - ActualProperties outputProperties = PropertyDerivations.deriveProperties(result, inputProperties, metadata, typeOperators, session, types, typeAnalyzer); + ActualProperties outputProperties = PropertyDerivations.deriveProperties(result, inputProperties, plannerContext, session, types, typeAnalyzer); verify(result instanceof SemiJoinNode || inputProperties.stream().noneMatch(ActualProperties::isNullsAndAnyReplicated) || outputProperties.isNullsAndAnyReplicated(), "SemiJoinNode is the only node that can strip null replication"); return outputProperties; @@ -1309,7 +1305,7 @@ private ActualProperties deriveProperties(PlanNode result, List groupingKeys = node.getGroupingKeys(); if (node.hasDefaultOutput()) { - checkState(node.isDecomposable(metadata)); + checkState(node.isDecomposable(plannerContext.getMetadata())); // Put fixed local exchange directly below final aggregation to ensure that final and partial aggregations are separated by exchange (in a local runner mode) // This is required so that default outputs from multiple instances of partial aggregations are passed to a single final aggregation. @@ -788,7 +785,7 @@ public PlanWithProperties visitIndexJoin(IndexJoinNode node, StreamPreferredProp parentPreferences.constrainTo(node.getProbeSource().getOutputSymbols()).withDefaultParallelism(session)); // index source does not support local parallel and must produce a single stream - StreamProperties indexStreamProperties = derivePropertiesRecursively(node.getIndexSource(), metadata, typeOperators, session, types, typeAnalyzer); + StreamProperties indexStreamProperties = derivePropertiesRecursively(node.getIndexSource(), plannerContext, session, types, typeAnalyzer); checkArgument(indexStreamProperties.getDistribution() == SINGLE, "index source must be single stream"); PlanWithProperties index = new PlanWithProperties(node.getIndexSource(), indexStreamProperties); @@ -889,12 +886,12 @@ private PlanWithProperties rebaseAndDeriveProperties(PlanNode node, List inputProperties) { - return new PlanWithProperties(result, StreamPropertyDerivations.deriveProperties(result, inputProperties, metadata, typeOperators, session, types, typeAnalyzer)); + return new PlanWithProperties(result, StreamPropertyDerivations.deriveProperties(result, inputProperties, plannerContext, session, types, typeAnalyzer)); } } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java index ffa8aaab2b64..dcf559f89ee5 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/IndexJoinOptimizer.java @@ -23,12 +23,11 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.BoundSignature; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.metadata.ResolvedIndex; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.predicate.TupleDomain; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; @@ -73,13 +72,11 @@ public class IndexJoinOptimizer implements PlanOptimizer { - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; - public IndexJoinOptimizer(Metadata metadata, TypeOperators typeOperators) + public IndexJoinOptimizer(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = plannerContext; } @Override @@ -90,7 +87,7 @@ public PlanNode optimize(PlanNode plan, Session session, TypeProvider type, Symb requireNonNull(symbolAllocator, "symbolAllocator is null"); requireNonNull(idAllocator, "idAllocator is null"); - return SimplePlanRewriter.rewriteWith(new Rewriter(symbolAllocator, idAllocator, metadata, typeOperators, session), plan, null); + return SimplePlanRewriter.rewriteWith(new Rewriter(symbolAllocator, idAllocator, plannerContext, session), plan, null); } private static class Rewriter @@ -98,21 +95,18 @@ private static class Rewriter { private final SymbolAllocator symbolAllocator; private final PlanNodeIdAllocator idAllocator; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final Session session; private Rewriter( SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session) { this.symbolAllocator = requireNonNull(symbolAllocator, "symbolAllocator is null"); this.idAllocator = requireNonNull(idAllocator, "idAllocator is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.session = requireNonNull(session, "session is null"); } @@ -131,8 +125,7 @@ public PlanNode visitJoin(JoinNode node, RewriteContext context) ImmutableSet.copyOf(leftJoinSymbols), symbolAllocator, idAllocator, - metadata, - typeOperators, + plannerContext, session); if (leftIndexCandidate.isPresent()) { // Sanity check that we can trace the path for the index lookup key @@ -145,8 +138,7 @@ public PlanNode visitJoin(JoinNode node, RewriteContext context) ImmutableSet.copyOf(rightJoinSymbols), symbolAllocator, idAllocator, - metadata, - typeOperators, + plannerContext, session); if (rightIndexCandidate.isPresent()) { // Sanity check that we can trace the path for the index lookup key @@ -255,23 +247,20 @@ private static class IndexSourceRewriter { private final SymbolAllocator symbolAllocator; private final PlanNodeIdAllocator idAllocator; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final DomainTranslator domainTranslator; private final Session session; private IndexSourceRewriter( SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.domainTranslator = new DomainTranslator(session, metadata); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.domainTranslator = new DomainTranslator(plannerContext); this.symbolAllocator = requireNonNull(symbolAllocator, "symbolAllocator is null"); this.idAllocator = requireNonNull(idAllocator, "idAllocator is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); this.session = requireNonNull(session, "session is null"); } @@ -280,12 +269,11 @@ public static Optional rewriteWithIndex( Set lookupSymbols, SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session) { AtomicBoolean success = new AtomicBoolean(); - IndexSourceRewriter indexSourceRewriter = new IndexSourceRewriter(symbolAllocator, idAllocator, metadata, typeOperators, session); + IndexSourceRewriter indexSourceRewriter = new IndexSourceRewriter(symbolAllocator, idAllocator, plannerContext, session); PlanNode rewritten = SimplePlanRewriter.rewriteWith(indexSourceRewriter, planNode, new Context(lookupSymbols, success)); if (success.get()) { return Optional.of(rewritten); @@ -308,9 +296,8 @@ public PlanNode visitTableScan(TableScanNode node, RewriteContext conte private PlanNode planTableScan(TableScanNode node, Expression predicate, Context context) { - DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.fromPredicate( - metadata, - typeOperators, + DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.getExtractionResult( + plannerContext, session, predicate, symbolAllocator.getTypes()); @@ -327,7 +314,7 @@ private PlanNode planTableScan(TableScanNode node, Expression predicate, Context Set outputColumns = node.getOutputSymbols().stream().map(node.getAssignments()::get).collect(toImmutableSet()); - Optional optionalResolvedIndex = metadata.resolveIndex(session, node.getTable(), lookupColumns, outputColumns, simplifiedConstraint); + Optional optionalResolvedIndex = plannerContext.getMetadata().resolveIndex(session, node.getTable(), lookupColumns, outputColumns, simplifiedConstraint); if (optionalResolvedIndex.isEmpty()) { // No index available, so give up by returning something return node; @@ -345,8 +332,8 @@ private PlanNode planTableScan(TableScanNode node, Expression predicate, Context node.getAssignments()); Expression resultingPredicate = combineConjuncts( - metadata, - domainTranslator.toPredicate(resolvedIndex.getUnresolvedTupleDomain().transformKeys(inverseAssignments::get)), + plannerContext.getMetadata(), + domainTranslator.toPredicate(session, resolvedIndex.getUnresolvedTupleDomain().transformKeys(inverseAssignments::get)), decomposedPredicate.getRemainingExpression()); if (!resultingPredicate.equals(TRUE_LITERAL)) { @@ -392,7 +379,7 @@ public PlanNode visitWindow(WindowNode node, RewriteContext context) .map(ResolvedFunction::getSignature) .map(BoundSignature::getName) .map(QualifiedName::of) - .allMatch(metadata::isAggregationFunction)) { + .allMatch(plannerContext.getMetadata()::isAggregationFunction)) { return node; } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java index 9ef7ce9808f8..d94532470289 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/MetadataQueryOptimizer.java @@ -20,7 +20,6 @@ import io.trino.Session; import io.trino.SystemSessionProperties; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.TableProperties; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ColumnMetadata; @@ -28,6 +27,7 @@ import io.trino.spi.predicate.NullableValue; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.LiteralEncoder; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; @@ -65,13 +65,11 @@ public class MetadataQueryOptimizer { private static final Set ALLOWED_FUNCTIONS = ImmutableSet.of("max", "min", "approx_distinct"); - private final Metadata metadata; + private final PlannerContext plannerContext; - public MetadataQueryOptimizer(Metadata metadata) + public MetadataQueryOptimizer(PlannerContext plannerContext) { - requireNonNull(metadata, "metadata is null"); - - this.metadata = metadata; + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -80,7 +78,7 @@ public PlanNode optimize(PlanNode plan, Session session, TypeProvider types, Sym if (!SystemSessionProperties.isOptimizeMetadataQueries(session)) { return plan; } - return SimplePlanRewriter.rewriteWith(new Optimizer(session, metadata, idAllocator), plan, null); + return SimplePlanRewriter.rewriteWith(new Optimizer(session, plannerContext, idAllocator), plan, null); } private static class Optimizer @@ -88,14 +86,14 @@ private static class Optimizer { private final PlanNodeIdAllocator idAllocator; private final Session session; - private final Metadata metadata; + private final PlannerContext plannerContext; private final LiteralEncoder literalEncoder; - private Optimizer(Session session, Metadata metadata, PlanNodeIdAllocator idAllocator) + private Optimizer(Session session, PlannerContext plannerContext, PlanNodeIdAllocator idAllocator) { this.session = session; - this.metadata = metadata; - this.literalEncoder = new LiteralEncoder(session, metadata); + this.plannerContext = plannerContext; + this.literalEncoder = new LiteralEncoder(plannerContext); this.idAllocator = idAllocator; } @@ -126,7 +124,7 @@ public PlanNode visitAggregation(AggregationNode node, RewriteContext cont } for (Symbol symbol : inputs) { ColumnHandle column = tableScan.getAssignments().get(symbol); - ColumnMetadata columnMetadata = metadata.getColumnMetadata(session, tableScan.getTable(), column); + ColumnMetadata columnMetadata = plannerContext.getMetadata().getColumnMetadata(session, tableScan.getTable(), column); typesBuilder.put(symbol, columnMetadata.getType()); columnBuilder.put(symbol, column); @@ -137,7 +135,7 @@ public PlanNode visitAggregation(AggregationNode node, RewriteContext cont // Materialize the list of partitions and replace the TableScan node // with a Values node - TableProperties layout = metadata.getTableProperties(session, tableScan.getTable()); + TableProperties layout = plannerContext.getMetadata().getTableProperties(session, tableScan.getTable()); if (layout.getDiscretePredicates().isEmpty()) { return context.defaultRewrite(node); } @@ -164,7 +162,7 @@ public PlanNode visitAggregation(AggregationNode node, RewriteContext cont return context.defaultRewrite(node); } else { - rowBuilder.add(literalEncoder.toExpression(value.getValue(), type)); + rowBuilder.add(literalEncoder.toExpression(session, value.getValue(), type)); } } rowsBuilder.add(new Row(rowBuilder.build())); @@ -190,7 +188,7 @@ private Optional findTableScan(PlanNode source) else if (source instanceof ProjectNode) { // verify projections are deterministic ProjectNode project = (ProjectNode) source; - if (!Iterables.all(project.getAssignments().getExpressions(), expression -> isDeterministic(expression, metadata))) { + if (!Iterables.all(project.getAssignments().getExpressions(), expression -> isDeterministic(expression, plannerContext.getMetadata()))) { return Optional.empty(); } source = project.getSource(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PlanNodeDecorrelator.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PlanNodeDecorrelator.java index 5a0d87c0b8d0..086da0a92733 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PlanNodeDecorrelator.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PlanNodeDecorrelator.java @@ -21,10 +21,11 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; -import io.trino.metadata.Metadata; import io.trino.spi.connector.SortOrder; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import io.trino.sql.ExpressionUtils; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.OrderingScheme; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.SymbolAllocator; @@ -71,17 +72,17 @@ public class PlanNodeDecorrelator { - private final Metadata metadata; + private final PlannerContext plannerContext; private final SymbolAllocator symbolAllocator; private final Lookup lookup; private final TypeCoercion typeCoercion; - public PlanNodeDecorrelator(Metadata metadata, SymbolAllocator symbolAllocator, Lookup lookup) + public PlanNodeDecorrelator(PlannerContext plannerContext, SymbolAllocator symbolAllocator, Lookup lookup) { - this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.symbolAllocator = requireNonNull(symbolAllocator, "symbolAllocator is null"); this.lookup = requireNonNull(lookup, "lookup is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.typeCoercion = new TypeCoercion(plannerContext.getTypeManager()::getType); } public Optional decorrelateFilters(PlanNode node, List correlation) @@ -90,7 +91,7 @@ public Optional decorrelateFilters(PlanNode node, List return Optional.of(new DecorrelatedNode(ImmutableList.of(), node)); } - Optional decorrelationResultOptional = node.accept(new DecorrelatingVisitor(metadata, correlation), null); + Optional decorrelationResultOptional = node.accept(new DecorrelatingVisitor(plannerContext.getTypeManager(), correlation), null); return decorrelationResultOptional.flatMap(decorrelationResult -> decorrelatedNode( decorrelationResult.correlatedPredicates, decorrelationResult.node, @@ -100,12 +101,12 @@ public Optional decorrelateFilters(PlanNode node, List private class DecorrelatingVisitor extends PlanVisitor, Void> { - private final Metadata metadata; + private final TypeManager typeManager; private final List correlation; - DecorrelatingVisitor(Metadata metadata, List correlation) + DecorrelatingVisitor(TypeManager typeManager, List correlation) { - this.metadata = metadata; + this.typeManager = requireNonNull(typeManager, "typeManager is null"); this.correlation = requireNonNull(correlation, "correlation is null"); } @@ -160,7 +161,7 @@ public Optional visitFilter(FilterNode node, Void context) FilterNode newFilterNode = new FilterNode( node.getId(), childDecorrelationResult.node, - ExpressionUtils.combineConjuncts(metadata, uncorrelatedPredicates)); + ExpressionUtils.combineConjuncts(plannerContext.getMetadata(), uncorrelatedPredicates)); Set symbolsToPropagate = Sets.difference(SymbolsExtractor.extractUnique(correlatedPredicates), ImmutableSet.copyOf(correlation)); return Optional.of(new DecorrelationResult( @@ -545,7 +546,7 @@ private Set extractConstantSymbols(List correlatedConjuncts) // checks whether the expression is a deterministic combination of correlation symbols private boolean isConstant(Expression expression) { - return isDeterministic(expression, metadata) && + return isDeterministic(expression, plannerContext.getMetadata()) && ImmutableSet.copyOf(correlation).containsAll(SymbolsExtractor.extractUnique(expression)); } @@ -562,7 +563,7 @@ private boolean isSimpleInjectiveCast(Expression expression) Symbol sourceSymbol = Symbol.from(cast.getExpression()); Type sourceType = symbolAllocator.getTypes().get(sourceSymbol); - Type targetType = metadata.getType(toTypeSignature(((Cast) expression).getType())); + Type targetType = typeManager.getType(toTypeSignature(((Cast) expression).getType())); return typeCoercion.isInjectiveCoercion(sourceType, targetType); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java index ee069f423157..16341610f9ea 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PredicatePushDown.java @@ -24,7 +24,7 @@ import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.Metadata; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.EffectivePredicateExtractor; import io.trino.sql.planner.EqualityInference; @@ -125,21 +125,18 @@ public class PredicatePushDown LESS_THAN, LESS_THAN_OR_EQUAL); - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; private final boolean useTableProperties; private final boolean dynamicFiltering; public PredicatePushDown( - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, boolean useTableProperties, boolean dynamicFiltering) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.useTableProperties = useTableProperties; this.dynamicFiltering = dynamicFiltering; @@ -154,7 +151,7 @@ public PlanNode optimize(PlanNode plan, Session session, TypeProvider types, Sym requireNonNull(idAllocator, "idAllocator is null"); return SimplePlanRewriter.rewriteWith( - new Rewriter(symbolAllocator, idAllocator, metadata, typeOperators, typeAnalyzer, session, types, useTableProperties, dynamicFiltering), + new Rewriter(symbolAllocator, idAllocator, plannerContext, typeAnalyzer, session, types, useTableProperties, dynamicFiltering), plan, TRUE_LITERAL); } @@ -164,8 +161,8 @@ private static class Rewriter { private final SymbolAllocator symbolAllocator; private final PlanNodeIdAllocator idAllocator; + private final PlannerContext plannerContext; private final Metadata metadata; - private final TypeOperators typeOperators; private final TypeAnalyzer typeAnalyzer; private final Session session; private final TypeProvider types; @@ -177,8 +174,7 @@ private static class Rewriter private Rewriter( SymbolAllocator symbolAllocator, PlanNodeIdAllocator idAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, Session session, TypeProvider types, @@ -187,19 +183,19 @@ private Rewriter( { this.symbolAllocator = requireNonNull(symbolAllocator, "symbolAllocator is null"); this.idAllocator = requireNonNull(idAllocator, "idAllocator is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); + this.metadata = plannerContext.getMetadata(); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.session = requireNonNull(session, "session is null"); this.types = requireNonNull(types, "types is null"); - this.expressionEquivalence = new ExpressionEquivalence(metadata, typeAnalyzer); + this.expressionEquivalence = new ExpressionEquivalence(plannerContext.getMetadata(), typeAnalyzer); this.dynamicFiltering = dynamicFiltering; this.effectivePredicateExtractor = new EffectivePredicateExtractor( - new DomainTranslator(session, metadata), - metadata, + new DomainTranslator(plannerContext), + plannerContext, useTableProperties && isPredicatePushdownUseTableProperties(session)); - this.literalEncoder = new LiteralEncoder(session, metadata); + this.literalEncoder = new LiteralEncoder(plannerContext); } @Override @@ -300,7 +296,7 @@ public PlanNode visitProject(ProjectNode node, RewriteContext contex List inlinedDeterministicConjuncts = inlineConjuncts.get(true).stream() .map(entry -> inlineSymbols(node.getAssignments().getMap(), entry)) .map(conjunct -> canonicalizeExpression(conjunct, typeAnalyzer.getTypes(session, types, conjunct), metadata, session)) // normalize expressions to a form that unwrapCasts understands - .map(conjunct -> unwrapCasts(session, metadata, typeOperators, typeAnalyzer, types, conjunct)) + .map(conjunct -> unwrapCasts(session, plannerContext, typeAnalyzer, types, conjunct)) .collect(Collectors.toList()); PlanNode rewrittenNode = context.defaultRewrite(node, combineConjuncts(metadata, inlinedDeterministicConjuncts)); @@ -1225,8 +1221,8 @@ private boolean canConvertOuterToInner(List innerSymbolsForOuterJoin, Ex private Expression simplifyExpression(Expression expression) { Map, Type> expressionTypes = typeAnalyzer.getTypes(session, symbolAllocator.getTypes(), expression); - ExpressionInterpreter optimizer = new ExpressionInterpreter(expression, metadata, session, expressionTypes); - return literalEncoder.toExpression(optimizer.optimize(NoOpSymbolResolver.INSTANCE), expressionTypes.get(NodeRef.of(expression))); + ExpressionInterpreter optimizer = new ExpressionInterpreter(expression, plannerContext, session, expressionTypes); + return literalEncoder.toExpression(session, optimizer.optimize(NoOpSymbolResolver.INSTANCE), expressionTypes.get(NodeRef.of(expression))); } private boolean areExpressionsEquivalent(Expression leftExpression, Expression rightExpression) @@ -1240,7 +1236,7 @@ private boolean areExpressionsEquivalent(Expression leftExpression, Expression r private Object nullInputEvaluator(Collection nullSymbols, Expression expression) { Map, Type> expressionTypes = typeAnalyzer.getTypes(session, symbolAllocator.getTypes(), expression); - return new ExpressionInterpreter(expression, metadata, session, expressionTypes) + return new ExpressionInterpreter(expression, plannerContext, session, expressionTypes) .optimize(symbol -> nullSymbols.contains(symbol) ? null : symbol.toSymbolReference()); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java index 5501ecfbe3a2..088e09f86aa0 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/PropertyDerivations.java @@ -21,7 +21,6 @@ import com.google.common.collect.Sets; import io.trino.Session; import io.trino.SystemSessionProperties; -import io.trino.metadata.Metadata; import io.trino.metadata.TableProperties; import io.trino.metadata.TableProperties.TablePartitioning; import io.trino.spi.connector.ColumnHandle; @@ -30,7 +29,7 @@ import io.trino.spi.connector.LocalProperty; import io.trino.spi.predicate.NullableValue; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.ExpressionInterpreter; import io.trino.sql.planner.NoOpSymbolResolver; @@ -119,28 +118,26 @@ private PropertyDerivations() {} public static ActualProperties derivePropertiesRecursively( PlanNode node, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { List inputProperties = node.getSources().stream() - .map(source -> derivePropertiesRecursively(source, metadata, typeOperators, session, types, typeAnalyzer)) + .map(source -> derivePropertiesRecursively(source, plannerContext, session, types, typeAnalyzer)) .collect(toImmutableList()); - return deriveProperties(node, inputProperties, metadata, typeOperators, session, types, typeAnalyzer); + return deriveProperties(node, inputProperties, plannerContext, session, types, typeAnalyzer); } public static ActualProperties deriveProperties( PlanNode node, List inputProperties, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { - ActualProperties output = node.accept(new Visitor(metadata, typeOperators, session, types, typeAnalyzer), inputProperties); + ActualProperties output = node.accept(new Visitor(plannerContext, session, types, typeAnalyzer), inputProperties); output.getNodePartitioning().ifPresent(partitioning -> verify(node.getOutputSymbols().containsAll(partitioning.getColumns()), "Node-level partitioning properties contain columns not present in node's output")); @@ -158,28 +155,25 @@ public static ActualProperties deriveProperties( public static ActualProperties streamBackdoorDeriveProperties( PlanNode node, List inputProperties, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { - return node.accept(new Visitor(metadata, typeOperators, session, types, typeAnalyzer), inputProperties); + return node.accept(new Visitor(plannerContext, session, types, typeAnalyzer), inputProperties); } private static class Visitor extends PlanVisitor> { - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final Session session; private final TypeProvider types; private final TypeAnalyzer typeAnalyzer; - public Visitor(Metadata metadata, TypeOperators typeOperators, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) + public Visitor(PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { - this.metadata = metadata; - this.typeOperators = typeOperators; + this.plannerContext = plannerContext; this.session = session; this.types = types; this.typeAnalyzer = typeAnalyzer; @@ -701,9 +695,8 @@ public ActualProperties visitFilter(FilterNode node, List inpu { ActualProperties properties = Iterables.getOnlyElement(inputProperties); - DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.fromPredicate( - metadata, - typeOperators, + DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.getExtractionResult( + plannerContext, session, node.getPredicate(), types); @@ -732,7 +725,7 @@ public ActualProperties visitProject(ProjectNode node, List in Map, Type> expressionTypes = typeAnalyzer.getTypes(session, types, expression); Type type = requireNonNull(expressionTypes.get(NodeRef.of(expression))); - ExpressionInterpreter optimizer = new ExpressionInterpreter(expression, metadata, session, expressionTypes); + ExpressionInterpreter optimizer = new ExpressionInterpreter(expression, plannerContext, session, expressionTypes); // TODO: // We want to use a symbol resolver that looks up in the constants from the input subplan // to take advantage of constant-folding for complex expressions @@ -823,7 +816,7 @@ public ActualProperties visitValues(ValuesNode node, List cont @Override public ActualProperties visitTableScan(TableScanNode node, List inputProperties) { - TableProperties layout = metadata.getTableProperties(session, node.getTable()); + TableProperties layout = plannerContext.getMetadata().getTableProperties(session, node.getTable()); Map assignments = ImmutableBiMap.copyOf(node.getAssignments()).inverse(); ActualProperties.Builder properties = ActualProperties.builder(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java index fb9c0393d686..2a04e2f95f1d 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/StreamPropertyDerivations.java @@ -24,7 +24,7 @@ import io.trino.metadata.TableProperties; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.LocalProperty; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Partitioning.ArgumentBinding; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; @@ -106,42 +106,39 @@ private StreamPropertyDerivations() {} public static StreamProperties derivePropertiesRecursively( PlanNode node, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { List inputProperties = node.getSources().stream() - .map(source -> derivePropertiesRecursively(source, metadata, typeOperators, session, types, typeAnalyzer)) + .map(source -> derivePropertiesRecursively(source, plannerContext, session, types, typeAnalyzer)) .collect(toImmutableList()); - return deriveProperties(node, inputProperties, metadata, typeOperators, session, types, typeAnalyzer); + return deriveProperties(node, inputProperties, plannerContext, session, types, typeAnalyzer); } public static StreamProperties deriveProperties( PlanNode node, StreamProperties inputProperties, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { - return deriveProperties(node, ImmutableList.of(inputProperties), metadata, typeOperators, session, types, typeAnalyzer); + return deriveProperties(node, ImmutableList.of(inputProperties), plannerContext, session, types, typeAnalyzer); } public static StreamProperties deriveProperties( PlanNode node, List inputProperties, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session, TypeProvider types, TypeAnalyzer typeAnalyzer) { requireNonNull(node, "node is null"); requireNonNull(inputProperties, "inputProperties is null"); - requireNonNull(metadata, "metadata is null"); + requireNonNull(plannerContext, "plannerContext is null"); requireNonNull(session, "session is null"); requireNonNull(types, "types is null"); requireNonNull(typeAnalyzer, "typeAnalyzer is null"); @@ -154,13 +151,12 @@ public static StreamProperties deriveProperties( inputProperties.stream() .map(properties -> properties.otherActualProperties) .collect(toImmutableList()), - metadata, - typeOperators, + plannerContext, session, types, typeAnalyzer); - StreamProperties result = node.accept(new Visitor(metadata, session), inputProperties) + StreamProperties result = node.accept(new Visitor(plannerContext.getMetadata(), session), inputProperties) .withOtherActualProperties(otherProperties); result.getPartitioningColumns().ifPresent(columns -> diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/WindowFilterPushDown.java b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/WindowFilterPushDown.java index 15654e13e261..43189b43b5a0 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/WindowFilterPushDown.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/optimizations/WindowFilterPushDown.java @@ -17,13 +17,12 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.FunctionId; -import io.trino.metadata.Metadata; import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.Range; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.predicate.ValueSet; -import io.trino.spi.type.TypeOperators; import io.trino.sql.ExpressionUtils; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; @@ -51,7 +50,6 @@ import static io.trino.spi.predicate.Range.range; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.sql.planner.DomainTranslator.ExtractionResult; -import static io.trino.sql.planner.DomainTranslator.fromPredicate; import static io.trino.sql.planner.plan.ChildReplacer.replaceChildren; import static io.trino.sql.planner.plan.TopNRankingNode.RankingType.RANK; import static io.trino.sql.planner.plan.TopNRankingNode.RankingType.ROW_NUMBER; @@ -61,13 +59,11 @@ public class WindowFilterPushDown implements PlanOptimizer { - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; - public WindowFilterPushDown(Metadata metadata, TypeOperators typeOperators) + public WindowFilterPushDown(PlannerContext plannerContext) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); } @Override @@ -79,15 +75,14 @@ public PlanNode optimize(PlanNode plan, Session session, TypeProvider types, Sym requireNonNull(symbolAllocator, "symbolAllocator is null"); requireNonNull(idAllocator, "idAllocator is null"); - return SimplePlanRewriter.rewriteWith(new Rewriter(idAllocator, metadata, typeOperators, session, types), plan, null); + return SimplePlanRewriter.rewriteWith(new Rewriter(idAllocator, plannerContext, session, types), plan, null); } private static class Rewriter extends SimplePlanRewriter { private final PlanNodeIdAllocator idAllocator; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final Session session; private final TypeProvider types; private final FunctionId rowNumberFunctionId; @@ -96,19 +91,17 @@ private static class Rewriter private Rewriter( PlanNodeIdAllocator idAllocator, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, Session session, TypeProvider types) { this.idAllocator = requireNonNull(idAllocator, "idAllocator is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.session = requireNonNull(session, "session is null"); this.types = requireNonNull(types, "types is null"); - rowNumberFunctionId = metadata.resolveFunction(session, QualifiedName.of("row_number"), ImmutableList.of()).getFunctionId(); - rankFunctionId = metadata.resolveFunction(session, QualifiedName.of("rank"), ImmutableList.of()).getFunctionId(); - domainTranslator = new DomainTranslator(session, metadata); + rowNumberFunctionId = plannerContext.getMetadata().resolveFunction(session, QualifiedName.of("row_number"), ImmutableList.of()).getFunctionId(); + rankFunctionId = plannerContext.getMetadata().resolveFunction(session, QualifiedName.of("rank"), ImmutableList.of()).getFunctionId(); + domainTranslator = new DomainTranslator(plannerContext); } @Override @@ -173,7 +166,7 @@ public PlanNode visitFilter(FilterNode node, RewriteContext context) { PlanNode source = context.rewrite(node.getSource()); - TupleDomain tupleDomain = fromPredicate(metadata, typeOperators, session, node.getPredicate(), types).getTupleDomain(); + TupleDomain tupleDomain = DomainTranslator.getExtractionResult(plannerContext, session, node.getPredicate(), types).getTupleDomain(); if (source instanceof RowNumberNode) { Symbol rowNumberSymbol = ((RowNumberNode) source).getRowNumberSymbol(); @@ -208,7 +201,7 @@ else if (source instanceof WindowNode && isOptimizeTopNRanking(session)) { private PlanNode rewriteFilterSource(FilterNode filterNode, PlanNode source, Symbol rankingSymbol, int upperBound) { - ExtractionResult extractionResult = fromPredicate(metadata, typeOperators, session, filterNode.getPredicate(), types); + ExtractionResult extractionResult = DomainTranslator.getExtractionResult(plannerContext, session, filterNode.getPredicate(), types); TupleDomain tupleDomain = extractionResult.getTupleDomain(); if (!allRankingValuesInDomain(tupleDomain, rankingSymbol, upperBound)) { @@ -218,9 +211,9 @@ private PlanNode rewriteFilterSource(FilterNode filterNode, PlanNode source, Sym // Remove the ranking domain because it is absorbed into the node TupleDomain newTupleDomain = tupleDomain.filter((symbol, domain) -> !symbol.equals(rankingSymbol)); Expression newPredicate = ExpressionUtils.combineConjuncts( - metadata, + plannerContext.getMetadata(), extractionResult.getRemainingExpression(), - domainTranslator.toPredicate(newTupleDomain)); + domainTranslator.toPredicate(session, newTupleDomain)); if (newPredicate.equals(BooleanLiteral.TRUE_LITERAL)) { return source; diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregations.java b/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregations.java index 270a1c42e218..9ac0e86035d5 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/plan/StatisticAggregations.java @@ -18,10 +18,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.trino.metadata.AggregationFunctionMetadata; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.SymbolAllocator; import io.trino.sql.planner.plan.AggregationNode.Aggregation; @@ -59,7 +59,7 @@ public List getGroupingSymbols() return groupingSymbols; } - public Parts createPartialAggregations(SymbolAllocator symbolAllocator, Metadata metadata) + public Parts createPartialAggregations(SymbolAllocator symbolAllocator, PlannerContext plannerContext) { ImmutableMap.Builder partialAggregation = ImmutableMap.builder(); ImmutableMap.Builder finalAggregation = ImmutableMap.builder(); @@ -67,9 +67,9 @@ public Parts createPartialAggregations(SymbolAllocator symbolAllocator, Metadata for (Map.Entry entry : aggregations.entrySet()) { Aggregation originalAggregation = entry.getValue(); ResolvedFunction resolvedFunction = originalAggregation.getResolvedFunction(); - AggregationFunctionMetadata functionMetadata = metadata.getAggregationFunctionMetadata(resolvedFunction); + AggregationFunctionMetadata functionMetadata = plannerContext.getMetadata().getAggregationFunctionMetadata(resolvedFunction); List intermediateTypes = functionMetadata.getIntermediateTypes().stream() - .map(metadata::getType) + .map(plannerContext.getTypeManager()::getType) .collect(toImmutableList()); Type intermediateType = intermediateTypes.size() == 1 ? intermediateTypes.get(0) : RowType.anonymous(intermediateTypes); Symbol partialSymbol = symbolAllocator.newSymbol(resolvedFunction.getSignature().getName(), intermediateType); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/IoPlanPrinter.java b/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/IoPlanPrinter.java index c422a62a9f99..a2a7138cd0fd 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/IoPlanPrinter.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/planprinter/IoPlanPrinter.java @@ -20,7 +20,6 @@ import io.trino.cost.PlanCostEstimate; import io.trino.cost.PlanNodeStatsEstimate; import io.trino.cost.StatsAndCosts; -import io.trino.metadata.Metadata; import io.trino.metadata.TableHandle; import io.trino.metadata.TableMetadata; import io.trino.spi.connector.CatalogSchemaTableName; @@ -30,7 +29,7 @@ import io.trino.spi.predicate.Range; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.DomainTranslator; import io.trino.sql.planner.Plan; import io.trino.sql.planner.plan.FilterNode; @@ -65,26 +64,24 @@ public class IoPlanPrinter { private final Plan plan; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final Session session; private final ValuePrinter valuePrinter; - private IoPlanPrinter(Plan plan, Metadata metadata, TypeOperators typeOperators, Session session) + private IoPlanPrinter(Plan plan, PlannerContext plannerContext, Session session) { this.plan = requireNonNull(plan, "plan is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.session = requireNonNull(session, "session is null"); - this.valuePrinter = new ValuePrinter(metadata, session); + this.valuePrinter = new ValuePrinter(plannerContext.getMetadata(), session); } /** * @throws io.trino.NotInTransactionException if called without an active transaction */ - public static String textIoPlan(Plan plan, Metadata metadata, TypeOperators typeOperators, Session session) + public static String textIoPlan(Plan plan, PlannerContext plannerContext, Session session) { - return new IoPlanPrinter(plan, metadata, typeOperators, session).print(); + return new IoPlanPrinter(plan, plannerContext, session).print(); } private String print() @@ -618,9 +615,8 @@ public Void visitFilter(FilterNode node, IoPlanBuilder context) PlanNode source = node.getSource(); if (source instanceof TableScanNode) { TableScanNode tableScanNode = (TableScanNode) source; - DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.fromPredicate( - metadata, - typeOperators, + DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.getExtractionResult( + plannerContext, session, node.getPredicate(), plan.getTypes()); @@ -691,8 +687,8 @@ else if (writerTarget instanceof CreateReference || writerTarget instanceof Inse private void addInputTableConstraints(TupleDomain filterDomain, TableScanNode tableScan, IoPlanBuilder context) { TableHandle table = tableScan.getTable(); - TableMetadata tableMetadata = metadata.getTableMetadata(session, table); - TupleDomain predicateDomain = metadata.getTableProperties(session, table).getPredicate(); + TableMetadata tableMetadata = plannerContext.getMetadata().getTableMetadata(session, table); + TupleDomain predicateDomain = plannerContext.getMetadata().getTableProperties(session, table).getPredicate(); EstimatedStatsAndCost estimatedStatsAndCost = getEstimatedStatsAndCost(tableScan); context.addInputTableColumnInfo( new IoPlan.TableColumnInfo( @@ -724,7 +720,7 @@ private Set parseConstraints(TableHandle tableHandle, TupleDom checkArgument(!constraint.isNone()); ImmutableSet.Builder columnConstraints = ImmutableSet.builder(); for (Map.Entry entry : constraint.getDomains().get().entrySet()) { - ColumnMetadata columnMetadata = metadata.getColumnMetadata(session, tableHandle, entry.getKey()); + ColumnMetadata columnMetadata = plannerContext.getMetadata().getColumnMetadata(session, tableHandle, entry.getKey()); columnConstraints.add(new ColumnConstraint( columnMetadata.getName(), columnMetadata.getType(), diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/AllFunctionsResolved.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/AllFunctionsResolved.java index aa49abce8a2b..b71328a03b1a 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/AllFunctionsResolved.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/AllFunctionsResolved.java @@ -16,9 +16,8 @@ import com.google.common.collect.ImmutableList.Builder; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ExpressionExtractor; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; @@ -39,8 +38,7 @@ public final class AllFunctionsResolved public void validate( PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/DynamicFiltersChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/DynamicFiltersChecker.java index 7606f3be708f..9763e5253268 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/DynamicFiltersChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/DynamicFiltersChecker.java @@ -18,9 +18,8 @@ import io.trino.Session; import io.trino.cost.StatsAndCosts; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; import io.trino.sql.DynamicFilters; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.SubExpressionExtractor; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -57,8 +56,7 @@ public class DynamicFiltersChecker public void validate( PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) @@ -69,7 +67,7 @@ public void validate( catch (RuntimeException e) { try { int nestLevel = 4; // so that it renders reasonably within exception stacktrace - String explain = textLogicalPlan(plan, types, metadata, StatsAndCosts.empty(), session, nestLevel, false); + String explain = textLogicalPlan(plan, types, plannerContext.getMetadata(), StatsAndCosts.empty(), session, nestLevel, false); e.addSuppressed(new Exception("Current plan:\n" + explain)); } catch (RuntimeException ignore) { diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoDuplicatePlanNodeIdsChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoDuplicatePlanNodeIdsChecker.java index f839c36d1c2b..a2cc5ba28a35 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoDuplicatePlanNodeIdsChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoDuplicatePlanNodeIdsChecker.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.plan.PlanNode; @@ -37,8 +36,7 @@ public class NoDuplicatePlanNodeIdsChecker public void validate( PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoIdentifierLeftChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoIdentifierLeftChecker.java index e06564b8e9c7..e30270e2efcc 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoIdentifierLeftChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoIdentifierLeftChecker.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.ExpressionTreeUtils; import io.trino.sql.planner.ExpressionExtractor; import io.trino.sql.planner.TypeAnalyzer; @@ -33,8 +32,7 @@ public final class NoIdentifierLeftChecker public void validate( PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoSubqueryExpressionLeftChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoSubqueryExpressionLeftChecker.java index 52cd9bc1a236..205deabade79 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoSubqueryExpressionLeftChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/NoSubqueryExpressionLeftChecker.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ExpressionExtractor; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -34,8 +33,7 @@ public final class NoSubqueryExpressionLeftChecker public void validate( PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/PlanSanityChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/PlanSanityChecker.java index 44b5cd00374b..8d2a08fe8567 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/PlanSanityChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/PlanSanityChecker.java @@ -17,8 +17,7 @@ import com.google.common.collect.Multimap; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.plan.PlanNode; @@ -68,33 +67,29 @@ public PlanSanityChecker(boolean forceSingleNode) public void validateFinalPlan(PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) { - checkers.get(Stage.FINAL).forEach(checker -> checker.validate(planNode, session, metadata, typeOperators, typeAnalyzer, types, warningCollector)); + checkers.get(Stage.FINAL).forEach(checker -> checker.validate(planNode, session, plannerContext, typeAnalyzer, types, warningCollector)); } public void validateIntermediatePlan(PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) { - checkers.get(Stage.INTERMEDIATE).forEach(checker -> checker.validate(planNode, session, metadata, typeOperators, typeAnalyzer, types, warningCollector)); + checkers.get(Stage.INTERMEDIATE).forEach(checker -> checker.validate(planNode, session, plannerContext, typeAnalyzer, types, warningCollector)); } public interface Checker { void validate(PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, - TypeAnalyzer typeAnalyzer, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/SugarFreeChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/SugarFreeChecker.java index b3895ad0295f..042836a0c281 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/SugarFreeChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/SugarFreeChecker.java @@ -16,8 +16,7 @@ import com.google.common.collect.ImmutableList.Builder; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.ExpressionExtractor; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; @@ -48,8 +47,7 @@ public final class SugarFreeChecker @Override public void validate(PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableExecuteStructureValidator.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableExecuteStructureValidator.java index a7bc9213a3e9..1ec837259b3b 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableExecuteStructureValidator.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableExecuteStructureValidator.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.plan.ExchangeNode; @@ -35,7 +34,12 @@ public class TableExecuteStructureValidator implements PlanSanityChecker.Checker { @Override - public void validate(PlanNode planNode, Session session, Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) + public void validate(PlanNode planNode, + Session session, + PlannerContext plannerContext, + TypeAnalyzer typeAnalyzer, + TypeProvider types, + WarningCollector warningCollector) { Optional tableExecuteNode = searchFrom(planNode) .where(node -> node instanceof TableExecuteNode) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableScanValidator.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableScanValidator.java index 281a66b902f0..8506b4bb3f26 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableScanValidator.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TableScanValidator.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.SimplePlanVisitor; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -29,8 +28,7 @@ public class TableScanValidator @Override public void validate(PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) @@ -40,7 +38,7 @@ public void validate(PlanNode plan, @Override public Void visitTableScan(TableScanNode node, Void context) { - metadata.validateScan(session, node.getTable()); + plannerContext.getMetadata().validateScan(session, node.getTable()); return null; } }, null); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TypeValidator.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TypeValidator.java index c7d4e8377dfd..f090de4a365a 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TypeValidator.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/TypeValidator.java @@ -17,9 +17,9 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.BoundSignature; -import io.trino.metadata.Metadata; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; +import io.trino.spi.type.TypeManager; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.SimplePlanVisitor; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; @@ -51,13 +51,12 @@ public final class TypeValidator @Override public void validate(PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) { - plan.accept(new Visitor(session, metadata, typeAnalyzer, types), null); + plan.accept(new Visitor(session, plannerContext.getTypeManager(), typeAnalyzer, types), null); } private static class Visitor @@ -68,10 +67,10 @@ private static class Visitor private final TypeAnalyzer typeAnalyzer; private final TypeProvider types; - public Visitor(Session session, Metadata metadata, TypeAnalyzer typeAnalyzer, TypeProvider types) + public Visitor(Session session, TypeManager typeManager, TypeAnalyzer typeAnalyzer, TypeProvider types) { this.session = requireNonNull(session, "session is null"); - this.typeCoercion = new TypeCoercion(metadata::getType); + this.typeCoercion = new TypeCoercion(typeManager::getType); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.types = requireNonNull(types, "types is null"); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateAggregationsWithDefaultValues.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateAggregationsWithDefaultValues.java index 79eb6e6127ff..263b0e3a4934 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateAggregationsWithDefaultValues.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateAggregationsWithDefaultValues.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.optimizations.ActualProperties; @@ -63,29 +62,26 @@ public ValidateAggregationsWithDefaultValues(boolean forceSingleNode) @Override public void validate(PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) { - planNode.accept(new Visitor(session, metadata, typeOperators, typeAnalyzer, types), null); + planNode.accept(new Visitor(session, plannerContext, typeAnalyzer, types), null); } private class Visitor extends PlanVisitor, Void> { final Session session; - final Metadata metadata; - final TypeOperators typeOperators; + final PlannerContext plannerContext; final TypeAnalyzer typeAnalyzer; final TypeProvider types; - Visitor(Session session, Metadata metadata, TypeOperators typeOperators, TypeAnalyzer typeAnalyzer, TypeProvider types) + Visitor(Session session, PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types) { this.session = requireNonNull(session, "session is null"); - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.plannerContext = requireNonNull(plannerContext, "plannerContext is null"); this.typeAnalyzer = requireNonNull(typeAnalyzer, "typeAnalyzer is null"); this.types = requireNonNull(types, "types is null"); } @@ -124,14 +120,14 @@ public Optional visitAggregation(AggregationNode node, Void conte // No remote repartition exchange between final and partial aggregation. // Make sure that final aggregation operators are executed on a single node. - ActualProperties globalProperties = PropertyDerivations.derivePropertiesRecursively(node, metadata, typeOperators, session, types, typeAnalyzer); + ActualProperties globalProperties = PropertyDerivations.derivePropertiesRecursively(node, plannerContext, session, types, typeAnalyzer); checkArgument(forceSingleNode || globalProperties.isSingleNode(), "Final aggregation with default value not separated from partial aggregation by remote hash exchange"); if (!seenExchanges.localRepartitionExchange) { // No local repartition exchange between final and partial aggregation. // Make sure that final aggregation operators are executed by single thread. - StreamProperties localProperties = StreamPropertyDerivations.derivePropertiesRecursively(node, metadata, typeOperators, session, types, typeAnalyzer); + StreamProperties localProperties = StreamPropertyDerivations.derivePropertiesRecursively(node, plannerContext, session, types, typeAnalyzer); checkArgument(localProperties.isSingleStream(), "Final aggregation with default value not separated from partial aggregation by local hash exchange"); } diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java index ac69f1e1ec63..4bcfe17a66cb 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateDependenciesChecker.java @@ -18,8 +18,7 @@ import com.google.common.collect.Sets; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -97,8 +96,7 @@ public final class ValidateDependenciesChecker @Override public void validate(PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateLimitWithPresortedInput.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateLimitWithPresortedInput.java index 4df79075c9b1..66b852155ef9 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateLimitWithPresortedInput.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateLimitWithPresortedInput.java @@ -17,11 +17,10 @@ import com.google.common.collect.PeekingIterator; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.spi.connector.ConstantProperty; import io.trino.spi.connector.LocalProperty; import io.trino.spi.connector.SortingProperty; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -48,33 +47,29 @@ public class ValidateLimitWithPresortedInput @Override public void validate(PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) { - planNode.accept(new Visitor(session, metadata, typeOperators, typeAnalyzer, types), null); + planNode.accept(new Visitor(session, plannerContext, typeAnalyzer, types), null); } private static final class Visitor extends PlanVisitor { private final Session session; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; private final TypeProvider types; private Visitor(Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types) { this.session = session; - this.metadata = metadata; - this.typeOperators = typeOperators; + this.plannerContext = plannerContext; this.typeAnalyzer = typeAnalyzer; this.types = types; } @@ -96,7 +91,7 @@ public Void visitLimit(LimitNode node, Void context) return null; } - StreamProperties properties = derivePropertiesRecursively(node.getSource(), metadata, typeOperators, session, types, typeAnalyzer); + StreamProperties properties = derivePropertiesRecursively(node.getSource(), plannerContext, session, types, typeAnalyzer); PeekingIterator> actuals = peekingIterator(normalizeAndPrune(properties.getLocalProperties()).iterator()); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateStreamingAggregations.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateStreamingAggregations.java index 7fc7523cd1db..555bd27278f8 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateStreamingAggregations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/ValidateStreamingAggregations.java @@ -17,10 +17,9 @@ import com.google.common.collect.Iterators; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.spi.connector.GroupingProperty; import io.trino.spi.connector.LocalProperty; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -47,33 +46,29 @@ public class ValidateStreamingAggregations @Override public void validate(PlanNode planNode, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) { - planNode.accept(new Visitor(session, metadata, typeOperators, typeAnalyzer, types), null); + planNode.accept(new Visitor(session, plannerContext, typeAnalyzer, types), null); } private static final class Visitor extends PlanVisitor { private final Session session; - private final Metadata metadata; - private final TypeOperators typeOperators; + private final PlannerContext plannerContext; private final TypeAnalyzer typeAnalyzer; private final TypeProvider types; private Visitor(Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types) { this.session = session; - this.metadata = metadata; - this.typeOperators = typeOperators; + this.plannerContext = plannerContext; this.typeAnalyzer = typeAnalyzer; this.types = types; } @@ -92,7 +87,7 @@ public Void visitAggregation(AggregationNode node, Void context) return null; } - StreamProperties properties = derivePropertiesRecursively(node.getSource(), metadata, typeOperators, session, types, typeAnalyzer); + StreamProperties properties = derivePropertiesRecursively(node.getSource(), plannerContext, session, types, typeAnalyzer); List> desiredProperties = ImmutableList.of(new GroupingProperty<>(node.getPreGroupedSymbols())); Iterator>> matchIterator = LocalProperties.match(properties.getLocalProperties(), desiredProperties).iterator(); diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyNoFilteredAggregations.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyNoFilteredAggregations.java index a6e12452dc1e..80c26f18c0a1 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyNoFilteredAggregations.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyNoFilteredAggregations.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.plan.AggregationNode; @@ -30,8 +29,7 @@ public final class VerifyNoFilteredAggregations @Override public void validate(PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyOnlyOneOutputNode.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyOnlyOneOutputNode.java index 73394fd1f801..cad94f097e49 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyOnlyOneOutputNode.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyOnlyOneOutputNode.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.plan.OutputNode; @@ -31,8 +30,7 @@ public final class VerifyOnlyOneOutputNode @Override public void validate(PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyUseConnectorNodePartitioningSet.java b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyUseConnectorNodePartitioningSet.java index 23e3e4825078..63d636dcbf3a 100644 --- a/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyUseConnectorNodePartitioningSet.java +++ b/core/trino-main/src/main/java/io/trino/sql/planner/sanity/VerifyUseConnectorNodePartitioningSet.java @@ -15,8 +15,7 @@ import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.plan.PlanNode; @@ -31,8 +30,7 @@ public final class VerifyUseConnectorNodePartitioningSet @Override public void validate(PlanNode plan, Session session, - Metadata metadata, - TypeOperators typeOperators, + PlannerContext plannerContext, TypeAnalyzer typeAnalyzer, TypeProvider types, WarningCollector warningCollector) diff --git a/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java b/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java index 1a1f9a09d39b..1eaf93c46144 100644 --- a/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java +++ b/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowQueriesRewrite.java @@ -22,15 +22,20 @@ import io.trino.Session; import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; +import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.FunctionKind; import io.trino.metadata.FunctionMetadata; import io.trino.metadata.MaterializedViewDefinition; +import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.Metadata; import io.trino.metadata.MetadataUtil; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.RedirectionAwareTableHandle; +import io.trino.metadata.SchemaPropertyManager; +import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.SessionPropertyManager.SessionPropertyValue; import io.trino.metadata.TableHandle; +import io.trino.metadata.TablePropertyManager; import io.trino.metadata.ViewDefinition; import io.trino.security.AccessControl; import io.trino.spi.StandardErrorCode; @@ -156,13 +161,31 @@ public final class ShowQueriesRewrite private final Metadata metadata; private final SqlParser parser; private final AccessControl accessControl; + private final SessionPropertyManager sessionPropertyManager; + private final SchemaPropertyManager schemaPropertyManager; + private final ColumnPropertyManager columnPropertyManager; + private final TablePropertyManager tablePropertyManager; + private final MaterializedViewPropertyManager materializedViewPropertyManager; @Inject - public ShowQueriesRewrite(Metadata metadata, SqlParser parser, AccessControl accessControl) + public ShowQueriesRewrite( + Metadata metadata, + SqlParser parser, + AccessControl accessControl, + SessionPropertyManager sessionPropertyManager, + SchemaPropertyManager schemaPropertyManager, + ColumnPropertyManager columnPropertyManager, + TablePropertyManager tablePropertyManager, + MaterializedViewPropertyManager materializedViewPropertyManager) { this.metadata = requireNonNull(metadata, "metadata is null"); this.parser = requireNonNull(parser, "parser is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); + this.schemaPropertyManager = requireNonNull(schemaPropertyManager, "schemaPropertyManager is null"); + this.columnPropertyManager = requireNonNull(columnPropertyManager, "columnPropertyManager is null"); + this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); + this.materializedViewPropertyManager = requireNonNull(materializedViewPropertyManager, "materializedViewPropertyManager is null"); } @Override @@ -174,7 +197,17 @@ public Statement rewrite( Map, Expression> parameterLookup, WarningCollector warningCollector) { - return (Statement) new Visitor(metadata, parser, session, accessControl).process(node, null); + Visitor visitor = new Visitor( + metadata, + parser, + session, + accessControl, + sessionPropertyManager, + schemaPropertyManager, + columnPropertyManager, + tablePropertyManager, + materializedViewPropertyManager); + return (Statement) visitor.process(node, null); } private static class Visitor @@ -184,13 +217,32 @@ private static class Visitor private final Session session; private final SqlParser sqlParser; private final AccessControl accessControl; - - public Visitor(Metadata metadata, SqlParser sqlParser, Session session, AccessControl accessControl) + private final SessionPropertyManager sessionPropertyManager; + private final SchemaPropertyManager schemaPropertyManager; + private final ColumnPropertyManager columnPropertyManager; + private final TablePropertyManager tablePropertyManager; + private final MaterializedViewPropertyManager materializedViewPropertyManager; + + public Visitor( + Metadata metadata, + SqlParser sqlParser, + Session session, + AccessControl accessControl, + SessionPropertyManager sessionPropertyManager, + SchemaPropertyManager schemaPropertyManager, + ColumnPropertyManager columnPropertyManager, + TablePropertyManager tablePropertyManager, + MaterializedViewPropertyManager materializedViewPropertyManager) { this.metadata = requireNonNull(metadata, "metadata is null"); this.sqlParser = requireNonNull(sqlParser, "sqlParser is null"); this.session = requireNonNull(session, "session is null"); this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.sessionPropertyManager = requireNonNull(sessionPropertyManager, "sessionPropertyManager is null"); + this.schemaPropertyManager = requireNonNull(schemaPropertyManager, "schemaPropertyManager is null"); + this.columnPropertyManager = requireNonNull(columnPropertyManager, "columnPropertyManager is null"); + this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); + this.materializedViewPropertyManager = requireNonNull(materializedViewPropertyManager, "materializedViewPropertyManager is null"); } @Override @@ -539,7 +591,7 @@ protected Node visitShowCreate(ShowCreate node, Void context) accessControl.checkCanShowCreateTable(session.toSecurityContext(), new QualifiedObjectName(catalogName.getValue(), schemaName.getValue(), tableName.getValue())); Map properties = viewDefinition.get().getProperties(); - Map> allMaterializedViewProperties = metadata.getMaterializedViewPropertyManager() + Map> allMaterializedViewProperties = materializedViewPropertyManager .getAllProperties() .get(new CatalogName(catalogName.getValue())); List propertyNodes = buildProperties(objectName, Optional.empty(), INVALID_MATERIALIZED_VIEW_PROPERTY, properties, allMaterializedViewProperties); @@ -605,7 +657,7 @@ protected Node visitShowCreate(ShowCreate node, Void context) accessControl.checkCanShowCreateTable(session.toSecurityContext(), targetTableName); ConnectorTableMetadata connectorTableMetadata = metadata.getTableMetadata(session, tableHandle.get()).getMetadata(); - Map> allColumnProperties = metadata.getColumnPropertyManager().getAllProperties().get(tableHandle.get().getCatalogName()); + Map> allColumnProperties = columnPropertyManager.getAllProperties().get(tableHandle.get().getCatalogName()); List columns = connectorTableMetadata.getColumns().stream() .filter(column -> !column.isHidden()) @@ -621,7 +673,7 @@ protected Node visitShowCreate(ShowCreate node, Void context) .collect(toImmutableList()); Map properties = connectorTableMetadata.getProperties(); - Map> allTableProperties = metadata.getTablePropertyManager().getAllProperties().get(tableHandle.get().getCatalogName()); + Map> allTableProperties = tablePropertyManager.getAllProperties().get(tableHandle.get().getCatalogName()); List propertyNodes = buildProperties(targetTableName, Optional.empty(), INVALID_TABLE_PROPERTY, properties, allTableProperties); CreateTable createTable = new CreateTable( @@ -643,7 +695,7 @@ protected Node visitShowCreate(ShowCreate node, Void context) accessControl.checkCanShowCreateSchema(session.toSecurityContext(), schemaName); Map properties = metadata.getSchemaProperties(session, schemaName); - Map> allTableProperties = metadata.getSchemaPropertyManager().getAllProperties().get(new CatalogName(schemaName.getCatalogName())); + Map> allTableProperties = schemaPropertyManager.getAllProperties().get(new CatalogName(schemaName.getCatalogName())); QualifiedName qualifiedSchemaName = QualifiedName.of(schemaName.getCatalogName(), schemaName.getSchemaName()); List propertyNodes = buildProperties(qualifiedSchemaName, Optional.empty(), INVALID_SCHEMA_PROPERTY, properties, allTableProperties); @@ -768,12 +820,11 @@ private static String getFunctionType(FunctionMetadata function) } @Override - protected Node visitShowSession(ShowSession node, Void context) { ImmutableList.Builder rows = ImmutableList.builder(); SortedMap catalogNames = listCatalogs(session, metadata, accessControl); - List sessionProperties = metadata.getSessionPropertyManager().getAllSessionProperties(session, catalogNames); + List sessionProperties = sessionPropertyManager.getAllSessionProperties(session, catalogNames); for (SessionPropertyValue sessionProperty : sessionProperties) { if (sessionProperty.isHidden()) { continue; diff --git a/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java b/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java index e4756422f39a..b7bcebc205a4 100644 --- a/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java +++ b/core/trino-main/src/main/java/io/trino/testing/LocalQueryRunner.java @@ -70,15 +70,18 @@ import io.trino.memory.MemoryManagerConfig; import io.trino.memory.NodeMemoryConfig; import io.trino.metadata.AnalyzePropertyManager; +import io.trino.metadata.BlockEncodingManager; import io.trino.metadata.CatalogManager; import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.DisabledSystemSecurityMetadata; import io.trino.metadata.HandleResolver; import io.trino.metadata.InMemoryNodeManager; +import io.trino.metadata.InternalBlockEncodingSerde; import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.Metadata; import io.trino.metadata.MetadataManager; import io.trino.metadata.MetadataUtil; +import io.trino.metadata.ProcedureRegistry; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.QualifiedTablePrefix; import io.trino.metadata.SchemaPropertyManager; @@ -87,7 +90,9 @@ import io.trino.metadata.SqlFunction; import io.trino.metadata.TableHandle; import io.trino.metadata.TableProceduresPropertyManager; +import io.trino.metadata.TableProceduresRegistry; import io.trino.metadata.TablePropertyManager; +import io.trino.metadata.TypeRegistry; import io.trino.operator.Driver; import io.trino.operator.DriverContext; import io.trino.operator.DriverFactory; @@ -116,6 +121,7 @@ import io.trino.spi.Plugin; import io.trino.spi.connector.ConnectorFactory; import io.trino.spi.session.PropertyMetadata; +import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeOperators; import io.trino.spiller.FileSingleStreamSpillerFactory; import io.trino.spiller.GenericPartitioningSpillerFactory; @@ -128,10 +134,13 @@ import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; import io.trino.split.SplitSource; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.Analysis; import io.trino.sql.analyzer.Analyzer; import io.trino.sql.analyzer.AnalyzerFactory; +import io.trino.sql.analyzer.QueryExplainer; import io.trino.sql.analyzer.QueryExplainerFactory; +import io.trino.sql.analyzer.StatementAnalyzerFactory; import io.trino.sql.gen.ExpressionCompiler; import io.trino.sql.gen.JoinCompiler; import io.trino.sql.gen.JoinFilterFunctionCompiler; @@ -167,6 +176,7 @@ import io.trino.transaction.TransactionManager; import io.trino.transaction.TransactionManagerConfig; import io.trino.type.BlockTypeOperators; +import io.trino.type.InternalTypeManager; import io.trino.util.FinalizerService; import org.intellij.lang.annotations.Language; @@ -221,9 +231,8 @@ public class LocalQueryRunner private final SqlParser sqlParser; private final PlanFragmenter planFragmenter; private final InMemoryNodeManager nodeManager; - private final TypeOperators typeOperators; private final BlockTypeOperators blockTypeOperators; - private final MetadataManager metadata; + private final PlannerContext plannerContext; private final StatsCalculator statsCalculator; private final ScalarStatsCalculator scalarStatsCalculator; private final CostCalculator costCalculator; @@ -241,6 +250,11 @@ public class LocalQueryRunner private final FileSingleStreamSpillerFactory singleStreamSpillerFactory; private final SpillerFactory spillerFactory; private final PartitioningSpillerFactory partitioningSpillerFactory; + private final SessionPropertyManager sessionPropertyManager; + private final SchemaPropertyManager schemaPropertyManager; + private final ColumnPropertyManager columnPropertyManager; + private final TablePropertyManager tablePropertyManager; + private final MaterializedViewPropertyManager materializedViewPropertyManager; private final PageFunctionCompiler pageFunctionCompiler; private final ExpressionCompiler expressionCompiler; @@ -255,6 +269,7 @@ public class LocalQueryRunner private final FeaturesConfig featuresConfig; private final PlanOptimizersProvider planOptimizersProvider; private final OperatorFactories operatorFactories; + private final StatementAnalyzerFactory statementAnalyzerFactory; private boolean printPlan; private final ReadWriteLock lock = new ReentrantReadWriteLock(); @@ -296,7 +311,7 @@ private LocalQueryRunner( this.finalizerService = new FinalizerService(); finalizerService.start(); - this.typeOperators = new TypeOperators(); + TypeOperators typeOperators = new TypeOperators(); this.blockTypeOperators = new BlockTypeOperators(typeOperators); this.sqlParser = new SqlParser(); this.nodeManager = new InMemoryNodeManager(); @@ -314,32 +329,52 @@ private LocalQueryRunner( notificationExecutor); this.nodePartitioningManager = new NodePartitioningManager(nodeScheduler, blockTypeOperators); - this.metadata = new MetadataManager( + BlockEncodingManager blockEncodingManager = new BlockEncodingManager(); + TypeRegistry typeRegistry = new TypeRegistry(typeOperators, featuresConfig); + TypeManager typeManager = new InternalTypeManager(typeRegistry); + InternalBlockEncodingSerde blockEncodingSerde = new InternalBlockEncodingSerde(blockEncodingManager, typeManager); + MetadataManager metadata = new MetadataManager( featuresConfig, - createSessionPropertyManager(extraSessionProperties, taskManagerConfig, featuresConfig), - new SchemaPropertyManager(), - new TablePropertyManager(), - new MaterializedViewPropertyManager(), - new ColumnPropertyManager(), - new AnalyzePropertyManager(), - new TableProceduresPropertyManager(), new DisabledSystemSecurityMetadata(), transactionManager, typeOperators, blockTypeOperators, + typeManager, + blockEncodingSerde, nodeManager.getCurrentNode().getNodeVersion()); + this.plannerContext = new PlannerContext(metadata, typeOperators, blockEncodingSerde, typeManager); this.splitManager = new SplitManager(new QueryManagerConfig(), metadata); - this.planFragmenter = new PlanFragmenter(this.metadata, this.nodePartitioningManager, new QueryManagerConfig()); + this.planFragmenter = new PlanFragmenter(metadata, this.nodePartitioningManager, new QueryManagerConfig()); this.joinCompiler = new JoinCompiler(typeOperators); PageIndexerFactory pageIndexerFactory = new GroupByHashPageIndexerFactory(joinCompiler, blockTypeOperators); - this.statsCalculator = createNewStatsCalculator(metadata, new TypeAnalyzer(sqlParser, metadata)); - this.scalarStatsCalculator = new ScalarStatsCalculator(metadata, new TypeAnalyzer(sqlParser, metadata)); - this.taskCountEstimator = new TaskCountEstimator(() -> nodeCountForStats); - this.costCalculator = new CostCalculatorUsingExchanges(taskCountEstimator); - this.estimatedExchangesCostCalculator = new CostCalculatorWithEstimatedExchanges(costCalculator, taskCountEstimator); this.groupProvider = new TestingGroupProvider(); this.accessControl = new TestingAccessControlManager(transactionManager, eventListenerManager); accessControl.loadSystemAccessControl(AllowAllSystemAccessControl.NAME, ImmutableMap.of()); + + TableProceduresRegistry tableProceduresRegistry = new TableProceduresRegistry(); + this.sessionPropertyManager = createSessionPropertyManager(extraSessionProperties, taskManagerConfig, featuresConfig); + this.schemaPropertyManager = new SchemaPropertyManager(); + this.columnPropertyManager = new ColumnPropertyManager(); + this.tablePropertyManager = new TablePropertyManager(); + this.materializedViewPropertyManager = new MaterializedViewPropertyManager(); + AnalyzePropertyManager analyzePropertyManager = new AnalyzePropertyManager(); + TableProceduresPropertyManager tableProceduresPropertyManager = new TableProceduresPropertyManager(); + + this.statementAnalyzerFactory = new StatementAnalyzerFactory( + plannerContext, + sqlParser, + accessControl, + groupProvider, + tableProceduresRegistry, + sessionPropertyManager, + tablePropertyManager, + analyzePropertyManager, + tableProceduresPropertyManager); + this.statsCalculator = createNewStatsCalculator(plannerContext, new TypeAnalyzer(plannerContext, statementAnalyzerFactory, accessControl)); + this.scalarStatsCalculator = new ScalarStatsCalculator(plannerContext, new TypeAnalyzer(plannerContext, statementAnalyzerFactory, accessControl)); + this.taskCountEstimator = new TaskCountEstimator(() -> nodeCountForStats); + this.costCalculator = new CostCalculatorUsingExchanges(taskCountEstimator); + this.estimatedExchangesCostCalculator = new CostCalculatorWithEstimatedExchanges(costCalculator, taskCountEstimator); this.pageSourceManager = new PageSourceManager(); this.pageFunctionCompiler = new PageFunctionCompiler(metadata, 0); @@ -364,7 +399,16 @@ private LocalQueryRunner( pageIndexerFactory, transactionManager, eventListenerManager, - typeOperators, + typeManager, + new ProcedureRegistry(), + tableProceduresRegistry, + sessionPropertyManager, + schemaPropertyManager, + columnPropertyManager, + tablePropertyManager, + materializedViewPropertyManager, + analyzePropertyManager, + tableProceduresPropertyManager, nodeSchedulerConfig); GlobalSystemConnectorFactory globalSystemConnectorFactory = new GlobalSystemConnectorFactory(ImmutableSet.of( @@ -372,12 +416,12 @@ private LocalQueryRunner( new CatalogSystemTable(metadata, accessControl), new TableCommentSystemTable(metadata, accessControl), new MaterializedViewSystemTable(metadata, accessControl), - new SchemaPropertiesSystemTable(transactionManager, metadata), - new TablePropertiesSystemTable(transactionManager, metadata), - new MaterializedViewPropertiesSystemTable(transactionManager, metadata), - new ColumnPropertiesSystemTable(transactionManager, metadata), - new AnalyzePropertiesSystemTable(transactionManager, metadata), - new TransactionsSystemTable(metadata, transactionManager)), + new SchemaPropertiesSystemTable(transactionManager, schemaPropertyManager), + new TablePropertiesSystemTable(transactionManager, tablePropertyManager), + new MaterializedViewPropertiesSystemTable(transactionManager, materializedViewPropertyManager), + new ColumnPropertiesSystemTable(transactionManager, columnPropertyManager), + new AnalyzePropertiesSystemTable(transactionManager, analyzePropertyManager), + new TransactionsSystemTable(typeManager, transactionManager)), ImmutableSet.of()); this.pluginManager = new PluginManager( @@ -391,7 +435,9 @@ private LocalQueryRunner( Optional.of(new HeaderAuthenticatorManager(new HeaderAuthenticatorConfig())), eventListenerManager, new GroupProviderManager(), - new SessionPropertyDefaults(nodeInfo, accessControl)); + new SessionPropertyDefaults(nodeInfo, accessControl), + typeRegistry, + blockEncodingManager); connectorManager.addConnectorFactory(globalSystemConnectorFactory, globalSystemConnectorFactory.getClass()::getClassLoader); connectorManager.createCatalog(GlobalSystemConnector.NAME, GlobalSystemConnector.NAME, ImmutableMap.of()); @@ -420,12 +466,12 @@ private LocalQueryRunner( defaultSession.getSystemProperties(), defaultSession.getConnectorProperties(), defaultSession.getUnprocessedCatalogProperties(), - metadata.getSessionPropertyManager(), + sessionPropertyManager, defaultSession.getPreparedStatements(), defaultSession.getProtocolHeaders()); SpillerStats spillerStats = new SpillerStats(); - this.singleStreamSpillerFactory = new FileSingleStreamSpillerFactory(metadata, spillerStats, featuresConfig, nodeSpillConfig); + this.singleStreamSpillerFactory = new FileSingleStreamSpillerFactory(plannerContext.getBlockEncodingSerde(), spillerStats, featuresConfig, nodeSpillConfig); this.partitioningSpillerFactory = new GenericPartitioningSpillerFactory(this.singleStreamSpillerFactory); this.spillerFactory = new GenericSpillerFactory(singleStreamSpillerFactory); } @@ -450,12 +496,12 @@ private static SessionPropertyManager createSessionPropertyManager( return new SessionPropertyManager(systemSessionProperties); } - private static StatsCalculator createNewStatsCalculator(Metadata metadata, TypeAnalyzer typeAnalyzer) + private static StatsCalculator createNewStatsCalculator(PlannerContext plannerContext, TypeAnalyzer typeAnalyzer) { StatsNormalizer normalizer = new StatsNormalizer(); - ScalarStatsCalculator scalarStatsCalculator = new ScalarStatsCalculator(metadata, typeAnalyzer); - FilterStatsCalculator filterStatsCalculator = new FilterStatsCalculator(metadata, scalarStatsCalculator, normalizer); - return new ComposableStatsCalculator(new StatsRulesProvider(metadata, scalarStatsCalculator, filterStatsCalculator, normalizer).get()); + ScalarStatsCalculator scalarStatsCalculator = new ScalarStatsCalculator(plannerContext, typeAnalyzer); + FilterStatsCalculator filterStatsCalculator = new FilterStatsCalculator(plannerContext, scalarStatsCalculator, normalizer); + return new ComposableStatsCalculator(new StatsRulesProvider(plannerContext, scalarStatsCalculator, filterStatsCalculator, normalizer).get()); } @Override @@ -495,21 +541,40 @@ public SqlParser getSqlParser() return sqlParser; } + public PlannerContext getPlannerContext() + { + return plannerContext; + } + @Override public Metadata getMetadata() { - return metadata; + return plannerContext.getMetadata(); + } + + @Override + public TypeManager getTypeManager() + { + return plannerContext.getTypeManager(); + } + + @Override + public QueryExplainer getQueryExplainer() + { + QueryExplainerFactory queryExplainerFactory = createQueryExplainerFactory(getPlanOptimizers(true)); + AnalyzerFactory analyzerFactory = createAnalyzerFactory(queryExplainerFactory); + return queryExplainerFactory.createQueryExplainer(analyzerFactory); } @Override - public AnalyzerFactory getAnalyzerFactory() + public SessionPropertyManager getSessionPropertyManager() { - return createAnalyzerFactory(getPlanOptimizers(false)); + return sessionPropertyManager; } public TypeOperators getTypeOperators() { - return typeOperators; + return plannerContext.getTypeOperators(); } public BlockTypeOperators getBlockTypeOperators() @@ -600,7 +665,7 @@ public void installPlugin(Plugin plugin) @Override public void addFunctions(List functions) { - metadata.addFunctions(functions); + plannerContext.getMetadata().addFunctions(functions); } @Override @@ -766,7 +831,7 @@ public SubPlan createSubPlans(Session session, Plan plan, boolean forceSingleNod private List createDrivers(Session session, Plan plan, OutputFactory outputFactory, TaskContext taskContext) { if (printPlan) { - System.out.println(PlanPrinter.textLogicalPlan(plan.getRoot(), plan.getTypes(), metadata, plan.getStatsAndCosts(), session, 0, false)); + System.out.println(PlanPrinter.textLogicalPlan(plan.getRoot(), plan.getTypes(), plannerContext.getMetadata(), plan.getStatsAndCosts(), session, 0, false)); } SubPlan subplan = createSubPlans(session, plan, true); @@ -777,8 +842,8 @@ private List createDrivers(Session session, Plan plan, OutputFactory out TableExecuteContextManager tableExecuteContextManager = new TableExecuteContextManager(); tableExecuteContextManager.registerTableExecuteContextForQuery(taskContext.getQueryContext().getQueryId()); LocalExecutionPlanner executionPlanner = new LocalExecutionPlanner( - metadata, - new TypeAnalyzer(sqlParser, metadata), + plannerContext, + new TypeAnalyzer(plannerContext, statementAnalyzerFactory, accessControl), Optional.empty(), pageSourceManager, indexManager, @@ -796,9 +861,8 @@ private List createDrivers(Session session, Plan plan, OutputFactory out new PagesIndex.TestingFactory(false), joinCompiler, operatorFactories, - new OrderingCompiler(typeOperators), + new OrderingCompiler(plannerContext.getTypeOperators()), new DynamicFilterConfig(), - typeOperators, blockTypeOperators, tableExecuteContextManager); @@ -896,20 +960,20 @@ public Plan createPlan(Session session, @Language("SQL") String sql, LogicalPlan public List getPlanOptimizers(boolean forceSingleNode) { return planOptimizersProvider.getPlanOptimizers( - forceSingleNode, - sqlParser, - metadata, - typeOperators, + plannerContext, + new TypeAnalyzer(plannerContext, statementAnalyzerFactory, accessControl), taskManagerConfig, + forceSingleNode, splitManager, pageSourceManager, statsCalculator, scalarStatsCalculator, costCalculator, estimatedExchangesCostCalculator, - featuresConfig, + new CostComparator(featuresConfig), taskCountEstimator, - nodePartitioningManager); + nodePartitioningManager, + new RuleStatsRecorder()).get(); } public Plan createPlan(Session session, @Language("SQL") String sql, List optimizers, WarningCollector warningCollector) @@ -925,7 +989,7 @@ public Plan createPlan(Session session, @Language("SQL") String sql, List optimizers) + private QueryExplainerFactory createQueryExplainerFactory(List optimizers) { - QueryExplainerFactory queryExplainerFactory = new QueryExplainerFactory( + return new QueryExplainerFactory( () -> optimizers, planFragmenter, - metadata, - typeOperators, - sqlParser, + plannerContext, + statementAnalyzerFactory, + accessControl, statsCalculator, costCalculator); + } + private AnalyzerFactory createAnalyzerFactory(QueryExplainerFactory queryExplainerFactory) + { return new AnalyzerFactory( - metadata, - sqlParser, - accessControl, - groupProvider, + statementAnalyzerFactory, new StatementRewrite(ImmutableSet.of( new DescribeInputRewrite(sqlParser), new DescribeOutputRewrite(sqlParser), - new ShowQueriesRewrite(metadata, sqlParser, accessControl), + new ShowQueriesRewrite( + plannerContext.getMetadata(), + sqlParser, + accessControl, + sessionPropertyManager, + schemaPropertyManager, + columnPropertyManager, + tablePropertyManager, + materializedViewPropertyManager), new ShowStatsRewrite(queryExplainerFactory, statsCalculator), new ExplainRewrite(queryExplainerFactory, new QueryPreparer(sqlParser))))); } @@ -987,21 +1058,21 @@ private static List findTableScanNodes(PlanNode node) public interface PlanOptimizersProvider { - List getPlanOptimizers( - boolean forceSingleNode, - SqlParser sqlParser, - MetadataManager metadata, - TypeOperators typeOperators, + PlanOptimizers getPlanOptimizers( + PlannerContext plannerContext, + TypeAnalyzer typeAnalyzer, TaskManagerConfig taskManagerConfig, + boolean forceSingleNode, SplitManager splitManager, PageSourceManager pageSourceManager, StatsCalculator statsCalculator, ScalarStatsCalculator scalarStatsCalculator, CostCalculator costCalculator, CostCalculator estimatedExchangesCostCalculator, - FeaturesConfig featuresConfig, + CostComparator costComparator, TaskCountEstimator taskCountEstimator, - NodePartitioningManager nodePartitioningManager); + NodePartitioningManager nodePartitioningManager, + RuleStatsRecorder ruleStats); } public static class Builder @@ -1014,37 +1085,7 @@ public static class Builder private Map>> defaultSessionProperties = ImmutableMap.of(); private Set extraSessionProperties = ImmutableSet.of(); private int nodeCountForStats; - private PlanOptimizersProvider planOptimizersProvider = ( - forceSingleNode, - sqlParser, - metadata, - typeOperators, - taskManagerConfig, - splitManager, - pageSourceManager, - statsCalculator, - scalarStatsCalculator, - costCalculator, - estimatedExchangesCostCalculator, - featuresConfig, - taskCountEstimator, - nodePartitioningManager) -> - new PlanOptimizers( - metadata, - typeOperators, - new TypeAnalyzer(sqlParser, metadata), - taskManagerConfig, - forceSingleNode, - splitManager, - pageSourceManager, - statsCalculator, - scalarStatsCalculator, - costCalculator, - estimatedExchangesCostCalculator, - new CostComparator(featuresConfig), - taskCountEstimator, - nodePartitioningManager, - new RuleStatsRecorder()).get(); + private PlanOptimizersProvider planOptimizersProvider = PlanOptimizers::new; private OperatorFactories operatorFactories = new TrinoOperatorFactories(); private Builder(Session defaultSession) diff --git a/core/trino-main/src/main/java/io/trino/testing/QueryRunner.java b/core/trino-main/src/main/java/io/trino/testing/QueryRunner.java index bcfcda7ccf23..0072d503a95f 100644 --- a/core/trino-main/src/main/java/io/trino/testing/QueryRunner.java +++ b/core/trino-main/src/main/java/io/trino/testing/QueryRunner.java @@ -19,12 +19,14 @@ import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; +import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.SqlFunction; import io.trino.spi.ErrorType; import io.trino.spi.Plugin; +import io.trino.spi.type.TypeManager; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; -import io.trino.sql.analyzer.AnalyzerFactory; +import io.trino.sql.analyzer.QueryExplainer; import io.trino.sql.planner.NodePartitioningManager; import io.trino.sql.planner.Plan; import io.trino.transaction.TransactionManager; @@ -50,7 +52,11 @@ public interface QueryRunner Metadata getMetadata(); - AnalyzerFactory getAnalyzerFactory(); + TypeManager getTypeManager(); + + QueryExplainer getQueryExplainer(); + + SessionPropertyManager getSessionPropertyManager(); SplitManager getSplitManager(); diff --git a/core/trino-main/src/main/java/io/trino/testing/TestingConnectorContext.java b/core/trino-main/src/main/java/io/trino/testing/TestingConnectorContext.java index 50368a55b003..dfad81d6b9ab 100644 --- a/core/trino-main/src/main/java/io/trino/testing/TestingConnectorContext.java +++ b/core/trino-main/src/main/java/io/trino/testing/TestingConnectorContext.java @@ -16,7 +16,6 @@ import io.trino.connector.CatalogName; import io.trino.connector.ConnectorAwareNodeManager; import io.trino.metadata.InMemoryNodeManager; -import io.trino.metadata.Metadata; import io.trino.operator.GroupByHashPageIndexerFactory; import io.trino.operator.PagesIndex; import io.trino.operator.PagesIndexPageSorter; @@ -30,27 +29,23 @@ import io.trino.spi.type.TypeOperators; import io.trino.sql.gen.JoinCompiler; import io.trino.type.BlockTypeOperators; -import io.trino.type.InternalTypeManager; import io.trino.version.EmbedVersion; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.connector.MetadataProvider.NOOP_METADATA_PROVIDER; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; public final class TestingConnectorContext implements ConnectorContext { private final NodeManager nodeManager; private final VersionEmbedder versionEmbedder = new EmbedVersion("testversion"); - private final TypeManager typeManager; private final PageSorter pageSorter = new PagesIndexPageSorter(new PagesIndex.TestingFactory(false)); private final PageIndexerFactory pageIndexerFactory; public TestingConnectorContext() { - Metadata metadata = createTestMetadataManager(); TypeOperators typeOperators = new TypeOperators(); pageIndexerFactory = new GroupByHashPageIndexerFactory(new JoinCompiler(typeOperators), new BlockTypeOperators(typeOperators)); - typeManager = new InternalTypeManager(metadata, typeOperators); CatalogName catalogName = new CatalogName("test"); InMemoryNodeManager inMemoryNodeManager = new InMemoryNodeManager(); inMemoryNodeManager.addCurrentNodeConnector(catalogName); @@ -72,7 +67,7 @@ public VersionEmbedder getVersionEmbedder() @Override public TypeManager getTypeManager() { - return typeManager; + return TESTING_TYPE_MANAGER; } @Override diff --git a/core/trino-main/src/main/java/io/trino/type/InternalTypeManager.java b/core/trino-main/src/main/java/io/trino/type/InternalTypeManager.java index 90fe3acbadc2..d85e3b0c9923 100644 --- a/core/trino-main/src/main/java/io/trino/type/InternalTypeManager.java +++ b/core/trino-main/src/main/java/io/trino/type/InternalTypeManager.java @@ -13,7 +13,8 @@ */ package io.trino.type; -import io.trino.metadata.Metadata; +import io.trino.FeaturesConfig; +import io.trino.metadata.TypeRegistry; import io.trino.spi.type.Type; import io.trino.spi.type.TypeId; import io.trino.spi.type.TypeManager; @@ -22,42 +23,40 @@ import javax.inject.Inject; -import static java.util.Objects.requireNonNull; - public final class InternalTypeManager implements TypeManager { - private final Metadata metadata; - private final TypeOperators typeOperators; + public static final TypeManager TESTING_TYPE_MANAGER = new InternalTypeManager(new TypeRegistry(new TypeOperators(), new FeaturesConfig())); + + private final TypeRegistry typeRegistry; @Inject - public InternalTypeManager(Metadata metadata, TypeOperators typeOperators) + public InternalTypeManager(TypeRegistry typeRegistry) { - this.metadata = requireNonNull(metadata, "metadata is null"); - this.typeOperators = requireNonNull(typeOperators, "typeOperators is null"); + this.typeRegistry = typeRegistry; } @Override public Type getType(TypeSignature signature) { - return metadata.getType(signature); + return typeRegistry.getType(signature); } @Override public Type fromSqlType(String type) { - return metadata.fromSqlType(type); + return typeRegistry.fromSqlType(type); } @Override public Type getType(TypeId id) { - return metadata.getType(id); + return typeRegistry.getType(id); } @Override public TypeOperators getTypeOperators() { - return typeOperators; + return typeRegistry.getTypeOperators(); } } diff --git a/core/trino-main/src/main/java/io/trino/type/TypeDeserializer.java b/core/trino-main/src/main/java/io/trino/type/TypeDeserializer.java index 9c9328d348d4..1a9dc203fed4 100644 --- a/core/trino-main/src/main/java/io/trino/type/TypeDeserializer.java +++ b/core/trino-main/src/main/java/io/trino/type/TypeDeserializer.java @@ -15,9 +15,9 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.FromStringDeserializer; -import io.trino.metadata.Metadata; import io.trino.spi.type.Type; import io.trino.spi.type.TypeId; +import io.trino.spi.type.TypeManager; import javax.inject.Inject; @@ -31,9 +31,9 @@ public final class TypeDeserializer private final Function typeLoader; @Inject - public TypeDeserializer(Metadata metadata) + public TypeDeserializer(TypeManager typeManager) { - this(requireNonNull(metadata, "metadata is null")::getType); + this(requireNonNull(typeManager, "typeManager is null")::getType); } public TypeDeserializer(Function typeLoader) diff --git a/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java b/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java index 1358f1255aeb..33ff6de4905f 100644 --- a/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java +++ b/core/trino-main/src/test/java/io/trino/block/AbstractTestBlock.java @@ -18,14 +18,16 @@ import io.airlift.slice.Slice; import io.airlift.slice.SliceOutput; import io.airlift.slice.Slices; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.block.BlockBuilderStatus; +import io.trino.spi.block.BlockEncodingSerde; import io.trino.spi.block.DictionaryBlock; import io.trino.spi.block.DictionaryId; import io.trino.spi.block.MapHashTables; +import io.trino.spi.block.TestingBlockEncodingSerde; import org.openjdk.jol.info.ClassLayout; +import org.testng.annotations.Test; import java.lang.invoke.MethodHandle; import java.lang.reflect.Array; @@ -41,10 +43,10 @@ import static io.airlift.slice.SizeOf.SIZE_OF_LONG; import static io.airlift.slice.SizeOf.SIZE_OF_SHORT; import static io.airlift.slice.SizeOf.sizeOf; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarbinaryType.VARBINARY; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Math.toIntExact; import static java.lang.String.format; import static java.util.Arrays.fill; @@ -55,9 +57,10 @@ import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; +@Test public abstract class AbstractTestBlock { - private static final Metadata METADATA = createTestMetadataManager(); + private static final BlockEncodingSerde BLOCK_ENCODING_SERDE = new TestingBlockEncodingSerde(TESTING_TYPE_MANAGER::getType); protected void assertBlock(Block block, Supplier newBlockBuilder, T[] expectedValues) { @@ -421,8 +424,8 @@ private static Block copyBlockViaCopyRegion(Block block) private static Block copyBlockViaBlockSerde(Block block) { DynamicSliceOutput sliceOutput = new DynamicSliceOutput(1024); - METADATA.getBlockEncodingSerde().writeBlock(sliceOutput, block); - return METADATA.getBlockEncodingSerde().readBlock(sliceOutput.slice().getInput()); + BLOCK_ENCODING_SERDE.writeBlock(sliceOutput, block); + return BLOCK_ENCODING_SERDE.readBlock(sliceOutput.slice().getInput()); } private static Block copyBlockViaWritePositionTo(Block block, Supplier newBlockBuilder) diff --git a/core/trino-main/src/test/java/io/trino/block/ColumnarTestUtils.java b/core/trino-main/src/test/java/io/trino/block/ColumnarTestUtils.java index 1f3b6aca5601..b2b9aa764eaf 100644 --- a/core/trino-main/src/test/java/io/trino/block/ColumnarTestUtils.java +++ b/core/trino-main/src/test/java/io/trino/block/ColumnarTestUtils.java @@ -15,22 +15,23 @@ import io.airlift.slice.DynamicSliceOutput; import io.airlift.slice.Slice; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; +import io.trino.spi.block.BlockEncodingSerde; import io.trino.spi.block.DictionaryBlock; import io.trino.spi.block.RunLengthEncodedBlock; +import io.trino.spi.block.TestingBlockEncodingSerde; import java.lang.reflect.Array; import java.util.Arrays; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; public final class ColumnarTestUtils { - private static final Metadata METADATA = createTestMetadataManager(); + private static final BlockEncodingSerde BLOCK_ENCODING_SERDE = new TestingBlockEncodingSerde(TESTING_TYPE_MANAGER::getType); private ColumnarTestUtils() {} @@ -113,8 +114,8 @@ public static T[] alternatingNullValues(T[] objects) private static Block copyBlock(Block block) { DynamicSliceOutput sliceOutput = new DynamicSliceOutput(1024); - METADATA.getBlockEncodingSerde().writeBlock(sliceOutput, block); - return METADATA.getBlockEncodingSerde().readBlock(sliceOutput.slice().getInput()); + BLOCK_ENCODING_SERDE.writeBlock(sliceOutput, block); + return BLOCK_ENCODING_SERDE.readBlock(sliceOutput.slice().getInput()); } public static DictionaryBlock createTestDictionaryBlock(Block block) diff --git a/core/trino-main/src/test/java/io/trino/block/TestColumnarMap.java b/core/trino-main/src/test/java/io/trino/block/TestColumnarMap.java index 63731f24f427..d45e944ab9a0 100644 --- a/core/trino-main/src/test/java/io/trino/block/TestColumnarMap.java +++ b/core/trino-main/src/test/java/io/trino/block/TestColumnarMap.java @@ -35,10 +35,10 @@ import static io.trino.block.ColumnarTestUtils.createTestDictionaryExpectedValues; import static io.trino.block.ColumnarTestUtils.createTestRleBlock; import static io.trino.block.ColumnarTestUtils.createTestRleExpectedValues; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.block.ColumnarMap.toColumnarMap; import static io.trino.spi.type.StandardTypes.MAP; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -177,7 +177,7 @@ public static BlockBuilder createBlockBuilderWithValues(Slice[][][] expectedValu private static BlockBuilder createMapBuilder(int expectedEntries) { - MapType mapType = (MapType) createTestMetadataManager().getType(new TypeSignature(MAP, TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()), TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()))); + MapType mapType = (MapType) TESTING_TYPE_MANAGER.getType(new TypeSignature(MAP, TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()), TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()))); return new MapBlockBuilder(mapType, null, expectedEntries); } diff --git a/core/trino-main/src/test/java/io/trino/cost/TestComparisonStatsCalculator.java b/core/trino-main/src/test/java/io/trino/cost/TestComparisonStatsCalculator.java index d17c2c5da49b..d9514577acef 100644 --- a/core/trino-main/src/test/java/io/trino/cost/TestComparisonStatsCalculator.java +++ b/core/trino-main/src/test/java/io/trino/cost/TestComparisonStatsCalculator.java @@ -15,13 +15,10 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.spi.type.DoubleType; import io.trino.spi.type.Type; import io.trino.spi.type.VarcharType; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.tree.Cast; import io.trino.sql.tree.ComparisonExpression; @@ -39,10 +36,11 @@ import java.util.Objects; import java.util.function.Consumer; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.sql.analyzer.TypeSignatureTranslator.toSqlType; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.tree.ComparisonExpression.Operator.EQUAL; import static io.trino.sql.tree.ComparisonExpression.Operator.GREATER_THAN; import static io.trino.sql.tree.ComparisonExpression.Operator.LESS_THAN; @@ -77,8 +75,7 @@ public class TestComparisonStatsCalculator public void setUp() { session = testSessionBuilder().build(); - Metadata metadata = createTestMetadataManager(); - filterStatsCalculator = new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata, new TypeAnalyzer(new SqlParser(), metadata)), new StatsNormalizer()); + filterStatsCalculator = new FilterStatsCalculator(PLANNER_CONTEXT, new ScalarStatsCalculator(PLANNER_CONTEXT, createTestingTypeAnalyzer(PLANNER_CONTEXT)), new StatsNormalizer()); uStats = SymbolStatsEstimate.builder() .setAverageRowSize(8.0) diff --git a/core/trino-main/src/test/java/io/trino/cost/TestFilterStatsCalculator.java b/core/trino-main/src/test/java/io/trino/cost/TestFilterStatsCalculator.java index 93968098a505..029a9eea2213 100644 --- a/core/trino-main/src/test/java/io/trino/cost/TestFilterStatsCalculator.java +++ b/core/trino-main/src/test/java/io/trino/cost/TestFilterStatsCalculator.java @@ -16,22 +16,20 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.DoubleType; import io.trino.spi.type.Type; import io.trino.spi.type.VarcharType; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.tree.Expression; import io.trino.transaction.TestingTransactionManager; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.sql.ExpressionTestUtils.planExpression; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.iterative.rule.test.PlanBuilder.expression; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.transaction.TransactionBuilder.transaction; @@ -57,7 +55,6 @@ public class TestFilterStatsCalculator private PlanNodeStatsEstimate zeroStatistics; private TypeProvider standardTypes; private Session session; - private Metadata metadata; @BeforeClass public void setUp() @@ -153,8 +150,7 @@ public void setUp() .build()); session = testSessionBuilder().build(); - metadata = createTestMetadataManager(); - statsCalculator = new FilterStatsCalculator(metadata, new ScalarStatsCalculator(metadata, new TypeAnalyzer(new SqlParser(), metadata)), new StatsNormalizer()); + statsCalculator = new FilterStatsCalculator(PLANNER_CONTEXT, new ScalarStatsCalculator(PLANNER_CONTEXT, createTestingTypeAnalyzer(PLANNER_CONTEXT)), new StatsNormalizer()); } @Test @@ -577,7 +573,7 @@ public void testInPredicateFilter() private PlanNodeStatsAssertion assertExpression(String expression) { - return assertExpression(planExpression(metadata, session, standardTypes, expression(expression))); + return assertExpression(planExpression(PLANNER_CONTEXT, session, standardTypes, expression(expression))); } private PlanNodeStatsAssertion assertExpression(Expression expression) diff --git a/core/trino-main/src/test/java/io/trino/cost/TestJoinStatsRule.java b/core/trino-main/src/test/java/io/trino/cost/TestJoinStatsRule.java index f0abe15ff2dd..5727582133c1 100644 --- a/core/trino-main/src/test/java/io/trino/cost/TestJoinStatsRule.java +++ b/core/trino-main/src/test/java/io/trino/cost/TestJoinStatsRule.java @@ -15,11 +15,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import io.trino.metadata.Metadata; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.plan.JoinNode; import io.trino.sql.planner.plan.JoinNode.EquiJoinClause; @@ -31,9 +28,10 @@ import static io.trino.cost.FilterStatsCalculator.UNKNOWN_FILTER_COEFFICIENT; import static io.trino.cost.PlanNodeStatsAssertion.assertThat; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.plan.JoinNode.Type.FULL; import static io.trino.sql.planner.plan.JoinNode.Type.INNER; import static io.trino.sql.planner.plan.JoinNode.Type.LEFT; @@ -86,10 +84,9 @@ public class TestJoinStatsRule RIGHT_JOIN_COLUMN_STATS, RIGHT_OTHER_COLUMN_STATS); - private static final Metadata METADATA = createTestMetadataManager(); private static final StatsNormalizer NORMALIZER = new StatsNormalizer(); private static final JoinStatsRule JOIN_STATS_RULE = new JoinStatsRule( - new FilterStatsCalculator(METADATA, new ScalarStatsCalculator(METADATA, new TypeAnalyzer(new SqlParser(), METADATA)), NORMALIZER), + new FilterStatsCalculator(PLANNER_CONTEXT, new ScalarStatsCalculator(PLANNER_CONTEXT, createTestingTypeAnalyzer(PLANNER_CONTEXT)), NORMALIZER), NORMALIZER, 1.0); private static final TypeProvider TYPES = TypeProvider.copyOf(ImmutableMap.builder() diff --git a/core/trino-main/src/test/java/io/trino/cost/TestScalarStatsCalculator.java b/core/trino-main/src/test/java/io/trino/cost/TestScalarStatsCalculator.java index ecd648050fc6..63fd3d9af49d 100644 --- a/core/trino-main/src/test/java/io/trino/cost/TestScalarStatsCalculator.java +++ b/core/trino-main/src/test/java/io/trino/cost/TestScalarStatsCalculator.java @@ -22,7 +22,6 @@ import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.LiteralEncoder; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.tree.Cast; import io.trino.sql.tree.DecimalLiteral; @@ -43,6 +42,7 @@ import static io.trino.spi.type.VarcharType.createVarcharType; import static io.trino.sql.ExpressionUtils.rewriteIdentifiersToSymbolReferences; import static io.trino.sql.analyzer.TypeSignatureTranslator.toSqlType; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.transaction.TransactionBuilder.transaction; import static java.lang.Double.NEGATIVE_INFINITY; @@ -59,7 +59,7 @@ public class TestScalarStatsCalculator public void setUp() { functionResolution = new TestingFunctionResolution(); - calculator = new ScalarStatsCalculator(functionResolution.getMetadata(), new TypeAnalyzer(sqlParser, functionResolution.getMetadata())); + calculator = new ScalarStatsCalculator(functionResolution.getPlannerContext(), createTestingTypeAnalyzer(functionResolution.getPlannerContext())); session = testSessionBuilder().build(); } @@ -144,8 +144,8 @@ public void testFunctionCall() @Test public void testVarbinaryConstant() { - LiteralEncoder literalEncoder = new LiteralEncoder(session, functionResolution.getMetadata()); - Expression expression = literalEncoder.toExpression(Slices.utf8Slice("ala ma kota"), VARBINARY); + LiteralEncoder literalEncoder = new LiteralEncoder(functionResolution.getPlannerContext()); + Expression expression = literalEncoder.toExpression(session, Slices.utf8Slice("ala ma kota"), VARBINARY); assertCalculate(expression) .distinctValuesCount(1.0) diff --git a/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java b/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java index bb536be51033..0bd1d28983a0 100644 --- a/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java +++ b/core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java @@ -22,17 +22,17 @@ import io.trino.metadata.Catalog; import io.trino.metadata.CatalogManager; import io.trino.metadata.MaterializedViewDefinition; -import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.MetadataManager; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.TableHandle; import io.trino.metadata.TableMetadata; -import io.trino.metadata.TablePropertyManager; import io.trino.metadata.TableSchema; import io.trino.metadata.ViewColumn; import io.trino.metadata.ViewDefinition; import io.trino.security.AccessControl; import io.trino.security.AllowAllAccessControl; +import io.trino.spi.TrinoException; +import io.trino.spi.connector.CatalogSchemaName; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ColumnMetadata; import io.trino.spi.connector.ConnectorTableMetadata; @@ -40,6 +40,8 @@ import io.trino.spi.connector.TestingColumnHandle; import io.trino.spi.resourcegroups.ResourceGroupId; import io.trino.spi.security.Identity; +import io.trino.spi.security.TrinoPrincipal; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TestingConnectorTransactionHandle; import io.trino.sql.tree.QualifiedName; import io.trino.testing.TestingMetadata.TestingTableHandle; @@ -52,13 +54,18 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Verify.verifyNotNull; import static com.google.common.collect.ImmutableMap.toImmutableMap; import static com.google.common.util.concurrent.MoreExecutors.directExecutor; import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.spi.StandardErrorCode.ALREADY_EXISTS; +import static io.trino.spi.StandardErrorCode.DIVISION_BY_ZERO; import static io.trino.spi.type.BigintType.BIGINT; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; @@ -71,6 +78,7 @@ public abstract class BaseDataDefinitionTaskTest public static final String SCHEMA = "schema"; protected Session testSession; protected MockMetadata metadata; + protected PlannerContext plannerContext; protected TransactionManager transactionManager; protected QueryStateMachine queryStateMachine; @@ -79,17 +87,13 @@ public void setUp() { CatalogManager catalogManager = new CatalogManager(); transactionManager = createTestTransactionManager(catalogManager); - TablePropertyManager tablePropertyManager = new TablePropertyManager(); - MaterializedViewPropertyManager materializedViewPropertyManager = new MaterializedViewPropertyManager(); Catalog testCatalog = createBogusTestingCatalog(CATALOG_NAME); catalogManager.registerCatalog(testCatalog); testSession = testSessionBuilder() .setTransactionId(transactionManager.beginTransaction(false)) .build(); - metadata = new MockMetadata( - tablePropertyManager, - materializedViewPropertyManager, - testCatalog.getConnectorCatalogName()); + metadata = new MockMetadata(testCatalog.getConnectorCatalogName()); + plannerContext = plannerContextBuilder().withMetadata(metadata).build(); queryStateMachine = stateMachine(transactionManager, createTestMetadataManager(), new AllowAllAccessControl(), testSession); } @@ -172,42 +176,48 @@ private static QueryStateMachine stateMachine(TransactionManager transactionMana protected static class MockMetadata extends AbstractMockMetadata { - private final TablePropertyManager tablePropertyManager; - private final MaterializedViewPropertyManager materializedViewPropertyManager; private final CatalogName catalogHandle; + private final List schemas = new CopyOnWriteArrayList<>(); + private final AtomicBoolean failCreateSchema = new AtomicBoolean(); private final Map tables = new ConcurrentHashMap<>(); private final Map views = new ConcurrentHashMap<>(); private final Map materializedViews = new ConcurrentHashMap<>(); - public MockMetadata( - TablePropertyManager tablePropertyManager, - MaterializedViewPropertyManager materializedViewPropertyManager, - CatalogName catalogHandle) + public MockMetadata(CatalogName catalogHandle) { - this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); - this.materializedViewPropertyManager = requireNonNull(materializedViewPropertyManager, "materializedViewPropertyManager is null"); this.catalogHandle = requireNonNull(catalogHandle, "catalogHandle is null"); } @Override - public TablePropertyManager getTablePropertyManager() + public Optional getCatalogHandle(Session session, String catalogName) { - return tablePropertyManager; + if (catalogHandle.getCatalogName().equals(catalogName)) { + return Optional.of(catalogHandle); + } + return Optional.empty(); + } + + public void failCreateSchema() + { + failCreateSchema.set(true); } @Override - public MaterializedViewPropertyManager getMaterializedViewPropertyManager() + public boolean schemaExists(Session session, CatalogSchemaName schema) { - return materializedViewPropertyManager; + return schemas.contains(schema); } @Override - public Optional getCatalogHandle(Session session, String catalogName) + public void createSchema(Session session, CatalogSchemaName schema, Map properties, TrinoPrincipal principal) { - if (catalogHandle.getCatalogName().equals(catalogName)) { - return Optional.of(catalogHandle); + if (failCreateSchema.get()) { + throw new TrinoException(DIVISION_BY_ZERO, "TEST create schema fail: " + schema); } - return Optional.empty(); + if (schemas.contains(schema)) { + throw new TrinoException(ALREADY_EXISTS, "Schema already exists"); + } + schemas.add(schema); } @Override diff --git a/core/trino-main/src/test/java/io/trino/execution/TaskTestUtils.java b/core/trino-main/src/test/java/io/trino/execution/TaskTestUtils.java index 5c698ee583cd..6b9263f2988b 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TaskTestUtils.java +++ b/core/trino-main/src/test/java/io/trino/execution/TaskTestUtils.java @@ -28,12 +28,10 @@ import io.trino.execution.scheduler.UniformNodeSelectorFactory; import io.trino.index.IndexManager; import io.trino.metadata.InMemoryNodeManager; -import io.trino.metadata.Metadata; import io.trino.metadata.Split; import io.trino.operator.PagesIndex; import io.trino.operator.TrinoOperatorFactories; import io.trino.operator.index.IndexJoinLookupStats; -import io.trino.spi.type.TypeOperators; import io.trino.spiller.GenericSpillerFactory; import io.trino.split.PageSinkManager; import io.trino.split.PageSourceManager; @@ -42,14 +40,12 @@ import io.trino.sql.gen.JoinFilterFunctionCompiler; import io.trino.sql.gen.OrderingCompiler; import io.trino.sql.gen.PageFunctionCompiler; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.LocalExecutionPlanner; import io.trino.sql.planner.NodePartitioningManager; import io.trino.sql.planner.Partitioning; import io.trino.sql.planner.PartitioningScheme; import io.trino.sql.planner.PlanFragment; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.plan.PlanFragmentId; import io.trino.sql.planner.plan.PlanNodeId; import io.trino.sql.planner.plan.TableScanNode; @@ -62,12 +58,13 @@ import java.util.Optional; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.StageExecutionDescriptor.ungroupedExecution; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.planner.SystemPartitioningHandle.SINGLE_DISTRIBUTION; import static io.trino.sql.planner.SystemPartitioningHandle.SOURCE_DISTRIBUTION; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.testing.TestingHandles.TEST_TABLE_HANDLE; public final class TaskTestUtils @@ -104,35 +101,32 @@ private TaskTestUtils() {} public static LocalExecutionPlanner createTestingPlanner() { - Metadata metadata = createTestMetadataManager(); - PageSourceManager pageSourceManager = new PageSourceManager(); pageSourceManager.addConnectorPageSourceProvider(CONNECTOR_ID, new TestingPageSourceProvider()); // we don't start the finalizer so nothing will be collected, which is ok for a test FinalizerService finalizerService = new FinalizerService(); - TypeOperators typeOperators = new TypeOperators(); - BlockTypeOperators blockTypeOperators = new BlockTypeOperators(typeOperators); + BlockTypeOperators blockTypeOperators = new BlockTypeOperators(PLANNER_CONTEXT.getTypeOperators()); NodeScheduler nodeScheduler = new NodeScheduler(new UniformNodeSelectorFactory( new InMemoryNodeManager(), new NodeSchedulerConfig().setIncludeCoordinator(true), new NodeTaskMap(finalizerService))); NodePartitioningManager nodePartitioningManager = new NodePartitioningManager(nodeScheduler, blockTypeOperators); - PageFunctionCompiler pageFunctionCompiler = new PageFunctionCompiler(metadata, 0); + PageFunctionCompiler pageFunctionCompiler = new PageFunctionCompiler(PLANNER_CONTEXT.getMetadata(), 0); return new LocalExecutionPlanner( - metadata, - new TypeAnalyzer(new SqlParser(), metadata), + PLANNER_CONTEXT, + createTestingTypeAnalyzer(PLANNER_CONTEXT), Optional.empty(), pageSourceManager, new IndexManager(), nodePartitioningManager, new PageSinkManager(), new MockExchangeClientSupplier(), - new ExpressionCompiler(metadata, pageFunctionCompiler), + new ExpressionCompiler(PLANNER_CONTEXT.getMetadata(), pageFunctionCompiler), pageFunctionCompiler, - new JoinFilterFunctionCompiler(metadata), + new JoinFilterFunctionCompiler(PLANNER_CONTEXT.getMetadata()), new IndexJoinLookupStats(), new TaskManagerConfig(), new GenericSpillerFactory((types, spillContext, memoryContext) -> { @@ -145,11 +139,10 @@ public static LocalExecutionPlanner createTestingPlanner() throw new UnsupportedOperationException(); }, new PagesIndex.TestingFactory(false), - new JoinCompiler(typeOperators), + new JoinCompiler(PLANNER_CONTEXT.getTypeOperators()), new TrinoOperatorFactories(), - new OrderingCompiler(typeOperators), + new OrderingCompiler(PLANNER_CONTEXT.getTypeOperators()), new DynamicFilterConfig(), - typeOperators, blockTypeOperators, new TableExecuteContextManager()); } diff --git a/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java b/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java index ba80dd0beefe..e8aae7dc4ba9 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestCallTask.java @@ -21,6 +21,7 @@ import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.CatalogManager; import io.trino.metadata.MetadataManager; +import io.trino.metadata.ProcedureRegistry; import io.trino.plugin.base.security.AllowAllSystemAccessControl; import io.trino.security.AccessControl; import io.trino.security.AllowAllAccessControl; @@ -30,6 +31,7 @@ import io.trino.spi.procedure.Procedure; import io.trino.spi.resourcegroups.ResourceGroupId; import io.trino.spi.security.AccessDeniedException; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.Call; import io.trino.sql.tree.QualifiedName; import io.trino.testing.TestingAccessControlManager; @@ -48,6 +50,7 @@ import static io.airlift.concurrent.Threads.daemonThreadsNamed; import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.block.MethodHandleUtil.methodHandle; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; import static io.trino.testing.TestingAccessControlManager.TestingPrivilegeType.INSERT_TABLE; import static io.trino.testing.TestingAccessControlManager.privilege; import static io.trino.testing.TestingEventListenerManager.emptyEventListenerManager; @@ -121,8 +124,8 @@ public void testExecuteNoPermissionOnInsert() private void executeCallTask(MethodHandle methodHandle, Function accessControlProvider) { TransactionManager transactionManager = createTransactionManager(); - MetadataManager metadata = createMetadataManager( - transactionManager, + MetadataManager metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); + ProcedureRegistry procedureRegistry = createProcedureRegistry( new Procedure( "test", "testing_procedure", @@ -130,7 +133,8 @@ private void executeCallTask(MethodHandle methodHandle, Function getFutureValue(new CreateMaterializedViewTask(metadata, new AllowAllAccessControl(), parser, analyzerFactory) + assertTrinoExceptionThrownBy(() -> getFutureValue(new CreateMaterializedViewTask(plannerContext, new AllowAllAccessControl(), parser, analyzerFactory, materializedViewPropertyManager) .execute(statement, queryStateMachine, ImmutableList.of(), WarningCollector.NOOP))) .hasErrorCode(ALREADY_EXISTS) .hasMessage("Materialized view already exists"); @@ -181,7 +181,7 @@ public void testCreateMaterializedViewWithInvalidProperty() ImmutableList.of(new Property(new Identifier("baz"), new StringLiteral("abc"))), Optional.empty()); - assertTrinoExceptionThrownBy(() -> getFutureValue(new CreateMaterializedViewTask(metadata, new AllowAllAccessControl(), parser, analyzerFactory) + assertTrinoExceptionThrownBy(() -> getFutureValue(new CreateMaterializedViewTask(plannerContext, new AllowAllAccessControl(), parser, analyzerFactory, materializedViewPropertyManager) .execute(statement, queryStateMachine, ImmutableList.of(), WarningCollector.NOOP))) .hasErrorCode(INVALID_MATERIALIZED_VIEW_PROPERTY) .hasMessage("Catalog 'catalog' does not support materialized view property 'baz'"); @@ -204,8 +204,13 @@ public void testCreateDenyPermission() accessControl.loadSystemAccessControl(AllowAllSystemAccessControl.NAME, ImmutableMap.of()); accessControl.deny(privilege("test_mv", CREATE_MATERIALIZED_VIEW)); - AnalyzerFactory analyzerFactory = new AnalyzerFactory(metadata, parser, accessControl, new TestingGroupProvider(), new StatementRewrite(ImmutableSet.of())); - assertThatThrownBy(() -> getFutureValue(new CreateMaterializedViewTask(metadata, accessControl, parser, analyzerFactory) + StatementAnalyzerFactory statementAnalyzerFactory = createTestingStatementAnalyzerFactory( + plannerContext, + accessControl, + new TablePropertyManager(), + new AnalyzePropertyManager()); + AnalyzerFactory analyzerFactory = new AnalyzerFactory(statementAnalyzerFactory, new StatementRewrite(ImmutableSet.of())); + assertThatThrownBy(() -> getFutureValue(new CreateMaterializedViewTask(plannerContext, accessControl, parser, analyzerFactory, materializedViewPropertyManager) .execute(statement, queryStateMachine, ImmutableList.of(), WarningCollector.NOOP))) .isInstanceOf(AccessDeniedException.class) .hasMessageContaining("Cannot create materialized view catalog.schema.test_mv"); @@ -231,18 +236,11 @@ private QueryStateMachine stateMachine(TransactionManager transactionManager, Me private static class MockMetadata extends AbstractMockMetadata { - private final TablePropertyManager tablePropertyManager; - private final MaterializedViewPropertyManager materializedViewPropertyManager; private final CatalogName catalogHandle; private final Map materializedViews = new ConcurrentHashMap<>(); - public MockMetadata( - TablePropertyManager tablePropertyManager, - MaterializedViewPropertyManager materializedViewPropertyManager, - CatalogName catalogHandle) + public MockMetadata(CatalogName catalogHandle) { - this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); - this.materializedViewPropertyManager = requireNonNull(materializedViewPropertyManager, "materializedViewPropertyManager is null"); this.catalogHandle = requireNonNull(catalogHandle, "catalogHandle is null"); } @@ -255,18 +253,6 @@ public void createMaterializedView(Session session, QualifiedObjectName viewName } } - @Override - public TablePropertyManager getTablePropertyManager() - { - return tablePropertyManager; - } - - @Override - public MaterializedViewPropertyManager getMaterializedViewPropertyManager() - { - return materializedViewPropertyManager; - } - @Override public Optional getCatalogHandle(Session session, String catalogName) { diff --git a/core/trino-main/src/test/java/io/trino/execution/TestCreateSchemaTask.java b/core/trino-main/src/test/java/io/trino/execution/TestCreateSchemaTask.java index 5fabc77a5f13..9250bd0eb2cf 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestCreateSchemaTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestCreateSchemaTask.java @@ -14,134 +14,75 @@ package io.trino.execution; import com.google.common.collect.ImmutableList; -import io.trino.Session; import io.trino.connector.CatalogName; -import io.trino.metadata.AbstractMockMetadata; -import io.trino.metadata.Catalog; -import io.trino.metadata.CatalogManager; +import io.trino.execution.warnings.WarningCollector; import io.trino.metadata.SchemaPropertyManager; import io.trino.security.AllowAllAccessControl; import io.trino.spi.TrinoException; import io.trino.spi.connector.CatalogSchemaName; -import io.trino.spi.security.TrinoPrincipal; import io.trino.sql.tree.CreateSchema; import io.trino.sql.tree.QualifiedName; -import io.trino.transaction.TransactionManager; -import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CopyOnWriteArrayList; - import static io.airlift.concurrent.MoreFutures.getFutureValue; -import static io.trino.spi.StandardErrorCode.ALREADY_EXISTS; -import static io.trino.testing.TestingSession.createBogusTestingCatalog; -import static io.trino.testing.TestingSession.testSessionBuilder; -import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.util.Collections.emptyList; -import static java.util.Objects.requireNonNull; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; @Test(singleThreaded = true) public class TestCreateSchemaTask + extends BaseDataDefinitionTaskTest { - private static final String CATALOG_NAME = "catalog"; - private Session testSession; - private TestCreateSchemaTask.MockMetadata metadata; - - @BeforeMethod - public void setUp() - { - CatalogManager catalogManager = new CatalogManager(); - TransactionManager transactionManager = createTestTransactionManager(catalogManager); - Catalog testCatalog = createBogusTestingCatalog(CATALOG_NAME); - catalogManager.registerCatalog(testCatalog); - SchemaPropertyManager schemaPropertyManager = new SchemaPropertyManager(); - schemaPropertyManager.addProperties(testCatalog.getConnectorCatalogName(), ImmutableList.of()); - testSession = testSessionBuilder() - .setTransactionId(transactionManager.beginTransaction(false)) - .build(); - metadata = new TestCreateSchemaTask.MockMetadata( - schemaPropertyManager, - testCatalog.getConnectorCatalogName()); - } + private static final CatalogSchemaName CATALOG_SCHEMA_NAME = new CatalogSchemaName(CATALOG_NAME, "test_db"); @Test public void testDuplicatedCreateSchema() { - String schemaName = "test_db"; - CreateSchema statement = new CreateSchema(QualifiedName.of(schemaName), false, ImmutableList.of()); - getFutureValue(CreateSchemaTask.internalExecute(statement, metadata, new AllowAllAccessControl(), testSession, emptyList())); - assertEquals(metadata.getCreateSchemaCount(), 1); + CreateSchemaTask task = getCreateSchemaTask(); + CreateSchema statement = new CreateSchema(QualifiedName.of(CATALOG_SCHEMA_NAME.getSchemaName()), false, ImmutableList.of()); + getFutureValue(task.execute(statement, queryStateMachine, emptyList(), WarningCollector.NOOP)); + assertTrue(metadata.schemaExists(testSession, CATALOG_SCHEMA_NAME)); assertThatExceptionOfType(TrinoException.class) - .isThrownBy(() -> getFutureValue(CreateSchemaTask.internalExecute(statement, metadata, new AllowAllAccessControl(), testSession, emptyList()))) - .withMessage("Schema already exists"); + .isThrownBy(() -> getFutureValue(task.execute(statement, queryStateMachine, emptyList(), WarningCollector.NOOP))) + .withMessage("Schema 'catalog.test_db' already exists"); } @Test public void testDuplicatedCreateSchemaIfNotExists() { - String schemaName = "test_db"; - CreateSchema statement = new CreateSchema(QualifiedName.of(schemaName), true, ImmutableList.of()); - getFutureValue(CreateSchemaTask.internalExecute(statement, metadata, new AllowAllAccessControl(), testSession, emptyList())); - assertEquals(metadata.getCreateSchemaCount(), 1); - getFutureValue(CreateSchemaTask.internalExecute(statement, metadata, new AllowAllAccessControl(), testSession, emptyList())); - assertEquals(metadata.getCreateSchemaCount(), 1); + CreateSchemaTask task = getCreateSchemaTask(); + CreateSchema statement = new CreateSchema(QualifiedName.of(CATALOG_SCHEMA_NAME.getSchemaName()), true, ImmutableList.of()); + getFutureValue(task.execute(statement, queryStateMachine, emptyList(), WarningCollector.NOOP)); + assertTrue(metadata.schemaExists(testSession, CATALOG_SCHEMA_NAME)); + getFutureValue(task.execute(statement, queryStateMachine, emptyList(), WarningCollector.NOOP)); + assertTrue(metadata.schemaExists(testSession, CATALOG_SCHEMA_NAME)); } - private static class MockMetadata - extends AbstractMockMetadata + @Test + public void failCreateSchema() { - private final CatalogName catalogHandle; - private final List schemas; - private final SchemaPropertyManager schemaPropertyManager; - - public MockMetadata( - SchemaPropertyManager schemaPropertyManager, - CatalogName catalogHandle) - { - this.schemaPropertyManager = requireNonNull(schemaPropertyManager, "schemaPropertyManager is null"); - this.catalogHandle = requireNonNull(catalogHandle, "catalogHandle is null"); - this.schemas = new CopyOnWriteArrayList<>(); - } - - @Override - public SchemaPropertyManager getSchemaPropertyManager() - { - return schemaPropertyManager; - } - - @Override - public boolean schemaExists(Session session, CatalogSchemaName schema) - { - // To check the exception handling thrown by createSchema. - return false; - } - - @Override - public void createSchema(Session session, CatalogSchemaName schema, Map properties, TrinoPrincipal principal) - { - if (schemas.contains(schema)) { - throw new TrinoException(ALREADY_EXISTS, "Schema already exists"); - } - schemas.add(schema); - } - - @Override - public Optional getCatalogHandle(Session session, String catalogName) - { - if (catalogHandle.getCatalogName().equals(catalogName)) { - return Optional.of(catalogHandle); - } - return Optional.empty(); - } + CreateSchemaTask task = getCreateSchemaTask(); + metadata.failCreateSchema(); + assertThatExceptionOfType(TrinoException.class) + .isThrownBy(() -> getFutureValue(task.execute( + new CreateSchema(QualifiedName.of(CATALOG_SCHEMA_NAME.getSchemaName()), false, ImmutableList.of()), + queryStateMachine, + emptyList(), + WarningCollector.NOOP))) + .withMessage("TEST create schema fail: catalog.test_db"); + assertThatExceptionOfType(TrinoException.class) + .isThrownBy(() -> getFutureValue(task.execute( + new CreateSchema(QualifiedName.of(CATALOG_SCHEMA_NAME.getSchemaName()), true, ImmutableList.of()), + queryStateMachine, + emptyList(), + WarningCollector.NOOP))) + .withMessage("TEST create schema fail: catalog.test_db"); + } - public int getCreateSchemaCount() - { - return schemas.size(); - } + private CreateSchemaTask getCreateSchemaTask() + { + SchemaPropertyManager schemaPropertyManager = new SchemaPropertyManager(); + schemaPropertyManager.addProperties(new CatalogName(CATALOG_NAME), ImmutableList.of()); + return new CreateSchemaTask(plannerContext, new AllowAllAccessControl(), schemaPropertyManager); } } diff --git a/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java b/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java index b36f06712f45..a2e42f8435af 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestCreateTableTask.java @@ -24,8 +24,6 @@ import io.trino.metadata.Catalog; import io.trino.metadata.CatalogManager; import io.trino.metadata.ColumnPropertyManager; -import io.trino.metadata.MaterializedViewPropertyManager; -import io.trino.metadata.MetadataManager; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.TableHandle; import io.trino.metadata.TableMetadata; @@ -38,9 +36,7 @@ import io.trino.spi.connector.ConnectorTableMetadata; import io.trino.spi.connector.SchemaTableName; import io.trino.spi.security.AccessDeniedException; -import io.trino.spi.type.Type; -import io.trino.spi.type.TypeId; -import io.trino.spi.type.TypeSignature; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TestingConnectorTransactionHandle; import io.trino.sql.tree.ColumnDefinition; import io.trino.sql.tree.CreateTable; @@ -64,7 +60,6 @@ import static com.google.common.collect.Sets.immutableEnumSet; import static io.airlift.concurrent.MoreFutures.getFutureValue; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.StandardErrorCode.ALREADY_EXISTS; import static io.trino.spi.StandardErrorCode.INVALID_TABLE_PROPERTY; import static io.trino.spi.StandardErrorCode.NOT_SUPPORTED; @@ -77,6 +72,7 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.QueryUtil.identifier; import static io.trino.sql.analyzer.TypeSignatureTranslator.toSqlType; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; import static io.trino.sql.tree.LikeClause.PropertiesOption.INCLUDING; import static io.trino.testing.TestingAccessControlManager.TestingPrivilegeType.SELECT_COLUMN; import static io.trino.testing.TestingAccessControlManager.TestingPrivilegeType.SHOW_CREATE_TABLE; @@ -106,34 +102,31 @@ public class TestCreateTableTask private Session testSession; private MockMetadata metadata; + private PlannerContext plannerContext; private TransactionManager transactionManager; + private ColumnPropertyManager columnPropertyManager; + private TablePropertyManager tablePropertyManager; @BeforeMethod public void setUp() { CatalogManager catalogManager = new CatalogManager(); transactionManager = createTestTransactionManager(catalogManager); - TablePropertyManager tablePropertyManager = new TablePropertyManager(); - MaterializedViewPropertyManager materializedViewPropertyManager = new MaterializedViewPropertyManager(); - ColumnPropertyManager columnPropertyManager = new ColumnPropertyManager(); + tablePropertyManager = new TablePropertyManager(); + columnPropertyManager = new ColumnPropertyManager(); Catalog testCatalog = createBogusTestingCatalog(CATALOG_NAME); catalogManager.registerCatalog(testCatalog); tablePropertyManager.addProperties( testCatalog.getConnectorCatalogName(), ImmutableList.of(stringProperty("baz", "test property", null, false))); - materializedViewPropertyManager.addProperties( - testCatalog.getConnectorCatalogName(), - ImmutableList.of(stringProperty("foo", "test materialized view property", null, false))); columnPropertyManager.addProperties(testCatalog.getConnectorCatalogName(), ImmutableList.of()); testSession = testSessionBuilder() .setTransactionId(transactionManager.beginTransaction(false)) .build(); metadata = new MockMetadata( - tablePropertyManager, - materializedViewPropertyManager, - columnPropertyManager, testCatalog.getConnectorCatalogName(), emptySet()); + plannerContext = plannerContextBuilder().withMetadata(metadata).build(); } @Test @@ -145,7 +138,8 @@ public void testCreateTableNotExistsTrue() ImmutableList.of(), Optional.empty()); - getFutureValue(new CreateTableTask(metadata, new AllowAllAccessControl(), new FeaturesConfig()).internalExecute(statement, testSession, emptyList(), output -> {})); + CreateTableTask createTableTask = new CreateTableTask(plannerContext, new AllowAllAccessControl(), columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + getFutureValue(createTableTask.internalExecute(statement, testSession, emptyList(), output -> {})); assertEquals(metadata.getCreateTableCallCount(), 1); } @@ -158,7 +152,8 @@ public void testCreateTableNotExistsFalse() ImmutableList.of(), Optional.empty()); - assertTrinoExceptionThrownBy(() -> getFutureValue(new CreateTableTask(metadata, new AllowAllAccessControl(), new FeaturesConfig()).internalExecute(statement, testSession, emptyList(), output -> {}))) + CreateTableTask createTableTask = new CreateTableTask(plannerContext, new AllowAllAccessControl(), columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + assertTrinoExceptionThrownBy(() -> getFutureValue(createTableTask.internalExecute(statement, testSession, emptyList(), output -> {}))) .hasErrorCode(ALREADY_EXISTS) .hasMessage("Table already exists"); @@ -174,7 +169,8 @@ public void testCreateTableWithMaterializedViewPropertyFails() ImmutableList.of(new Property(new Identifier("foo"), new StringLiteral("bar"))), Optional.empty()); - assertTrinoExceptionThrownBy(() -> getFutureValue(new CreateTableTask(metadata, new AllowAllAccessControl(), new FeaturesConfig()).internalExecute(statement, testSession, emptyList(), output -> {}))) + CreateTableTask createTableTask = new CreateTableTask(plannerContext, new AllowAllAccessControl(), columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + assertTrinoExceptionThrownBy(() -> getFutureValue(createTableTask.internalExecute(statement, testSession, emptyList(), output -> {}))) .hasErrorCode(INVALID_TABLE_PROPERTY) .hasMessage("Catalog 'catalog' does not support table property 'foo'"); @@ -191,7 +187,8 @@ public void testCreateWithNotNullColumns() new ColumnDefinition(identifier("c"), toSqlType(VARBINARY), false, emptyList(), Optional.empty())); CreateTable statement = new CreateTable(QualifiedName.of("test_table"), inputColumns, true, ImmutableList.of(), Optional.empty()); - getFutureValue(new CreateTableTask(metadata, new AllowAllAccessControl(), new FeaturesConfig()).internalExecute(statement, testSession, emptyList(), output -> {})); + CreateTableTask createTableTask = new CreateTableTask(plannerContext, new AllowAllAccessControl(), columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + getFutureValue(createTableTask.internalExecute(statement, testSession, emptyList(), output -> {})); assertEquals(metadata.getCreateTableCallCount(), 1); List columns = metadata.getReceivedTableMetadata().get(0).getColumns(); assertEquals(columns.size(), 3); @@ -223,8 +220,9 @@ public void testCreateWithUnsupportedConnectorThrowsWhenNotNull() ImmutableList.of(), Optional.empty()); + CreateTableTask createTableTask = new CreateTableTask(plannerContext, new AllowAllAccessControl(), columnPropertyManager, tablePropertyManager, new FeaturesConfig()); assertTrinoExceptionThrownBy(() -> - getFutureValue(new CreateTableTask(metadata, new AllowAllAccessControl(), new FeaturesConfig()).internalExecute(statement, testSession, emptyList(), output -> {}))) + getFutureValue(createTableTask.internalExecute(statement, testSession, emptyList(), output -> {}))) .hasErrorCode(NOT_SUPPORTED) .hasMessage("Catalog 'catalog' does not support non-null column for column name 'b'"); } @@ -234,7 +232,8 @@ public void testCreateLike() { CreateTable statement = getCreatleLikeStatement(false); - getFutureValue(new CreateTableTask(metadata, new AllowAllAccessControl(), new FeaturesConfig()).internalExecute(statement, testSession, List.of(), output -> {})); + CreateTableTask createTableTask = new CreateTableTask(plannerContext, new AllowAllAccessControl(), columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + getFutureValue(createTableTask.internalExecute(statement, testSession, List.of(), output -> {})); assertEquals(metadata.getCreateTableCallCount(), 1); assertThat(metadata.getReceivedTableMetadata().get(0).getColumns()) @@ -247,7 +246,8 @@ public void testCreateLikeWithProperties() { CreateTable statement = getCreatleLikeStatement(true); - getFutureValue(new CreateTableTask(metadata, new AllowAllAccessControl(), new FeaturesConfig()).internalExecute(statement, testSession, List.of(), output -> {})); + CreateTableTask createTableTask = new CreateTableTask(plannerContext, new AllowAllAccessControl(), columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + getFutureValue(createTableTask.internalExecute(statement, testSession, List.of(), output -> {})); assertEquals(metadata.getCreateTableCallCount(), 1); assertThat(metadata.getReceivedTableMetadata().get(0).getColumns()) @@ -264,7 +264,8 @@ public void testCreateLikeDenyPermission() TestingAccessControlManager accessControl = new TestingAccessControlManager(transactionManager, new EventListenerManager(new EventListenerConfig())); accessControl.deny(privilege("parent_table", SELECT_COLUMN)); - assertThatThrownBy(() -> getFutureValue(new CreateTableTask(metadata, accessControl, new FeaturesConfig()).internalExecute(statement, testSession, List.of(), output -> {}))) + CreateTableTask createTableTask = new CreateTableTask(plannerContext, accessControl, columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + assertThatThrownBy(() -> getFutureValue(createTableTask.internalExecute(statement, testSession, List.of(), output -> {}))) .isInstanceOf(AccessDeniedException.class) .hasMessageContaining("Cannot reference columns of table"); } @@ -277,7 +278,8 @@ public void testCreateLikeWithPropertiesDenyPermission() TestingAccessControlManager accessControl = new TestingAccessControlManager(transactionManager, new EventListenerManager(new EventListenerConfig())); accessControl.deny(privilege("parent_table", SHOW_CREATE_TABLE)); - assertThatThrownBy(() -> getFutureValue(new CreateTableTask(metadata, accessControl, new FeaturesConfig()).internalExecute(statement, testSession, List.of(), output -> {}))) + CreateTableTask createTableTask = new CreateTableTask(plannerContext, accessControl, columnPropertyManager, tablePropertyManager, new FeaturesConfig()); + assertThatThrownBy(() -> getFutureValue(createTableTask.internalExecute(statement, testSession, List.of(), output -> {}))) .isInstanceOf(AccessDeniedException.class) .hasMessageContaining("Cannot reference properties of table"); } @@ -295,27 +297,14 @@ private CreateTable getCreatleLikeStatement(boolean includingProperties) private static class MockMetadata extends AbstractMockMetadata { - private final MetadataManager metadata; - private final TablePropertyManager tablePropertyManager; - private final MaterializedViewPropertyManager materializedViewPropertyManager; - private final ColumnPropertyManager columnPropertyManager; private final CatalogName catalogHandle; private final List tables = new CopyOnWriteArrayList<>(); private Set connectorCapabilities; - public MockMetadata( - TablePropertyManager tablePropertyManager, - MaterializedViewPropertyManager materializedViewPropertyManager, - ColumnPropertyManager columnPropertyManager, - CatalogName catalogHandle, - Set connectorCapabilities) + public MockMetadata(CatalogName catalogHandle, Set connectorCapabilities) { - this.tablePropertyManager = requireNonNull(tablePropertyManager, "tablePropertyManager is null"); - this.materializedViewPropertyManager = requireNonNull(materializedViewPropertyManager, "materializedViewPropertyManager is null"); - this.columnPropertyManager = requireNonNull(columnPropertyManager, "columnPropertyManager is null"); this.catalogHandle = requireNonNull(catalogHandle, "catalogHandle is null"); this.connectorCapabilities = immutableEnumSet(requireNonNull(connectorCapabilities, "connectorCapabilities is null")); - this.metadata = createTestMetadataManager(); } @Override @@ -327,42 +316,6 @@ public void createTable(Session session, String catalogName, ConnectorTableMetad } } - @Override - public TablePropertyManager getTablePropertyManager() - { - return tablePropertyManager; - } - - @Override - public MaterializedViewPropertyManager getMaterializedViewPropertyManager() - { - return materializedViewPropertyManager; - } - - @Override - public ColumnPropertyManager getColumnPropertyManager() - { - return columnPropertyManager; - } - - @Override - public Type getType(TypeSignature signature) - { - return metadata.getType(signature); - } - - @Override - public Type getType(TypeId id) - { - return metadata.getType(id); - } - - @Override - public Type fromSqlType(String sqlType) - { - return metadata.fromSqlType(sqlType); - } - @Override public Optional getCatalogHandle(Session session, String catalogName) { diff --git a/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java b/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java index 0624b41d26c0..687431d39b21 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestResetSessionTask.java @@ -21,6 +21,7 @@ import io.trino.metadata.Catalog; import io.trino.metadata.CatalogManager; import io.trino.metadata.Metadata; +import io.trino.metadata.SessionPropertyManager; import io.trino.security.AccessControl; import io.trino.security.AllowAllAccessControl; import io.trino.spi.resourcegroups.ResourceGroupId; @@ -53,6 +54,7 @@ public class TestResetSessionTask private final TransactionManager transactionManager; private final AccessControl accessControl; private final Metadata metadata; + private final SessionPropertyManager sessionPropertyManager; public TestResetSessionTask() { @@ -61,15 +63,16 @@ public TestResetSessionTask() accessControl = new AllowAllAccessControl(); metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); + sessionPropertyManager = new SessionPropertyManager(); - metadata.getSessionPropertyManager().addSystemSessionProperty(stringProperty( + sessionPropertyManager.addSystemSessionProperty(stringProperty( "foo", "test property", null, false)); Catalog bogusTestingCatalog = createBogusTestingCatalog(CATALOG_NAME); - metadata.getSessionPropertyManager().addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), ImmutableList.of(stringProperty( + sessionPropertyManager.addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), ImmutableList.of(stringProperty( "baz", "test property", null, @@ -87,7 +90,7 @@ public void tearDown() @Test public void test() { - Session session = testSessionBuilder(metadata.getSessionPropertyManager()) + Session session = testSessionBuilder(sessionPropertyManager) .setSystemProperty("foo", "bar") .setCatalogSessionProperty(CATALOG_NAME, "baz", "blah") .build(); @@ -106,7 +109,7 @@ public void test() WarningCollector.NOOP, Optional.empty()); - getFutureValue(new ResetSessionTask(metadata).execute( + getFutureValue(new ResetSessionTask(metadata, sessionPropertyManager).execute( new ResetSession(QualifiedName.of(CATALOG_NAME, "baz")), stateMachine, emptyList(), diff --git a/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java b/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java index 1f34f0459c09..6180abee13ee 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestSetSessionTask.java @@ -20,12 +20,14 @@ import io.trino.metadata.Catalog; import io.trino.metadata.CatalogManager; import io.trino.metadata.Metadata; +import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.TestingFunctionResolution; import io.trino.security.AccessControl; import io.trino.security.AllowAllAccessControl; import io.trino.spi.TrinoException; import io.trino.spi.resourcegroups.ResourceGroupId; import io.trino.spi.session.PropertyMetadata; +import io.trino.sql.PlannerContext; import io.trino.sql.tree.Expression; import io.trino.sql.tree.FunctionCall; import io.trino.sql.tree.LongLiteral; @@ -52,6 +54,7 @@ import static io.trino.spi.session.PropertyMetadata.integerProperty; import static io.trino.spi.session.PropertyMetadata.stringProperty; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; import static io.trino.testing.TestingSession.createBogusTestingCatalog; import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static java.lang.String.format; @@ -75,6 +78,8 @@ private enum Size private final TransactionManager transactionManager; private final AccessControl accessControl; private final Metadata metadata; + private final PlannerContext plannerContext; + private final SessionPropertyManager sessionPropertyManager; public TestSetSessionTask() { @@ -83,8 +88,9 @@ public TestSetSessionTask() accessControl = new AllowAllAccessControl(); metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); - - metadata.getSessionPropertyManager().addSystemSessionProperty(stringProperty( + plannerContext = plannerContextBuilder().withMetadata(metadata).build(); + sessionPropertyManager = new SessionPropertyManager(); + sessionPropertyManager.addSystemSessionProperty(stringProperty( CATALOG_NAME, "test property", null, @@ -111,7 +117,7 @@ public TestSetSessionTask() null, false)); - metadata.getSessionPropertyManager().addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), sessionProperties); + sessionPropertyManager.addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), sessionProperties); catalogManager.registerCatalog(bogusTestingCatalog); } @@ -198,7 +204,7 @@ private void testSetSessionWithParameters(String property, Expression expression metadata, WarningCollector.NOOP, Optional.empty()); - getFutureValue(new SetSessionTask(metadata, accessControl).execute(new SetSession(qualifiedPropName, expression), stateMachine, parameters, WarningCollector.NOOP)); + getFutureValue(new SetSessionTask(plannerContext, accessControl, sessionPropertyManager).execute(new SetSession(qualifiedPropName, expression), stateMachine, parameters, WarningCollector.NOOP)); Map sessionProperties = stateMachine.getSetSessionProperties(); assertEquals(sessionProperties, ImmutableMap.of(qualifiedPropName.toString(), expectedValue)); diff --git a/core/trino-main/src/test/java/io/trino/execution/TestSetTimeZoneTask.java b/core/trino-main/src/test/java/io/trino/execution/TestSetTimeZoneTask.java index 5b762230e06f..64af10fcb987 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestSetTimeZoneTask.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestSetTimeZoneTask.java @@ -255,12 +255,7 @@ private QueryStateMachine createQueryStateMachine(String query) private void executeSetTimeZone(SetTimeZone setTimeZone, QueryStateMachine stateMachine) { - SetTimeZoneTask task = new SetTimeZoneTask( - localQueryRunner.getMetadata(), - localQueryRunner.getAccessControl(), - localQueryRunner.getSqlParser(), - localQueryRunner.getAnalyzerFactory(), - localQueryRunner.getGroupProvider()); + SetTimeZoneTask task = new SetTimeZoneTask(localQueryRunner.getPlannerContext(), localQueryRunner.getAccessControl()); getFutureValue(task.execute(setTimeZone, stateMachine, emptyList(), WarningCollector.NOOP)); } } diff --git a/core/trino-main/src/test/java/io/trino/execution/TestSqlTaskExecution.java b/core/trino-main/src/test/java/io/trino/execution/TestSqlTaskExecution.java index ea460581b070..226b645a07e8 100644 --- a/core/trino-main/src/test/java/io/trino/execution/TestSqlTaskExecution.java +++ b/core/trino-main/src/test/java/io/trino/execution/TestSqlTaskExecution.java @@ -52,6 +52,7 @@ import io.trino.spi.HostAddress; import io.trino.spi.Page; import io.trino.spi.QueryId; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.connector.ConnectorSplit; import io.trino.spi.connector.UpdatablePageSource; import io.trino.spi.memory.MemoryPoolId; @@ -98,7 +99,6 @@ import static io.trino.execution.buffer.OutputBuffers.BufferType.PARTITIONED; import static io.trino.execution.buffer.OutputBuffers.createInitialEmptyOutputBuffers; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.PipelineExecutionStrategy.GROUPED_EXECUTION; import static io.trino.operator.PipelineExecutionStrategy.UNGROUPED_EXECUTION; import static io.trino.spi.type.VarcharType.VARCHAR; @@ -156,7 +156,7 @@ public void testSimple(PipelineExecutionStrategy executionStrategy) TABLE_SCAN_NODE_ID, outputBuffer, Function.identity(), - new PagesSerdeFactory(createTestMetadataManager().getBlockEncodingSerde(), false)); + new PagesSerdeFactory(new TestingBlockEncodingSerde(), false)); LocalExecutionPlan localExecutionPlan = new LocalExecutionPlan( ImmutableList.of(new DriverFactory( 0, @@ -377,7 +377,7 @@ public void testComplex(PipelineExecutionStrategy executionStrategy) joinCNodeId, outputBuffer, Function.identity(), - new PagesSerdeFactory(createTestMetadataManager().getBlockEncodingSerde(), false)); + new PagesSerdeFactory(new TestingBlockEncodingSerde(), false)); TestingCrossJoinOperatorFactory joinOperatorFactoryA = new TestingCrossJoinOperatorFactory(2, joinANodeId, buildStatesA); TestingCrossJoinOperatorFactory joinOperatorFactoryB = new TestingCrossJoinOperatorFactory(102, joinBNodeId, buildStatesB); TestingCrossJoinOperatorFactory joinOperatorFactoryC = new TestingCrossJoinOperatorFactory(3, joinCNodeId, buildStatesC); diff --git a/core/trino-main/src/test/java/io/trino/execution/buffer/BenchmarkPagesSerde.java b/core/trino-main/src/test/java/io/trino/execution/buffer/BenchmarkPagesSerde.java index 2838d9d5843c..9a42272b0ff1 100644 --- a/core/trino-main/src/test/java/io/trino/execution/buffer/BenchmarkPagesSerde.java +++ b/core/trino-main/src/test/java/io/trino/execution/buffer/BenchmarkPagesSerde.java @@ -17,6 +17,7 @@ import io.trino.spi.Page; import io.trino.spi.PageBuilder; import io.trino.spi.block.BlockBuilder; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.Type; import io.trino.spiller.AesSpillCipher; import org.openjdk.jmh.annotations.Benchmark; @@ -42,7 +43,6 @@ import static io.airlift.slice.Slices.utf8Slice; import static io.trino.jmh.Benchmarks.benchmark; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.PageAssertions.assertPageEquals; import static io.trino.spi.type.VarcharType.VARCHAR; import static java.nio.charset.StandardCharsets.ISO_8859_1; @@ -127,7 +127,7 @@ public Page[] getDataPages() private PagesSerde createPagesSerde() { - PagesSerdeFactory serdeFactory = new PagesSerdeFactory(createTestMetadataManager().getBlockEncodingSerde(), compressed); + PagesSerdeFactory serdeFactory = new PagesSerdeFactory(new TestingBlockEncodingSerde(), compressed); return encrypted ? serdeFactory.createPagesSerdeForSpill(Optional.of(new AesSpillCipher())) : serdeFactory.createPagesSerde(); } diff --git a/core/trino-main/src/test/java/io/trino/execution/buffer/TestingPagesSerdeFactory.java b/core/trino-main/src/test/java/io/trino/execution/buffer/TestingPagesSerdeFactory.java index f5de8b61b5b3..abc360e90f10 100644 --- a/core/trino-main/src/test/java/io/trino/execution/buffer/TestingPagesSerdeFactory.java +++ b/core/trino-main/src/test/java/io/trino/execution/buffer/TestingPagesSerdeFactory.java @@ -17,27 +17,31 @@ import io.airlift.compress.Decompressor; import io.airlift.compress.lz4.Lz4Compressor; import io.airlift.compress.lz4.Lz4Decompressor; +import io.trino.metadata.BlockEncodingManager; +import io.trino.metadata.InternalBlockEncodingSerde; import io.trino.spi.Page; import io.trino.spi.block.BlockEncodingSerde; import io.trino.spiller.SpillCipher; import java.util.Optional; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; public class TestingPagesSerdeFactory extends PagesSerdeFactory { + private static final InternalBlockEncodingSerde BLOCK_ENCODING_SERDE = new InternalBlockEncodingSerde(new BlockEncodingManager(), TESTING_TYPE_MANAGER); + public TestingPagesSerdeFactory() { // compression should be enabled in as many tests as possible - super(createTestMetadataManager().getBlockEncodingSerde(), true); + super(BLOCK_ENCODING_SERDE, true); } public static PagesSerde testingPagesSerde() { return new SynchronizedPagesSerde( - createTestMetadataManager().getBlockEncodingSerde(), + BLOCK_ENCODING_SERDE, Optional.of(new Lz4Compressor()), Optional.of(new Lz4Decompressor()), Optional.empty()); diff --git a/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java b/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java index 875d118ce6b9..c2a8c0b2d08d 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java +++ b/core/trino-main/src/test/java/io/trino/metadata/AbstractMockMetadata.java @@ -25,7 +25,6 @@ import io.trino.operator.aggregation.AggregationMetadata; import io.trino.operator.window.WindowFunctionSupplier; import io.trino.spi.TrinoException; -import io.trino.spi.block.BlockEncodingSerde; import io.trino.spi.connector.AggregateFunction; import io.trino.spi.connector.AggregationApplicationResult; import io.trino.spi.connector.BeginTableExecuteResult; @@ -64,10 +63,7 @@ import io.trino.spi.statistics.ComputedStatistics; import io.trino.spi.statistics.TableStatistics; import io.trino.spi.statistics.TableStatisticsMetadata; -import io.trino.spi.type.ParametricType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeId; -import io.trino.spi.type.TypeSignature; import io.trino.sql.analyzer.TypeSignatureProvider; import io.trino.sql.planner.PartitioningHandle; import io.trino.sql.tree.QualifiedName; @@ -84,6 +80,7 @@ import static io.trino.metadata.RedirectionAwareTableHandle.noRedirection; import static io.trino.spi.StandardErrorCode.FUNCTION_NOT_FOUND; import static io.trino.spi.type.DoubleType.DOUBLE; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; public abstract class AbstractMockMetadata implements Metadata @@ -93,7 +90,7 @@ public static Metadata dummyMetadata() return new AbstractMockMetadata() {}; } - private final ResolvedFunctionDecoder functionDecoder = new ResolvedFunctionDecoder(this::getType); + private final ResolvedFunctionDecoder functionDecoder = new ResolvedFunctionDecoder(TESTING_TYPE_MANAGER::getType); @Override public Set getConnectorCapabilities(Session session, CatalogName catalogName) @@ -718,46 +715,6 @@ public List listTablePrivileges(Session session, QualifiedTablePrefix throw new UnsupportedOperationException(); } - // - // Types - // - - @Override - public Type getType(TypeSignature signature) - { - throw new UnsupportedOperationException(); - } - - @Override - public Type fromSqlType(String sqlType) - { - throw new UnsupportedOperationException(); - } - - @Override - public Type getType(TypeId id) - { - throw new UnsupportedOperationException(); - } - - @Override - public void verifyTypes() - { - throw new UnsupportedOperationException(); - } - - @Override - public Collection getTypes() - { - throw new UnsupportedOperationException(); - } - - @Override - public Collection getParametricTypes() - { - throw new UnsupportedOperationException(); - } - // // Functions // @@ -858,74 +815,6 @@ public FunctionInvoker getScalarFunctionInvoker(ResolvedFunction resolvedFunctio throw new UnsupportedOperationException(); } - @Override - public ProcedureRegistry getProcedureRegistry() - { - throw new UnsupportedOperationException(); - } - - @Override - public TableProceduresRegistry getTableProcedureRegistry() - { - throw new UnsupportedOperationException(); - } - - // - // Blocks - // - - @Override - public BlockEncodingSerde getBlockEncodingSerde() - { - throw new UnsupportedOperationException(); - } - - // - // Properties - // - - @Override - public SessionPropertyManager getSessionPropertyManager() - { - throw new UnsupportedOperationException(); - } - - @Override - public SchemaPropertyManager getSchemaPropertyManager() - { - throw new UnsupportedOperationException(); - } - - @Override - public TablePropertyManager getTablePropertyManager() - { - throw new UnsupportedOperationException(); - } - - @Override - public MaterializedViewPropertyManager getMaterializedViewPropertyManager() - { - throw new UnsupportedOperationException(); - } - - @Override - public ColumnPropertyManager getColumnPropertyManager() - { - throw new UnsupportedOperationException(); - } - - @Override - public AnalyzePropertyManager getAnalyzePropertyManager() - { - throw new UnsupportedOperationException(); - } - - @Override - public TableProceduresPropertyManager getTableProceduresPropertyManager() - { - throw new UnsupportedOperationException(); - } - @Override public Optional> applyProjection(Session session, TableHandle table, List projections, Map assignments) { diff --git a/core/trino-main/src/test/java/io/trino/metadata/TestFunctionRegistry.java b/core/trino-main/src/test/java/io/trino/metadata/TestFunctionRegistry.java index 076b97e12581..14c82ddd4462 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/TestFunctionRegistry.java +++ b/core/trino-main/src/test/java/io/trino/metadata/TestFunctionRegistry.java @@ -82,7 +82,7 @@ public void testExactMatchBeforeCoercion() continue; } List argumentTypes = function.getSignature().getArgumentTypes().stream() - .map(metadata::getType) + .map(functionResolution.getPlannerContext().getTypeManager()::getType) .collect(toImmutableList()); BoundSignature exactOperator = functionResolution.resolveOperator(operatorType, argumentTypes).getSignature(); assertEquals(exactOperator.toSignature(), function.getSignature()); diff --git a/core/trino-main/src/test/java/io/trino/metadata/TestSignature.java b/core/trino-main/src/test/java/io/trino/metadata/TestSignature.java index 0d1bf698b2f0..aef669bfecbf 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/TestSignature.java +++ b/core/trino-main/src/test/java/io/trino/metadata/TestSignature.java @@ -24,11 +24,11 @@ import io.trino.type.TypeSignatureDeserializer; import org.testng.annotations.Test; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; public class TestSignature @@ -38,7 +38,7 @@ public void testSerializationRoundTrip() { ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); objectMapperProvider.setJsonDeserializers(ImmutableMap.of( - Type.class, new TypeDeserializer(createTestMetadataManager()), + Type.class, new TypeDeserializer(TESTING_TYPE_MANAGER), TypeSignature.class, new TypeSignatureDeserializer())); JsonCodec codec = new JsonCodecFactory(objectMapperProvider, true).jsonCodec(Signature.class); diff --git a/core/trino-main/src/test/java/io/trino/metadata/TestSignatureBinder.java b/core/trino-main/src/test/java/io/trino/metadata/TestSignatureBinder.java index ac452ecf04fb..644c2b9cffe4 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/TestSignatureBinder.java +++ b/core/trino-main/src/test/java/io/trino/metadata/TestSignatureBinder.java @@ -28,7 +28,6 @@ import java.util.Optional; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.metadata.Signature.castableFromTypeParameter; import static io.trino.metadata.Signature.castableToTypeParameter; import static io.trino.metadata.Signature.comparableTypeParameter; @@ -55,6 +54,7 @@ import static io.trino.spi.type.VarcharType.createVarcharType; import static io.trino.sql.analyzer.TypeSignatureProvider.fromTypes; import static io.trino.sql.analyzer.TypeSignatureTranslator.parseTypeSignature; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; import static io.trino.type.JsonType.JSON; import static io.trino.type.UnknownType.UNKNOWN; import static java.lang.String.format; @@ -69,7 +69,6 @@ public class TestSignatureBinder { private static final TypeVariables NO_BOUND_VARIABLES = new BoundVariables(); - private final Metadata metadata = createTestMetadataManager(); @Test public void testBindLiteralForDecimal() @@ -1134,7 +1133,7 @@ private static SignatureBuilder functionSignature() private Type type(TypeSignature signature) { - return requireNonNull(metadata.getType(signature)); + return requireNonNull(PLANNER_CONTEXT.getTypeManager().getType(signature)); } private BindSignatureAssertion assertThat(Signature function) @@ -1142,7 +1141,7 @@ private BindSignatureAssertion assertThat(Signature function) return new BindSignatureAssertion(function); } - private class BindSignatureAssertion + private static class BindSignatureAssertion { private final Signature function; private List argumentTypes; @@ -1208,7 +1207,7 @@ public BindSignatureAssertion produces(TypeVariables expected) private Optional bindVariables() { assertNotNull(argumentTypes); - SignatureBinder signatureBinder = new SignatureBinder(TEST_SESSION, metadata, function, allowCoercion); + SignatureBinder signatureBinder = new SignatureBinder(TEST_SESSION, PLANNER_CONTEXT.getMetadata(), PLANNER_CONTEXT.getTypeManager(), function, allowCoercion); if (returnType == null) { return signatureBinder.bindVariables(argumentTypes); } diff --git a/core/trino-main/src/test/java/io/trino/metadata/TestingFunctionResolution.java b/core/trino-main/src/test/java/io/trino/metadata/TestingFunctionResolution.java index ea966a3355ad..aa1003332a14 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/TestingFunctionResolution.java +++ b/core/trino-main/src/test/java/io/trino/metadata/TestingFunctionResolution.java @@ -13,7 +13,6 @@ */ package io.trino.metadata; -import com.google.common.collect.ImmutableSet; import io.trino.FeaturesConfig; import io.trino.Session; import io.trino.operator.aggregation.TestingAggregationFunction; @@ -22,6 +21,7 @@ import io.trino.spi.function.OperatorType; import io.trino.spi.type.Type; import io.trino.spi.type.TypeSignature; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.TypeSignatureProvider; import io.trino.sql.gen.ExpressionCompiler; import io.trino.sql.gen.PageFunctionCompiler; @@ -34,13 +34,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.FunctionExtractor.extractFunctions; import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static io.trino.transaction.TransactionBuilder.transaction; import static java.util.Objects.requireNonNull; @@ -49,18 +48,13 @@ public class TestingFunctionResolution { private final TransactionManager transactionManager; private final Metadata metadata; + private final PlannerContext plannerContext; public TestingFunctionResolution() { - this(ImmutableSet.of()); - } - - public TestingFunctionResolution(Set> functions) - { - transactionManager = createTestTransactionManager(); - MetadataManager metadataManager = createTestMetadataManager(transactionManager, new FeaturesConfig()); - metadataManager.addFunctions(extractFunctions(functions)); - metadata = metadataManager; + this.transactionManager = createTestTransactionManager(); + this.metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); + this.plannerContext = plannerContextBuilder().withMetadata(metadata).build(); } public TestingFunctionResolution(LocalQueryRunner localQueryRunner) @@ -72,6 +66,7 @@ public TestingFunctionResolution(TransactionManager transactionManager, Metadata { this.transactionManager = requireNonNull(transactionManager, "transactionManager is null"); this.metadata = requireNonNull(metadata, "metadata is null"); + this.plannerContext = plannerContextBuilder().withMetadata(metadata).build(); } public TestingFunctionResolution addFunctions(List functions) @@ -80,6 +75,11 @@ public TestingFunctionResolution addFunctions(List functi return this; } + public PlannerContext getPlannerContext() + { + return plannerContext; + } + public Metadata getMetadata() { return metadata; diff --git a/core/trino-main/src/test/java/io/trino/operator/BenchmarkScanFilterAndProjectOperator.java b/core/trino-main/src/test/java/io/trino/operator/BenchmarkScanFilterAndProjectOperator.java index d3d6c80199f0..b63f21e61461 100644 --- a/core/trino-main/src/test/java/io/trino/operator/BenchmarkScanFilterAndProjectOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/BenchmarkScanFilterAndProjectOperator.java @@ -20,7 +20,6 @@ import io.trino.Session; import io.trino.connector.CatalogName; import io.trino.execution.Lifespan; -import io.trino.metadata.Metadata; import io.trino.metadata.Split; import io.trino.operator.ScanFilterAndProjectOperator.ScanFilterAndProjectOperatorFactory; import io.trino.operator.project.CursorProcessor; @@ -70,11 +69,11 @@ import static io.airlift.units.DataSize.Unit.GIGABYTE; import static io.airlift.units.DataSize.Unit.KILOBYTE; import static io.trino.jmh.Benchmarks.benchmark; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.ExpressionTestUtils.createExpression; import static io.trino.sql.ExpressionTestUtils.getTypes; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; import static io.trino.testing.TestingHandles.TEST_TABLE_HANDLE; import static io.trino.testing.TestingSplit.createLocalSplit; import static java.util.Locale.ENGLISH; @@ -95,7 +94,6 @@ public class BenchmarkScanFilterAndProjectOperator private static final Map TYPE_MAP = ImmutableMap.of("bigint", BIGINT, "varchar", VARCHAR); private static final Session TEST_SESSION = TestingSession.testSessionBuilder().build(); - private static final Metadata METADATA = createTestMetadataManager(); private static final int TOTAL_POSITIONS = 1_000_000; private static final DataSize FILTER_AND_PROJECT_MIN_OUTPUT_PAGE_SIZE = DataSize.of(500, KILOBYTE); @@ -143,9 +141,9 @@ public void setup() .mapToObj(i -> new TestingColumnHandle(Integer.toString(i))) .collect(toImmutableList()); - PageFunctionCompiler pageFunctionCompiler = new PageFunctionCompiler(METADATA, 0); - PageProcessor pageProcessor = new ExpressionCompiler(METADATA, pageFunctionCompiler).compilePageProcessor(Optional.of(getFilter(type)), projections).get(); - CursorProcessor cursorProcessor = new ExpressionCompiler(METADATA, pageFunctionCompiler).compileCursorProcessor(Optional.of(getFilter(type)), projections, "key").get(); + PageFunctionCompiler pageFunctionCompiler = new PageFunctionCompiler(PLANNER_CONTEXT.getMetadata(), 0); + PageProcessor pageProcessor = new ExpressionCompiler(PLANNER_CONTEXT.getMetadata(), pageFunctionCompiler).compilePageProcessor(Optional.of(getFilter(type)), projections).get(); + CursorProcessor cursorProcessor = new ExpressionCompiler(PLANNER_CONTEXT.getMetadata(), pageFunctionCompiler).compileCursorProcessor(Optional.of(getFilter(type)), projections, "key").get(); createTaskContext(); createScanFilterAndProjectOperatorFactories(createInputPages(types), pageProcessor, cursorProcessor, columnHandles, types); @@ -225,13 +223,13 @@ else if (type == VARCHAR) { private RowExpression rowExpression(String value) { - Expression expression = createExpression(value, METADATA, TypeProvider.copyOf(symbolTypes)); + Expression expression = createExpression(value, PLANNER_CONTEXT, TypeProvider.copyOf(symbolTypes)); return SqlToRowExpressionTranslator.translate( expression, - getTypes(TEST_SESSION, METADATA, TypeProvider.copyOf(symbolTypes), expression), + getTypes(TEST_SESSION, PLANNER_CONTEXT, TypeProvider.copyOf(symbolTypes), expression), sourceLayout, - METADATA, + PLANNER_CONTEXT.getMetadata(), TEST_SESSION, true); } diff --git a/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java b/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java index 123b3d87ff83..04bf46a17b3c 100644 --- a/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/BenchmarkUnnestOperator.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import io.airlift.units.DataSize; -import io.trino.metadata.Metadata; import io.trino.operator.unnest.UnnestOperator.UnnestOperatorFactory; import io.trino.spi.Page; import io.trino.spi.block.Block; @@ -55,9 +54,9 @@ import static io.airlift.units.DataSize.Unit.GIGABYTE; import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.jmh.Benchmarks.benchmark; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.IntegerType.INTEGER; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.mapType; import static java.util.concurrent.Executors.newCachedThreadPool; import static java.util.concurrent.Executors.newScheduledThreadPool; @@ -113,23 +112,22 @@ public void setup() { executor = newCachedThreadPool(daemonThreadsNamed(getClass().getSimpleName() + "-%s")); scheduledExecutor = newScheduledThreadPool(2, daemonThreadsNamed(getClass().getSimpleName() + "-scheduledExecutor-%s")); - Metadata metadata = createTestMetadataManager(); InputGenerator inputGenerator = new InputGenerator(0, nestedLengths, stringLengths); ImmutableList.Builder typesBuilder = ImmutableList.builder(); ImmutableList.Builder channelsBuilder = ImmutableList.builder(); - Type replicateType = getType(metadata, this.replicateType).get(); + Type replicateType = getType(this.replicateType).get(); typesBuilder.add(replicateType); channelsBuilder.add(0); - Type nestedTypeOne = getType(metadata, this.nestedTypeOne).get(); + Type nestedTypeOne = getType(this.nestedTypeOne).get(); typesBuilder.add(nestedTypeOne); channelsBuilder.add(1); if (!nestedTypeTwo.equals("NONE")) { - Type nestedTypeTwo = getType(metadata, this.nestedTypeTwo).get(); + Type nestedTypeTwo = getType(this.nestedTypeTwo).get(); typesBuilder.add(nestedTypeTwo); channelsBuilder.add(2); } @@ -151,12 +149,12 @@ public void setup() false); } - public Optional getType(Metadata metadata, String typeString) + public static Optional getType(String typeString) { if (typeString.equals("NONE")) { return Optional.empty(); } - return Optional.of(metadata.fromSqlType(typeString)); + return Optional.of(TESTING_TYPE_MANAGER.fromSqlType(typeString)); } @TearDown diff --git a/core/trino-main/src/test/java/io/trino/operator/aggregation/TestArbitraryAggregation.java b/core/trino-main/src/test/java/io/trino/operator/aggregation/TestArbitraryAggregation.java index 23018dfee804..93581014e5be 100644 --- a/core/trino-main/src/test/java/io/trino/operator/aggregation/TestArbitraryAggregation.java +++ b/core/trino-main/src/test/java/io/trino/operator/aggregation/TestArbitraryAggregation.java @@ -14,13 +14,17 @@ package io.trino.operator.aggregation; import com.google.common.collect.ImmutableList; +import io.trino.FeaturesConfig; import io.trino.metadata.TestingFunctionResolution; +import io.trino.metadata.TypeRegistry; import io.trino.spi.type.ArrayType; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeOperators; import io.trino.sql.tree.QualifiedName; import org.testng.annotations.Test; import java.util.Arrays; +import java.util.Collection; import static io.trino.block.BlockAssertions.createArrayBigintBlock; import static io.trino.block.BlockAssertions.createBooleansBlock; @@ -44,7 +48,8 @@ public class TestArbitraryAggregation @Test public void testAllRegistered() { - for (Type valueType : FUNCTION_RESOLUTION.getMetadata().getTypes()) { + Collection standardTypes = new TypeRegistry(new TypeOperators(), new FeaturesConfig()).getTypes(); + for (Type valueType : standardTypes) { assertNotNull(FUNCTION_RESOLUTION.getAggregateFunction(QualifiedName.of("arbitrary"), fromTypes(valueType))); } } diff --git a/core/trino-main/src/test/java/io/trino/operator/aggregation/TestMergeQuantileDigestFunction.java b/core/trino-main/src/test/java/io/trino/operator/aggregation/TestMergeQuantileDigestFunction.java index f10ce1bbda8d..effc2db85069 100644 --- a/core/trino-main/src/test/java/io/trino/operator/aggregation/TestMergeQuantileDigestFunction.java +++ b/core/trino-main/src/test/java/io/trino/operator/aggregation/TestMergeQuantileDigestFunction.java @@ -58,7 +58,7 @@ public class TestMergeQuantileDigestFunction @Override protected Block[] getSequenceBlocks(int start, int length) { - Type type = functionResolution.getMetadata().getType(new TypeSignature(QDIGEST.getName(), TypeSignatureParameter.typeParameter(DOUBLE.getTypeSignature()))); + Type type = functionResolution.getPlannerContext().getTypeManager().getType(new TypeSignature(QDIGEST.getName(), TypeSignatureParameter.typeParameter(DOUBLE.getTypeSignature()))); BlockBuilder blockBuilder = type.createBlockBuilder(null, length); for (int i = start; i < start + length; i++) { QuantileDigest qdigest = new QuantileDigest(0.0); diff --git a/core/trino-main/src/test/java/io/trino/operator/aggregation/minmaxby/TestMinMaxByAggregation.java b/core/trino-main/src/test/java/io/trino/operator/aggregation/minmaxby/TestMinMaxByAggregation.java index 31afdf8b6919..88285ac2ffa7 100644 --- a/core/trino-main/src/test/java/io/trino/operator/aggregation/minmaxby/TestMinMaxByAggregation.java +++ b/core/trino-main/src/test/java/io/trino/operator/aggregation/minmaxby/TestMinMaxByAggregation.java @@ -14,15 +14,19 @@ package io.trino.operator.aggregation.minmaxby; import com.google.common.collect.ImmutableList; +import io.trino.FeaturesConfig; import io.trino.metadata.TestingFunctionResolution; +import io.trino.metadata.TypeRegistry; import io.trino.spi.type.ArrayType; import io.trino.spi.type.RowType; import io.trino.spi.type.SqlDecimal; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeOperators; import io.trino.sql.analyzer.TypeSignatureProvider; import io.trino.sql.tree.QualifiedName; import org.testng.annotations.Test; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -52,6 +56,7 @@ public class TestMinMaxByAggregation { private static final TestingFunctionResolution FUNCTION_RESOLUTION = new TestingFunctionResolution(); + private static final Collection STANDARD_TYPES = new TypeRegistry(new TypeOperators(), new FeaturesConfig()).getTypes(); @Test public void testAllRegistered() @@ -71,7 +76,7 @@ public void testAllRegistered() private static List getTypes() { return new ImmutableList.Builder() - .addAll(FUNCTION_RESOLUTION.getMetadata().getTypes()) + .addAll(STANDARD_TYPES) .add(VARCHAR) .add(createDecimalType(1)) .add(RowType.anonymous(ImmutableList.of(BIGINT, VARCHAR, DOUBLE))) diff --git a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java index 67b33f4df107..44c091112d8d 100644 --- a/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/output/BenchmarkPartitionedOutputOperator.java @@ -36,6 +36,7 @@ import io.trino.spi.Page; import io.trino.spi.block.Block; import io.trino.spi.block.RunLengthEncodedBlock; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.ArrayType; import io.trino.spi.type.BigintType; import io.trino.spi.type.BooleanType; @@ -89,7 +90,6 @@ import static io.trino.execution.buffer.OutputBuffers.BufferType.PARTITIONED; import static io.trino.execution.buffer.OutputBuffers.createInitialEmptyOutputBuffers; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.PageTestUtils.createRandomDictionaryPage; import static io.trino.operator.PageTestUtils.createRandomPage; import static io.trino.operator.PageTestUtils.createRandomRlePage; @@ -426,7 +426,7 @@ private PartitionedOutputOperator createPartitionedOutputOperator() PartitionFunction partitionFunction = new BucketPartitionFunction( new HashBucketFunction(new PrecomputedHashGenerator(0), partitionCount), IntStream.range(0, partitionCount).toArray()); - PagesSerdeFactory serdeFactory = new PagesSerdeFactory(createTestMetadataManager().getBlockEncodingSerde(), enableCompression); + PagesSerdeFactory serdeFactory = new PagesSerdeFactory(new TestingBlockEncodingSerde(), enableCompression); PartitionedOutputBuffer buffer = createPartitionedOutputBuffer(); TaskContext taskContext = createTaskContext(); diff --git a/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java b/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java index a9bdb4b088ea..49701ea057ad 100644 --- a/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/output/TestPartitionedOutputOperator.java @@ -40,6 +40,7 @@ import io.trino.spi.block.Block; import io.trino.spi.block.DictionaryBlock; import io.trino.spi.block.RunLengthEncodedBlock; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.predicate.NullableValue; import io.trino.spi.type.ArrayType; import io.trino.spi.type.Decimals; @@ -72,7 +73,6 @@ import static io.trino.block.BlockAssertions.createRLEBlock; import static io.trino.block.BlockAssertions.createRandomBlockForType; import static io.trino.execution.buffer.OutputBuffers.BufferType.PARTITIONED; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.CharType.createCharType; @@ -106,7 +106,7 @@ public class TestPartitionedOutputOperator private static final int POSITIONS_PER_PAGE = 8; private static final int PARTITION_COUNT = 2; - private static final PagesSerdeFactory PAGES_SERDE_FACTORY = new PagesSerdeFactory(createTestMetadataManager().getBlockEncodingSerde(), false); + private static final PagesSerdeFactory PAGES_SERDE_FACTORY = new PagesSerdeFactory(new TestingBlockEncodingSerde(), false); private static final PagesSerde PAGES_SERDE = PAGES_SERDE_FACTORY.createPagesSerde(); private final Session testSession; diff --git a/core/trino-main/src/test/java/io/trino/operator/project/BenchmarkDictionaryBlock.java b/core/trino-main/src/test/java/io/trino/operator/project/BenchmarkDictionaryBlock.java index 9c9ef923d3bb..e2d167e5be5c 100644 --- a/core/trino-main/src/test/java/io/trino/operator/project/BenchmarkDictionaryBlock.java +++ b/core/trino-main/src/test/java/io/trino/operator/project/BenchmarkDictionaryBlock.java @@ -43,8 +43,8 @@ import static io.airlift.slice.Slices.utf8Slice; import static io.trino.block.BlockAssertions.createSlicesBlock; import static io.trino.jmh.Benchmarks.benchmark; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.util.concurrent.TimeUnit.MICROSECONDS; @SuppressWarnings("MethodMayBeStatic") @@ -101,7 +101,7 @@ public void setup() private static Block createMapBlock(int positionCount) { - MapType mapType = (MapType) createTestMetadataManager().getType(new TypeSignature(StandardTypes.MAP, TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()), TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()))); + MapType mapType = (MapType) TESTING_TYPE_MANAGER.getType(new TypeSignature(StandardTypes.MAP, TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()), TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()))); Block keyBlock = createDictionaryBlock(generateList("key", positionCount)); Block valueBlock = createDictionaryBlock(generateList("value", positionCount)); int[] offsets = new int[positionCount + 1]; diff --git a/core/trino-main/src/test/java/io/trino/operator/scalar/FunctionAssertions.java b/core/trino-main/src/test/java/io/trino/operator/scalar/FunctionAssertions.java index 6391148c5243..470052ec9a6f 100644 --- a/core/trino-main/src/test/java/io/trino/operator/scalar/FunctionAssertions.java +++ b/core/trino-main/src/test/java/io/trino/operator/scalar/FunctionAssertions.java @@ -62,6 +62,7 @@ import io.trino.spi.type.Type; import io.trino.spi.type.TypeOperators; import io.trino.split.PageSourceProvider; +import io.trino.sql.PlannerContext; import io.trino.sql.gen.ExpressionCompiler; import io.trino.sql.planner.ExpressionInterpreter; import io.trino.sql.planner.Symbol; @@ -74,7 +75,6 @@ import io.trino.sql.tree.SymbolReference; import io.trino.testing.LocalQueryRunner; import io.trino.testing.MaterializedResult; -import io.trino.transaction.TransactionManager; import io.trino.type.BlockTypeOperators; import org.intellij.lang.annotations.Language; import org.joda.time.DateTime; @@ -214,10 +214,7 @@ public final class FunctionAssertions private final Session session; private final LocalQueryRunner runner; - private final TransactionManager transactionManager; - private final Metadata metadata; private final TestingFunctionResolution testingFunctionResolution; - private final ExpressionCompiler compiler; public FunctionAssertions() { @@ -235,15 +232,17 @@ public FunctionAssertions(Session session, FeaturesConfig featuresConfig) runner = LocalQueryRunner.builder(session) .withFeaturesConfig(featuresConfig) .build(); - transactionManager = runner.getTransactionManager(); - metadata = runner.getMetadata(); - testingFunctionResolution = new TestingFunctionResolution(transactionManager, metadata); - compiler = runner.getExpressionCompiler(); + testingFunctionResolution = new TestingFunctionResolution(runner.getTransactionManager(), runner.getMetadata()); } public Metadata getMetadata() { - return metadata; + return runner.getMetadata(); + } + + public PlannerContext getPlannerContext() + { + return runner.getPlannerContext(); } public TestingFunctionResolution getFunctionResolution() @@ -272,13 +271,13 @@ public void assertFunction(String projection, Type expectedType, Object expected expected = ((Slice) expected).toStringUtf8(); } - Object actual = selectSingleValue(projection, expectedType, compiler); + Object actual = selectSingleValue(projection, expectedType, runner.getExpressionCompiler()); assertEquals(actual, expected); } public void assertFunctionString(String projection, Type expectedType, String expected) { - Object actual = selectSingleValue(projection, expectedType, compiler); + Object actual = selectSingleValue(projection, expectedType, runner.getExpressionCompiler()); assertEquals(actual.toString(), expected); } @@ -289,7 +288,7 @@ public void tryEvaluate(String expression, Type expectedType) public void tryEvaluate(String expression, Type expectedType, Session session) { - selectUniqueValue(expression, expectedType, session, compiler); + selectUniqueValue(expression, expectedType, session, runner.getExpressionCompiler()); } public void tryEvaluateWithAll(String expression, Type expectedType) @@ -299,7 +298,7 @@ public void tryEvaluateWithAll(String expression, Type expectedType) public void tryEvaluateWithAll(String expression, Type expectedType, Session session) { - executeProjectionWithAll(expression, expectedType, session, compiler); + executeProjectionWithAll(expression, expectedType, session, runner.getExpressionCompiler()); } public void executeProjectionWithFullEngine(String projection) @@ -371,16 +370,16 @@ public void assertInvalidCast(String projection, String message) private void evaluateInvalid(String projection) { // type isn't necessary as the function is not valid - selectSingleValue(projection, UNKNOWN, compiler); + selectSingleValue(projection, UNKNOWN, runner.getExpressionCompiler()); } public void assertCachedInstanceHasBoundedRetainedSize(String projection) { - transaction(transactionManager, new AllowAllAccessControl()) + transaction(runner.getTransactionManager(), new AllowAllAccessControl()) .singleStatement() .execute(session, txSession -> { // metadata.getCatalogHandle() registers the catalog for the transaction - txSession.getCatalog().ifPresent(catalog -> metadata.getCatalogHandle(txSession, catalog)); + txSession.getCatalog().ifPresent(catalog -> getMetadata().getCatalogHandle(txSession, catalog)); assertCachedInstanceHasBoundedRetainedSizeInTx(projection, txSession); return null; }); @@ -390,9 +389,9 @@ private void assertCachedInstanceHasBoundedRetainedSizeInTx(String projection, S { requireNonNull(projection, "projection is null"); - Expression projectionExpression = createExpression(session, projection, metadata, INPUT_TYPES); + Expression projectionExpression = createExpression(session, projection, getPlannerContext(), INPUT_TYPES); RowExpression projectionRowExpression = toRowExpression(session, projectionExpression); - PageProcessor processor = compiler.compilePageProcessor(Optional.empty(), ImmutableList.of(projectionRowExpression)).get(); + PageProcessor processor = runner.getExpressionCompiler().compilePageProcessor(Optional.empty(), ImmutableList.of(projectionRowExpression)).get(); // This is a heuristic to detect whether the retained size of cachedInstance is bounded. // * The test runs at least 1000 iterations. @@ -502,11 +501,11 @@ private long getRetainedSizeOf(Object object) private List executeProjectionWithAll(String projection, Type expectedType, Session session, ExpressionCompiler compiler) { - return transaction(transactionManager, new AllowAllAccessControl()) + return transaction(runner.getTransactionManager(), new AllowAllAccessControl()) .singleStatement() .execute(session, txSession -> { // metadata.getCatalogHandle() registers the catalog for the transaction - txSession.getCatalog().ifPresent(catalog -> metadata.getCatalogHandle(txSession, catalog)); + txSession.getCatalog().ifPresent(catalog -> getMetadata().getCatalogHandle(txSession, catalog)); return executeProjectionWithAllInTx(projection, expectedType, txSession, compiler); }); } @@ -515,7 +514,7 @@ private List executeProjectionWithAllInTx(String projection, Type expect { requireNonNull(projection, "projection is null"); - Expression projectionExpression = createExpression(session, projection, metadata, INPUT_TYPES); + Expression projectionExpression = createExpression(session, projection, getPlannerContext(), INPUT_TYPES); RowExpression projectionRowExpression = toRowExpression(session, projectionExpression); List results = new ArrayList<>(); @@ -566,7 +565,7 @@ private List executeProjectionWithAllInTx(String projection, Type expect private RowExpression toRowExpression(Session session, Expression projectionExpression) { - return toRowExpression(session, projectionExpression, getTypes(session, metadata, INPUT_TYPES, projectionExpression), INPUT_MAPPING); + return toRowExpression(session, projectionExpression, getTypes(session, getPlannerContext(), INPUT_TYPES, projectionExpression), INPUT_MAPPING); } private Object selectSingleValue(OperatorFactory operatorFactory, Type type, Session session) @@ -599,7 +598,7 @@ private Object selectSingleValue(Operator operator, Type type) public void assertFilter(String filter, boolean expected, boolean withNoInputColumns) { - assertFilter(filter, expected, withNoInputColumns, compiler); + assertFilter(filter, expected, withNoInputColumns, runner.getExpressionCompiler()); } private void assertFilter(String filter, boolean expected, boolean withNoInputColumns, ExpressionCompiler compiler) @@ -617,7 +616,7 @@ private List executeFilterWithAll(String filter, Session session, boole { requireNonNull(filter, "filter is null"); - Expression filterExpression = createExpression(session, filter, metadata, INPUT_TYPES); + Expression filterExpression = createExpression(session, filter, getPlannerContext(), INPUT_TYPES); RowExpression filterRowExpression = toRowExpression(session, filterExpression); List results = new ArrayList<>(); @@ -738,8 +737,8 @@ protected Void visitSymbolReference(SymbolReference node, Void context) private Object interpret(Expression expression, Type expectedType, Session session) { - Map, Type> expressionTypes = getTypes(session, metadata, INPUT_TYPES, expression); - ExpressionInterpreter evaluator = new ExpressionInterpreter(expression, metadata, session, expressionTypes); + Map, Type> expressionTypes = getTypes(session, getPlannerContext(), INPUT_TYPES, expression); + ExpressionInterpreter evaluator = new ExpressionInterpreter(expression, runner.getPlannerContext(), session, expressionTypes); Object result = evaluator.evaluate(symbol -> { int position = 0; @@ -843,7 +842,7 @@ private static SourceOperatorFactory compileScanFilterProject(Optional, Type> expressionTypes, Map layout) { - return translate(projection, expressionTypes, layout, metadata, session, false); + return translate(projection, expressionTypes, layout, getMetadata(), session, false); } private static Page getAtMostOnePage(Operator operator, Page sourcePage) diff --git a/core/trino-main/src/test/java/io/trino/operator/spiller/BenchmarkBinaryFileSpiller.java b/core/trino-main/src/test/java/io/trino/operator/spiller/BenchmarkBinaryFileSpiller.java index fdc1f534a103..800169f04d04 100644 --- a/core/trino-main/src/test/java/io/trino/operator/spiller/BenchmarkBinaryFileSpiller.java +++ b/core/trino-main/src/test/java/io/trino/operator/spiller/BenchmarkBinaryFileSpiller.java @@ -18,6 +18,7 @@ import io.trino.spi.Page; import io.trino.spi.PageBuilder; import io.trino.spi.block.BlockEncodingSerde; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.Type; import io.trino.spiller.FileSingleStreamSpillerFactory; import io.trino.spiller.GenericSpillerFactory; @@ -45,7 +46,6 @@ import java.util.concurrent.TimeUnit; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.VarcharType.VARCHAR; @@ -60,7 +60,7 @@ public class BenchmarkBinaryFileSpiller { private static final List TYPES = ImmutableList.of(BIGINT, BIGINT, DOUBLE, createUnboundedVarcharType(), DOUBLE); - private static final BlockEncodingSerde BLOCK_ENCODING_SERDE = createTestMetadataManager().getBlockEncodingSerde(); + private static final BlockEncodingSerde BLOCK_ENCODING_SERDE = new TestingBlockEncodingSerde(); private static final Path SPILL_PATH = Paths.get(System.getProperty("java.io.tmpdir"), "spills"); @Benchmark diff --git a/core/trino-main/src/test/java/io/trino/operator/unnest/TestUnnestOperator.java b/core/trino-main/src/test/java/io/trino/operator/unnest/TestUnnestOperator.java index 723fc9909b65..2a4bb0379dc7 100644 --- a/core/trino-main/src/test/java/io/trino/operator/unnest/TestUnnestOperator.java +++ b/core/trino-main/src/test/java/io/trino/operator/unnest/TestUnnestOperator.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import io.trino.metadata.Metadata; import io.trino.operator.DriverContext; import io.trino.operator.OperatorFactory; import io.trino.spi.Page; @@ -35,7 +34,6 @@ import static io.airlift.concurrent.Threads.daemonThreadsNamed; import static io.trino.RowPagesBuilder.rowPagesBuilder; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.OperatorAssertion.assertOperatorEquals; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; @@ -43,6 +41,7 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.testing.MaterializedResult.resultBuilder; import static io.trino.testing.TestingTaskContext.createTaskContext; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.arrayBlockOf; import static io.trino.util.StructuralTestUtil.mapBlockOf; import static java.lang.Double.NEGATIVE_INFINITY; @@ -79,9 +78,8 @@ public void tearDown() @Test public void testUnnest() { - Metadata metadata = createTestMetadataManager(); Type arrayType = new ArrayType(BIGINT); - Type mapType = metadata.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); + Type mapType = TESTING_TYPE_MANAGER.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); List input = rowPagesBuilder(BIGINT, arrayType, mapType) .row(1L, arrayBlockOf(BIGINT, 2, 3), mapBlockOf(BIGINT, BIGINT, ImmutableMap.of(4, 5))) @@ -108,9 +106,8 @@ public void testUnnest() @Test public void testUnnestWithArray() { - Metadata metadata = createTestMetadataManager(); Type arrayType = new ArrayType(new ArrayType(BIGINT)); - Type mapType = metadata.getType(mapType(new ArrayType(BIGINT).getTypeSignature(), new ArrayType(BIGINT).getTypeSignature())); + Type mapType = TESTING_TYPE_MANAGER.getType(mapType(new ArrayType(BIGINT).getTypeSignature(), new ArrayType(BIGINT).getTypeSignature())); List input = rowPagesBuilder(BIGINT, arrayType, mapType) .row( @@ -143,9 +140,8 @@ public void testUnnestWithArray() @Test public void testUnnestWithOrdinality() { - Metadata metadata = createTestMetadataManager(); Type arrayType = new ArrayType(BIGINT); - Type mapType = metadata.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); + Type mapType = TESTING_TYPE_MANAGER.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); List input = rowPagesBuilder(BIGINT, arrayType, mapType) .row(1L, arrayBlockOf(BIGINT, 2, 3), mapBlockOf(BIGINT, BIGINT, ImmutableMap.of(4, 5))) @@ -172,9 +168,8 @@ public void testUnnestWithOrdinality() @Test public void testUnnestNonNumericDoubles() { - Metadata metadata = createTestMetadataManager(); Type arrayType = new ArrayType(DOUBLE); - Type mapType = metadata.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); + Type mapType = TESTING_TYPE_MANAGER.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); List input = rowPagesBuilder(BIGINT, arrayType, mapType) .row(1L, arrayBlockOf(DOUBLE, NEGATIVE_INFINITY, POSITIVE_INFINITY, NaN), @@ -225,8 +220,7 @@ public void testUnnestWithArrayOfRows() @Test public void testOuterUnnest() { - Metadata metadata = createTestMetadataManager(); - Type mapType = metadata.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); + Type mapType = TESTING_TYPE_MANAGER.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); Type arrayType = new ArrayType(BIGINT); Type elementType = RowType.anonymous(ImmutableList.of(BIGINT, DOUBLE, VARCHAR)); Type arrayOfRowType = new ArrayType(elementType); @@ -258,8 +252,7 @@ public void testOuterUnnest() @Test public void testOuterUnnestWithOrdinality() { - Metadata metadata = createTestMetadataManager(); - Type mapType = metadata.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); + Type mapType = TESTING_TYPE_MANAGER.getType(mapType(BIGINT.getTypeSignature(), BIGINT.getTypeSignature())); Type arrayType = new ArrayType(BIGINT); Type elementType = RowType.anonymous(ImmutableList.of(BIGINT, DOUBLE, VARCHAR)); Type arrayOfRowType = new ArrayType(elementType); diff --git a/core/trino-main/src/test/java/io/trino/server/protocol/TestQueryResultRows.java b/core/trino-main/src/test/java/io/trino/server/protocol/TestQueryResultRows.java index c6b1231c8895..5e423a76738b 100644 --- a/core/trino-main/src/test/java/io/trino/server/protocol/TestQueryResultRows.java +++ b/core/trino-main/src/test/java/io/trino/server/protocol/TestQueryResultRows.java @@ -18,7 +18,6 @@ import io.trino.Session; import io.trino.client.ClientTypeSignature; import io.trino.client.Column; -import io.trino.metadata.Metadata; import io.trino.spi.Page; import io.trino.spi.TrinoException; import io.trino.spi.type.ArrayType; @@ -49,9 +48,9 @@ import static io.trino.client.ClientStandardTypes.ROW; import static io.trino.client.ClientStandardTypes.TIMESTAMP; import static io.trino.client.ClientStandardTypes.TIMESTAMP_WITH_TIME_ZONE; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.server.protocol.QueryResultRows.queryResultRowsBuilder; import static io.trino.spi.type.TypeSignature.mapType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; @@ -66,8 +65,6 @@ public class TestQueryResultRows private static final Function BIGINT_COLUMN = name -> new Column(name, BIGINT, new ClientTypeSignature(BIGINT)); private static final Function INT_COLUMN = name -> new Column(name, INTEGER, new ClientTypeSignature(INTEGER)); - private static final Metadata METADATA = createTestMetadataManager(); - @Test public void shouldNotReturnValues() { @@ -484,6 +481,6 @@ public List getExceptions() private static Type createMapType(Type keyType, Type valueType) { - return METADATA.getType(mapType(keyType.getTypeSignature(), valueType.getTypeSignature())); + return TESTING_TYPE_MANAGER.getType(mapType(keyType.getTypeSignature(), valueType.getTypeSignature())); } } diff --git a/core/trino-main/src/test/java/io/trino/server/remotetask/TestHttpRemoteTask.java b/core/trino-main/src/test/java/io/trino/server/remotetask/TestHttpRemoteTask.java index 6a790bbca44a..aa034c35c185 100644 --- a/core/trino-main/src/test/java/io/trino/server/remotetask/TestHttpRemoteTask.java +++ b/core/trino-main/src/test/java/io/trino/server/remotetask/TestHttpRemoteTask.java @@ -47,8 +47,10 @@ import io.trino.execution.TaskTestUtils; import io.trino.execution.TestSqlTaskManager; import io.trino.execution.buffer.OutputBuffers; +import io.trino.metadata.BlockEncodingManager; import io.trino.metadata.HandleJsonModule; import io.trino.metadata.HandleResolver; +import io.trino.metadata.InternalBlockEncodingSerde; import io.trino.metadata.InternalNode; import io.trino.metadata.Metadata; import io.trino.metadata.Split; @@ -65,6 +67,7 @@ import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeOperators; import io.trino.sql.DynamicFilters; import io.trino.sql.planner.Symbol; @@ -77,7 +80,6 @@ import io.trino.type.TypeDeserializer; import org.testng.annotations.Test; -import javax.inject.Singleton; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; @@ -108,6 +110,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService; +import static com.google.inject.Scopes.SINGLETON; import static io.airlift.json.JsonBinder.jsonBinder; import static io.airlift.json.JsonCodecBinder.jsonCodecBinder; import static io.airlift.testing.Assertions.assertGreaterThanOrEqual; @@ -123,6 +126,7 @@ import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.testing.assertions.Assert.assertEquals; import static io.trino.testing.assertions.Assert.assertEventually; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Math.min; import static java.lang.String.format; import static java.util.Objects.requireNonNull; @@ -437,7 +441,7 @@ private static HttpRemoteTaskFactory createHttpRemoteTaskFactory(TestingTaskReso @Override public void configure(Binder binder) { - binder.bind(JsonMapper.class); + binder.bind(JsonMapper.class).in(SINGLETON); binder.bind(Metadata.class).toInstance(createTestMetadataManager()); jsonBinder(binder).addDeserializerBinding(Type.class).to(TypeDeserializer.class); jsonCodecBinder(binder).bindJsonCodec(TaskStatus.class); @@ -446,13 +450,10 @@ public void configure(Binder binder) jsonBinder(binder).addDeserializerBinding(Block.class).to(BlockJsonSerde.Deserializer.class); jsonCodecBinder(binder).bindJsonCodec(TaskInfo.class); jsonCodecBinder(binder).bindJsonCodec(TaskUpdateRequest.class); - } - @Provides - @Singleton - public BlockEncodingSerde createBlockEncodingSerde(Metadata metadata) - { - return metadata.getBlockEncodingSerde(); + binder.bind(TypeManager.class).toInstance(TESTING_TYPE_MANAGER); + binder.bind(BlockEncodingManager.class).in(SINGLETON); + binder.bind(BlockEncodingSerde.class).to(InternalBlockEncodingSerde.class).in(SINGLETON); } @Provides diff --git a/core/trino-main/src/test/java/io/trino/spiller/TestBinaryFileSpiller.java b/core/trino-main/src/test/java/io/trino/spiller/TestBinaryFileSpiller.java index 6fa40485eea2..56ef63fab66a 100644 --- a/core/trino-main/src/test/java/io/trino/spiller/TestBinaryFileSpiller.java +++ b/core/trino-main/src/test/java/io/trino/spiller/TestBinaryFileSpiller.java @@ -19,9 +19,10 @@ import io.trino.execution.buffer.PagesSerde; import io.trino.execution.buffer.PagesSerdeFactory; import io.trino.memory.context.AggregatedMemoryContext; -import io.trino.metadata.Metadata; import io.trino.spi.Page; import io.trino.spi.block.BlockBuilder; +import io.trino.spi.block.BlockEncodingSerde; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.Type; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; @@ -38,7 +39,6 @@ import static com.google.common.io.MoreFiles.deleteRecursively; import static com.google.common.io.RecursiveDeleteOption.ALLOW_INSECURE; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.PageAssertions.assertPageEquals; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; @@ -69,15 +69,15 @@ public void setUpClass() @BeforeMethod public void setUp() { - Metadata metadata = createTestMetadataManager(); spillerStats = new SpillerStats(); FeaturesConfig featuresConfig = new FeaturesConfig(); featuresConfig.setSpillerSpillPaths(spillPath.getAbsolutePath()); featuresConfig.setSpillMaxUsedSpaceThreshold(1.0); NodeSpillConfig nodeSpillConfig = new NodeSpillConfig(); - singleStreamSpillerFactory = new FileSingleStreamSpillerFactory(metadata, spillerStats, featuresConfig, nodeSpillConfig); + BlockEncodingSerde blockEncodingSerde = new TestingBlockEncodingSerde(); + singleStreamSpillerFactory = new FileSingleStreamSpillerFactory(blockEncodingSerde, spillerStats, featuresConfig, nodeSpillConfig); factory = new GenericSpillerFactory(singleStreamSpillerFactory); - PagesSerdeFactory pagesSerdeFactory = new PagesSerdeFactory(metadata.getBlockEncodingSerde(), nodeSpillConfig.isSpillCompressionEnabled()); + PagesSerdeFactory pagesSerdeFactory = new PagesSerdeFactory(blockEncodingSerde, nodeSpillConfig.isSpillCompressionEnabled()); pagesSerde = pagesSerdeFactory.createPagesSerde(); memoryContext = newSimpleAggregatedMemoryContext(); } diff --git a/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpiller.java b/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpiller.java index b2fc65f45a62..298552364837 100644 --- a/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpiller.java +++ b/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpiller.java @@ -24,6 +24,7 @@ import io.trino.operator.PageAssertions; import io.trino.spi.Page; import io.trino.spi.block.BlockBuilder; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.Type; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; @@ -41,7 +42,6 @@ import static com.google.common.io.RecursiveDeleteOption.ALLOW_INSECURE; import static com.google.common.util.concurrent.MoreExecutors.listeningDecorator; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.VarbinaryType.VARBINARY; @@ -107,7 +107,7 @@ private void assertSpill(boolean compression, boolean encryption) { FileSingleStreamSpillerFactory spillerFactory = new FileSingleStreamSpillerFactory( executor, // executor won't be closed, because we don't call destroy() on the spiller factory - createTestMetadataManager().getBlockEncodingSerde(), + new TestingBlockEncodingSerde(), new SpillerStats(), ImmutableList.of(spillPath.toPath()), 1.0, diff --git a/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpillerFactory.java b/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpillerFactory.java index d27207abb406..1299efefd8d9 100644 --- a/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpillerFactory.java +++ b/core/trino-main/src/test/java/io/trino/spiller/TestFileSingleStreamSpillerFactory.java @@ -21,6 +21,7 @@ import io.trino.spi.Page; import io.trino.spi.block.BlockBuilder; import io.trino.spi.block.BlockEncodingSerde; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.Type; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -40,7 +41,6 @@ import static com.google.common.io.RecursiveDeleteOption.ALLOW_INSECURE; import static com.google.common.util.concurrent.Futures.getUnchecked; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spiller.FileSingleStreamSpillerFactory.SPILL_FILE_PREFIX; import static io.trino.spiller.FileSingleStreamSpillerFactory.SPILL_FILE_SUFFIX; @@ -52,7 +52,7 @@ @Test(singleThreaded = true) public class TestFileSingleStreamSpillerFactory { - private final BlockEncodingSerde blockEncodingSerde = createTestMetadataManager().getBlockEncodingSerde(); + private final BlockEncodingSerde blockEncodingSerde = new TestingBlockEncodingSerde(); private Closer closer; private ListeningExecutorService executor; private File spillPath1; diff --git a/core/trino-main/src/test/java/io/trino/spiller/TestGenericPartitioningSpiller.java b/core/trino-main/src/test/java/io/trino/spiller/TestGenericPartitioningSpiller.java index 2e6876174520..f6c5551fb556 100644 --- a/core/trino-main/src/test/java/io/trino/spiller/TestGenericPartitioningSpiller.java +++ b/core/trino-main/src/test/java/io/trino/spiller/TestGenericPartitioningSpiller.java @@ -24,6 +24,7 @@ import io.trino.operator.SpillContext; import io.trino.operator.TestingOperatorContext; import io.trino.spi.Page; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.Type; import io.trino.spiller.PartitioningSpiller.PartitioningSpillResult; import org.testng.annotations.AfterClass; @@ -42,7 +43,6 @@ import static com.google.common.io.MoreFiles.deleteRecursively; import static com.google.common.io.RecursiveDeleteOption.ALLOW_INSECURE; import static io.airlift.concurrent.MoreFutures.getFutureValue; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.PageAssertions.assertPageEquals; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; @@ -76,7 +76,7 @@ public void setUp() featuresConfig.setSpillerThreads(8); featuresConfig.setSpillMaxUsedSpaceThreshold(1.0); SingleStreamSpillerFactory singleStreamSpillerFactory = new FileSingleStreamSpillerFactory( - createTestMetadataManager(), + new TestingBlockEncodingSerde(), new SpillerStats(), featuresConfig, new NodeSpillConfig()); diff --git a/core/trino-main/src/test/java/io/trino/sql/ExpressionTestUtils.java b/core/trino-main/src/test/java/io/trino/sql/ExpressionTestUtils.java index f341f5a7ae52..c4d2af59be9b 100644 --- a/core/trino-main/src/test/java/io/trino/sql/ExpressionTestUtils.java +++ b/core/trino-main/src/test/java/io/trino/sql/ExpressionTestUtils.java @@ -16,7 +16,6 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Type; @@ -25,7 +24,6 @@ import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.DesugarArrayConstructorRewriter; import io.trino.sql.planner.DesugarLikeRewriter; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.assertions.ExpressionVerifier; import io.trino.sql.planner.assertions.SymbolAliases; @@ -47,6 +45,7 @@ import static io.trino.sql.ParsingUtil.createParsingOptions; import static io.trino.sql.analyzer.SemanticExceptions.semanticException; import static io.trino.sql.analyzer.TypeSignatureTranslator.toSqlType; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.transaction.TransactionBuilder.transaction; import static org.testng.internal.EclipseInterface.ASSERT_LEFT; import static org.testng.internal.EclipseInterface.ASSERT_MIDDLE; @@ -80,47 +79,47 @@ private static void failNotEqual(Object actual, Object expected, String message) throw new AssertionError(formatted + ASSERT_LEFT + expected + ASSERT_MIDDLE + actual + ASSERT_RIGHT); } - public static Expression createExpression(Session session, String expression, Metadata metadata, TypeProvider symbolTypes) + public static Expression createExpression(Session session, String expression, PlannerContext plannerContext, TypeProvider symbolTypes) { Expression parsedExpression = SQL_PARSER.createExpression(expression, createParsingOptions(session)); - return planExpression(metadata, session, symbolTypes, parsedExpression); + return planExpression(plannerContext, session, symbolTypes, parsedExpression); } - public static Expression createExpression(String expression, Metadata metadata, TypeProvider symbolTypes) + public static Expression createExpression(String expression, PlannerContext plannerContext, TypeProvider symbolTypes) { - return createExpression(TEST_SESSION, expression, metadata, symbolTypes); + return createExpression(TEST_SESSION, expression, plannerContext, symbolTypes); } - public static Expression planExpression(Metadata metadata, Session session, TypeProvider typeProvider, Expression expression) + public static Expression planExpression(PlannerContext plannerContext, Session session, TypeProvider typeProvider, Expression expression) { if (session.getTransactionId().isPresent()) { - return planExpressionInExistingTx(metadata, typeProvider, expression, session); + return planExpressionInExistingTx(plannerContext, typeProvider, expression, session); } return transaction(new TestingTransactionManager(), new AllowAllAccessControl()) .singleStatement() .execute(session, transactionSession -> { - return planExpressionInExistingTx(metadata, typeProvider, expression, transactionSession); + return planExpressionInExistingTx(plannerContext, typeProvider, expression, transactionSession); }); } - private static Expression planExpressionInExistingTx(Metadata metadata, TypeProvider typeProvider, Expression expression, Session transactionSession) + private static Expression planExpressionInExistingTx(PlannerContext plannerContext, TypeProvider typeProvider, Expression expression, Session transactionSession) { Expression rewritten = rewriteIdentifiersToSymbolReferences(expression); - rewritten = DesugarLikeRewriter.rewrite(rewritten, transactionSession, metadata, new TypeAnalyzer(SQL_PARSER, metadata), typeProvider); - rewritten = DesugarArrayConstructorRewriter.rewrite(rewritten, transactionSession, metadata, new TypeAnalyzer(SQL_PARSER, metadata), typeProvider); - rewritten = CanonicalizeExpressionRewriter.rewrite(rewritten, transactionSession, metadata, new TypeAnalyzer(SQL_PARSER, metadata), typeProvider); - return resolveFunctionCalls(metadata, transactionSession, typeProvider, rewritten); + rewritten = DesugarLikeRewriter.rewrite(rewritten, transactionSession, plannerContext.getMetadata(), createTestingTypeAnalyzer(plannerContext), typeProvider); + rewritten = DesugarArrayConstructorRewriter.rewrite(rewritten, transactionSession, plannerContext.getMetadata(), createTestingTypeAnalyzer(plannerContext), typeProvider); + rewritten = CanonicalizeExpressionRewriter.rewrite(rewritten, transactionSession, plannerContext.getMetadata(), createTestingTypeAnalyzer(plannerContext), typeProvider); + return resolveFunctionCalls(plannerContext, transactionSession, typeProvider, rewritten); } - public static Expression resolveFunctionCalls(Metadata metadata, Session session, TypeProvider typeProvider, Expression expression) + public static Expression resolveFunctionCalls(PlannerContext plannerContext, Session session, TypeProvider typeProvider, Expression expression) { - return resolveFunctionCalls(metadata, session, typeProvider, expression, Scope.builder().build()); + return resolveFunctionCalls(plannerContext, session, typeProvider, expression, Scope.builder().build()); } - public static Expression resolveFunctionCalls(Metadata metadata, Session session, TypeProvider typeProvider, Expression expression, Scope scope) + public static Expression resolveFunctionCalls(PlannerContext plannerContext, Session session, TypeProvider typeProvider, Expression expression, Scope scope) { ExpressionAnalyzer analyzer = ExpressionAnalyzer.createWithoutSubqueries( - metadata, + plannerContext, new AllowAllAccessControl(), session, typeProvider, @@ -177,15 +176,15 @@ private Expression coerceIfNecessary(Expression originalExpression, Expression r }, expression); } - public static Map, Type> getTypes(Session session, Metadata metadata, TypeProvider typeProvider, Expression expression) + public static Map, Type> getTypes(Session session, PlannerContext plannerContext, TypeProvider typeProvider, Expression expression) { if (session.getTransactionId().isPresent()) { - return new TypeAnalyzer(SQL_PARSER, metadata).getTypes(session, typeProvider, expression); + return createTestingTypeAnalyzer(plannerContext).getTypes(session, typeProvider, expression); } return transaction(new TestingTransactionManager(), new AllowAllAccessControl()) .singleStatement() .execute(session, transactionSession -> { - return new TypeAnalyzer(SQL_PARSER, metadata).getTypes(transactionSession, typeProvider, expression); + return createTestingTypeAnalyzer(plannerContext).getTypes(transactionSession, typeProvider, expression); }); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/TestExpressionInterpreter.java b/core/trino-main/src/test/java/io/trino/sql/TestExpressionInterpreter.java index 0c9c76143d51..c0f72acf3bff 100644 --- a/core/trino-main/src/test/java/io/trino/sql/TestExpressionInterpreter.java +++ b/core/trino-main/src/test/java/io/trino/sql/TestExpressionInterpreter.java @@ -17,8 +17,6 @@ import com.google.common.collect.ImmutableMap; import io.airlift.slice.Slice; import io.airlift.slice.Slices; -import io.trino.metadata.Metadata; -import io.trino.metadata.TestingFunctionResolution; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Decimals; import io.trino.spi.type.SqlTimestampWithTimeZone; @@ -29,7 +27,6 @@ import io.trino.sql.planner.ExpressionInterpreter; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.SymbolResolver; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.assertions.SymbolAliases; import io.trino.sql.planner.iterative.rule.CanonicalizeExpressionRewriter; @@ -75,6 +72,8 @@ import static io.trino.sql.ExpressionTestUtils.resolveFunctionCalls; import static io.trino.sql.ExpressionUtils.rewriteIdentifiersToSymbolReferences; import static io.trino.sql.ParsingUtil.createParsingOptions; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; import static io.trino.type.DateTimes.scaleEpochMillisToMicros; import static io.trino.type.IntervalDayTimeType.INTERVAL_DAY_TIME; @@ -152,8 +151,6 @@ public class TestExpressionInterpreter }; private static final SqlParser SQL_PARSER = new SqlParser(); - private static final TestingFunctionResolution FUNCTION_RESOLUTION = new TestingFunctionResolution(); - private static final Metadata METADATA = FUNCTION_RESOLUTION.getMetadata(); @Test public void testAnd() @@ -1926,8 +1923,8 @@ private static Object optimize(@Language("SQL") String expression) static Object optimize(Expression parsedExpression) { - Map, Type> expressionTypes = getTypes(TEST_SESSION, METADATA, SYMBOL_TYPES, parsedExpression); - ExpressionInterpreter interpreter = new ExpressionInterpreter(parsedExpression, METADATA, TEST_SESSION, expressionTypes); + Map, Type> expressionTypes = getTypes(TEST_SESSION, PLANNER_CONTEXT, SYMBOL_TYPES, parsedExpression); + ExpressionInterpreter interpreter = new ExpressionInterpreter(parsedExpression, PLANNER_CONTEXT, TEST_SESSION, expressionTypes); return interpreter.optimize(INPUTS); } @@ -1939,12 +1936,12 @@ static Expression planExpression(@Language("SQL") String expression) .execute(TEST_SESSION, transactionSession -> { Expression parsedExpression = SQL_PARSER.createExpression(expression, createParsingOptions(transactionSession)); parsedExpression = rewriteIdentifiersToSymbolReferences(parsedExpression); - parsedExpression = resolveFunctionCalls(METADATA, transactionSession, SYMBOL_TYPES, parsedExpression); + parsedExpression = resolveFunctionCalls(PLANNER_CONTEXT, transactionSession, SYMBOL_TYPES, parsedExpression); parsedExpression = CanonicalizeExpressionRewriter.rewrite( parsedExpression, transactionSession, - METADATA, - new TypeAnalyzer(SQL_PARSER, METADATA), + PLANNER_CONTEXT.getMetadata(), + createTestingTypeAnalyzer(PLANNER_CONTEXT), SYMBOL_TYPES); return parsedExpression; }); @@ -1959,7 +1956,7 @@ private static Object evaluate(String expression) { assertRoundTrip(expression); - Expression parsedExpression = ExpressionTestUtils.createExpression(expression, METADATA, SYMBOL_TYPES); + Expression parsedExpression = ExpressionTestUtils.createExpression(expression, PLANNER_CONTEXT, SYMBOL_TYPES); return evaluate(parsedExpression); } @@ -1974,8 +1971,8 @@ private static void assertRoundTrip(String expression) private static Object evaluate(Expression expression) { - Map, Type> expressionTypes = getTypes(TEST_SESSION, METADATA, SYMBOL_TYPES, expression); - ExpressionInterpreter interpreter = new ExpressionInterpreter(expression, METADATA, TEST_SESSION, expressionTypes); + Map, Type> expressionTypes = getTypes(TEST_SESSION, PLANNER_CONTEXT, SYMBOL_TYPES, expression); + ExpressionInterpreter interpreter = new ExpressionInterpreter(expression, PLANNER_CONTEXT, TEST_SESSION, expressionTypes); return interpreter.evaluate(INPUTS); } diff --git a/core/trino-main/src/test/java/io/trino/sql/TestSqlToRowExpressionTranslator.java b/core/trino-main/src/test/java/io/trino/sql/TestSqlToRowExpressionTranslator.java index de14ee2d522e..65f0ee8c8688 100644 --- a/core/trino-main/src/test/java/io/trino/sql/TestSqlToRowExpressionTranslator.java +++ b/core/trino-main/src/test/java/io/trino/sql/TestSqlToRowExpressionTranslator.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableMap; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Type; import io.trino.sql.analyzer.ExpressionAnalyzer; @@ -36,10 +35,10 @@ import java.util.Map; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DecimalType.createDecimalType; import static io.trino.spi.type.Decimals.encodeScaledValue; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; import static io.trino.sql.planner.iterative.rule.test.PlanBuilder.expression; import static io.trino.sql.relational.Expressions.constant; import static io.trino.testing.assertions.Assert.assertEquals; @@ -47,8 +46,7 @@ public class TestSqlToRowExpressionTranslator { - private final Metadata metadata = createTestMetadataManager(); - private final LiteralEncoder literalEncoder = new LiteralEncoder(TEST_SESSION, metadata); + private final LiteralEncoder literalEncoder = new LiteralEncoder(PLANNER_CONTEXT); @Test(timeOut = 10_000) public void testPossibleExponentialOptimizationTime() @@ -92,7 +90,7 @@ private RowExpression translateAndOptimize(Expression expression) private RowExpression translateAndOptimize(Expression expression, Map, Type> types) { - return SqlToRowExpressionTranslator.translate(expression, types, ImmutableMap.of(), metadata, TEST_SESSION, true); + return SqlToRowExpressionTranslator.translate(expression, types, ImmutableMap.of(), PLANNER_CONTEXT.getMetadata(), TEST_SESSION, true); } private Expression simplifyExpression(Expression expression) @@ -100,15 +98,15 @@ private Expression simplifyExpression(Expression expression) // Testing simplified expressions is important, since simplification may create CASTs or function calls that cannot be simplified by the ExpressionOptimizer Map, Type> expressionTypes = getExpressionTypes(expression); - ExpressionInterpreter interpreter = new ExpressionInterpreter(expression, metadata, TEST_SESSION, expressionTypes); + ExpressionInterpreter interpreter = new ExpressionInterpreter(expression, PLANNER_CONTEXT, TEST_SESSION, expressionTypes); Object value = interpreter.optimize(NoOpSymbolResolver.INSTANCE); - return literalEncoder.toExpression(value, expressionTypes.get(NodeRef.of(expression))); + return literalEncoder.toExpression(TEST_SESSION, value, expressionTypes.get(NodeRef.of(expression))); } private Map, Type> getExpressionTypes(Expression expression) { ExpressionAnalyzer expressionAnalyzer = ExpressionAnalyzer.createWithoutSubqueries( - metadata, + PLANNER_CONTEXT, new AllowAllAccessControl(), TEST_SESSION, TypeProvider.empty(), diff --git a/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java b/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java index 2acb921ddb39..877254842631 100644 --- a/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java +++ b/core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java @@ -30,16 +30,21 @@ import io.trino.execution.warnings.WarningCollector; import io.trino.memory.MemoryManagerConfig; import io.trino.memory.NodeMemoryConfig; +import io.trino.metadata.AnalyzePropertyManager; import io.trino.metadata.Catalog; import io.trino.metadata.Catalog.SecurityManagement; import io.trino.metadata.CatalogManager; +import io.trino.metadata.ColumnPropertyManager; import io.trino.metadata.InMemoryNodeManager; import io.trino.metadata.InternalNodeManager; import io.trino.metadata.MaterializedViewDefinition; +import io.trino.metadata.MaterializedViewPropertyManager; import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; +import io.trino.metadata.SchemaPropertyManager; import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.TableHandle; +import io.trino.metadata.TablePropertyManager; import io.trino.metadata.ViewColumn; import io.trino.metadata.ViewDefinition; import io.trino.plugin.base.security.AllowAllSystemAccessControl; @@ -61,6 +66,7 @@ import io.trino.spi.type.ArrayType; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; +import io.trino.sql.PlannerContext; import io.trino.sql.parser.ParsingOptions; import io.trino.sql.parser.SqlParser; import io.trino.sql.rewrite.ShowQueriesRewrite; @@ -158,8 +164,10 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; import static io.trino.spi.type.VarcharType.createVarcharType; +import static io.trino.sql.analyzer.StatementAnalyzerFactory.createTestingStatementAnalyzerFactory; import static io.trino.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DECIMAL; import static io.trino.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DOUBLE; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; import static io.trino.testing.TestingAccessControlManager.TestingPrivilegeType.SELECT_COLUMN; import static io.trino.testing.TestingAccessControlManager.privilege; import static io.trino.testing.TestingEventListenerManager.emptyEventListenerManager; @@ -167,6 +175,7 @@ import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static io.trino.transaction.TransactionBuilder.transaction; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.util.Collections.emptyList; import static java.util.Collections.emptyMap; @@ -201,7 +210,9 @@ public class TestAnalyzer private TransactionManager transactionManager; private AccessControl accessControl; - private Metadata metadata; + private PlannerContext plannerContext; + private TablePropertyManager tablePropertyManager; + private AnalyzePropertyManager analyzePropertyManager; @Test public void testTooManyArguments() @@ -5159,14 +5170,19 @@ public void setup() accessControlManager.setSystemAccessControls(List.of(AllowAllSystemAccessControl.INSTANCE)); this.accessControl = accessControlManager; - metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); + Metadata metadata = createTestMetadataManager(transactionManager, new FeaturesConfig()); metadata.addFunctions(ImmutableList.of(APPLY_FUNCTION)); + plannerContext = plannerContextBuilder().withMetadata(metadata).build(); Catalog tpchTestCatalog = createTestingCatalog(TPCH_CATALOG, TPCH_CATALOG_NAME); TestingMetadata testingConnectorMetadata = (TestingMetadata) tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getMetadata(null); catalogManager.registerCatalog(tpchTestCatalog); - metadata.getTablePropertyManager().addProperties(TPCH_CATALOG_NAME, tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getTableProperties()); - metadata.getAnalyzePropertyManager().addProperties(TPCH_CATALOG_NAME, tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getAnalyzeProperties()); + + tablePropertyManager = new TablePropertyManager(); + tablePropertyManager.addProperties(TPCH_CATALOG_NAME, tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getTableProperties()); + + analyzePropertyManager = new AnalyzePropertyManager(); + analyzePropertyManager.addProperties(TPCH_CATALOG_NAME, tpchTestCatalog.getConnector(TPCH_CATALOG_NAME).getAnalyzeProperties()); catalogManager.registerCatalog(createTestingCatalog(SECOND_CATALOG, SECOND_CATALOG_NAME)); catalogManager.registerCatalog(createTestingCatalog(THIRD_CATALOG, THIRD_CATALOG_NAME)); @@ -5312,10 +5328,10 @@ public void setup() // for identifier chain resolving tests catalogManager.registerCatalog(createTestingCatalog(CATALOG_FOR_IDENTIFIER_CHAIN_TESTS, CATALOG_FOR_IDENTIFIER_CHAIN_TESTS_NAME)); - Type singleFieldRowType = metadata.fromSqlType("row(f1 bigint)"); - Type rowType = metadata.fromSqlType("row(f1 bigint, f2 bigint)"); - Type nestedRowType = metadata.fromSqlType("row(f1 row(f11 bigint, f12 bigint), f2 boolean)"); - Type doubleNestedRowType = metadata.fromSqlType("row(f1 row(f11 row(f111 bigint, f112 bigint), f12 boolean), f2 boolean)"); + Type singleFieldRowType = TESTING_TYPE_MANAGER.fromSqlType("row(f1 bigint)"); + Type rowType = TESTING_TYPE_MANAGER.fromSqlType("row(f1 bigint, f2 bigint)"); + Type nestedRowType = TESTING_TYPE_MANAGER.fromSqlType("row(f1 row(f11 bigint, f12 bigint), f2 boolean)"); + Type doubleNestedRowType = TESTING_TYPE_MANAGER.fromSqlType("row(f1 row(f11 row(f111 bigint, f112 bigint), f12 boolean), f2 boolean)"); SchemaTableName b = new SchemaTableName("a", "b"); inSetupTransaction(session -> metadata.createTable(session, CATALOG_FOR_IDENTIFIER_CHAIN_TESTS, @@ -5482,10 +5498,19 @@ private void inSetupTransaction(Consumer consumer) .execute(SETUP_SESSION, consumer); } - private static Analyzer createAnalyzer(Session session, Metadata metadata, AccessControl accessControl) + private Analyzer createAnalyzer(Session session, AccessControl accessControl) { - StatementRewrite statementRewrite = new StatementRewrite(ImmutableSet.of(new ShowQueriesRewrite(metadata, SQL_PARSER, accessControl))); - AnalyzerFactory analyzerFactory = new AnalyzerFactory(metadata, SQL_PARSER, accessControl, user -> ImmutableSet.of(), statementRewrite); + StatementRewrite statementRewrite = new StatementRewrite(ImmutableSet.of(new ShowQueriesRewrite( + plannerContext.getMetadata(), + SQL_PARSER, + accessControl, + new SessionPropertyManager(), + new SchemaPropertyManager(), + new ColumnPropertyManager(), + tablePropertyManager, + new MaterializedViewPropertyManager()))); + StatementAnalyzerFactory statementAnalyzerFactory = createTestingStatementAnalyzerFactory(plannerContext, accessControl, tablePropertyManager, analyzePropertyManager); + AnalyzerFactory analyzerFactory = new AnalyzerFactory(statementAnalyzerFactory, statementRewrite); return analyzerFactory.createAnalyzer( session, emptyList(), @@ -5509,7 +5534,7 @@ private Analysis analyze(Session clientSession, @Language("SQL") String query, A .singleStatement() .readUncommitted() .execute(clientSession, session -> { - Analyzer analyzer = createAnalyzer(session, metadata, accessControl); + Analyzer analyzer = createAnalyzer(session, accessControl); Statement statement = SQL_PARSER.createStatement(query, new ParsingOptions( new FeaturesConfig().isParseDecimalLiteralsAsDouble() ? AS_DOUBLE : AS_DECIMAL)); return analyzer.analyze(statement); @@ -5543,7 +5568,7 @@ private Catalog createTestingCatalog(String catalogName, CatalogName catalog) connector, SecurityManagement.CONNECTOR, createInformationSchemaCatalogName(catalog), - new InformationSchemaConnector(catalogName, nodeManager, metadata, accessControl), + new InformationSchemaConnector(catalogName, nodeManager, plannerContext.getMetadata(), accessControl), systemId, new SystemConnector( nodeManager, diff --git a/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor2.java b/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor2.java index 75611002fb98..a7a70896b400 100644 --- a/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor2.java +++ b/core/trino-main/src/test/java/io/trino/sql/gen/BenchmarkPageProcessor2.java @@ -26,7 +26,6 @@ import io.trino.spi.PageBuilder; import io.trino.spi.connector.RecordSet; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -60,6 +59,8 @@ import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.ExpressionTestUtils.createExpression; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static java.util.Locale.ENGLISH; import static java.util.stream.Collectors.toList; @@ -73,8 +74,7 @@ public class BenchmarkPageProcessor2 { private static final Map TYPE_MAP = ImmutableMap.of("bigint", BIGINT, "varchar", VARCHAR); - private static final Metadata METADATA = createTestMetadataManager(); - private static final TypeAnalyzer TYPE_ANALYZER = new TypeAnalyzer(new SqlParser(), METADATA); + private static final TypeAnalyzer TYPE_ANALYZER = createTestingTypeAnalyzer(PLANNER_CONTEXT); private static final Session TEST_SESSION = TestingSession.testSessionBuilder().build(); private static final int POSITIONS = 1024; @@ -171,10 +171,10 @@ else if (type == VARCHAR) { private RowExpression rowExpression(String value) { - Expression expression = createExpression(value, METADATA, TypeProvider.copyOf(symbolTypes)); + Expression expression = createExpression(value, PLANNER_CONTEXT, TypeProvider.copyOf(symbolTypes)); Map, Type> expressionTypes = TYPE_ANALYZER.getTypes(TEST_SESSION, TypeProvider.copyOf(symbolTypes), expression); - return SqlToRowExpressionTranslator.translate(expression, expressionTypes, sourceLayout, METADATA, TEST_SESSION, true); + return SqlToRowExpressionTranslator.translate(expression, expressionTypes, sourceLayout, PLANNER_CONTEXT.getMetadata(), TEST_SESSION, true); } private static Page createPage(List types, boolean dictionary) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestConnectorExpressionTranslator.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestConnectorExpressionTranslator.java index f4c56ddb3c5c..d22278f508ce 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestConnectorExpressionTranslator.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestConnectorExpressionTranslator.java @@ -15,12 +15,10 @@ import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.spi.expression.ConnectorExpression; import io.trino.spi.expression.FieldDereference; import io.trino.spi.expression.Variable; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; import io.trino.sql.tree.Expression; import io.trino.sql.tree.LongLiteral; import io.trino.sql.tree.SubscriptExpression; @@ -32,22 +30,22 @@ import java.util.Optional; import static com.google.common.collect.ImmutableMap.toImmutableMap; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.IntegerType.INTEGER; import static io.trino.spi.type.RowType.field; import static io.trino.spi.type.RowType.rowType; import static io.trino.spi.type.VarcharType.createVarcharType; import static io.trino.sql.planner.ConnectorExpressionTranslator.translate; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static org.testng.Assert.assertEquals; public class TestConnectorExpressionTranslator { private static final Session TEST_SESSION = TestingSession.testSessionBuilder().build(); - private static final Metadata METADATA = createTestMetadataManager(); - private static final TypeAnalyzer TYPE_ANALYZER = new TypeAnalyzer(new SqlParser(), METADATA); + private static final TypeAnalyzer TYPE_ANALYZER = createTestingTypeAnalyzer(PLANNER_CONTEXT); private static final Type ROW_TYPE = rowType(field("int_symbol_1", INTEGER), field("varchar_symbol_1", createVarcharType(5))); - private static final LiteralEncoder LITERAL_ENCODER = new LiteralEncoder(TEST_SESSION, METADATA); + private static final LiteralEncoder LITERAL_ENCODER = new LiteralEncoder(PLANNER_CONTEXT); private static final Map symbols = ImmutableMap.builder() .put(new Symbol("double_symbol_1"), DOUBLE) @@ -98,7 +96,7 @@ private void assertTranslationToConnectorExpression(Expression expression, Optio private void assertTranslationFromConnectorExpression(ConnectorExpression connectorExpression, Expression expected) { - Expression translation = translate(connectorExpression, variableMappings, LITERAL_ENCODER); + Expression translation = translate(TEST_SESSION, connectorExpression, variableMappings, LITERAL_ENCODER); assertEquals(translation, expected); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestDomainTranslator.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestDomainTranslator.java index f7ec07721fbc..32461044c9c4 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestDomainTranslator.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestDomainTranslator.java @@ -18,7 +18,6 @@ import com.google.common.io.BaseEncoding; import io.airlift.slice.Slice; import io.airlift.slice.Slices; -import io.trino.metadata.Metadata; import io.trino.metadata.TestingFunctionResolution; import io.trino.security.AllowAllAccessControl; import io.trino.spi.predicate.Domain; @@ -30,7 +29,6 @@ import io.trino.spi.type.DoubleType; import io.trino.spi.type.RealType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; import io.trino.sql.planner.DomainTranslator.ExtractionResult; import io.trino.sql.tree.BetweenPredicate; import io.trino.sql.tree.Cast; @@ -175,8 +173,6 @@ public class TestDomainTranslator private static final long COLOR_VALUE_2 = 2; private TestingFunctionResolution functionResolution; - private Metadata metadata; - private TypeOperators typeOperators; private LiteralEncoder literalEncoder; private DomainTranslator domainTranslator; @@ -184,17 +180,14 @@ public class TestDomainTranslator public void setup() { functionResolution = new TestingFunctionResolution(); - metadata = functionResolution.getMetadata(); - typeOperators = new TypeOperators(); - literalEncoder = new LiteralEncoder(TEST_SESSION, metadata); - domainTranslator = new DomainTranslator(TEST_SESSION, metadata); + literalEncoder = new LiteralEncoder(functionResolution.getPlannerContext()); + domainTranslator = new DomainTranslator(functionResolution.getPlannerContext()); } @AfterClass(alwaysRun = true) public void tearDown() { functionResolution = null; - metadata = null; literalEncoder = null; domainTranslator = null; } @@ -802,7 +795,7 @@ public void testFromBasicComparisonsWithNulls() @Test public void testFromBasicComparisonsWithNaN() { - Expression nanDouble = literalEncoder.toExpression(Double.NaN, DOUBLE); + Expression nanDouble = literalEncoder.toExpression(TEST_SESSION, Double.NaN, DOUBLE); assertPredicateIsAlwaysFalse(equal(C_DOUBLE, nanDouble)); assertPredicateIsAlwaysFalse(greaterThan(C_DOUBLE, nanDouble)); @@ -820,7 +813,7 @@ public void testFromBasicComparisonsWithNaN() assertPredicateIsAlwaysFalse(not(notEqual(C_DOUBLE, nanDouble))); assertUnsupportedPredicate(not(isDistinctFrom(C_DOUBLE, nanDouble))); - Expression nanReal = literalEncoder.toExpression((long) Float.floatToIntBits(Float.NaN), REAL); + Expression nanReal = literalEncoder.toExpression(TEST_SESSION, (long) Float.floatToIntBits(Float.NaN), REAL); assertPredicateIsAlwaysFalse(equal(C_REAL, nanReal)); assertPredicateIsAlwaysFalse(greaterThan(C_REAL, nanReal)); @@ -1081,9 +1074,9 @@ public void testInPredicateWithVarchar() private void testInPredicate(Symbol symbol, Symbol symbol2, Type type, Object one, Object two) { - Expression oneExpression = literalEncoder.toExpression(one, type); - Expression twoExpression = literalEncoder.toExpression(two, type); - Expression nullExpression = literalEncoder.toExpression(null, type); + Expression oneExpression = literalEncoder.toExpression(TEST_SESSION, one, type); + Expression twoExpression = literalEncoder.toExpression(TEST_SESSION, two, type); + Expression nullExpression = literalEncoder.toExpression(TEST_SESSION, null, type); Expression otherSymbol = symbol2.toSymbolReference(); // IN, single value @@ -1154,10 +1147,10 @@ private void testInPredicate(Symbol symbol, Symbol symbol2, Type type, Object on private void testInPredicateWithFloatingPoint(Symbol symbol, Symbol symbol2, Type type, Object one, Object two, Object nan) { - Expression oneExpression = literalEncoder.toExpression(one, type); - Expression twoExpression = literalEncoder.toExpression(two, type); - Expression nanExpression = literalEncoder.toExpression(nan, type); - Expression nullExpression = literalEncoder.toExpression(null, type); + Expression oneExpression = literalEncoder.toExpression(TEST_SESSION, one, type); + Expression twoExpression = literalEncoder.toExpression(TEST_SESSION, two, type); + Expression nanExpression = literalEncoder.toExpression(TEST_SESSION, nan, type); + Expression nullExpression = literalEncoder.toExpression(TEST_SESSION, null, type); Expression otherSymbol = symbol2.toSymbolReference(); // IN, single value @@ -1476,7 +1469,7 @@ private void testNumericTypeTranslation(NumericValues columnValues, NumericVa { Type columnType = columnValues.getType(); Type literalType = literalValues.getType(); - Type superType = new TypeCoercion(metadata::getType).getCommonSuperType(columnType, literalType).orElseThrow(() -> new IllegalArgumentException("incompatible types in test (" + columnType + ", " + literalType + ")")); + Type superType = new TypeCoercion(functionResolution.getPlannerContext().getTypeManager()::getType).getCommonSuperType(columnType, literalType).orElseThrow(() -> new IllegalArgumentException("incompatible types in test (" + columnType + ", " + literalType + ")")); Expression max = toExpression(literalValues.getMax(), literalType); Expression min = toExpression(literalValues.getMin(), literalType); @@ -1936,13 +1929,13 @@ private ExtractionResult fromPredicate(Expression originalPredicate) return transaction(new TestingTransactionManager(), new AllowAllAccessControl()) .singleStatement() .execute(TEST_SESSION, transactionSession -> { - return DomainTranslator.fromPredicate(metadata, typeOperators, transactionSession, originalPredicate, TYPES); + return DomainTranslator.getExtractionResult(functionResolution.getPlannerContext(), transactionSession, originalPredicate, TYPES); }); } private Expression toPredicate(TupleDomain tupleDomain) { - return domainTranslator.toPredicate(tupleDomain); + return domainTranslator.toPredicate(TEST_SESSION, tupleDomain); } private static Expression unprocessableExpression1(Symbol symbol) @@ -2046,7 +2039,7 @@ private static IsNullPredicate isNull(Expression expression) private InPredicate in(Expression expression, Type expressisonType, List values) { List types = nCopies(values.size(), expressisonType); - List expressions = literalEncoder.toExpressions(values, types); + List expressions = literalEncoder.toExpressions(TEST_SESSION, values, types); return new InPredicate(expression, new InListExpression(expressions)); } @@ -2150,7 +2143,7 @@ private static Expression cast(Expression expression, Type type) private Expression colorLiteral(long value) { - return literalEncoder.toExpression(value, COLOR); + return literalEncoder.toExpression(TEST_SESSION, value, COLOR); } private Expression varbinaryLiteral(Slice value) @@ -2196,7 +2189,7 @@ private void testSimpleComparison(Expression expression, Symbol symbol, Expressi private Expression toExpression(Object object, Type type) { - return literalEncoder.toExpression(object, type); + return literalEncoder.toExpression(TEST_SESSION, object, type); } private static TupleDomain tupleDomain(T key, Domain domain) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java index 6a5667552a45..70753a6e6f52 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestEffectivePredicateExtractor.java @@ -32,7 +32,6 @@ import io.trino.metadata.TableProperties; import io.trino.metadata.TestingFunctionResolution; import io.trino.security.AllowAllAccessControl; -import io.trino.spi.block.BlockEncodingSerde; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ConnectorTableHandle; import io.trino.spi.connector.ConnectorTableProperties; @@ -41,10 +40,8 @@ import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeId; -import io.trino.spi.type.TypeSignature; +import io.trino.sql.PlannerContext; import io.trino.sql.analyzer.TypeSignatureProvider; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.plan.AggregationNode; import io.trino.sql.planner.plan.AggregationNode.Aggregation; import io.trino.sql.planner.plan.Assignments; @@ -107,6 +104,8 @@ import static io.trino.sql.ExpressionUtils.combineConjuncts; import static io.trino.sql.ExpressionUtils.or; import static io.trino.sql.analyzer.TypeSignatureTranslator.toSqlType; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.plan.AggregationNode.globalAggregation; import static io.trino.sql.planner.plan.AggregationNode.singleGroupingSet; import static io.trino.sql.tree.BooleanLiteral.FALSE_LITERAL; @@ -140,30 +139,6 @@ public class TestEffectivePredicateExtractor { private final Metadata delegate = functionResolution.getMetadata(); - @Override - public BlockEncodingSerde getBlockEncodingSerde() - { - return delegate.getBlockEncodingSerde(); - } - - @Override - public Type getType(TypeSignature signature) - { - return delegate.getType(signature); - } - - @Override - public Type fromSqlType(String sqlType) - { - return delegate.fromSqlType(sqlType); - } - - @Override - public Type getType(TypeId id) - { - return delegate.getType(id); - } - @Override public ResolvedFunction resolveFunction(Session session, QualifiedName name, List parameterTypes) { @@ -202,10 +177,11 @@ public TableProperties getTableProperties(Session session, TableHandle handle) ImmutableList.of())); } }; + private final PlannerContext plannerContext = plannerContextBuilder().withMetadata(metadata).build(); - private final TypeAnalyzer typeAnalyzer = new TypeAnalyzer(new SqlParser(), metadata); - private final EffectivePredicateExtractor effectivePredicateExtractor = new EffectivePredicateExtractor(new DomainTranslator(SESSION, metadata), metadata, true); - private final EffectivePredicateExtractor effectivePredicateExtractorWithoutTableProperties = new EffectivePredicateExtractor(new DomainTranslator(SESSION, metadata), metadata, false); + private final TypeAnalyzer typeAnalyzer = createTestingTypeAnalyzer(plannerContext); + private final EffectivePredicateExtractor effectivePredicateExtractor = new EffectivePredicateExtractor(new DomainTranslator(plannerContext), plannerContext, true); + private final EffectivePredicateExtractor effectivePredicateExtractorWithoutTableProperties = new EffectivePredicateExtractor(new DomainTranslator(plannerContext), plannerContext, false); private Map scanAssignments; private TableScanNode baseTableScan; diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java index b2d21f62879c..048fd379caf7 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestLiteralEncoder.java @@ -21,7 +21,6 @@ import io.trino.metadata.BoundSignature; import io.trino.metadata.FunctionNullability; import io.trino.metadata.LiteralFunction; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.metadata.Signature; import io.trino.operator.scalar.Re2JCastToRegexpFunction; @@ -52,7 +51,6 @@ import static io.trino.metadata.FunctionId.toFunctionId; import static io.trino.metadata.FunctionKind.SCALAR; import static io.trino.metadata.LiteralFunction.LITERAL_FUNCTION_NAME; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.scalar.JoniRegexpCasts.castVarcharToJoniRegexp; import static io.trino.operator.scalar.JsonFunctions.castVarcharToJsonPath; import static io.trino.operator.scalar.StringFunctions.castVarcharToCodePoints; @@ -68,6 +66,7 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.spi.type.VarcharType.createVarcharType; import static io.trino.sql.SqlFormatter.formatSql; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; import static io.trino.transaction.TransactionBuilder.transaction; import static io.trino.type.CodePointsType.CODE_POINTS; import static io.trino.type.JoniRegexpType.JONI_REGEXP; @@ -83,12 +82,11 @@ public class TestLiteralEncoder { - private final Metadata metadata = createTestMetadataManager(); - private final LiteralEncoder encoder = new LiteralEncoder(TEST_SESSION, metadata); + private final LiteralEncoder encoder = new LiteralEncoder(PLANNER_CONTEXT); private final ResolvedFunction literalFunction = new ResolvedFunction( new BoundSignature(LITERAL_FUNCTION_NAME, VARBINARY, ImmutableList.of(VARBINARY)), - new LiteralFunction(metadata::getBlockEncodingSerde).getFunctionMetadata().getFunctionId(), + new LiteralFunction(PLANNER_CONTEXT.getBlockEncodingSerde()).getFunctionMetadata().getFunctionId(), SCALAR, true, new FunctionNullability(false, ImmutableList.of(false)), @@ -241,7 +239,7 @@ public void testEncodeRegex() { assertRoundTrip(castVarcharToJoniRegexp(utf8Slice("[a-z]")), LIKE_PATTERN, (left, right) -> left.pattern().equals(right.pattern())); assertRoundTrip(castVarcharToJoniRegexp(utf8Slice("[a-z]")), JONI_REGEXP, (left, right) -> left.pattern().equals(right.pattern())); - assertRoundTrip(castVarcharToRe2JRegexp(utf8Slice("[a-z]")), metadata.getType(RE2J_REGEXP_SIGNATURE), (left, right) -> left.pattern().equals(right.pattern())); + assertRoundTrip(castVarcharToRe2JRegexp(utf8Slice("[a-z]")), PLANNER_CONTEXT.getTypeManager().getType(RE2J_REGEXP_SIGNATURE), (left, right) -> left.pattern().equals(right.pattern())); } @Test @@ -258,7 +256,7 @@ public void testEncodeCodePoints() private void assertEncode(Object value, Type type, String expected) { - Expression expression = encoder.toExpression(value, type); + Expression expression = encoder.toExpression(TEST_SESSION, value, type); assertEquals(getExpressionType(expression), type); assertEquals(getExpressionValue(expression), value); assertEquals(formatSql(expression), expected); @@ -270,7 +268,7 @@ private void assertEncode(Object value, Type type, String expected) @Deprecated private void assertEncodeCaseInsensitively(Object value, Type type, String expected) { - Expression expression = encoder.toExpression(value, type); + Expression expression = encoder.toExpression(TEST_SESSION, value, type); assertEquals(getExpressionType(expression), type); assertEquals(getExpressionValue(expression), value); assertEqualsIgnoreCase(formatSql(expression), expected); @@ -278,7 +276,7 @@ private void assertEncodeCaseInsensitively(Object value, Type type, String expec private void assertRoundTrip(T value, Type type, BiPredicate predicate) { - Expression expression = encoder.toExpression(value, type); + Expression expression = encoder.toExpression(TEST_SESSION, value, type); assertEquals(getExpressionType(expression), type); @SuppressWarnings("unchecked") T decodedValue = (T) getExpressionValue(expression); @@ -287,7 +285,7 @@ private void assertRoundTrip(T value, Type type, BiPredicate predicate private Object getExpressionValue(Expression expression) { - return new ExpressionInterpreter(expression, metadata, TEST_SESSION, getExpressionTypes(expression)).evaluate(); + return new ExpressionInterpreter(expression, PLANNER_CONTEXT, TEST_SESSION, getExpressionTypes(expression)).evaluate(); } private Type getExpressionType(Expression expression) @@ -304,7 +302,7 @@ private Map, Type> getExpressionTypes(Expression expression) .singleStatement() .execute(TEST_SESSION, transactionSession -> { ExpressionAnalyzer expressionAnalyzer = ExpressionAnalyzer.createWithoutSubqueries( - metadata, + PLANNER_CONTEXT, new AllowAllAccessControl(), transactionSession, TypeProvider.empty(), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestPartialTranslator.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestPartialTranslator.java index f4094be1bfe3..65a7c02b0904 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestPartialTranslator.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestPartialTranslator.java @@ -16,10 +16,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.spi.expression.ConnectorExpression; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; import io.trino.sql.tree.ArithmeticBinaryExpression; import io.trino.sql.tree.Expression; import io.trino.sql.tree.FunctionCall; @@ -36,7 +34,6 @@ import java.util.Map; import static com.google.common.collect.Iterables.getOnlyElement; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.IntegerType.INTEGER; @@ -45,6 +42,8 @@ import static io.trino.spi.type.VarcharType.createVarcharType; import static io.trino.sql.planner.ConnectorExpressionTranslator.translate; import static io.trino.sql.planner.PartialTranslator.extractPartialTranslations; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.tree.ArithmeticBinaryExpression.Operator.ADD; import static io.trino.testing.TestingSession.testSessionBuilder; import static org.testng.Assert.assertEquals; @@ -54,8 +53,7 @@ public class TestPartialTranslator private static final Session TEST_SESSION = testSessionBuilder() .setTransactionId(TransactionId.create()) .build(); - private static final Metadata METADATA = createTestMetadataManager(); - private static final TypeAnalyzer TYPE_ANALYZER = new TypeAnalyzer(new SqlParser(), METADATA); + private static final TypeAnalyzer TYPE_ANALYZER = createTestingTypeAnalyzer(PLANNER_CONTEXT); private static final TypeProvider TYPE_PROVIDER = TypeProvider.copyOf(ImmutableMap.builder() .put(new Symbol("double_symbol_1"), DOUBLE) .put(new Symbol("double_symbol_2"), DOUBLE) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestSortExpressionExtractor.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestSortExpressionExtractor.java index d8e6af268bf9..fcb32e7f0c5e 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestSortExpressionExtractor.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestSortExpressionExtractor.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import io.trino.metadata.Metadata; import io.trino.spi.type.Type; import io.trino.sql.ExpressionTestUtils; import io.trino.sql.planner.iterative.rule.test.PlanBuilder; @@ -30,10 +29,10 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.sql.ExpressionUtils.extractConjuncts; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; import static org.testng.Assert.assertEquals; public class TestSortExpressionExtractor @@ -45,7 +44,6 @@ public class TestSortExpressionExtractor .put(new Symbol("p2"), DOUBLE) .build()); private static final Set BUILD_SYMBOLS = ImmutableSet.of(new Symbol("b1"), new Symbol("b2")); - private final Metadata metadata = createTestMetadataManager(); @Test public void testGetSortExpression() @@ -91,7 +89,7 @@ public void testGetSortExpression() private Expression expression(String sql) { - return ExpressionTestUtils.planExpression(metadata, TEST_SESSION, TYPE_PROVIDER, PlanBuilder.expression(sql)); + return ExpressionTestUtils.planExpression(PLANNER_CONTEXT, TEST_SESSION, TYPE_PROVIDER, PlanBuilder.expression(sql)); } private void assertNoSortExpression(String expression) @@ -101,7 +99,7 @@ private void assertNoSortExpression(String expression) private void assertNoSortExpression(Expression expression) { - Optional actual = SortExpressionExtractor.extractSortExpression(metadata, BUILD_SYMBOLS, expression); + Optional actual = SortExpressionExtractor.extractSortExpression(PLANNER_CONTEXT.getMetadata(), BUILD_SYMBOLS, expression); assertEquals(actual, Optional.empty()); } @@ -132,7 +130,7 @@ private void assertGetSortExpression(Expression expression, String expectedSymbo private void assertGetSortExpression(Expression expression, String expectedSymbol, List searchExpressions) { Optional expected = Optional.of(new SortExpressionContext(new SymbolReference(expectedSymbol), searchExpressions)); - Optional actual = SortExpressionExtractor.extractSortExpression(metadata, BUILD_SYMBOLS, expression); + Optional actual = SortExpressionExtractor.extractSortExpression(PLANNER_CONTEXT.getMetadata(), BUILD_SYMBOLS, expression); assertEquals(actual, expected); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestTypeValidator.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestTypeValidator.java index 02a48c72e8f9..5bf5d58e36ec 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/TestTypeValidator.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestTypeValidator.java @@ -19,14 +19,11 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.ListMultimap; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.ResolvedFunction; import io.trino.metadata.TestingFunctionResolution; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.predicate.TupleDomain; -import io.trino.spi.type.TypeOperators; import io.trino.spi.type.VarcharType; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.plan.AggregationNode; import io.trino.sql.planner.plan.AggregationNode.Aggregation; import io.trino.sql.planner.plan.Assignments; @@ -51,7 +48,6 @@ import java.util.UUID; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DateType.DATE; import static io.trino.spi.type.DoubleType.DOUBLE; @@ -59,6 +55,8 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.analyzer.TypeSignatureProvider.fromTypes; import static io.trino.sql.analyzer.TypeSignatureTranslator.toSqlType; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.plan.AggregationNode.Step.SINGLE; import static io.trino.sql.planner.plan.AggregationNode.singleGroupingSet; import static io.trino.testing.TestingHandles.TEST_TABLE_HANDLE; @@ -67,11 +65,9 @@ @Test(singleThreaded = true) public class TestTypeValidator { - private static final SqlParser SQL_PARSER = new SqlParser(); private static final TypeValidator TYPE_VALIDATOR = new TypeValidator(); private final TestingFunctionResolution functionResolution = new TestingFunctionResolution(); - private final TypeOperators typeOperators = new TypeOperators(); private SymbolAllocator symbolAllocator; private TableScanNode baseTableScan; private Symbol columnA; @@ -377,8 +373,7 @@ public void testInvalidUnion() private void assertTypesValid(PlanNode node) { - Metadata metadata = createTestMetadataManager(); - TYPE_VALIDATOR.validate(node, TEST_SESSION, metadata, typeOperators, new TypeAnalyzer(SQL_PARSER, metadata), symbolAllocator.getTypes(), WarningCollector.NOOP); + TYPE_VALIDATOR.validate(node, TEST_SESSION, PLANNER_CONTEXT, createTestingTypeAnalyzer(PLANNER_CONTEXT), symbolAllocator.getTypes(), WarningCollector.NOOP); } private static PlanNodeId newId() diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/TestingPlannerContext.java b/core/trino-main/src/test/java/io/trino/sql/planner/TestingPlannerContext.java new file mode 100644 index 000000000000..4ff7c7517b95 --- /dev/null +++ b/core/trino-main/src/test/java/io/trino/sql/planner/TestingPlannerContext.java @@ -0,0 +1,59 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.trino.sql.planner; + +import io.trino.metadata.BlockEncodingManager; +import io.trino.metadata.InternalBlockEncodingSerde; +import io.trino.metadata.Metadata; +import io.trino.metadata.MetadataManager; +import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; + +import java.util.Optional; + +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; + +public final class TestingPlannerContext +{ + public static final PlannerContext PLANNER_CONTEXT = plannerContextBuilder().build(); + + private TestingPlannerContext() {} + + public static Builder plannerContextBuilder() + { + return new Builder(); + } + + public static class Builder + { + private Optional metadata = Optional.empty(); + + private Builder() {} + + public Builder withMetadata(Metadata metadata) + { + this.metadata = Optional.of(metadata); + return this; + } + + public PlannerContext build() + { + return new PlannerContext( + metadata.orElseGet(MetadataManager::createTestMetadataManager), + new TypeOperators(), + new InternalBlockEncodingSerde(new BlockEncodingManager(), TESTING_TYPE_MANAGER), + TESTING_TYPE_MANAGER); + } + } +} diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java index 9a0f0272d4de..7778aa031873 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestApplyTableScanRedirection.java @@ -95,7 +95,7 @@ public void testDoesNotFire() MockConnectorFactory mockFactory = createMockFactory(Optional.empty()); ruleTester.getQueryRunner().createCatalog(MOCK_CATALOG, mockFactory, ImmutableMap.of()); - ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getMetadata())) + ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getPlannerContext())) .on(p -> { Symbol column = p.symbol(SOURCE_COLUMN_NAME_A, VARCHAR); return p.tableScan(TEST_TABLE_HANDLE, @@ -118,7 +118,7 @@ public void testDoesNotFireForDeleteTableScan() ruleTester.getQueryRunner().createCatalog(MOCK_CATALOG, mockFactory, ImmutableMap.of()); - ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getMetadata())) + ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getPlannerContext())) .on(p -> { Symbol column = p.symbol(SOURCE_COLUMN_NAME_A, VARCHAR); return p.tableScan(TEST_TABLE_HANDLE, @@ -140,7 +140,7 @@ public void doesNotFireIfNoTableScan() MockConnectorFactory mockFactory = createMockFactory(Optional.of(applyTableScanRedirect)); ruleTester.getQueryRunner().createCatalog(MOCK_CATALOG, mockFactory, ImmutableMap.of()); - ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getMetadata())) + ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getPlannerContext())) .on(p -> p.values(p.symbol("a", BIGINT))) .withSession(MOCK_SESSION) .doesNotFire(); @@ -159,7 +159,7 @@ public void testMismatchedTypesWithCoercion() LocalQueryRunner runner = ruleTester.getQueryRunner(); runner.createCatalog(MOCK_CATALOG, mockFactory, ImmutableMap.of()); - ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getMetadata())) + ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getPlannerContext())) .on(p -> { Symbol column = p.symbol(SOURCE_COLUMN_NAME_A, VARCHAR); return p.tableScan(TEST_TABLE_HANDLE, @@ -208,7 +208,7 @@ public void testApplyTableScanRedirection() ruleTester.getQueryRunner().createCatalog(MOCK_CATALOG, mockFactory, ImmutableMap.of()); - ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getMetadata())) + ruleTester.assertThat(new ApplyTableScanRedirection(ruleTester.getPlannerContext())) .on(p -> { Symbol column = p.symbol(SOURCE_COLUMN_NAME_A, VARCHAR); return p.tableScan(TEST_TABLE_HANDLE, @@ -238,7 +238,7 @@ public void testApplyTableScanRedirectionWithFilter() ruleTester.getQueryRunner().createCatalog(MOCK_CATALOG, mockFactory, ImmutableMap.of()); - ApplyTableScanRedirection applyTableScanRedirection = new ApplyTableScanRedirection(ruleTester.getMetadata()); + ApplyTableScanRedirection applyTableScanRedirection = new ApplyTableScanRedirection(ruleTester.getPlannerContext()); TupleDomain constraint = TupleDomain.withColumnDomains( ImmutableMap.of(SOURCE_COLUMN_HANDLE_A, singleValue(VARCHAR, utf8Slice("foo")))); ruleTester.assertThat(applyTableScanRedirection) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestCanonicalizeExpressionRewriter.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestCanonicalizeExpressionRewriter.java index a52c9e0d2d21..7090947fe6f9 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestCanonicalizeExpressionRewriter.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestCanonicalizeExpressionRewriter.java @@ -15,10 +15,9 @@ import com.google.common.collect.ImmutableMap; import io.trino.FeaturesConfig; -import io.trino.metadata.Metadata; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -35,16 +34,18 @@ import static io.trino.spi.type.TimestampWithTimeZoneType.createTimestampWithTimeZoneType; import static io.trino.spi.type.VarcharType.createVarcharType; import static io.trino.sql.ExpressionTestUtils.assertExpressionEquals; +import static io.trino.sql.planner.TestingPlannerContext.plannerContextBuilder; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.iterative.rule.CanonicalizeExpressionRewriter.rewrite; import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; import static io.trino.transaction.TransactionBuilder.transaction; public class TestCanonicalizeExpressionRewriter { - public static final TransactionManager TRANSACTION_MANAGER = createTestTransactionManager(); - private static final Metadata METADATA = createTestMetadataManager(TRANSACTION_MANAGER, new FeaturesConfig()); - private static final TypeAnalyzer TYPE_ANALYZER = new TypeAnalyzer(new SqlParser(), METADATA); - public static final AllowAllAccessControl ACCESS_CONTROL = new AllowAllAccessControl(); + private static final TransactionManager TRANSACTION_MANAGER = createTestTransactionManager(); + private static final PlannerContext PLANNER_CONTEXT = plannerContextBuilder().withMetadata(createTestMetadataManager(TRANSACTION_MANAGER, new FeaturesConfig())).build(); + private static final TypeAnalyzer TYPE_ANALYZER = createTestingTypeAnalyzer(PLANNER_CONTEXT); + private static final AllowAllAccessControl ACCESS_CONTROL = new AllowAllAccessControl(); @Test public void testRewriteIsNotNullPredicate() @@ -126,7 +127,7 @@ private static void assertRewritten(String from, String to) return rewrite( PlanBuilder.expression(from), transactedSession, - METADATA, + PLANNER_CONTEXT.getMetadata(), TYPE_ANALYZER, TypeProvider.copyOf(ImmutableMap.builder() .put(new Symbol("x"), BIGINT) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestEliminateCrossJoins.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestEliminateCrossJoins.java index c6b9728fbf7d..df2d120f1bb4 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestEliminateCrossJoins.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestEliminateCrossJoins.java @@ -16,10 +16,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.assertions.PlanMatchPattern; import io.trino.sql.planner.iterative.GroupReference; @@ -45,6 +43,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; import static io.trino.SystemSessionProperties.JOIN_REORDERING_STRATEGY; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.any; import static io.trino.sql.planner.assertions.PlanMatchPattern.expression; import static io.trino.sql.planner.assertions.PlanMatchPattern.join; @@ -127,7 +126,7 @@ public void testJoinOrder() "a", "c", "b", "c"); - JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, new TypeAnalyzer(new SqlParser(), tester().getMetadata()), TypeProvider.empty()); + JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, createTestingTypeAnalyzer(tester().getPlannerContext()), TypeProvider.empty()); assertEquals( getJoinOrder(joinGraph), @@ -159,7 +158,7 @@ public void testJoinOrderWithRealCrossJoin() PlanNode plan = joinNode(leftPlan, rightPlan); - JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, new TypeAnalyzer(new SqlParser(), tester().getMetadata()), TypeProvider.empty()); + JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, createTestingTypeAnalyzer(tester().getPlannerContext()), TypeProvider.empty()); assertEquals( getJoinOrder(joinGraph), @@ -181,7 +180,7 @@ public void testJoinOrderWithMultipleEdgesBetweenNodes() "b1", "c1", "b2", "c2"); - JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, new TypeAnalyzer(new SqlParser(), tester().getMetadata()), TypeProvider.empty()); + JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, createTestingTypeAnalyzer(tester().getPlannerContext()), TypeProvider.empty()); assertEquals( getJoinOrder(joinGraph), @@ -202,7 +201,7 @@ public void testDoesNotChangeOrderWithoutCrossJoin() values("c"), "b", "c"); - JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, new TypeAnalyzer(new SqlParser(), tester().getMetadata()), TypeProvider.empty()); + JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, createTestingTypeAnalyzer(tester().getPlannerContext()), TypeProvider.empty()); assertEquals( getJoinOrder(joinGraph), @@ -222,7 +221,7 @@ public void testDoNotReorderCrossJoins() values("c"), "b", "c"); - JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, new TypeAnalyzer(new SqlParser(), tester().getMetadata()), TypeProvider.empty()); + JoinGraph joinGraph = JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, createTestingTypeAnalyzer(tester().getPlannerContext()), TypeProvider.empty()); assertEquals( getJoinOrder(joinGraph), @@ -309,7 +308,7 @@ public void testGiveUpOnComplexProjections() "a2", "c", "b", "c"); - assertEquals(JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, new TypeAnalyzer(new SqlParser(), tester().getMetadata()), TypeProvider.empty()).size(), 2); + assertEquals(JoinGraph.buildFrom(tester().getMetadata(), plan, noLookup(), new PlanNodeIdAllocator(), session, createTestingTypeAnalyzer(tester().getPlannerContext()), TypeProvider.empty()).size(), 2); } private Function crossJoinAndJoin(JoinNode.Type secondJoinType) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinNodeFlattener.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinNodeFlattener.java index 12a78c8d9a7f..994ed2765a16 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinNodeFlattener.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinNodeFlattener.java @@ -15,11 +15,9 @@ package io.trino.sql.planner.iterative.rule; import com.google.common.collect.ImmutableList; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Plan; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.assertions.PlanAssert; import io.trino.sql.planner.assertions.PlanMatchPattern; @@ -50,6 +48,7 @@ import static io.trino.cost.StatsAndCosts.empty; import static io.trino.metadata.AbstractMockMetadata.dummyMetadata; import static io.trino.sql.ExpressionUtils.and; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.node; import static io.trino.sql.planner.assertions.PlanMatchPattern.values; import static io.trino.sql.planner.iterative.Lookup.noLookup; @@ -104,7 +103,7 @@ public void testDoesNotAllowOuterJoin() ImmutableList.of(a1), ImmutableList.of(b1), Optional.empty()); - assertThatThrownBy(() -> toMultiJoinNode(queryRunner.getMetadata(), outerJoin, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes())) + assertThatThrownBy(() -> toMultiJoinNode(queryRunner.getMetadata(), outerJoin, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes())) .isInstanceOf(IllegalStateException.class) .hasMessageMatching("join type must be.*"); } @@ -140,7 +139,7 @@ public void testDoesNotConvertNestedOuterJoins() .setOutputSymbols(a1, b1, c1) .build(); assertEquals( - toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes()), + toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes()), expected); } @@ -167,7 +166,7 @@ public void testPushesProjectionsThroughJoin() equiJoinClause(a, b))), valuesC, equiJoinClause(d, c)); - MultiJoinNode actual = toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, true, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes()); + MultiJoinNode actual = toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, true, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes()); assertEquals(actual.getOutputSymbols(), ImmutableList.of(d, c)); assertEquals(actual.getFilter(), and(createEqualsExpression(a, b), createEqualsExpression(d, c))); assertTrue(actual.isPushedProjectionThroughJoin()); @@ -213,7 +212,7 @@ public void testDoesNotPushStraddlingProjection() equiJoinClause(a, b))), valuesC, equiJoinClause(d, c)); - MultiJoinNode actual = toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, true, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes()); + MultiJoinNode actual = toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, true, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes()); assertEquals(actual.getOutputSymbols(), ImmutableList.of(d, c)); assertEquals(actual.getFilter(), createEqualsExpression(d, c)); assertFalse(actual.isPushedProjectionThroughJoin()); @@ -265,7 +264,7 @@ public void testRetainsOutputSymbols() .setOutputSymbols(a1, b1) .build(); assertEquals( - toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes()), + toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes()), expected); } @@ -311,7 +310,7 @@ public void testCombinesCriteriaAndFilters() ImmutableList.of(a1, b1, b2, c1, c2), false); assertEquals( - toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes()), + toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, DEFAULT_JOIN_LIMIT, false, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes()), expected); } @@ -369,7 +368,7 @@ public void testConvertsBushyTrees() .setOutputSymbols(a1, b1, c1, d1, d2, e1, e2) .build(); assertEquals( - toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, 5, false, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes()), + toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, 5, false, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes()), expected); } @@ -429,7 +428,7 @@ public void testMoreThanJoinLimit() .setOutputSymbols(a1, b1, c1, d1, d2, e1, e2) .build(); assertEquals( - toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, 2, false, testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), queryRunner.getMetadata()), p.getTypes()), + toMultiJoinNode(queryRunner.getMetadata(), joinNode, noLookup(), planNodeIdAllocator, 2, false, testSessionBuilder().build(), createTestingTypeAnalyzer(queryRunner.getPlannerContext()), p.getTypes()), expected); } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushDistinctLimitIntoTableScan.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushDistinctLimitIntoTableScan.java index d9c3c1387d02..82fe572ce622 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushDistinctLimitIntoTableScan.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushDistinctLimitIntoTableScan.java @@ -88,7 +88,7 @@ protected Optional createLocalQueryRunner() @BeforeClass public void init() { - rule = new PushDistinctLimitIntoTableScan(tester().getMetadata()); + rule = new PushDistinctLimitIntoTableScan(tester().getPlannerContext()); tableHandle = new TableHandle( TEST_CATALOG, diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateIntoTableScan.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateIntoTableScan.java index 53ae28e90fc0..85fabc70b0f0 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateIntoTableScan.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateIntoTableScan.java @@ -38,9 +38,6 @@ import io.trino.spi.predicate.NullableValue; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; -import io.trino.sql.parser.SqlParser; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.iterative.rule.test.BaseRuleTest; import io.trino.sql.tree.ArithmeticBinaryExpression; import io.trino.sql.tree.ComparisonExpression; @@ -62,6 +59,7 @@ import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.spi.type.VarcharType.createVarcharType; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.anyTree; import static io.trino.sql.planner.assertions.PlanMatchPattern.constrainedTableScanWithTableLayout; import static io.trino.sql.planner.assertions.PlanMatchPattern.filter; @@ -96,7 +94,7 @@ public class TestPushPredicateIntoTableScan @BeforeClass public void setUpBeforeClass() { - pushPredicateIntoTableScan = new PushPredicateIntoTableScan(tester().getMetadata(), new TypeOperators(), new TypeAnalyzer(new SqlParser(), tester().getMetadata())); + pushPredicateIntoTableScan = new PushPredicateIntoTableScan(tester().getPlannerContext(), createTestingTypeAnalyzer(tester().getPlannerContext())); CatalogName catalogName = tester().getCurrentConnectorId(); tester().getQueryRunner().createCatalog(MOCK_CATALOG, createMockFactory(), ImmutableMap.of()); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoRowNumber.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoRowNumber.java index 4ad3c5d7fc11..84dd576bc4a5 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoRowNumber.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoRowNumber.java @@ -37,7 +37,7 @@ public class TestPushPredicateThroughProjectIntoRowNumber @Test public void testRowNumberSymbolPruned() { - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -57,7 +57,7 @@ public void testRowNumberSymbolPruned() @Test public void testNoUpperBoundForRowNumberSymbol() { - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -77,7 +77,7 @@ public void testNoUpperBoundForRowNumberSymbol() @Test public void testNonPositiveUpperBoundForRowNumberSymbol() { - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -97,7 +97,7 @@ public void testNonPositiveUpperBoundForRowNumberSymbol() @Test public void testPredicateNotSatisfied() { - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -125,7 +125,7 @@ public void testPredicateNotSatisfied() @Test public void testPredicateNotSatisfiedAndMaxRowCountNotUpdated() { - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -145,7 +145,7 @@ public void testPredicateNotSatisfiedAndMaxRowCountNotUpdated() @Test public void testPredicateSatisfied() { - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -167,7 +167,7 @@ public void testPredicateSatisfied() values(ImmutableList.of("a"))) .withAlias("row_number", new RowNumberSymbolMatcher()))); - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -193,7 +193,7 @@ public void testPredicateSatisfied() @Test public void testPredicatePartiallySatisfied() { - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); @@ -217,7 +217,7 @@ public void testPredicatePartiallySatisfied() values(ImmutableList.of("a"))) .withAlias("row_number", new RowNumberSymbolMatcher())))); - tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumber = p.symbol("row_number"); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoWindow.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoWindow.java index 030b1e18fb92..da43cabfe13b 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoWindow.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushPredicateThroughProjectIntoWindow.java @@ -54,7 +54,7 @@ public void testRankingSymbolPruned() private void assertRankingSymbolPruned(Function rankingFunction) { - tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol ranking = p.symbol("ranking"); @@ -81,7 +81,7 @@ public void testNoUpperBoundForRankingSymbol() private void assertNoUpperBoundForRankingSymbol(Function rankingFunction) { - tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol ranking = p.symbol("ranking"); @@ -108,7 +108,7 @@ public void testNonPositiveUpperBoundForRankingSymbol() private void assertNonPositiveUpperBoundForRankingSymbol(Function rankingFunction) { - tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol ranking = p.symbol("ranking"); @@ -135,7 +135,7 @@ public void testPredicateNotSatisfied() private void assertPredicateNotSatisfied(Function rankingFunction, RankingType rankingType) { - tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol ranking = p.symbol("ranking"); @@ -176,7 +176,7 @@ public void testPredicateSatisfied() private void assertPredicateSatisfied(Function rankingFunction, RankingType rankingType) { - tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol ranking = p.symbol("ranking"); @@ -215,7 +215,7 @@ public void testPredicatePartiallySatisfied() private void assertPredicatePartiallySatisfied(Function rankingFunction, RankingType rankingType) { - tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol ranking = p.symbol("ranking"); @@ -246,7 +246,7 @@ private void assertPredicatePartiallySatisfied(Function rankingFunction, Ranking values(ImmutableList.of("a"))) .withAlias("ranking", new TopNRankingSymbolMatcher())))); - tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getMetadata(), tester().getQueryRunner().getTypeOperators())) + tester().assertThat(new PushPredicateThroughProjectIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol ranking = p.symbol("ranking"); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionIntoTableScan.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionIntoTableScan.java index 373bc5ec32ce..bd6cc1ae5afd 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionIntoTableScan.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionIntoTableScan.java @@ -22,7 +22,6 @@ import io.trino.cost.PlanNodeStatsEstimate; import io.trino.cost.ScalarStatsCalculator; import io.trino.cost.SymbolStatsEstimate; -import io.trino.metadata.Metadata; import io.trino.metadata.TableHandle; import io.trino.plugin.tpch.TpchColumnHandle; import io.trino.spi.connector.Assignment; @@ -43,7 +42,7 @@ import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.iterative.rule.test.RuleTester; @@ -64,6 +63,7 @@ import static io.trino.spi.type.RowType.field; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.planner.ConnectorExpressionTranslator.translate; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.TypeProvider.viewOf; import static io.trino.sql.planner.assertions.PlanMatchPattern.anyTree; import static io.trino.sql.planner.assertions.PlanMatchPattern.expression; @@ -127,7 +127,7 @@ public void testPushProjection() MockConnectorFactory factory = createMockFactory(ImmutableMap.of(columnName, columnHandle), Optional.of(this::mockApplyProjection)); ruleTester.getQueryRunner().createCatalog(MOCK_CATALOG, factory, ImmutableMap.of()); - TypeAnalyzer typeAnalyzer = new TypeAnalyzer(new SqlParser(), ruleTester.getMetadata()); + TypeAnalyzer typeAnalyzer = createTestingTypeAnalyzer(ruleTester.getPlannerContext()); // Prepare project node symbols and types Symbol identity = new Symbol("symbol_identity"); @@ -313,12 +313,12 @@ else if (projection instanceof Constant) { private static PushProjectionIntoTableScan createRule(RuleTester tester) { - Metadata metadata = tester.getMetadata(); + PlannerContext plannerContext = tester.getPlannerContext(); TypeAnalyzer typeAnalyzer = tester.getTypeAnalyzer(); return new PushProjectionIntoTableScan( - metadata, + plannerContext, typeAnalyzer, - new ScalarStatsCalculator(metadata, typeAnalyzer)); + new ScalarStatsCalculator(plannerContext, typeAnalyzer)); } private static TableHandle createTableHandle(String schemaName, String tableName) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionThroughJoin.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionThroughJoin.java index 51bc5b58016a..431916aef21c 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionThroughJoin.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushProjectionThroughJoin.java @@ -16,12 +16,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import io.trino.Session; -import io.trino.metadata.Metadata; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Plan; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.assertions.PlanMatchPattern; import io.trino.sql.planner.iterative.rule.test.PlanBuilder; import io.trino.sql.planner.plan.Assignments; @@ -38,7 +35,8 @@ import static io.trino.cost.PlanNodeStatsEstimate.unknown; import static io.trino.cost.StatsAndCosts.empty; import static io.trino.metadata.AbstractMockMetadata.dummyMetadata; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanAssert.assertPlan; import static io.trino.sql.planner.assertions.PlanMatchPattern.expression; import static io.trino.sql.planner.assertions.PlanMatchPattern.join; @@ -56,8 +54,6 @@ public class TestPushProjectionThroughJoin { - private final Metadata metadata = createTestMetadataManager(); - @Test public void testPushesProjectionThroughJoin() { @@ -92,7 +88,8 @@ a2, new ArithmeticUnaryExpression(PLUS, a0.toSymbolReference()), new JoinNode.EquiJoinClause(a1, b1))); Session session = testSessionBuilder().build(); - Optional rewritten = pushProjectionThroughJoin(metadata, planNode, noLookup(), idAllocator, session, new TypeAnalyzer(new SqlParser(), metadata), p.getTypes()); + Optional rewritten = pushProjectionThroughJoin(PLANNER_CONTEXT.getMetadata(), planNode, noLookup(), idAllocator, session, createTestingTypeAnalyzer( + PLANNER_CONTEXT), p.getTypes()); assertTrue(rewritten.isPresent()); assertPlan( session, @@ -131,7 +128,8 @@ c, new ArithmeticBinaryExpression(ADD, a.toSymbolReference(), b.toSymbolReferenc INNER, p.values(a), p.values(b))); - Optional rewritten = pushProjectionThroughJoin(metadata, planNode, noLookup(), new PlanNodeIdAllocator(), testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), metadata), p.getTypes()); + Optional rewritten = pushProjectionThroughJoin(PLANNER_CONTEXT.getMetadata(), planNode, noLookup(), new PlanNodeIdAllocator(), testSessionBuilder().build(), createTestingTypeAnalyzer( + PLANNER_CONTEXT), p.getTypes()); assertThat(rewritten).isEmpty(); } @@ -150,7 +148,8 @@ c, new ArithmeticUnaryExpression(MINUS, a.toSymbolReference())), LEFT, p.values(a), p.values(b))); - Optional rewritten = pushProjectionThroughJoin(metadata, planNode, noLookup(), new PlanNodeIdAllocator(), testSessionBuilder().build(), new TypeAnalyzer(new SqlParser(), metadata), p.getTypes()); + Optional rewritten = pushProjectionThroughJoin(PLANNER_CONTEXT.getMetadata(), planNode, noLookup(), new PlanNodeIdAllocator(), testSessionBuilder().build(), createTestingTypeAnalyzer( + PLANNER_CONTEXT), p.getTypes()); assertThat(rewritten).isEmpty(); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoRowNumber.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoRowNumber.java index e40dc23bb593..6c7d804abaea 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoRowNumber.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoRowNumber.java @@ -14,7 +14,6 @@ package io.trino.sql.planner.iterative.rule; import com.google.common.collect.ImmutableList; -import io.trino.spi.type.TypeOperators; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.assertions.RowNumberSymbolMatcher; import io.trino.sql.planner.iterative.rule.test.BaseRuleTest; @@ -33,7 +32,7 @@ public class TestPushdownFilterIntoRowNumber @Test public void testSourceRowNumber() { - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumberSymbol = p.symbol("row_number_1"); @@ -51,7 +50,7 @@ public void testSourceRowNumber() .partitionBy(ImmutableList.of("a")), values("a"))); - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumberSymbol = p.symbol("row_number_1"); @@ -69,7 +68,7 @@ public void testSourceRowNumber() .partitionBy(ImmutableList.of("a")), values("a"))); - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumberSymbol = p.symbol("row_number_1"); @@ -90,7 +89,7 @@ public void testSourceRowNumber() values("a")) .withAlias("row_number_1", new RowNumberSymbolMatcher()))); - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumberSymbol = p.symbol("row_number_1"); @@ -115,7 +114,7 @@ public void testSourceRowNumber() @Test public void testNoOutputsThroughRowNumber() { - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol rowNumberSymbol = p.symbol("row_number_1"); return p.filter(expression("row_number_1 < cast(-100 as bigint)"), @@ -128,7 +127,7 @@ public void testNoOutputsThroughRowNumber() @Test public void testDoNotFire() { - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol rowNumberSymbol = p.symbol("row_number_1"); return p.filter(expression("not_row_number < cast(100 as bigint)"), @@ -137,7 +136,7 @@ public void testDoNotFire() }) .doesNotFire(); - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol rowNumberSymbol = p.symbol("row_number_1"); return p.filter(expression("row_number_1 > cast(100 as bigint)"), @@ -146,7 +145,7 @@ public void testDoNotFire() }) .doesNotFire(); - tester().assertThat(new PushdownFilterIntoRowNumber(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoRowNumber(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol rowNumberSymbol = p.symbol("row_number_1"); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoWindow.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoWindow.java index 69995a435931..35f68d15b35d 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoWindow.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestPushdownFilterIntoWindow.java @@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableMap; import io.trino.metadata.ResolvedFunction; import io.trino.spi.connector.SortOrder; -import io.trino.spi.type.TypeOperators; import io.trino.sql.planner.OrderingScheme; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.assertions.TopNRankingSymbolMatcher; @@ -49,7 +48,7 @@ public void testEliminateFilter() private void assertEliminateFilter(String rankingFunctionName) { ResolvedFunction ranking = tester().getMetadata().resolveFunction(tester().getSession(), QualifiedName.of(rankingFunctionName), fromTypes()); - tester().assertThat(new PushdownFilterIntoWindow(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol rankSymbol = p.symbol("rank_1"); Symbol a = p.symbol("a", BIGINT); @@ -77,7 +76,7 @@ public void testKeepFilter() private void assertKeepFilter(String rankingFunctionName) { ResolvedFunction ranking = tester().getMetadata().resolveFunction(tester().getSession(), QualifiedName.of(rankingFunctionName), fromTypes()); - tester().assertThat(new PushdownFilterIntoWindow(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol rowNumberSymbol = p.symbol("row_number_1"); Symbol a = p.symbol("a", BIGINT); @@ -100,7 +99,7 @@ private void assertKeepFilter(String rankingFunctionName) ImmutableMap.of("a", SortOrder.ASC_NULLS_FIRST)), values("a")).withAlias("row_number_1", new TopNRankingSymbolMatcher()))); - tester().assertThat(new PushdownFilterIntoWindow(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol rowNumberSymbol = p.symbol("row_number_1"); Symbol a = p.symbol("a", BIGINT); @@ -134,7 +133,7 @@ public void testNoUpperBound() private void assertNoUpperBound(String rankingFunctionName) { ResolvedFunction ranking = tester().getMetadata().resolveFunction(tester().getSession(), QualifiedName.of(rankingFunctionName), fromTypes()); - tester().assertThat(new PushdownFilterIntoWindow(tester().getMetadata(), new TypeOperators())) + tester().assertThat(new PushdownFilterIntoWindow(tester().getPlannerContext())) .on(p -> { Symbol rowNumberSymbol = p.symbol("row_number_1"); Symbol a = p.symbol("a"); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestRemoveRedundantTableScanPredicate.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestRemoveRedundantTableScanPredicate.java index 5b5c21ab8cb7..040a8e7d6bc7 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestRemoveRedundantTableScanPredicate.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestRemoveRedundantTableScanPredicate.java @@ -25,7 +25,6 @@ import io.trino.spi.predicate.Domain; import io.trino.spi.predicate.NullableValue; import io.trino.spi.predicate.TupleDomain; -import io.trino.spi.type.TypeOperators; import io.trino.sql.planner.FunctionCallBuilder; import io.trino.sql.planner.iterative.rule.test.BaseRuleTest; import io.trino.sql.tree.ArithmeticBinaryExpression; @@ -59,7 +58,7 @@ public class TestRemoveRedundantTableScanPredicate @BeforeClass public void setUpBeforeClass() { - removeRedundantTableScanPredicate = new RemoveRedundantTableScanPredicate(tester().getMetadata(), new TypeOperators(), tester().getTypeAnalyzer()); + removeRedundantTableScanPredicate = new RemoveRedundantTableScanPredicate(tester().getPlannerContext(), tester().getTypeAnalyzer()); CatalogName catalogName = tester().getCurrentConnectorId(); TpchTableHandle nation = new TpchTableHandle("sf1", "nation", 1.0); nationTableHandle = new TableHandle( diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestReorderJoins.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestReorderJoins.java index 6dd6eff62d82..6d5f9796a4b9 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestReorderJoins.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestReorderJoins.java @@ -20,12 +20,9 @@ import io.trino.cost.CostComparator; import io.trino.cost.PlanNodeStatsEstimate; import io.trino.cost.SymbolStatsEstimate; -import io.trino.metadata.Metadata; import io.trino.metadata.TestingFunctionResolution; import io.trino.spi.type.Type; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.assertions.PlanMatchPattern; import io.trino.sql.planner.iterative.rule.test.RuleAssert; import io.trino.sql.planner.iterative.rule.test.RuleTester; @@ -47,8 +44,9 @@ import static io.trino.SystemSessionProperties.JOIN_DISTRIBUTION_TYPE; import static io.trino.SystemSessionProperties.JOIN_MAX_BROADCAST_TABLE_SIZE; import static io.trino.SystemSessionProperties.JOIN_REORDERING_STRATEGY; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.equiJoinClause; import static io.trino.sql.planner.assertions.PlanMatchPattern.expression; import static io.trino.sql.planner.assertions.PlanMatchPattern.join; @@ -66,8 +64,6 @@ public class TestReorderJoins { private RuleTester tester; - private final Metadata metadata = createTestMetadataManager(); - @BeforeClass public void setUp() { @@ -683,6 +679,6 @@ public void testReorderAndReplicate() private RuleAssert assertReorderJoins() { - return tester.assertThat(new ReorderJoins(metadata, new CostComparator(1, 1, 1), new TypeAnalyzer(new SqlParser(), metadata))); + return tester.assertThat(new ReorderJoins(PLANNER_CONTEXT.getMetadata(), new CostComparator(1, 1, 1), createTestingTypeAnalyzer(PLANNER_CONTEXT))); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestSimplifyExpressions.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestSimplifyExpressions.java index 094050fa4647..d0cefac8e928 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestSimplifyExpressions.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestSimplifyExpressions.java @@ -13,14 +13,12 @@ */ package io.trino.sql.planner.iterative.rule; -import io.trino.metadata.Metadata; import io.trino.spi.type.Type; import io.trino.sql.parser.ParsingOptions; import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.SymbolAllocator; import io.trino.sql.planner.SymbolsExtractor; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.tree.Cast; import io.trino.sql.tree.Expression; import io.trino.sql.tree.ExpressionRewriter; @@ -34,7 +32,6 @@ import java.util.stream.Collectors; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DoubleType.DOUBLE; @@ -43,6 +40,8 @@ import static io.trino.sql.ExpressionUtils.extractPredicates; import static io.trino.sql.ExpressionUtils.logicalExpression; import static io.trino.sql.ExpressionUtils.rewriteIdentifiersToSymbolReferences; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.iterative.rule.SimplifyExpressions.rewrite; import static java.util.stream.Collectors.toList; import static org.testng.Assert.assertEquals; @@ -50,7 +49,6 @@ public class TestSimplifyExpressions { private static final SqlParser SQL_PARSER = new SqlParser(); - private static final Metadata METADATA = createTestMetadataManager(); @Test public void testPushesDownNegations() @@ -249,7 +247,7 @@ private static void assertSimplifies(String expression, String expected) ParsingOptions parsingOptions = new ParsingOptions(); Expression actualExpression = rewriteIdentifiersToSymbolReferences(SQL_PARSER.createExpression(expression, parsingOptions)); Expression expectedExpression = rewriteIdentifiersToSymbolReferences(SQL_PARSER.createExpression(expected, parsingOptions)); - Expression rewritten = rewrite(actualExpression, TEST_SESSION, new SymbolAllocator(booleanSymbolTypeMapFor(actualExpression)), METADATA, new TypeAnalyzer(SQL_PARSER, METADATA)); + Expression rewritten = rewrite(actualExpression, TEST_SESSION, new SymbolAllocator(booleanSymbolTypeMapFor(actualExpression)), PLANNER_CONTEXT, createTestingTypeAnalyzer(PLANNER_CONTEXT)); assertEquals( normalize(rewritten), normalize(expectedExpression)); @@ -318,7 +316,7 @@ private static void assertSimplifiesNumericTypes(String expression, String expec ParsingOptions parsingOptions = new ParsingOptions(); Expression actualExpression = rewriteIdentifiersToSymbolReferences(SQL_PARSER.createExpression(expression, parsingOptions)); Expression expectedExpression = rewriteIdentifiersToSymbolReferences(SQL_PARSER.createExpression(expected, parsingOptions)); - Expression rewritten = rewrite(actualExpression, TEST_SESSION, new SymbolAllocator(numericAndBooleanSymbolTypeMapFor(actualExpression)), METADATA, new TypeAnalyzer(SQL_PARSER, METADATA)); + Expression rewritten = rewrite(actualExpression, TEST_SESSION, new SymbolAllocator(numericAndBooleanSymbolTypeMapFor(actualExpression)), PLANNER_CONTEXT, createTestingTypeAnalyzer(PLANNER_CONTEXT)); assertEquals( normalize(rewritten), normalize(expectedExpression)); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithProjection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithProjection.java index a6cea9398267..475455c47394 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithProjection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithProjection.java @@ -40,7 +40,7 @@ public class TestTransformCorrelatedDistinctAggregationWithProjection @Test public void doesNotFireOnUncorrelated() { - tester().assertThat(new TransformCorrelatedDistinctAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedDistinctAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(), p.values(p.symbol("a")), @@ -51,7 +51,7 @@ public void doesNotFireOnUncorrelated() @Test public void doesNotFireOnCorrelatedWithNonDistinctAggregation() { - tester().assertThat(new TransformCorrelatedDistinctAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedDistinctAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -66,7 +66,7 @@ public void doesNotFireOnCorrelatedWithNonDistinctAggregation() @Test public void rewritesOnSubqueryWithDistinct() { - tester().assertThat(new TransformCorrelatedDistinctAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedDistinctAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithoutProjection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithoutProjection.java index 39ccc6251ef3..0a703894f481 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithoutProjection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedDistinctAggregationWithoutProjection.java @@ -39,7 +39,7 @@ public class TestTransformCorrelatedDistinctAggregationWithoutProjection @Test public void doesNotFireOnUncorrelated() { - tester().assertThat(new TransformCorrelatedDistinctAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedDistinctAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(), p.values(p.symbol("a")), @@ -50,7 +50,7 @@ public void doesNotFireOnUncorrelated() @Test public void doesNotFireOnCorrelatedWithNonDistinctAggregation() { - tester().assertThat(new TransformCorrelatedDistinctAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedDistinctAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -63,7 +63,7 @@ public void doesNotFireOnCorrelatedWithNonDistinctAggregation() @Test public void rewritesOnSubqueryWithDistinct() { - tester().assertThat(new TransformCorrelatedDistinctAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedDistinctAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithProjection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithProjection.java index 1e66962bcc3c..66187e6bb0e0 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithProjection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithProjection.java @@ -42,7 +42,7 @@ public class TestTransformCorrelatedGlobalAggregationWithProjection @Test public void doesNotFireOnPlanWithoutCorrelatedJoinNode() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.values(p.symbol("a"))) .doesNotFire(); } @@ -50,7 +50,7 @@ public void doesNotFireOnPlanWithoutCorrelatedJoinNode() @Test public void doesNotFireOnCorrelatedWithoutAggregation() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -61,7 +61,7 @@ public void doesNotFireOnCorrelatedWithoutAggregation() @Test public void doesNotFireOnUncorrelated() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(), p.values(p.symbol("a")), @@ -72,7 +72,7 @@ public void doesNotFireOnUncorrelated() @Test public void doesNotFireOnCorrelatedWithNonScalarAggregation() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -86,7 +86,7 @@ public void doesNotFireOnCorrelatedWithNonScalarAggregation() @Test public void doesNotFireOnMultipleProjections() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -104,7 +104,7 @@ public void doesNotFireOnMultipleProjections() @Test public void doesNotFireOnSubqueryWithoutProjection() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -118,7 +118,7 @@ public void doesNotFireOnSubqueryWithoutProjection() @Test public void rewritesOnSubqueryWithProjection() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -141,7 +141,7 @@ public void rewritesOnSubqueryWithProjection() @Test public void rewritesOnSubqueryWithDistinct() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -187,7 +187,7 @@ public void rewritesOnSubqueryWithDistinct() @Test public void testWithPreexistingMask() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithoutProjection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithoutProjection.java index d6ea6a36beb0..6306a38e5749 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithoutProjection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGlobalAggregationWithoutProjection.java @@ -42,7 +42,7 @@ public class TestTransformCorrelatedGlobalAggregationWithoutProjection @Test public void doesNotFireOnPlanWithoutCorrelatedJoinNode() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.values(p.symbol("a"))) .doesNotFire(); } @@ -50,7 +50,7 @@ public void doesNotFireOnPlanWithoutCorrelatedJoinNode() @Test public void doesNotFireOnCorrelatedWithoutAggregation() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -61,7 +61,7 @@ public void doesNotFireOnCorrelatedWithoutAggregation() @Test public void doesNotFireOnUncorrelated() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(), p.values(p.symbol("a")), @@ -72,7 +72,7 @@ public void doesNotFireOnUncorrelated() @Test public void doesNotFireOnCorrelatedWithNonScalarAggregation() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -86,7 +86,7 @@ public void doesNotFireOnCorrelatedWithNonScalarAggregation() @Test public void doesNotFireOnMultipleProjections() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -104,7 +104,7 @@ public void doesNotFireOnMultipleProjections() @Test public void rewritesOnSubqueryWithoutProjection() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -126,7 +126,7 @@ public void rewritesOnSubqueryWithoutProjection() @Test public void rewritesOnSubqueryWithProjection() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -141,7 +141,7 @@ public void rewritesOnSubqueryWithProjection() @Test public void testSubqueryWithCount() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -166,7 +166,7 @@ public void testSubqueryWithCount() @Test public void rewritesOnSubqueryWithDistinct() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -210,7 +210,7 @@ public void rewritesOnSubqueryWithDistinct() @Test public void testWithPreexistingMask() { - tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGlobalAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithProjection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithProjection.java index d58083524b38..f300abb305e1 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithProjection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithProjection.java @@ -42,7 +42,7 @@ public class TestTransformCorrelatedGroupedAggregationWithProjection @Test public void doesNotFireOnUncorrelated() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(), p.values(p.symbol("a")), @@ -53,7 +53,7 @@ public void doesNotFireOnUncorrelated() @Test public void doesNotFireOnCorrelatedWithNonGroupedAggregation() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -69,7 +69,7 @@ public void doesNotFireOnCorrelatedWithNonGroupedAggregation() @Test public void rewritesOnSubqueryWithoutDistinct() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -106,7 +106,7 @@ public void rewritesOnSubqueryWithoutDistinct() @Test public void rewritesOnSubqueryWithDistinct() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithoutProjection.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithoutProjection.java index b26cd5bf6ce9..cc80b967b671 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithoutProjection.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedGroupedAggregationWithoutProjection.java @@ -41,7 +41,7 @@ public class TestTransformCorrelatedGroupedAggregationWithoutProjection @Test public void doesNotFireOnUncorrelated() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(), p.values(p.symbol("a")), @@ -52,7 +52,7 @@ public void doesNotFireOnUncorrelated() @Test public void doesNotFireOnCorrelatedWithNonGroupedAggregation() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -66,7 +66,7 @@ public void doesNotFireOnCorrelatedWithNonGroupedAggregation() @Test public void rewritesOnSubqueryWithoutDistinct() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), @@ -101,7 +101,7 @@ public void rewritesOnSubqueryWithoutDistinct() @Test public void rewritesOnSubqueryWithDistinct() { - tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedGroupedAggregationWithoutProjection(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("corr")), p.values(p.symbol("corr")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedJoinToJoin.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedJoinToJoin.java index d1872d4e704a..4c557a5e5e03 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedJoinToJoin.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformCorrelatedJoinToJoin.java @@ -38,7 +38,7 @@ public class TestTransformCorrelatedJoinToJoin @Test public void testRewriteInnerCorrelatedJoin() { - tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol b = p.symbol("b"); @@ -62,7 +62,7 @@ public void testRewriteInnerCorrelatedJoin() TRUE_LITERAL, values("b")))); - tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol b = p.symbol("b"); @@ -95,7 +95,7 @@ public void testRewriteInnerCorrelatedJoin() @Test public void testRewriteLeftCorrelatedJoin() { - tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol b = p.symbol("b"); @@ -121,7 +121,7 @@ public void testRewriteLeftCorrelatedJoin() TRUE_LITERAL, values("b")))); - tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getPlannerContext())) .on(p -> { Symbol a = p.symbol("a"); Symbol b = p.symbol("b"); @@ -154,7 +154,7 @@ public void testRewriteLeftCorrelatedJoin() @Test public void doesNotFireOnUncorrelated() { - tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getMetadata())) + tester().assertThat(new TransformCorrelatedJoinToJoin(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(), p.values(p.symbol("a")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformExistsApplyToCorrelatedJoin.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformExistsApplyToCorrelatedJoin.java index 8ee0cf4a7e64..2cf79946037b 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformExistsApplyToCorrelatedJoin.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestTransformExistsApplyToCorrelatedJoin.java @@ -37,11 +37,11 @@ public class TestTransformExistsApplyToCorrelatedJoin @Test public void testDoesNotFire() { - tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getMetadata())) + tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getPlannerContext())) .on(p -> p.values(p.symbol("a"))) .doesNotFire(); - tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getMetadata())) + tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getPlannerContext())) .on(p -> p.correlatedJoin( ImmutableList.of(p.symbol("a")), @@ -53,7 +53,7 @@ public void testDoesNotFire() @Test public void testRewrite() { - tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getMetadata())) + tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getPlannerContext())) .on(p -> p.apply( Assignments.of(p.symbol("b", BOOLEAN), expression("EXISTS(SELECT TRUE)")), @@ -72,7 +72,7 @@ public void testRewrite() @Test public void testRewritesToLimit() { - tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getMetadata())) + tester().assertThat(new TransformExistsApplyToCorrelatedJoin(tester().getPlannerContext())) .on(p -> p.apply( Assignments.of(p.symbol("b", BOOLEAN), expression("EXISTS(SELECT TRUE)")), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestUnwrapSingleColumnRowInApply.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestUnwrapSingleColumnRowInApply.java index d21a39f3dc76..54e5677c35ff 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestUnwrapSingleColumnRowInApply.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestUnwrapSingleColumnRowInApply.java @@ -15,8 +15,6 @@ import com.google.common.collect.ImmutableMap; import io.trino.spi.type.RowType; -import io.trino.sql.parser.SqlParser; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.assertions.ExpressionMatcher; import io.trino.sql.planner.iterative.rule.test.BaseRuleTest; import io.trino.sql.planner.plan.Assignments; @@ -29,6 +27,7 @@ import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.IntegerType.INTEGER; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.apply; import static io.trino.sql.planner.assertions.PlanMatchPattern.expression; import static io.trino.sql.planner.assertions.PlanMatchPattern.project; @@ -43,7 +42,7 @@ public class TestUnwrapSingleColumnRowInApply @Test public void testDoesNotFireOnNoSingleColumnRow() { - tester().assertThat(new UnwrapSingleColumnRowInApply(new TypeAnalyzer(new SqlParser(), tester().getMetadata()))) + tester().assertThat(new UnwrapSingleColumnRowInApply(createTestingTypeAnalyzer(tester().getPlannerContext()))) .on(p -> p.apply( Assignments.builder() .put(p.symbol("output1", BOOLEAN), new InPredicate(new SymbolReference("value"), new SymbolReference("element"))) @@ -58,7 +57,7 @@ public void testDoesNotFireOnNoSingleColumnRow() @Test public void testUnwrapInPredicate() { - tester().assertThat(new UnwrapSingleColumnRowInApply(new TypeAnalyzer(new SqlParser(), tester().getMetadata()))) + tester().assertThat(new UnwrapSingleColumnRowInApply(createTestingTypeAnalyzer(tester().getPlannerContext()))) .on(p -> p.apply( Assignments.builder() .put(p.symbol("unwrapped", BOOLEAN), new InPredicate(new SymbolReference("rowValue"), new SymbolReference("rowElement"))) @@ -96,7 +95,7 @@ public void testUnwrapInPredicate() @Test public void testUnwrapQuantifiedComparison() { - tester().assertThat(new UnwrapSingleColumnRowInApply(new TypeAnalyzer(new SqlParser(), tester().getMetadata()))) + tester().assertThat(new UnwrapSingleColumnRowInApply(createTestingTypeAnalyzer(tester().getPlannerContext()))) .on(p -> p.apply( Assignments.builder() .put(p.symbol("unwrapped", BOOLEAN), new QuantifiedComparisonExpression(EQUAL, ALL, new SymbolReference("rowValue"), new SymbolReference("rowElement"))) diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleTester.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleTester.java index d4c11798be31..cf2354e80c8c 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleTester.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleTester.java @@ -23,6 +23,7 @@ import io.trino.spi.Plugin; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.iterative.Rule; import io.trino.testing.LocalQueryRunner; @@ -33,6 +34,7 @@ import java.util.Map; import java.util.Optional; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.testing.TestingSession.testSessionBuilder; import static java.util.Objects.requireNonNull; @@ -92,7 +94,7 @@ public RuleTester(LocalQueryRunner queryRunner) this.splitManager = queryRunner.getSplitManager(); this.pageSourceManager = queryRunner.getPageSourceManager(); this.accessControl = queryRunner.getAccessControl(); - this.typeAnalyzer = new TypeAnalyzer(queryRunner.getSqlParser(), metadata); + this.typeAnalyzer = createTestingTypeAnalyzer(queryRunner.getPlannerContext()); } public RuleAssert assertThat(Rule rule) @@ -106,6 +108,11 @@ public void close() queryRunner.close(); } + public PlannerContext getPlannerContext() + { + return queryRunner.getPlannerContext(); + } + public Metadata getMetadata() { return metadata; diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestEliminateSorts.java b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestEliminateSorts.java index d813142bccae..70381791df90 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestEliminateSorts.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestEliminateSorts.java @@ -18,7 +18,6 @@ import com.google.common.collect.ImmutableSet; import io.trino.cost.TaskCountEstimator; import io.trino.spi.connector.SortOrder; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.RuleStatsRecorder; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.assertions.BasePlanTest; @@ -34,6 +33,7 @@ import java.util.List; import java.util.Optional; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.anyTree; import static io.trino.sql.planner.assertions.PlanMatchPattern.functionCall; import static io.trino.sql.planner.assertions.PlanMatchPattern.output; @@ -90,7 +90,7 @@ public void testNotEliminateSorts() private void assertUnitPlan(@Language("SQL") String sql, PlanMatchPattern pattern) { - TypeAnalyzer typeAnalyzer = new TypeAnalyzer(new SqlParser(), getQueryRunner().getMetadata()); + TypeAnalyzer typeAnalyzer = createTestingTypeAnalyzer(getQueryRunner().getPlannerContext()); List optimizers = ImmutableList.of( new IterativeOptimizer( getQueryRunner().getMetadata(), @@ -100,7 +100,7 @@ private void assertUnitPlan(@Language("SQL") String sql, PlanMatchPattern patter ImmutableSet.of( new RemoveRedundantIdentityProjections(), new DetermineTableScanNodePartitioning(getQueryRunner().getMetadata(), getQueryRunner().getNodePartitioningManager(), new TaskCountEstimator(() -> 10)))), - new AddExchanges(getQueryRunner().getMetadata(), getQueryRunner().getTypeOperators(), typeAnalyzer, getQueryRunner().getStatsCalculator())); + new AddExchanges(getQueryRunner().getPlannerContext(), typeAnalyzer, getQueryRunner().getStatsCalculator())); assertPlan(sql, pattern, optimizers); } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestExpressionEquivalence.java b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestExpressionEquivalence.java index c4980a1c5707..4e2506086b78 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestExpressionEquivalence.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestExpressionEquivalence.java @@ -16,14 +16,12 @@ import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import io.trino.metadata.Metadata; import io.trino.security.AllowAllAccessControl; import io.trino.spi.type.Type; import io.trino.spi.type.TypeSignature; import io.trino.sql.parser.ParsingOptions; import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.tree.Expression; import io.trino.transaction.TestingTransactionManager; @@ -33,13 +31,14 @@ import java.util.Set; import static io.trino.SessionTestUtils.TEST_SESSION; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.sql.ExpressionTestUtils.planExpression; import static io.trino.sql.parser.ParsingOptions.DecimalLiteralTreatment.AS_DOUBLE; import static io.trino.sql.planner.SymbolsExtractor.extractUnique; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.transaction.TransactionBuilder.transaction; import static java.lang.String.format; import static java.util.function.Function.identity; @@ -50,8 +49,7 @@ public class TestExpressionEquivalence { private static final SqlParser SQL_PARSER = new SqlParser(); - private static final Metadata METADATA = createTestMetadataManager(); - private static final ExpressionEquivalence EQUIVALENCE = new ExpressionEquivalence(METADATA, new TypeAnalyzer(SQL_PARSER, METADATA)); + private static final ExpressionEquivalence EQUIVALENCE = new ExpressionEquivalence(PLANNER_CONTEXT.getMetadata(), createTestingTypeAnalyzer(PLANNER_CONTEXT)); private static final TypeProvider TYPE_PROVIDER = TypeProvider.copyOf(ImmutableMap.builder() .put(new Symbol("a_boolean"), BOOLEAN) .put(new Symbol("b_boolean"), BOOLEAN) @@ -134,8 +132,8 @@ public void testEquivalent() private static void assertEquivalent(@Language("SQL") String left, @Language("SQL") String right) { ParsingOptions parsingOptions = new ParsingOptions(AS_DOUBLE /* anything */); - Expression leftExpression = planExpression(METADATA, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(left, parsingOptions)); - Expression rightExpression = planExpression(METADATA, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(right, parsingOptions)); + Expression leftExpression = planExpression(PLANNER_CONTEXT, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(left, parsingOptions)); + Expression rightExpression = planExpression(PLANNER_CONTEXT, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(right, parsingOptions)); Set symbols = extractUnique(ImmutableList.of(leftExpression, rightExpression)); TypeProvider types = TypeProvider.copyOf(symbols.stream() @@ -212,8 +210,8 @@ public void testNotEquivalent() private static void assertNotEquivalent(@Language("SQL") String left, @Language("SQL") String right) { ParsingOptions parsingOptions = new ParsingOptions(AS_DOUBLE /* anything */); - Expression leftExpression = planExpression(METADATA, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(left, parsingOptions)); - Expression rightExpression = planExpression(METADATA, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(right, parsingOptions)); + Expression leftExpression = planExpression(PLANNER_CONTEXT, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(left, parsingOptions)); + Expression rightExpression = planExpression(PLANNER_CONTEXT, TEST_SESSION, TYPE_PROVIDER, SQL_PARSER.createExpression(right, parsingOptions)); Set symbols = extractUnique(ImmutableList.of(leftExpression, rightExpression)); TypeProvider types = TypeProvider.copyOf(symbols.stream() @@ -239,6 +237,6 @@ private static boolean areExpressionEquivalent(Expression leftExpression, Expres private static Type generateType(Symbol symbol) { String typeName = Splitter.on('_').limit(2).splitToList(symbol.getName()).get(1); - return METADATA.getType(new TypeSignature(typeName, ImmutableList.of())); + return PLANNER_CONTEXT.getTypeManager().getType(new TypeSignature(typeName, ImmutableList.of())); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestPartialTopNWithPresortedInput.java b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestPartialTopNWithPresortedInput.java index aa16b7d7a38b..ecb7f1f8d470 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestPartialTopNWithPresortedInput.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestPartialTopNWithPresortedInput.java @@ -21,16 +21,14 @@ import io.trino.connector.MockConnectorFactory; import io.trino.connector.MockConnectorTableHandle; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ColumnMetadata; import io.trino.spi.connector.ConnectorTableProperties; import io.trino.spi.connector.SchemaTableName; import io.trino.spi.connector.SortingProperty; import io.trino.spi.predicate.TupleDomain; -import io.trino.sql.parser.SqlParser; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Plan; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.assertions.BasePlanTest; import io.trino.sql.planner.assertions.PlanAssert; import io.trino.sql.planner.assertions.PlanMatchPattern; @@ -48,6 +46,7 @@ import static io.trino.spi.connector.SortOrder.ASC_NULLS_LAST; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.planner.LogicalPlanner.Stage.OPTIMIZED_AND_VALIDATED; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.anyTree; import static io.trino.sql.planner.assertions.PlanMatchPattern.exchange; import static io.trino.sql.planner.assertions.PlanMatchPattern.limit; @@ -201,8 +200,8 @@ private void assertPlanWithValidation(@Language("SQL") String sql, PlanMatchPatt queryRunner.inTransaction(queryRunner.getDefaultSession(), transactionSession -> { Plan actualPlan = queryRunner.createPlan(transactionSession, sql, OPTIMIZED_AND_VALIDATED, false, WarningCollector.NOOP); PlanAssert.assertPlan(transactionSession, queryRunner.getMetadata(), queryRunner.getStatsCalculator(), actualPlan, pattern); - Metadata metadata = queryRunner.getMetadata(); - new ValidateLimitWithPresortedInput().validate(actualPlan.getRoot(), transactionSession, metadata, queryRunner.getTypeOperators(), new TypeAnalyzer(new SqlParser(), metadata), actualPlan.getTypes(), WarningCollector.NOOP); + PlannerContext plannerContext = queryRunner.getPlannerContext(); + new ValidateLimitWithPresortedInput().validate(actualPlan.getRoot(), transactionSession, plannerContext, createTestingTypeAnalyzer(plannerContext), actualPlan.getTypes(), WarningCollector.NOOP); return null; }); } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java index b2d5f9dcdb89..d27131e5b874 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java @@ -22,13 +22,11 @@ import io.trino.metadata.TableHandle; import io.trino.plugin.tpch.TpchColumnHandle; import io.trino.plugin.tpch.TpchTableHandle; -import io.trino.spi.type.TypeOperators; -import io.trino.sql.parser.SqlParser; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.Plan; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.SymbolAllocator; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.assertions.BasePlanTest; import io.trino.sql.planner.assertions.PlanAssert; import io.trino.sql.planner.assertions.PlanMatchPattern; @@ -54,6 +52,7 @@ import static io.trino.sql.DynamicFilters.createDynamicFilterExpression; import static io.trino.sql.ExpressionUtils.combineConjuncts; import static io.trino.sql.ExpressionUtils.combineDisjuncts; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.equiJoinClause; import static io.trino.sql.planner.assertions.PlanMatchPattern.join; import static io.trino.sql.planner.assertions.PlanMatchPattern.output; @@ -69,8 +68,8 @@ public class TestRemoveUnsupportedDynamicFilters extends BasePlanTest { + private PlannerContext plannerContext; private Metadata metadata; - private final TypeOperators typeOperators = new TypeOperators(); private PlanBuilder builder; private Symbol lineitemOrderKeySymbol; private TableScanNode lineitemTableScanNode; @@ -81,7 +80,8 @@ public class TestRemoveUnsupportedDynamicFilters @BeforeClass public void setup() { - metadata = getQueryRunner().getMetadata(); + plannerContext = getQueryRunner().getPlannerContext(); + metadata = plannerContext.getMetadata(); builder = new PlanBuilder(new PlanNodeIdAllocator(), metadata, TEST_SESSION); CatalogName catalogName = getCurrentConnectorId(); lineitemTableHandle = new TableHandle( @@ -479,12 +479,10 @@ private PlanNode removeUnsupportedDynamicFilters(PlanNode root) return getQueryRunner().inTransaction(session -> { // metadata.getCatalogHandle() registers the catalog for the transaction session.getCatalog().ifPresent(catalog -> metadata.getCatalogHandle(session, catalog)); - PlanNode rewrittenPlan = new RemoveUnsupportedDynamicFilters(metadata).optimize(root, session, builder.getTypes(), new SymbolAllocator(), new PlanNodeIdAllocator(), WarningCollector.NOOP); + PlanNode rewrittenPlan = new RemoveUnsupportedDynamicFilters(plannerContext).optimize(root, session, builder.getTypes(), new SymbolAllocator(), new PlanNodeIdAllocator(), WarningCollector.NOOP); new DynamicFiltersChecker().validate(rewrittenPlan, session, - metadata, - typeOperators, - new TypeAnalyzer(new SqlParser(), metadata), + plannerContext, createTestingTypeAnalyzer(plannerContext), builder.getTypes(), WarningCollector.NOOP); return rewrittenPlan; diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestReorderWindows.java b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestReorderWindows.java index c6983f7d9ca5..6dd5ba718b2d 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestReorderWindows.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestReorderWindows.java @@ -18,7 +18,6 @@ import com.google.common.collect.ImmutableSet; import io.trino.spi.connector.SortOrder; import io.trino.sql.planner.RuleStatsRecorder; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.assertions.BasePlanTest; import io.trino.sql.planner.assertions.ExpectedValueProvider; import io.trino.sql.planner.assertions.PlanMatchPattern; @@ -35,6 +34,7 @@ import java.util.Optional; import static io.trino.sql.planner.PlanOptimizers.columnPruningRules; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.assertions.PlanMatchPattern.anyTree; import static io.trino.sql.planner.assertions.PlanMatchPattern.expression; import static io.trino.sql.planner.assertions.PlanMatchPattern.filter; @@ -335,9 +335,8 @@ private void assertUnitPlan(@Language("SQL") String sql, PlanMatchPattern patter List optimizers = ImmutableList.of( new UnaliasSymbolReferences(getQueryRunner().getMetadata()), new PredicatePushDown( - getQueryRunner().getMetadata(), - getQueryRunner().getTypeOperators(), - new TypeAnalyzer(getQueryRunner().getSqlParser(), getQueryRunner().getMetadata()), + getQueryRunner().getPlannerContext(), + createTestingTypeAnalyzer(getQueryRunner().getPlannerContext()), false, false), new IterativeOptimizer( diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestPatternRecognitionNodeSerialization.java b/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestPatternRecognitionNodeSerialization.java index 6f14a1dda261..9141b6d2d80e 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestPatternRecognitionNodeSerialization.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestPatternRecognitionNodeSerialization.java @@ -64,6 +64,7 @@ import static io.trino.sql.tree.PatternRecognitionRelation.RowsPerMatch.WINDOW; import static io.trino.sql.tree.SkipTo.Position.LAST; import static io.trino.sql.tree.WindowFrame.Type.ROWS; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; public class TestPatternRecognitionNodeSerialization @@ -89,7 +90,7 @@ public void testAggregationValuePointerRoundtrip() provider.setJsonSerializers(ImmutableMap.of(Expression.class, new ExpressionSerialization.ExpressionSerializer())); provider.setJsonDeserializers(ImmutableMap.of( Expression.class, new ExpressionSerialization.ExpressionDeserializer(new SqlParser()), - Type.class, new TypeDeserializer(createTestMetadataManager()))); + Type.class, new TypeDeserializer(TESTING_TYPE_MANAGER))); provider.setKeyDeserializers(ImmutableMap.of( TypeSignature.class, new TypeSignatureKeyDeserializer())); JsonCodec codec = new JsonCodecFactory(provider).jsonCodec(ValuePointer.class); @@ -148,7 +149,7 @@ public void testMeasureRoundtrip() provider.setJsonSerializers(ImmutableMap.of(Expression.class, new ExpressionSerialization.ExpressionSerializer())); provider.setJsonDeserializers(ImmutableMap.of( Expression.class, new ExpressionSerialization.ExpressionDeserializer(new SqlParser()), - Type.class, new TypeDeserializer(createTestMetadataManager()))); + Type.class, new TypeDeserializer(TESTING_TYPE_MANAGER))); JsonCodec codec = new JsonCodecFactory(provider).jsonCodec(Measure.class); assertJsonRoundTrip(codec, new Measure( @@ -184,7 +185,7 @@ public void testPatternRecognitionNodeRoundtrip() provider.setJsonSerializers(ImmutableMap.of(Expression.class, new ExpressionSerialization.ExpressionSerializer())); provider.setJsonDeserializers(ImmutableMap.of( Expression.class, new ExpressionSerialization.ExpressionDeserializer(new SqlParser()), - Type.class, new TypeDeserializer(createTestMetadataManager()))); + Type.class, new TypeDeserializer(TESTING_TYPE_MANAGER))); provider.setKeyDeserializers(ImmutableMap.of( TypeSignature.class, new TypeSignatureKeyDeserializer())); JsonCodec codec = new JsonCodecFactory(provider).jsonCodec(PatternRecognitionNode.class); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestWindowNode.java b/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestWindowNode.java index 80fd5d0f3228..6a3acd90f83a 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestWindowNode.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/plan/TestWindowNode.java @@ -73,7 +73,7 @@ public TestWindowNode() Slice.class, new SliceSerializer(), Expression.class, new ExpressionSerializer())); provider.setJsonDeserializers(ImmutableMap.of( - Type.class, new TypeDeserializer(functionResolution.getMetadata()), + Type.class, new TypeDeserializer(functionResolution.getPlannerContext().getTypeManager()), Slice.class, new SliceDeserializer(), Expression.class, new ExpressionDeserializer(sqlParser), TypeSignature.class, new TypeSignatureDeserializer())); diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestDynamicFiltersChecker.java b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestDynamicFiltersChecker.java index d68de6ac8993..5c5b5dd4e73f 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestDynamicFiltersChecker.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestDynamicFiltersChecker.java @@ -22,11 +22,9 @@ import io.trino.metadata.TableHandle; import io.trino.plugin.tpch.TpchColumnHandle; import io.trino.plugin.tpch.TpchTableHandle; -import io.trino.spi.type.TypeOperators; -import io.trino.sql.parser.SqlParser; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.assertions.BasePlanTest; import io.trino.sql.planner.iterative.rule.test.PlanBuilder; @@ -45,6 +43,7 @@ import static io.trino.sql.DynamicFilters.createDynamicFilterExpression; import static io.trino.sql.ExpressionUtils.combineConjuncts; import static io.trino.sql.ExpressionUtils.combineDisjuncts; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.iterative.rule.test.PlanBuilder.expression; import static io.trino.sql.planner.plan.JoinNode.Type.INNER; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -53,17 +52,18 @@ public class TestDynamicFiltersChecker extends BasePlanTest { private Metadata metadata; - private final TypeOperators typeOperators = new TypeOperators(); private PlanBuilder builder; private Symbol lineitemOrderKeySymbol; private TableScanNode lineitemTableScanNode; private Symbol ordersOrderKeySymbol; private TableScanNode ordersTableScanNode; + private PlannerContext plannerContext; @BeforeClass public void setup() { - metadata = getQueryRunner().getMetadata(); + plannerContext = getQueryRunner().getPlannerContext(); + metadata = plannerContext.getMetadata(); builder = new PlanBuilder(new PlanNodeIdAllocator(), metadata, TEST_SESSION); CatalogName catalogName = getCurrentConnectorId(); TableHandle lineitemTableHandle = new TableHandle( @@ -354,7 +354,7 @@ private void validatePlan(PlanNode root) getQueryRunner().inTransaction(session -> { // metadata.getCatalogHandle() registers the catalog for the transaction session.getCatalog().ifPresent(catalog -> metadata.getCatalogHandle(session, catalog)); - new DynamicFiltersChecker().validate(root, session, metadata, typeOperators, new TypeAnalyzer(new SqlParser(), metadata), TypeProvider.empty(), WarningCollector.NOOP); + new DynamicFiltersChecker().validate(root, session, plannerContext, createTestingTypeAnalyzer(plannerContext), TypeProvider.empty(), WarningCollector.NOOP); return null; }); } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateAggregationsWithDefaultValues.java b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateAggregationsWithDefaultValues.java index e44e843d99e8..f3e3dced690c 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateAggregationsWithDefaultValues.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateAggregationsWithDefaultValues.java @@ -18,15 +18,12 @@ import com.google.common.collect.ImmutableSet; import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.TableHandle; import io.trino.plugin.tpch.TpchColumnHandle; import io.trino.plugin.tpch.TpchTableHandle; -import io.trino.spi.type.TypeOperators; -import io.trino.sql.parser.SqlParser; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.assertions.BasePlanTest; import io.trino.sql.planner.iterative.rule.test.PlanBuilder; @@ -40,6 +37,7 @@ import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.spi.type.BigintType.BIGINT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.plan.AggregationNode.Step.FINAL; import static io.trino.sql.planner.plan.AggregationNode.Step.PARTIAL; import static io.trino.sql.planner.plan.AggregationNode.groupingSets; @@ -52,8 +50,7 @@ public class TestValidateAggregationsWithDefaultValues extends BasePlanTest { - private Metadata metadata; - private TypeOperators typeOperators = new TypeOperators(); + private PlannerContext plannerContext; private PlanBuilder builder; private Symbol symbol; private TableScanNode tableScanNode; @@ -61,8 +58,8 @@ public class TestValidateAggregationsWithDefaultValues @BeforeClass public void setup() { - metadata = getQueryRunner().getMetadata(); - builder = new PlanBuilder(new PlanNodeIdAllocator(), metadata, TEST_SESSION); + plannerContext = getQueryRunner().getPlannerContext(); + builder = new PlanBuilder(new PlanNodeIdAllocator(), plannerContext.getMetadata(), TEST_SESSION); CatalogName catalogName = getCurrentConnectorId(); TableHandle nationTableHandle = new TableHandle( catalogName, @@ -200,13 +197,12 @@ private void validatePlan(PlanNode root, boolean forceSingleNode) { getQueryRunner().inTransaction(session -> { // metadata.getCatalogHandle() registers the catalog for the transaction - session.getCatalog().ifPresent(catalog -> metadata.getCatalogHandle(session, catalog)); + session.getCatalog().ifPresent(catalog -> plannerContext.getMetadata().getCatalogHandle(session, catalog)); new ValidateAggregationsWithDefaultValues(forceSingleNode).validate( root, session, - metadata, - typeOperators, - new TypeAnalyzer(new SqlParser(), metadata), + plannerContext, + createTestingTypeAnalyzer(plannerContext), TypeProvider.empty(), WarningCollector.NOOP); return null; diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateLimitWithPresortedInput.java b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateLimitWithPresortedInput.java index 708255abc3f3..66c869dfb7bb 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateLimitWithPresortedInput.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateLimitWithPresortedInput.java @@ -22,7 +22,6 @@ import io.trino.connector.MockConnectorFactory; import io.trino.connector.MockConnectorTableHandle; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.TableHandle; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ColumnMetadata; @@ -47,6 +46,7 @@ import static io.trino.spi.connector.SortOrder.ASC_NULLS_FIRST; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.iterative.rule.test.PlanBuilder.expression; import static io.trino.testing.TestingSession.testSessionBuilder; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -180,16 +180,15 @@ public void testValidateFailed() private void validatePlan(Function planProvider) { LocalQueryRunner queryRunner = getQueryRunner(); - Metadata metadata = queryRunner.getMetadata(); - PlanBuilder builder = new PlanBuilder(idAllocator, metadata, queryRunner.getDefaultSession()); + PlanBuilder builder = new PlanBuilder(idAllocator, queryRunner.getMetadata(), queryRunner.getDefaultSession()); PlanNode planNode = planProvider.apply(builder); TypeProvider types = builder.getTypes(); queryRunner.inTransaction(session -> { // metadata.getCatalogHandle() registers the catalog for the transaction - session.getCatalog().ifPresent(catalog -> metadata.getCatalogHandle(session, catalog)); - TypeAnalyzer typeAnalyzer = new TypeAnalyzer(queryRunner.getSqlParser(), metadata); - new ValidateLimitWithPresortedInput().validate(planNode, session, metadata, queryRunner.getTypeOperators(), typeAnalyzer, types, WarningCollector.NOOP); + session.getCatalog().ifPresent(catalog -> queryRunner.getMetadata().getCatalogHandle(session, catalog)); + TypeAnalyzer typeAnalyzer = createTestingTypeAnalyzer(queryRunner.getPlannerContext()); + new ValidateLimitWithPresortedInput().validate(planNode, session, queryRunner.getPlannerContext(), typeAnalyzer, types, WarningCollector.NOOP); return null; }); } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateStreamingAggregations.java b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateStreamingAggregations.java index 2cd653d26cf8..14c4fa462129 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateStreamingAggregations.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestValidateStreamingAggregations.java @@ -17,12 +17,11 @@ import com.google.common.collect.ImmutableMap; import io.trino.connector.CatalogName; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.TableHandle; import io.trino.plugin.tpch.TpchColumnHandle; import io.trino.plugin.tpch.TpchTableHandle; import io.trino.plugin.tpch.TpchTransactionHandle; -import io.trino.spi.type.TypeOperators; +import io.trino.sql.PlannerContext; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -36,14 +35,14 @@ import java.util.function.Function; import static io.trino.spi.type.BigintType.BIGINT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.planner.plan.AggregationNode.Step.SINGLE; import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TestValidateStreamingAggregations extends BasePlanTest { - private Metadata metadata; - private TypeOperators typeOperators = new TypeOperators(); + private PlannerContext plannerContext; private TypeAnalyzer typeAnalyzer; private PlanNodeIdAllocator idAllocator = new PlanNodeIdAllocator(); private TableHandle nationTableHandle; @@ -51,8 +50,8 @@ public class TestValidateStreamingAggregations @BeforeClass public void setup() { - metadata = getQueryRunner().getMetadata(); - typeAnalyzer = new TypeAnalyzer(getQueryRunner().getSqlParser(), metadata); + plannerContext = getQueryRunner().getPlannerContext(); + typeAnalyzer = createTestingTypeAnalyzer(plannerContext); CatalogName catalogName = getCurrentConnectorId(); nationTableHandle = new TableHandle( @@ -108,13 +107,13 @@ public void testValidateFailed() private void validatePlan(Function planProvider) { getQueryRunner().inTransaction(session -> { - PlanBuilder builder = new PlanBuilder(idAllocator, metadata, session); + PlanBuilder builder = new PlanBuilder(idAllocator, plannerContext.getMetadata(), session); PlanNode planNode = planProvider.apply(builder); TypeProvider types = builder.getTypes(); // metadata.getCatalogHandle() registers the catalog for the transaction - session.getCatalog().ifPresent(catalog -> metadata.getCatalogHandle(session, catalog)); - new ValidateStreamingAggregations().validate(planNode, session, metadata, typeOperators, typeAnalyzer, types, WarningCollector.NOOP); + session.getCatalog().ifPresent(catalog -> plannerContext.getMetadata().getCatalogHandle(session, catalog)); + new ValidateStreamingAggregations().validate(planNode, session, plannerContext, typeAnalyzer, types, WarningCollector.NOOP); return null; }); } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestVerifyOnlyOneOutputNode.java b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestVerifyOnlyOneOutputNode.java index 264d129798ab..f0740b307d5e 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestVerifyOnlyOneOutputNode.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/sanity/TestVerifyOnlyOneOutputNode.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import io.trino.execution.warnings.WarningCollector; -import io.trino.spi.type.TypeOperators; import io.trino.sql.planner.PlanNodeIdAllocator; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.plan.Assignments; @@ -26,12 +25,12 @@ import io.trino.sql.planner.plan.ValuesNode; import org.testng.annotations.Test; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TestVerifyOnlyOneOutputNode { private final PlanNodeIdAllocator idAllocator = new PlanNodeIdAllocator(); - private final TypeOperators typeOperators = new TypeOperators(); @Test public void testValidateSuccessful() @@ -44,7 +43,7 @@ public void testValidateSuccessful() idAllocator.getNextId(), ImmutableList.of(), ImmutableList.of()), Assignments.of() ), ImmutableList.of(), ImmutableList.of()); - new VerifyOnlyOneOutputNode().validate(root, null, null, typeOperators, null, null, WarningCollector.NOOP); + new VerifyOnlyOneOutputNode().validate(root, null, PLANNER_CONTEXT, null, null, WarningCollector.NOOP); } @Test @@ -64,7 +63,7 @@ public void testValidateFailed() ImmutableList.of(), false), ImmutableList.of(), ImmutableList.of()); - assertThatThrownBy(() -> new VerifyOnlyOneOutputNode().validate(root, null, null, typeOperators, null, null, WarningCollector.NOOP)) + assertThatThrownBy(() -> new VerifyOnlyOneOutputNode().validate(root, null, PLANNER_CONTEXT, null, null, WarningCollector.NOOP)) .isInstanceOf(IllegalStateException.class) .hasMessage("Expected plan to have single instance of OutputNode"); } diff --git a/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java b/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java index ee3714e5ab9f..ad13e77877d9 100644 --- a/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java +++ b/core/trino-main/src/test/java/io/trino/sql/query/TestShowQueries.java @@ -66,7 +66,7 @@ public void init() .build(), ImmutableMap.of()); queryRunner.getCatalogManager().registerCatalog(createBogusTestingCatalog("testing_catalog")); - queryRunner.getMetadata().getSessionPropertyManager().addConnectorSessionProperties(new CatalogName("testing_catalog"), List.of()); + queryRunner.getSessionPropertyManager().addConnectorSessionProperties(new CatalogName("testing_catalog"), List.of()); assertions = new QueryAssertions(queryRunner); } diff --git a/core/trino-main/src/test/java/io/trino/type/AbstractTestType.java b/core/trino-main/src/test/java/io/trino/type/AbstractTestType.java index 3929b68bd7d3..23714198804d 100644 --- a/core/trino-main/src/test/java/io/trino/type/AbstractTestType.java +++ b/core/trino-main/src/test/java/io/trino/type/AbstractTestType.java @@ -21,6 +21,7 @@ import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.block.BlockEncodingSerde; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.ArrayType; import io.trino.spi.type.MapType; import io.trino.spi.type.RowType; @@ -41,7 +42,6 @@ import static com.google.common.base.Preconditions.checkState; import static io.airlift.testing.Assertions.assertInstanceOf; import static io.trino.block.BlockSerdeUtil.writeBlock; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.OperatorAssertion.toRow; import static io.trino.spi.connector.SortOrder.ASC_NULLS_FIRST; import static io.trino.spi.connector.SortOrder.ASC_NULLS_LAST; @@ -65,7 +65,7 @@ public abstract class AbstractTestType { - private final BlockEncodingSerde blockEncodingSerde = createTestMetadataManager().getBlockEncodingSerde(); + private final BlockEncodingSerde blockEncodingSerde = new TestingBlockEncodingSerde(); private final Class objectValueType; private final Block testBlock; diff --git a/core/trino-main/src/test/java/io/trino/type/BenchmarkDecimalOperators.java b/core/trino-main/src/test/java/io/trino/type/BenchmarkDecimalOperators.java index 5f0a880a4b61..f34758884772 100644 --- a/core/trino-main/src/test/java/io/trino/type/BenchmarkDecimalOperators.java +++ b/core/trino-main/src/test/java/io/trino/type/BenchmarkDecimalOperators.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import io.trino.RowPagesBuilder; -import io.trino.metadata.Metadata; import io.trino.operator.DriverYieldSignal; import io.trino.operator.project.PageProcessor; import io.trino.spi.Page; @@ -26,7 +25,6 @@ import io.trino.spi.type.Type; import io.trino.sql.gen.ExpressionCompiler; import io.trino.sql.gen.PageFunctionCompiler; -import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; @@ -59,11 +57,12 @@ import static io.trino.SessionTestUtils.TEST_SESSION; import static io.trino.jmh.Benchmarks.benchmark; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DecimalType.createDecimalType; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.sql.ExpressionTestUtils.createExpression; +import static io.trino.sql.planner.TestingPlannerContext.PLANNER_CONTEXT; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.testing.TestingConnectorSession.SESSION; import static java.lang.String.format; import static java.math.BigInteger.ONE; @@ -549,8 +548,7 @@ private Object execute(BaseState state) private static class BaseState { - private final Metadata metadata = createTestMetadataManager(); - private final TypeAnalyzer typeAnalyzer = new TypeAnalyzer(new SqlParser(), metadata); + private final TypeAnalyzer typeAnalyzer = createTestingTypeAnalyzer(PLANNER_CONTEXT); private final Random random = new Random(); protected final Map symbols = new HashMap<>(); @@ -605,7 +603,7 @@ protected void generateInputPage(int... initialValues) protected void generateProcessor(String expression) { - processor = new ExpressionCompiler(metadata, new PageFunctionCompiler(metadata, 0)).compilePageProcessor(Optional.empty(), ImmutableList.of(rowExpression(expression))).get(); + processor = new ExpressionCompiler(PLANNER_CONTEXT.getMetadata(), new PageFunctionCompiler(PLANNER_CONTEXT.getMetadata(), 0)).compilePageProcessor(Optional.empty(), ImmutableList.of(rowExpression(expression))).get(); } protected void setDoubleMaxValue(double doubleMaxValue) @@ -615,13 +613,13 @@ protected void setDoubleMaxValue(double doubleMaxValue) private RowExpression rowExpression(String value) { - Expression expression = createExpression(value, metadata, TypeProvider.copyOf(symbolTypes)); + Expression expression = createExpression(value, PLANNER_CONTEXT, TypeProvider.copyOf(symbolTypes)); return SqlToRowExpressionTranslator.translate( expression, typeAnalyzer.getTypes(TEST_SESSION, TypeProvider.copyOf(symbolTypes), expression), sourceLayout, - metadata, + PLANNER_CONTEXT.getMetadata(), TEST_SESSION, true); } diff --git a/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java b/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java index a30d109ba13c..c09f36a85a43 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java +++ b/core/trino-main/src/test/java/io/trino/type/TestArrayOperators.java @@ -105,7 +105,7 @@ public void testStackRepresentation() { Block actualBlock = arrayBlockOf(new ArrayType(BIGINT), arrayBlockOf(BIGINT, 1L, 2L), arrayBlockOf(BIGINT, 3L)); DynamicSliceOutput actualSliceOutput = new DynamicSliceOutput(100); - writeBlock(functionAssertions.getMetadata().getBlockEncodingSerde(), actualSliceOutput, actualBlock); + writeBlock(functionAssertions.getPlannerContext().getBlockEncodingSerde(), actualSliceOutput, actualBlock); Block expectedBlock = new ArrayType(BIGINT) .createBlockBuilder(null, 3) @@ -113,7 +113,7 @@ public void testStackRepresentation() .appendStructure(BIGINT.createBlockBuilder(null, 1).writeLong(3).closeEntry().build()) .build(); DynamicSliceOutput expectedSliceOutput = new DynamicSliceOutput(100); - writeBlock(functionAssertions.getMetadata().getBlockEncodingSerde(), expectedSliceOutput, expectedBlock); + writeBlock(functionAssertions.getPlannerContext().getBlockEncodingSerde(), expectedSliceOutput, expectedBlock); assertEquals(actualSliceOutput.slice(), expectedSliceOutput.slice()); } diff --git a/core/trino-main/src/test/java/io/trino/type/TestBigintArrayType.java b/core/trino-main/src/test/java/io/trino/type/TestBigintArrayType.java index efeb21737e0e..1e23832a9408 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestBigintArrayType.java +++ b/core/trino-main/src/test/java/io/trino/type/TestBigintArrayType.java @@ -13,16 +13,15 @@ */ package io.trino.type; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.Type; import java.util.List; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.TypeSignature.arrayType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.arrayBlockOf; public class TestBigintArrayType @@ -30,12 +29,7 @@ public class TestBigintArrayType { public TestBigintArrayType() { - this(createTestMetadataManager()); - } - - private TestBigintArrayType(Metadata metadata) - { - super(metadata.getType(arrayType(BIGINT.getTypeSignature())), List.class, createTestBlock(metadata.getType(arrayType(BIGINT.getTypeSignature())))); + super(TESTING_TYPE_MANAGER.getType(arrayType(BIGINT.getTypeSignature())), List.class, createTestBlock(TESTING_TYPE_MANAGER.getType(arrayType(BIGINT.getTypeSignature())))); } public static Block createTestBlock(Type arrayType) diff --git a/core/trino-main/src/test/java/io/trino/type/TestColorArrayType.java b/core/trino-main/src/test/java/io/trino/type/TestColorArrayType.java index 4725f62ff3d5..45e22d1ca32b 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestColorArrayType.java +++ b/core/trino-main/src/test/java/io/trino/type/TestColorArrayType.java @@ -13,16 +13,15 @@ */ package io.trino.type; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.Type; import java.util.List; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.TypeSignature.arrayType; import static io.trino.type.ColorType.COLOR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.arrayBlockOf; public class TestColorArrayType @@ -30,12 +29,7 @@ public class TestColorArrayType { public TestColorArrayType() { - this(createTestMetadataManager()); - } - - private TestColorArrayType(Metadata metadata) - { - super(metadata.getType(arrayType(COLOR.getTypeSignature())), List.class, createTestBlock(metadata.getType(arrayType(COLOR.getTypeSignature())))); + super(TESTING_TYPE_MANAGER.getType(arrayType(COLOR.getTypeSignature())), List.class, createTestBlock(TESTING_TYPE_MANAGER.getType(arrayType(COLOR.getTypeSignature())))); } public static Block createTestBlock(Type arrayType) diff --git a/core/trino-main/src/test/java/io/trino/type/TestIntegerArrayType.java b/core/trino-main/src/test/java/io/trino/type/TestIntegerArrayType.java index 92d44d439c75..6ff06196a624 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestIntegerArrayType.java +++ b/core/trino-main/src/test/java/io/trino/type/TestIntegerArrayType.java @@ -13,16 +13,15 @@ */ package io.trino.type; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.Type; import java.util.List; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.IntegerType.INTEGER; import static io.trino.spi.type.TypeSignature.arrayType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.arrayBlockOf; public class TestIntegerArrayType @@ -30,12 +29,7 @@ public class TestIntegerArrayType { public TestIntegerArrayType() { - this(createTestMetadataManager()); - } - - private TestIntegerArrayType(Metadata metadata) - { - super(metadata.getType(arrayType(INTEGER.getTypeSignature())), List.class, createTestBlock(metadata.getType(arrayType(INTEGER.getTypeSignature())))); + super(TESTING_TYPE_MANAGER.getType(arrayType(INTEGER.getTypeSignature())), List.class, createTestBlock(TESTING_TYPE_MANAGER.getType(arrayType(INTEGER.getTypeSignature())))); } public static Block createTestBlock(Type arrayType) diff --git a/core/trino-main/src/test/java/io/trino/type/TestRowOperators.java b/core/trino-main/src/test/java/io/trino/type/TestRowOperators.java index 484b9e211822..99636c828136 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestRowOperators.java +++ b/core/trino-main/src/test/java/io/trino/type/TestRowOperators.java @@ -90,7 +90,7 @@ public static Slice uncheckedToJson(@SqlType("varchar(x)") Slice slice) public void testRowTypeLookup() { TypeSignature signature = RowType.from(ImmutableList.of(field("b", BIGINT))).getTypeSignature(); - Type type = functionAssertions.getMetadata().getType(signature); + Type type = functionAssertions.getPlannerContext().getTypeManager().getType(signature); assertEquals(type.getTypeSignature().getParameters().size(), 1); assertEquals(type.getTypeSignature().getParameters().get(0).getNamedTypeSignature().getName().get(), "b"); } diff --git a/core/trino-main/src/test/java/io/trino/type/TestRowParametricType.java b/core/trino-main/src/test/java/io/trino/type/TestRowParametricType.java index 48f739459b93..86462cd93ffd 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestRowParametricType.java +++ b/core/trino-main/src/test/java/io/trino/type/TestRowParametricType.java @@ -16,8 +16,6 @@ import io.trino.spi.type.NamedTypeSignature; import io.trino.spi.type.RowFieldName; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; import io.trino.spi.type.TypeParameter; import io.trino.spi.type.TypeSignature; import io.trino.spi.type.TypeSignatureParameter; @@ -27,26 +25,25 @@ import java.util.Optional; import java.util.stream.Collectors; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.StandardTypes.ROW; import static io.trino.testing.assertions.Assert.assertEquals; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; public class TestRowParametricType { @Test public void testTypeSignatureRoundTrip() { - TypeManager typeManager = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); TypeSignature typeSignature = new TypeSignature( ROW, TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col1")), BIGINT.getTypeSignature())), TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName("col2")), DOUBLE.getTypeSignature()))); List parameters = typeSignature.getParameters().stream() - .map(parameter -> TypeParameter.of(parameter, typeManager)) + .map(parameter -> TypeParameter.of(parameter, TESTING_TYPE_MANAGER)) .collect(Collectors.toList()); - Type rowType = RowParametricType.ROW.createType(typeManager, parameters); + Type rowType = RowParametricType.ROW.createType(TESTING_TYPE_MANAGER, parameters); assertEquals(rowType.getTypeSignature(), typeSignature); } diff --git a/core/trino-main/src/test/java/io/trino/type/TestSmallintArrayType.java b/core/trino-main/src/test/java/io/trino/type/TestSmallintArrayType.java index 560517bc375c..ae0059f096fe 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestSmallintArrayType.java +++ b/core/trino-main/src/test/java/io/trino/type/TestSmallintArrayType.java @@ -13,16 +13,15 @@ */ package io.trino.type; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.Type; import java.util.List; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.SmallintType.SMALLINT; import static io.trino.spi.type.TypeSignature.arrayType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.arrayBlockOf; public class TestSmallintArrayType @@ -30,12 +29,7 @@ public class TestSmallintArrayType { public TestSmallintArrayType() { - this(createTestMetadataManager()); - } - - private TestSmallintArrayType(Metadata metadata) - { - super(metadata.getType(arrayType(SMALLINT.getTypeSignature())), List.class, createTestBlock(metadata.getType(arrayType(SMALLINT.getTypeSignature())))); + super(TESTING_TYPE_MANAGER.getType(arrayType(SMALLINT.getTypeSignature())), List.class, createTestBlock(TESTING_TYPE_MANAGER.getType(arrayType(SMALLINT.getTypeSignature())))); } public static Block createTestBlock(Type arrayType) diff --git a/core/trino-main/src/test/java/io/trino/type/TestTinyintArrayType.java b/core/trino-main/src/test/java/io/trino/type/TestTinyintArrayType.java index ca616786546c..00f60533a318 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestTinyintArrayType.java +++ b/core/trino-main/src/test/java/io/trino/type/TestTinyintArrayType.java @@ -13,16 +13,15 @@ */ package io.trino.type; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.Type; import java.util.List; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.TinyintType.TINYINT; import static io.trino.spi.type.TypeSignature.arrayType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.arrayBlockOf; public class TestTinyintArrayType @@ -30,12 +29,7 @@ public class TestTinyintArrayType { public TestTinyintArrayType() { - this(createTestMetadataManager()); - } - - private TestTinyintArrayType(Metadata metadata) - { - super(metadata.getType(arrayType(TINYINT.getTypeSignature())), List.class, createTestBlock(metadata.getType(arrayType(TINYINT.getTypeSignature())))); + super(TESTING_TYPE_MANAGER.getType(arrayType(TINYINT.getTypeSignature())), List.class, createTestBlock(TESTING_TYPE_MANAGER.getType(arrayType(TINYINT.getTypeSignature())))); } public static Block createTestBlock(Type arrayType) diff --git a/core/trino-main/src/test/java/io/trino/type/TestTypeCoercion.java b/core/trino-main/src/test/java/io/trino/type/TestTypeCoercion.java index 030a36e89b0e..d17ba246e547 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestTypeCoercion.java +++ b/core/trino-main/src/test/java/io/trino/type/TestTypeCoercion.java @@ -14,13 +14,17 @@ package io.trino.type; import com.google.common.collect.ImmutableSet; -import io.trino.metadata.Metadata; +import io.trino.FeaturesConfig; import io.trino.metadata.TestingFunctionResolution; +import io.trino.metadata.TypeRegistry; import io.trino.spi.type.ArrayType; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; +import io.trino.spi.type.TypeOperators; import io.trino.spi.type.TypeSignature; import org.testng.annotations.Test; +import java.util.Collection; import java.util.Optional; import java.util.Set; @@ -58,9 +62,10 @@ public class TestTypeCoercion { private final TestingFunctionResolution functionResolution = new TestingFunctionResolution(); - private final Metadata metadata = functionResolution.getMetadata(); - private final Type re2jType = metadata.getType(RE2J_REGEXP_SIGNATURE); - private final TypeCoercion typeCoercion = new TypeCoercion(metadata::getType); + private final TypeManager typeManager = functionResolution.getPlannerContext().getTypeManager(); + private final Collection standardTypes = new TypeRegistry(new TypeOperators(), new FeaturesConfig()).getTypes(); + private final Type re2jType = typeManager.getType(RE2J_REGEXP_SIGNATURE); + private final TypeCoercion typeCoercion = new TypeCoercion(typeManager::getType); @Test public void testIsTypeOnlyCoercion() @@ -108,7 +113,7 @@ public void testIsTypeOnlyCoercion() private Type mapType(Type keyType, Type valueType) { - return metadata.getType(TypeSignature.mapType(keyType.getTypeSignature(), valueType.getTypeSignature())); + return typeManager.getType(TypeSignature.mapType(keyType.getTypeSignature(), valueType.getTypeSignature())); } @Test @@ -312,7 +317,7 @@ private Set getStandardPrimitiveTypes() { ImmutableSet.Builder builder = ImmutableSet.builder(); // add unparametrized types - builder.addAll(metadata.getTypes()); + builder.addAll(standardTypes); // add corner cases for parametrized types builder.add(createDecimalType(1, 0)); builder.add(createDecimalType(17, 0)); diff --git a/core/trino-main/src/test/java/io/trino/type/TestTypeRegistry.java b/core/trino-main/src/test/java/io/trino/type/TestTypeRegistry.java index 8e0b59d9c3ce..5057d5c42c78 100644 --- a/core/trino-main/src/test/java/io/trino/type/TestTypeRegistry.java +++ b/core/trino-main/src/test/java/io/trino/type/TestTypeRegistry.java @@ -13,30 +13,23 @@ */ package io.trino.type; -import com.google.common.collect.ImmutableList; -import io.trino.metadata.Metadata; -import io.trino.metadata.TestingFunctionResolution; -import io.trino.spi.type.Type; +import io.trino.FeaturesConfig; +import io.trino.metadata.TypeRegistry; import io.trino.spi.type.TypeNotFoundException; +import io.trino.spi.type.TypeOperators; import io.trino.spi.type.TypeSignature; import org.testng.annotations.Test; -import static io.trino.spi.function.OperatorType.EQUAL; -import static io.trino.spi.function.OperatorType.HASH_CODE; -import static io.trino.spi.function.OperatorType.IS_DISTINCT_FROM; -import static io.trino.spi.function.OperatorType.LESS_THAN; -import static io.trino.spi.function.OperatorType.LESS_THAN_OR_EQUAL; import static org.assertj.core.api.Assertions.assertThatThrownBy; public class TestTypeRegistry { - private final TestingFunctionResolution functionResolution = new TestingFunctionResolution(); - private final Metadata metadata = functionResolution.getMetadata(); + private final TypeRegistry typeRegistry = new TypeRegistry(new TypeOperators(), new FeaturesConfig()); @Test public void testNonexistentType() { - assertThatThrownBy(() -> metadata.getType(new TypeSignature("not a real type"))) + assertThatThrownBy(() -> typeRegistry.getType(new TypeSignature("not a real type"))) .isInstanceOf(TypeNotFoundException.class) .hasMessage("Unknown type: not a real type"); } @@ -44,16 +37,6 @@ public void testNonexistentType() @Test public void testOperatorsImplemented() { - for (Type type : metadata.getTypes()) { - if (type.isComparable()) { - functionResolution.resolveOperator(EQUAL, ImmutableList.of(type, type)); - functionResolution.resolveOperator(IS_DISTINCT_FROM, ImmutableList.of(type, type)); - functionResolution.resolveOperator(HASH_CODE, ImmutableList.of(type)); - } - if (type.isOrderable()) { - functionResolution.resolveOperator(LESS_THAN, ImmutableList.of(type, type)); - functionResolution.resolveOperator(LESS_THAN_OR_EQUAL, ImmutableList.of(type, type)); - } - } + typeRegistry.verifyTypes(); } } diff --git a/core/trino-main/src/test/java/io/trino/util/StructuralTestUtil.java b/core/trino-main/src/test/java/io/trino/util/StructuralTestUtil.java index 3d1060900184..2376a9e8c335 100644 --- a/core/trino-main/src/test/java/io/trino/util/StructuralTestUtil.java +++ b/core/trino-main/src/test/java/io/trino/util/StructuralTestUtil.java @@ -16,7 +16,6 @@ import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; import io.airlift.slice.Slices; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.ArrayType; @@ -31,14 +30,12 @@ import java.math.BigDecimal; import java.util.Map; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.RealType.REAL; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Float.floatToRawIntBits; public final class StructuralTestUtil { - private static final Metadata METADATA = createTestMetadataManager(); - private StructuralTestUtil() {} public static Block arrayBlockOf(Type elementType, Object... values) @@ -65,7 +62,7 @@ public static Block mapBlockOf(Type keyType, Type valueType, Map value) public static MapType mapType(Type keyType, Type valueType) { - return (MapType) METADATA.getParameterizedType(StandardTypes.MAP, ImmutableList.of( + return (MapType) TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(keyType.getTypeSignature()), TypeSignatureParameter.typeParameter(valueType.getTypeSignature()))); } diff --git a/core/trino-spi/src/test/java/io/trino/spi/block/TestingBlockEncodingSerde.java b/core/trino-spi/src/test/java/io/trino/spi/block/TestingBlockEncodingSerde.java index 2fc5b3b3fdc4..f84dabcd5b49 100644 --- a/core/trino-spi/src/test/java/io/trino/spi/block/TestingBlockEncodingSerde.java +++ b/core/trino-spi/src/test/java/io/trino/spi/block/TestingBlockEncodingSerde.java @@ -18,11 +18,11 @@ import io.trino.spi.type.TestingTypeManager; import io.trino.spi.type.Type; import io.trino.spi.type.TypeId; -import io.trino.spi.type.TypeManager; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.function.Function; import static com.google.common.base.Preconditions.checkArgument; import static java.nio.charset.StandardCharsets.UTF_8; @@ -32,20 +32,29 @@ public final class TestingBlockEncodingSerde implements BlockEncodingSerde { - private final TypeManager typeManagerType = new TestingTypeManager(); + private final Function types; private final ConcurrentMap blockEncodings = new ConcurrentHashMap<>(); public TestingBlockEncodingSerde() { + this(new TestingTypeManager()::getType); + } + + public TestingBlockEncodingSerde(Function types) + { + this.types = requireNonNull(types, "types is null"); + // add the built-in BlockEncodings addBlockEncoding(new VariableWidthBlockEncoding()); addBlockEncoding(new ByteArrayBlockEncoding()); addBlockEncoding(new ShortArrayBlockEncoding()); addBlockEncoding(new IntArrayBlockEncoding()); addBlockEncoding(new LongArrayBlockEncoding()); - addBlockEncoding(new Int128ArrayBlockEncoding()); addBlockEncoding(new Int96ArrayBlockEncoding()); + addBlockEncoding(new Int128ArrayBlockEncoding()); addBlockEncoding(new DictionaryBlockEncoding()); addBlockEncoding(new ArrayBlockEncoding()); + addBlockEncoding(new MapBlockEncoding()); + addBlockEncoding(new SingleMapBlockEncoding()); addBlockEncoding(new RowBlockEncoding()); addBlockEncoding(new SingleRowBlockEncoding()); addBlockEncoding(new RunLengthBlockEncoding()); @@ -104,7 +113,7 @@ public Type readType(SliceInput sliceInput) requireNonNull(sliceInput, "sliceInput is null"); String id = readLengthPrefixedString(sliceInput); - Type type = typeManagerType.getType(TypeId.of(id)); + Type type = types.apply(TypeId.of(id)); if (type == null) { throw new IllegalArgumentException("Unknown type " + id); } diff --git a/lib/trino-orc/src/test/java/io/trino/orc/BenchmarkColumnReaders.java b/lib/trino-orc/src/test/java/io/trino/orc/BenchmarkColumnReaders.java index a0f35c74277e..bd74ff707dcd 100644 --- a/lib/trino-orc/src/test/java/io/trino/orc/BenchmarkColumnReaders.java +++ b/lib/trino-orc/src/test/java/io/trino/orc/BenchmarkColumnReaders.java @@ -52,7 +52,6 @@ import static com.google.common.io.RecursiveDeleteOption.ALLOW_INSECURE; import static io.trino.jmh.Benchmarks.benchmark; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.orc.OrcReader.INITIAL_BATCH_SIZE; import static io.trino.orc.OrcTester.writeOrcColumnTrino; import static io.trino.orc.metadata.CompressionKind.NONE; @@ -68,6 +67,7 @@ import static io.trino.spi.type.TimestampType.TIMESTAMP_MILLIS; import static io.trino.spi.type.TinyintType.TINYINT; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.nio.file.Files.readAllBytes; import static java.util.UUID.randomUUID; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -422,7 +422,7 @@ public static class AllNullBenchmarkData public void setup() throws Exception { - Type type = createTestMetadataManager().fromSqlType(typeName); + Type type = TESTING_TYPE_MANAGER.fromSqlType(typeName); setup(type, createValues()); } diff --git a/lib/trino-orc/src/test/java/io/trino/orc/OrcTester.java b/lib/trino-orc/src/test/java/io/trino/orc/OrcTester.java index 7d9c65d246ee..3be309d295b1 100644 --- a/lib/trino-orc/src/test/java/io/trino/orc/OrcTester.java +++ b/lib/trino-orc/src/test/java/io/trino/orc/OrcTester.java @@ -22,7 +22,6 @@ import io.airlift.slice.Slice; import io.airlift.slice.Slices; import io.airlift.units.DataSize; -import io.trino.metadata.Metadata; import io.trino.orc.metadata.CompressionKind; import io.trino.orc.metadata.OrcType; import io.trino.spi.Page; @@ -114,7 +113,6 @@ import static io.airlift.units.DataSize.Unit.MEGABYTE; import static io.airlift.units.DataSize.succinctBytes; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.orc.OrcReader.MAX_BATCH_SIZE; import static io.trino.orc.OrcTester.Format.ORC_11; import static io.trino.orc.OrcTester.Format.ORC_12; @@ -153,6 +151,7 @@ import static io.trino.spi.type.Varchars.truncateToLength; import static io.trino.testing.DateTimeTestingUtils.sqlTimestampOf; import static io.trino.testing.TestingConnectorSession.SESSION; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.util.Arrays.asList; import static java.util.stream.Collectors.toList; import static org.apache.hadoop.hive.serde2.ColumnProjectionUtils.READ_ALL_COLUMNS; @@ -189,8 +188,6 @@ public class OrcTester .withTinyStripeThreshold(DataSize.of(1, MEGABYTE)); public static final DateTimeZone HIVE_STORAGE_TIME_ZONE = DateTimeZone.forID("America/Bahia_Banderas"); - private static final Metadata METADATA = createTestMetadataManager(); - public enum Format { ORC_12, ORC_11 @@ -1183,12 +1180,12 @@ private static List toHiveList(Object input) private static Type arrayType(Type elementType) { - return METADATA.getParameterizedType(StandardTypes.ARRAY, ImmutableList.of(TypeSignatureParameter.typeParameter(elementType.getTypeSignature()))); + return TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.ARRAY, ImmutableList.of(TypeSignatureParameter.typeParameter(elementType.getTypeSignature()))); } private static Type mapType(Type keyType, Type valueType) { - return METADATA.getParameterizedType(StandardTypes.MAP, ImmutableList.of(TypeSignatureParameter.typeParameter(keyType.getTypeSignature()), TypeSignatureParameter.typeParameter(valueType.getTypeSignature()))); + return TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of(TypeSignatureParameter.typeParameter(keyType.getTypeSignature()), TypeSignatureParameter.typeParameter(valueType.getTypeSignature()))); } private static Type rowType(Type... fieldTypes) @@ -1199,7 +1196,7 @@ private static Type rowType(Type... fieldTypes) Type fieldType = fieldTypes[i]; typeSignatureParameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(filedName)), fieldType.getTypeSignature()))); } - return METADATA.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); + return TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); } private static boolean isTimestampTz(Type type) diff --git a/lib/trino-orc/src/test/java/io/trino/orc/TestOrcReaderMemoryUsage.java b/lib/trino-orc/src/test/java/io/trino/orc/TestOrcReaderMemoryUsage.java index bdd4816e41ec..75e6a675259f 100644 --- a/lib/trino-orc/src/test/java/io/trino/orc/TestOrcReaderMemoryUsage.java +++ b/lib/trino-orc/src/test/java/io/trino/orc/TestOrcReaderMemoryUsage.java @@ -13,7 +13,6 @@ */ package io.trino.orc; -import io.trino.metadata.Metadata; import io.trino.orc.metadata.CompressionKind; import io.trino.spi.Page; import io.trino.spi.type.StandardTypes; @@ -33,7 +32,6 @@ import java.util.HashMap; import static io.airlift.testing.Assertions.assertGreaterThan; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.orc.OrcReader.INITIAL_BATCH_SIZE; import static io.trino.orc.OrcReader.MAX_BATCH_SIZE; import static io.trino.orc.OrcTester.Format.ORC_12; @@ -42,12 +40,11 @@ import static io.trino.orc.OrcTester.createSettableStructObjectInspector; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; public class TestOrcReaderMemoryUsage { - private static final Metadata METADATA = createTestMetadataManager(); - @Test public void testVarcharTypeWithoutNulls() throws Exception @@ -142,7 +139,7 @@ public void testBigIntTypeWithNulls() public void testMapTypeWithNulls() throws Exception { - Type mapType = METADATA.getType(new TypeSignature(StandardTypes.MAP, TypeSignatureParameter.typeParameter(BIGINT.getTypeSignature()), TypeSignatureParameter.typeParameter(BIGINT.getTypeSignature()))); + Type mapType = TESTING_TYPE_MANAGER.getType(new TypeSignature(StandardTypes.MAP, TypeSignatureParameter.typeParameter(BIGINT.getTypeSignature()), TypeSignatureParameter.typeParameter(BIGINT.getTypeSignature()))); int rows = 10000; OrcRecordReader reader = null; diff --git a/lib/trino-orc/src/test/java/io/trino/orc/TestStructColumnReader.java b/lib/trino-orc/src/test/java/io/trino/orc/TestStructColumnReader.java index fa7552c65e0b..dd862e553f80 100644 --- a/lib/trino-orc/src/test/java/io/trino/orc/TestStructColumnReader.java +++ b/lib/trino-orc/src/test/java/io/trino/orc/TestStructColumnReader.java @@ -18,7 +18,6 @@ import com.google.common.collect.ImmutableMap; import io.airlift.slice.Slices; import io.airlift.units.DataSize; -import io.trino.metadata.Metadata; import io.trino.orc.metadata.OrcType; import io.trino.spi.Page; import io.trino.spi.block.Block; @@ -43,13 +42,13 @@ import static io.airlift.units.DataSize.Unit.MEGABYTE; import static io.trino.memory.context.AggregatedMemoryContext.newSimpleAggregatedMemoryContext; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.orc.OrcTester.READER_OPTIONS; import static io.trino.orc.OrcWriteValidation.OrcWriteValidationMode.BOTH; import static io.trino.orc.TestingOrcPredicate.ORC_ROW_GROUP_SIZE; import static io.trino.orc.TestingOrcPredicate.ORC_STRIPE_SIZE; import static io.trino.orc.metadata.CompressionKind.NONE; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.nio.charset.StandardCharsets.UTF_8; import static org.joda.time.DateTimeZone.UTC; import static org.testng.Assert.assertEquals; @@ -58,8 +57,6 @@ @Test(singleThreaded = true) public class TestStructColumnReader { - private static final Metadata METADATA = createTestMetadataManager(); - private static final Type TEST_DATA_TYPE = VARCHAR; private static final String STRUCT_COL_NAME = "struct_col"; @@ -282,7 +279,7 @@ private Type getType(List fieldNames) for (String fieldName : fieldNames) { typeSignatureParameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.of(new RowFieldName(fieldName)), TEST_DATA_TYPE.getTypeSignature()))); } - return METADATA.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); + return TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); } private Type getTypeNullName(int numFields) @@ -292,6 +289,6 @@ private Type getTypeNullName(int numFields) for (int i = 0; i < numFields; i++) { typeSignatureParameters.add(TypeSignatureParameter.namedTypeParameter(new NamedTypeSignature(Optional.empty(), TEST_DATA_TYPE.getTypeSignature()))); } - return METADATA.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); + return TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.ROW, typeSignatureParameters.build()); } } diff --git a/lib/trino-rcfile/src/test/java/io/trino/rcfile/RcFileTester.java b/lib/trino-rcfile/src/test/java/io/trino/rcfile/RcFileTester.java index e14cdb192c1b..340db57a748c 100644 --- a/lib/trino-rcfile/src/test/java/io/trino/rcfile/RcFileTester.java +++ b/lib/trino-rcfile/src/test/java/io/trino/rcfile/RcFileTester.java @@ -24,7 +24,6 @@ import io.airlift.slice.Slices; import io.airlift.units.DataSize; import io.trino.hadoop.HadoopNative; -import io.trino.metadata.Metadata; import io.trino.rcfile.binary.BinaryRcFileEncoding; import io.trino.rcfile.text.TextRcFileEncoding; import io.trino.spi.Page; @@ -123,7 +122,6 @@ import static io.airlift.slice.SizeOf.SIZE_OF_LONG; import static io.airlift.units.DataSize.Unit.KILOBYTE; import static io.airlift.units.DataSize.Unit.MEGABYTE; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.rcfile.RcFileDecoderUtils.findFirstSyncPosition; import static io.trino.rcfile.RcFileTester.Compression.BZIP2; import static io.trino.rcfile.RcFileTester.Compression.LZ4; @@ -148,6 +146,7 @@ import static io.trino.testing.DateTimeTestingUtils.sqlTimestampOf; import static io.trino.testing.TestingConnectorSession.SESSION; import static io.trino.type.DateTimes.MICROSECONDS_PER_MILLISECOND; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Math.toIntExact; import static java.util.Collections.nCopies; import static java.util.stream.Collectors.toList; @@ -183,7 +182,6 @@ public class RcFileTester HadoopNative.requireHadoopNative(); } - private static final Metadata METADATA = createTestMetadataManager(); public static final DateTimeZone HIVE_STORAGE_TIME_ZONE = DateTimeZone.forID("America/Bahia_Banderas"); public enum Format @@ -1160,7 +1158,7 @@ private static Object toHiveStruct(Object input) private static MapType createMapType(Type type) { - return (MapType) METADATA.getParameterizedType(MAP, ImmutableList.of( + return (MapType) TESTING_TYPE_MANAGER.getParameterizedType(MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(type.getTypeSignature()), TypeSignatureParameter.typeParameter(type.getTypeSignature()))); } diff --git a/lib/trino-record-decoder/src/test/java/io/trino/decoder/avro/TestAvroDecoder.java b/lib/trino-record-decoder/src/test/java/io/trino/decoder/avro/TestAvroDecoder.java index c60760876b38..27b2ef116fa2 100644 --- a/lib/trino-record-decoder/src/test/java/io/trino/decoder/avro/TestAvroDecoder.java +++ b/lib/trino-record-decoder/src/test/java/io/trino/decoder/avro/TestAvroDecoder.java @@ -21,7 +21,6 @@ import io.trino.decoder.DecoderTestColumnHandle; import io.trino.decoder.FieldValueProvider; import io.trino.decoder.RowDecoder; -import io.trino.metadata.Metadata; import io.trino.spi.TrinoException; import io.trino.spi.block.Block; import io.trino.spi.type.ArrayType; @@ -63,7 +62,6 @@ import static io.trino.decoder.avro.AvroDecoderTestUtil.checkRowValues; import static io.trino.decoder.util.DecoderTestUtil.checkIsNull; import static io.trino.decoder.util.DecoderTestUtil.checkValue; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DoubleType.DOUBLE; @@ -76,6 +74,7 @@ import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; import static io.trino.spi.type.VarcharType.createVarcharType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.nio.charset.StandardCharsets.UTF_8; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.testng.Assert.assertEquals; @@ -87,13 +86,12 @@ public class TestAvroDecoder private static final String DATA_SCHEMA = "dataSchema"; private static final AvroRowDecoderFactory DECODER_FACTORY = new AvroRowDecoderFactory(new FixedSchemaAvroReaderSupplier.Factory(), new AvroFileDeserializer.Factory()); - private static final Metadata METADATA = createTestMetadataManager(); - private static final Type VARCHAR_MAP_TYPE = METADATA.getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())); - private static final Type DOUBLE_MAP_TYPE = METADATA.getType(mapType(VARCHAR.getTypeSignature(), DOUBLE.getTypeSignature())); - private static final Type REAL_MAP_TYPE = METADATA.getType(mapType(VARCHAR.getTypeSignature(), REAL.getTypeSignature())); - private static final Type MAP_OF_REAL_MAP_TYPE = METADATA.getType(mapType(VARCHAR.getTypeSignature(), REAL_MAP_TYPE.getTypeSignature())); - private static final Type MAP_OF_ARRAY_OF_MAP_TYPE = METADATA.getType(mapType(VARCHAR.getTypeSignature(), new ArrayType(REAL_MAP_TYPE).getTypeSignature())); - private static final Type MAP_OF_RECORD = METADATA.getType(mapType(VARCHAR.getTypeSignature(), + private static final Type VARCHAR_MAP_TYPE = TESTING_TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())); + private static final Type DOUBLE_MAP_TYPE = TESTING_TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), DOUBLE.getTypeSignature())); + private static final Type REAL_MAP_TYPE = TESTING_TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), REAL.getTypeSignature())); + private static final Type MAP_OF_REAL_MAP_TYPE = TESTING_TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), REAL_MAP_TYPE.getTypeSignature())); + private static final Type MAP_OF_ARRAY_OF_MAP_TYPE = TESTING_TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), new ArrayType(REAL_MAP_TYPE).getTypeSignature())); + private static final Type MAP_OF_RECORD = TESTING_TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), RowType.from(ImmutableList.builder() .add(RowType.field("sf1", DOUBLE)) .add(RowType.field("sf2", BOOLEAN)) diff --git a/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/TestAccumuloClient.java b/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/TestAccumuloClient.java index b573d38e0cf1..eba37867c6b3 100644 --- a/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/TestAccumuloClient.java +++ b/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/TestAccumuloClient.java @@ -23,8 +23,6 @@ import io.trino.spi.connector.ColumnMetadata; import io.trino.spi.connector.ConnectorTableMetadata; import io.trino.spi.connector.SchemaTableName; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.apache.accumulo.core.client.Connector; import org.testng.annotations.Test; @@ -32,8 +30,8 @@ import java.util.List; import java.util.Map; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertNotNull; public class TestAccumuloClient @@ -50,7 +48,7 @@ public TestAccumuloClient() Connector connector = TestingAccumuloServer.getInstance().getConnector(); config.setZooKeepers(connector.getInstance().getZooKeepers()); - zooKeeperMetadataManager = new ZooKeeperMetadataManager(config, new InternalTypeManager(createTestMetadataManager(), new TypeOperators())); + zooKeeperMetadataManager = new ZooKeeperMetadataManager(config, TESTING_TYPE_MANAGER); client = new AccumuloClient(connector, config, zooKeeperMetadataManager, new AccumuloTableManager(connector), new IndexLookup(connector, new ColumnCardinalityCache(connector, config))); } diff --git a/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/model/TestField.java b/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/model/TestField.java index 6f655dc7791a..699f10707460 100644 --- a/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/model/TestField.java +++ b/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/model/TestField.java @@ -30,7 +30,6 @@ import java.util.GregorianCalendar; import static io.airlift.slice.Slices.utf8Slice; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DateType.DATE; @@ -43,6 +42,7 @@ import static io.trino.spi.type.TinyintType.TINYINT; import static io.trino.spi.type.VarbinaryType.VARBINARY; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Float.floatToIntBits; import static java.nio.charset.StandardCharsets.UTF_8; import static org.testng.Assert.assertEquals; @@ -160,7 +160,7 @@ public void testLong() @Test public void testMap() { - Type type = createTestMetadataManager().getParameterizedType(StandardTypes.MAP, ImmutableList.of( + Type type = TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()), TypeSignatureParameter.typeParameter(BIGINT.getTypeSignature()))); Block expected = AccumuloRowSerializer.getBlockFromMap(type, ImmutableMap.of("a", 1L, "b", 2L, "c", 3L)); diff --git a/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/serializers/AbstractTestAccumuloRowSerializer.java b/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/serializers/AbstractTestAccumuloRowSerializer.java index 14f6ca59681c..fa5ef0ce920e 100644 --- a/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/serializers/AbstractTestAccumuloRowSerializer.java +++ b/plugin/trino-accumulo/src/test/java/io/trino/plugin/accumulo/serializers/AbstractTestAccumuloRowSerializer.java @@ -34,7 +34,6 @@ import java.util.Map; import java.util.UUID; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DateType.DATE; @@ -47,6 +46,7 @@ import static io.trino.spi.type.TinyintType.TINYINT; import static io.trino.spi.type.VarbinaryType.VARBINARY; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.testng.Assert.assertEquals; @@ -185,7 +185,7 @@ public void testMap() throws Exception { AccumuloRowSerializer serializer = serializerClass.getConstructor().newInstance(); - Type type = createTestMetadataManager().getParameterizedType(StandardTypes.MAP, ImmutableList.of( + Type type = TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(VARCHAR.getTypeSignature()), TypeSignatureParameter.typeParameter(BIGINT.getTypeSignature()))); Map expected = ImmutableMap.of("a", 1L, "b", 2L, "3", 3L); diff --git a/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestCassandraColumnHandle.java b/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestCassandraColumnHandle.java index 64725cc10b12..d0823c5e6916 100644 --- a/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestCassandraColumnHandle.java +++ b/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestCassandraColumnHandle.java @@ -19,13 +19,10 @@ import io.airlift.json.ObjectMapperProvider; import io.trino.plugin.base.TypeDeserializer; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; public class TestCassandraColumnHandle @@ -36,8 +33,7 @@ public class TestCassandraColumnHandle public void setup() { ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); - TypeManager typeManager = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(typeManager))); + objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(TESTING_TYPE_MANAGER))); codec = new JsonCodecFactory(objectMapperProvider).jsonCodec(CassandraColumnHandle.class); } diff --git a/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestJsonCassandraHandles.java b/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestJsonCassandraHandles.java index 66bbcaf42a02..e08da02a58fa 100644 --- a/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestJsonCassandraHandles.java +++ b/plugin/trino-cassandra/src/test/java/io/trino/plugin/cassandra/TestJsonCassandraHandles.java @@ -21,9 +21,6 @@ import io.trino.spi.connector.SchemaTableName; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.testng.annotations.Test; import java.util.Collections; @@ -31,8 +28,8 @@ import java.util.Map; import java.util.Optional; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.testing.QueryAssertions.assertEqualsIgnoreOrder; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.nio.charset.StandardCharsets.UTF_8; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -92,8 +89,7 @@ public class TestJsonCassandraHandles static { ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); - TypeManager typeManager = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new CassandraClientModule.TypeDeserializer(typeManager))); + objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new CassandraClientModule.TypeDeserializer(TESTING_TYPE_MANAGER))); OBJECT_MAPPER = objectMapperProvider.get(); } diff --git a/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialInnerJoin.java b/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialInnerJoin.java index 86f41ccf3827..3e1515735a3e 100644 --- a/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialInnerJoin.java +++ b/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialInnerJoin.java @@ -389,6 +389,6 @@ public void testPushDownAnd() private RuleAssert assertRuleApplication() { RuleTester tester = tester(); - return tester.assertThat(new ExtractSpatialInnerJoin(tester.getMetadata(), tester.getSplitManager(), tester.getPageSourceManager(), tester.getTypeAnalyzer())); + return tester.assertThat(new ExtractSpatialInnerJoin(tester.getPlannerContext(), tester.getSplitManager(), tester.getPageSourceManager(), tester.getTypeAnalyzer())); } } diff --git a/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialLeftJoin.java b/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialLeftJoin.java index f6554bc3ce2b..30715497e21a 100644 --- a/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialLeftJoin.java +++ b/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestExtractSpatialLeftJoin.java @@ -258,6 +258,6 @@ public void testPushDownAnd() private RuleAssert assertRuleApplication() { RuleTester tester = tester(); - return tester().assertThat(new ExtractSpatialLeftJoin(tester.getMetadata(), tester.getSplitManager(), tester.getPageSourceManager(), tester.getTypeAnalyzer())); + return tester().assertThat(new ExtractSpatialLeftJoin(tester.getPlannerContext(), tester.getSplitManager(), tester.getPageSourceManager(), tester.getTypeAnalyzer())); } } diff --git a/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestRewriteSpatialPartitioningAggregation.java b/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestRewriteSpatialPartitioningAggregation.java index f57ce7ce995d..aa2ac22a3e9b 100644 --- a/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestRewriteSpatialPartitioningAggregation.java +++ b/plugin/trino-geospatial/src/test/java/io/trino/plugin/geospatial/TestRewriteSpatialPartitioningAggregation.java @@ -84,6 +84,6 @@ public void test() private RuleAssert assertRuleApplication() { - return tester().assertThat(new RewriteSpatialPartitioningAggregation(tester().getMetadata())); + return tester().assertThat(new RewriteSpatialPartitioningAggregation(tester().getPlannerContext())); } } diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java index ad5faff986f9..4c56ac146faf 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHive.java @@ -230,7 +230,6 @@ import static io.trino.plugin.hive.HiveTableRedirectionsProvider.NO_REDIRECTIONS; import static io.trino.plugin.hive.HiveTestUtils.PAGE_SORTER; import static io.trino.plugin.hive.HiveTestUtils.SESSION; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.arrayType; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHiveFileWriterFactories; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHivePageSourceFactories; @@ -294,6 +293,7 @@ import static io.trino.testing.MaterializedResult.materializeSourceDataStream; import static io.trino.testing.QueryAssertions.assertEqualsIgnoreOrder; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Float.floatToRawIntBits; import static java.lang.Math.toIntExact; import static java.lang.String.format; @@ -819,7 +819,7 @@ protected final void setup(String databaseName, HiveConfig hiveConfig, HiveMetas 1000, Optional.empty(), true, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, NOOP_METADATA_PROVIDER, locationService, partitionUpdateCodec, @@ -876,14 +876,14 @@ public Optional getMaterializedView(Connect hiveConfig.getSplitLoaderConcurrency(), hiveConfig.getMaxSplitsPerSecond(), false, - TYPE_MANAGER); + TESTING_TYPE_MANAGER); pageSinkProvider = new HivePageSinkProvider( getDefaultHiveFileWriterFactories(hiveConfig, hdfsEnvironment), hdfsEnvironment, PAGE_SORTER, metastoreClient, new GroupByHashPageIndexerFactory(JOIN_COMPILER, BLOCK_TYPE_OPERATORS), - TYPE_MANAGER, + TESTING_TYPE_MANAGER, getHiveConfig(), locationService, partitionUpdateCodec, @@ -892,7 +892,7 @@ public Optional getMaterializedView(Connect getHiveSessionProperties(hiveConfig), new HiveWriterStats()); pageSourceProvider = new HivePageSourceProvider( - TYPE_MANAGER, + TESTING_TYPE_MANAGER, hdfsEnvironment, hiveConfig, getDefaultHivePageSourceFactories(hdfsEnvironment, hiveConfig), @@ -901,7 +901,7 @@ public Optional getMaterializedView(Connect Optional.empty()); nodePartitioningProvider = new HiveNodePartitioningProvider( new TestingNodeManager("fake-environment"), - TYPE_MANAGER); + TESTING_TYPE_MANAGER); } protected HdfsConfiguration createTestHdfsConfiguration() diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileFormats.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileFormats.java index f713b6ea8c17..b945cc125911 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileFormats.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileFormats.java @@ -91,7 +91,6 @@ import static io.trino.plugin.hive.HiveColumnProjectionInfo.generatePartialName; import static io.trino.plugin.hive.HivePartitionKey.HIVE_DEFAULT_DYNAMIC_PARTITION; import static io.trino.plugin.hive.HiveTestUtils.SESSION; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.isDistinctFrom; import static io.trino.plugin.hive.HiveTestUtils.mapType; import static io.trino.plugin.hive.acid.AcidTransaction.NO_ACID_TRANSACTION; @@ -118,6 +117,7 @@ import static io.trino.testing.StructuralTestUtil.mapBlockOf; import static io.trino.testing.StructuralTestUtil.rowBlockOf; import static io.trino.type.DateTimes.MICROSECONDS_PER_MILLISECOND; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Float.intBitsToFloat; import static java.lang.Math.floorDiv; import static java.nio.charset.StandardCharsets.UTF_8; @@ -504,7 +504,7 @@ protected List getColumnHandles(List testColumns) if (testColumn.getDereferenceNames().size() == 0) { HiveType hiveType = HiveType.valueOf(testColumn.getObjectInspector().getTypeName()); - columns.add(createBaseColumn(testColumn.getName(), columnIndex, hiveType, hiveType.getType(TYPE_MANAGER), testColumn.isPartitionKey() ? PARTITION_KEY : REGULAR, Optional.empty())); + columns.add(createBaseColumn(testColumn.getName(), columnIndex, hiveType, hiveType.getType(TESTING_TYPE_MANAGER), testColumn.isPartitionKey() ? PARTITION_KEY : REGULAR, Optional.empty())); } else { HiveType baseHiveType = HiveType.valueOf(testColumn.getBaseObjectInspector().getTypeName()); @@ -513,12 +513,12 @@ protected List getColumnHandles(List testColumns) testColumn.getBaseName(), columnIndex, baseHiveType, - baseHiveType.getType(TYPE_MANAGER), + baseHiveType.getType(TESTING_TYPE_MANAGER), Optional.of(new HiveColumnProjectionInfo( testColumn.getDereferenceIndices(), testColumn.getDereferenceNames(), partialHiveType, - partialHiveType.getType(TYPE_MANAGER))), + partialHiveType.getType(TESTING_TYPE_MANAGER))), testColumn.isPartitionKey() ? PARTITION_KEY : REGULAR, Optional.empty()); columns.add(hiveColumnHandle); @@ -544,7 +544,7 @@ public static FileSplit createTestFileTrino( List types = testColumns.stream() .map(TestColumn::getType) .map(HiveType::valueOf) - .map(type -> type.getType(TYPE_MANAGER)) + .map(type -> type.getType(TESTING_TYPE_MANAGER)) .collect(toList()); PageBuilder pageBuilder = new PageBuilder(types); @@ -738,7 +738,7 @@ protected void checkCursor(RecordCursor cursor, List testColumns, in { List types = testColumns.stream() .map(column -> column.getObjectInspector().getTypeName()) - .map(type -> HiveType.valueOf(type).getType(TYPE_MANAGER)) + .map(type -> HiveType.valueOf(type).getType(TESTING_TYPE_MANAGER)) .collect(toImmutableList()); Map distinctFromOperators = types.stream().distinct() diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileSystem.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileSystem.java index 3e498cf9416b..f9b9f801215c 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileSystem.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/AbstractTestHiveFileSystem.java @@ -97,7 +97,6 @@ import static io.trino.plugin.hive.AbstractTestHive.getSplits; import static io.trino.plugin.hive.HiveTableRedirectionsProvider.NO_REDIRECTIONS; import static io.trino.plugin.hive.HiveTestUtils.PAGE_SORTER; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHiveFileWriterFactories; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHivePageSourceFactories; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHiveRecordCursorProviders; @@ -110,6 +109,7 @@ import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.testing.MaterializedResult.materializeSourceDataStream; import static io.trino.testing.QueryAssertions.assertEqualsIgnoreOrder; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.util.Locale.ENGLISH; import static java.util.UUID.randomUUID; import static java.util.concurrent.Executors.newCachedThreadPool; @@ -209,7 +209,7 @@ protected void setup(String host, int port, String databaseName, boolean s3Selec hivePartitionManager, newDirectExecutorService(), heartbeatService, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, NOOP_METADATA_PROVIDER, locationService, partitionUpdateCodec, @@ -238,7 +238,7 @@ protected void setup(String host, int port, String databaseName, boolean s3Selec config.getSplitLoaderConcurrency(), config.getMaxSplitsPerSecond(), config.getRecursiveDirWalkerEnabled(), - TYPE_MANAGER); + TESTING_TYPE_MANAGER); TypeOperators typeOperators = new TypeOperators(); BlockTypeOperators blockTypeOperators = new BlockTypeOperators(typeOperators); pageSinkProvider = new HivePageSinkProvider( @@ -247,7 +247,7 @@ protected void setup(String host, int port, String databaseName, boolean s3Selec PAGE_SORTER, metastoreClient, new GroupByHashPageIndexerFactory(new JoinCompiler(typeOperators), blockTypeOperators), - TYPE_MANAGER, + TESTING_TYPE_MANAGER, config, locationService, partitionUpdateCodec, @@ -256,7 +256,7 @@ protected void setup(String host, int port, String databaseName, boolean s3Selec getHiveSessionProperties(config), new HiveWriterStats()); pageSourceProvider = new HivePageSourceProvider( - TYPE_MANAGER, + TESTING_TYPE_MANAGER, hdfsEnvironment, config, getDefaultHivePageSourceFactories(hdfsEnvironment, config), diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/HiveTestUtils.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/HiveTestUtils.java index d92fa3406900..ad8553f7fe9e 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/HiveTestUtils.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/HiveTestUtils.java @@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableSet; import io.airlift.slice.Slice; import io.airlift.units.DataSize; -import io.trino.metadata.Metadata; import io.trino.operator.PagesIndex; import io.trino.operator.PagesIndexPageSorter; import io.trino.plugin.hive.authentication.NoHdfsAuthentication; @@ -48,11 +47,8 @@ import io.trino.spi.type.RowType; import io.trino.spi.type.StandardTypes; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; import io.trino.spi.type.TypeSignatureParameter; import io.trino.testing.TestingConnectorSession; -import io.trino.type.InternalTypeManager; import org.apache.hadoop.hive.common.type.Timestamp; import java.lang.invoke.MethodHandle; @@ -64,11 +60,11 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static io.airlift.units.DataSize.Unit.MEGABYTE; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.function.InvocationConvention.InvocationArgumentConvention.NULL_FLAG; import static io.trino.spi.function.InvocationConvention.InvocationReturnConvention.FAIL_ON_NULL; import static io.trino.spi.function.InvocationConvention.simpleConvention; import static io.trino.spi.type.Decimals.encodeScaledValue; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; public final class HiveTestUtils { @@ -76,9 +72,6 @@ private HiveTestUtils() {} public static final ConnectorSession SESSION = getHiveSession(new HiveConfig()); - private static final Metadata METADATA = createTestMetadataManager(); - public static final TypeManager TYPE_MANAGER = new InternalTypeManager(METADATA, new TypeOperators()); - public static final HdfsEnvironment HDFS_ENVIRONMENT = createTestHdfsEnvironment(); public static final PageSorter PAGE_SORTER = new PagesIndexPageSorter(new PagesIndex.TestingFactory(false)); @@ -136,7 +129,7 @@ public static Set getDefaultHivePageSourceFactories(HdfsE { FileFormatDataSourceStats stats = new FileFormatDataSourceStats(); return ImmutableSet.builder() - .add(new RcFilePageSourceFactory(TYPE_MANAGER, hdfsEnvironment, stats, hiveConfig)) + .add(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, hdfsEnvironment, stats, hiveConfig)) .add(new OrcPageSourceFactory(new OrcReaderConfig(), hdfsEnvironment, stats, hiveConfig)) .add(new ParquetPageSourceFactory(hdfsEnvironment, stats, new ParquetReaderConfig(), hiveConfig)) .build(); @@ -152,7 +145,7 @@ public static Set getDefaultHiveRecordCursorProviders( public static Set getDefaultHiveFileWriterFactories(HiveConfig hiveConfig, HdfsEnvironment hdfsEnvironment) { return ImmutableSet.builder() - .add(new RcFileFileWriterFactory(hdfsEnvironment, TYPE_MANAGER, new NodeVersion("test_version"), hiveConfig, new FileFormatDataSourceStats())) + .add(new RcFileFileWriterFactory(hdfsEnvironment, TESTING_TYPE_MANAGER, new NodeVersion("test_version"), hiveConfig, new FileFormatDataSourceStats())) .add(getDefaultOrcFileWriterFactory(hdfsEnvironment)) .build(); } @@ -161,7 +154,7 @@ private static OrcFileWriterFactory getDefaultOrcFileWriterFactory(HdfsEnvironme { return new OrcFileWriterFactory( hdfsEnvironment, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, new NodeVersion("test_version"), new FileFormatDataSourceStats(), new OrcWriterConfig()); @@ -196,21 +189,21 @@ private static HdfsEnvironment createTestHdfsEnvironment() public static MapType mapType(Type keyType, Type valueType) { - return (MapType) METADATA.getParameterizedType(StandardTypes.MAP, ImmutableList.of( + return (MapType) TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(keyType.getTypeSignature()), TypeSignatureParameter.typeParameter(valueType.getTypeSignature()))); } public static ArrayType arrayType(Type elementType) { - return (ArrayType) METADATA.getParameterizedType( + return (ArrayType) TESTING_TYPE_MANAGER.getParameterizedType( StandardTypes.ARRAY, ImmutableList.of(TypeSignatureParameter.typeParameter(elementType.getTypeSignature()))); } public static RowType rowType(List elementTypeSignatures) { - return (RowType) METADATA.getParameterizedType( + return (RowType) TESTING_TYPE_MANAGER.getParameterizedType( StandardTypes.ROW, ImmutableList.copyOf(elementTypeSignatures.stream() .map(TypeSignatureParameter::namedTypeParameter) @@ -229,7 +222,7 @@ public static Slice longDecimal(String value) public static MethodHandle distinctFromOperator(Type type) { - return TYPE_MANAGER.getTypeOperators().getDistinctFromOperator(type, simpleConvention(FAIL_ON_NULL, NULL_FLAG, NULL_FLAG)); + return TESTING_TYPE_MANAGER.getTypeOperators().getDistinctFromOperator(type, simpleConvention(FAIL_ON_NULL, NULL_FLAG, NULL_FLAG)); } public static boolean isDistinctFrom(MethodHandle handle, Block left, Block right) diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestBackgroundHiveSplitLoader.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestBackgroundHiveSplitLoader.java index dad7aa3bdd1a..0723df324733 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestBackgroundHiveSplitLoader.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestBackgroundHiveSplitLoader.java @@ -109,7 +109,6 @@ import static io.trino.plugin.hive.HiveStorageFormat.CSV; import static io.trino.plugin.hive.HiveTestUtils.HDFS_ENVIRONMENT; import static io.trino.plugin.hive.HiveTestUtils.SESSION; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.getHiveSession; import static io.trino.plugin.hive.HiveTimestampPrecision.DEFAULT_PRECISION; import static io.trino.plugin.hive.HiveType.HIVE_INT; @@ -122,6 +121,7 @@ import static io.trino.spi.type.IntegerType.INTEGER; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.concurrent.Executors.newCachedThreadPool; @@ -332,7 +332,7 @@ public void testPathFilterBucketedPartitionedTable() PARTITIONED_TABLE, Optional.of( new HiveBucketHandle( - getRegularColumnHandles(PARTITIONED_TABLE, TYPE_MANAGER, DEFAULT_PRECISION), + getRegularColumnHandles(PARTITIONED_TABLE, TESTING_TYPE_MANAGER, DEFAULT_PRECISION), BUCKETING_V1, BUCKET_COUNT, BUCKET_COUNT, @@ -541,7 +541,7 @@ public HivePartitionMetadata next() TupleDomain.all(), DynamicFilter.EMPTY, new Duration(0, SECONDS), - TYPE_MANAGER, + TESTING_TYPE_MANAGER, createBucketSplitInfo(Optional.empty(), Optional.empty()), SESSION, new TestingHdfsEnvironment(TEST_FILES), @@ -1074,7 +1074,7 @@ private BackgroundHiveSplitLoader backgroundHiveSplitLoader( compactEffectivePredicate, dynamicFilter, dynamicFilteringProbeBlockingTimeout, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, createBucketSplitInfo(bucketHandle, hiveBucketFilter), SESSION, hdfsEnvironment, @@ -1107,7 +1107,7 @@ private BackgroundHiveSplitLoader backgroundHiveSplitLoader(List codec = new JsonCodecFactory(objectMapperProvider).jsonCodec(HiveColumnHandle.class); String json = codec.toJson(expected); diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveConnectorTest.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveConnectorTest.java index 6db1a340b8a2..e1f174365f2e 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveConnectorTest.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveConnectorTest.java @@ -118,7 +118,6 @@ import static io.trino.plugin.hive.HiveTableProperties.BUCKET_COUNT_PROPERTY; import static io.trino.plugin.hive.HiveTableProperties.PARTITIONED_BY_PROPERTY; import static io.trino.plugin.hive.HiveTableProperties.STORAGE_FORMAT_PROPERTY; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveType.toHiveType; import static io.trino.plugin.hive.util.HiveUtil.columnExtraInfo; import static io.trino.spi.security.Identity.ofUser; @@ -151,6 +150,7 @@ import static io.trino.testing.assertions.Assert.assertEquals; import static io.trino.testing.sql.TestTable.randomTableSuffix; import static io.trino.transaction.TransactionBuilder.transaction; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.lang.String.join; import static java.nio.charset.StandardCharsets.UTF_8; @@ -8319,7 +8319,7 @@ private void assertOneNotNullResult(Session session, @Language("SQL") String que private Type canonicalizeType(Type type) { - return TYPE_MANAGER.getType(toHiveType(type).getTypeSignature()); + return TESTING_TYPE_MANAGER.getType(toHiveType(type).getTypeSignature()); } private void assertColumnType(TableMetadata tableMetadata, String columnName, Type expectedType) @@ -8421,7 +8421,7 @@ private List getAllTestingHiveStorageFormat() private JsonCodec getIoPlanCodec() { ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); - objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(getQueryRunner().getMetadata()))); + objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(getQueryRunner().getTypeManager()))); return new JsonCodecFactory(objectMapperProvider).jsonCodec(IoPlan.class); } diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveFileFormats.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveFileFormats.java index ea11b3e73495..e708f2c9334b 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveFileFormats.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveFileFormats.java @@ -81,13 +81,13 @@ import static io.trino.plugin.hive.HiveStorageFormat.TEXTFILE; import static io.trino.plugin.hive.HiveTestUtils.HDFS_ENVIRONMENT; import static io.trino.plugin.hive.HiveTestUtils.SESSION; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.createGenericHiveRecordCursorProvider; import static io.trino.plugin.hive.HiveTestUtils.getHiveSession; import static io.trino.plugin.hive.HiveTestUtils.getTypes; import static io.trino.plugin.hive.acid.AcidTransaction.NO_ACID_TRANSACTION; import static io.trino.testing.StructuralTestUtil.rowBlockOf; import static io.trino.testing.assertions.TrinoExceptionAssert.assertTrinoExceptionThrownBy; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toList; @@ -226,7 +226,7 @@ public void testRcTextPageSource(int rowCount, long fileSizePadding) .withColumns(TEST_COLUMNS) .withRowsCount(rowCount) .withFileSizePadding(fileSizePadding) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); } @Test(dataProvider = "rowCount") @@ -241,9 +241,9 @@ public void testRcTextOptimizedWriter(int rowCount) assertThatFileFormat(RCTEXT) .withColumns(testColumns) .withRowsCount(rowCount) - .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) + .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TESTING_TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) .isReadableByRecordCursor(createGenericHiveRecordCursorProvider(HDFS_ENVIRONMENT)) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); } @Test(dataProvider = "rowCount") @@ -260,7 +260,7 @@ public void testRcBinaryPageSource(int rowCount) assertThatFileFormat(RCBINARY) .withColumns(testColumns) .withRowsCount(rowCount) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); } @Test(dataProvider = "rowCount") @@ -282,8 +282,8 @@ public void testRcBinaryOptimizedWriter(int rowCount) assertThatFileFormat(RCBINARY) .withColumns(testColumns) .withRowsCount(rowCount) - .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())) + .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TESTING_TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())) .withColumns(testColumnsNoTimestamps) .isReadableByRecordCursor(createGenericHiveRecordCursorProvider(HDFS_ENVIRONMENT)); } @@ -324,7 +324,7 @@ public void testOrcOptimizedWriter(int rowCount, long fileSizePadding) .withRowsCount(rowCount) .withSession(session) .withFileSizePadding(fileSizePadding) - .withFileWriterFactory(new OrcFileWriterFactory(HDFS_ENVIRONMENT, TYPE_MANAGER, new NodeVersion("test"), STATS, new OrcWriterOptions())) + .withFileWriterFactory(new OrcFileWriterFactory(HDFS_ENVIRONMENT, TESTING_TYPE_MANAGER, new NodeVersion("test"), STATS, new OrcWriterOptions())) .isReadableByRecordCursor(createGenericHiveRecordCursorProvider(HDFS_ENVIRONMENT)) .isReadableByPageSource(new OrcPageSourceFactory(new OrcReaderOptions(), HDFS_ENVIRONMENT, STATS, UTC)); } @@ -445,7 +445,7 @@ public void testOptimizedParquetWriter(int rowCount) .withSession(session) .withColumns(testColumns) .withRowsCount(rowCount) - .withFileWriterFactory(new ParquetFileWriterFactory(HDFS_ENVIRONMENT, new NodeVersion("test-version"), TYPE_MANAGER)) + .withFileWriterFactory(new ParquetFileWriterFactory(HDFS_ENVIRONMENT, new NodeVersion("test-version"), TESTING_TYPE_MANAGER)) .isReadableByPageSource(new ParquetPageSourceFactory(HDFS_ENVIRONMENT, STATS, new ParquetReaderConfig(), new HiveConfig())); } @@ -508,13 +508,13 @@ public void testTruncateVarcharColumn() assertThatFileFormat(RCTEXT) .withWriteColumns(ImmutableList.of(writeColumn)) .withReadColumns(ImmutableList.of(readColumn)) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())) + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())) .isReadableByRecordCursor(createGenericHiveRecordCursorProvider(HDFS_ENVIRONMENT)); assertThatFileFormat(RCBINARY) .withWriteColumns(ImmutableList.of(writeColumn)) .withReadColumns(ImmutableList.of(readColumn)) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())) + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())) .isReadableByRecordCursor(createGenericHiveRecordCursorProvider(HDFS_ENVIRONMENT)); assertThatFileFormat(ORC) @@ -732,7 +732,7 @@ public void testRCTextProjectedColumnsPageSource(int rowCount) .withWriteColumns(writeColumns) .withReadColumns(readColumns) .withRowsCount(rowCount) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); } @Test(dataProvider = "rowCount") @@ -762,8 +762,8 @@ public void testRCBinaryProjectedColumns(int rowCount) .withWriteColumns(writeColumns) .withReadColumns(readColumns) .withRowsCount(rowCount) - .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); + .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TESTING_TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); } @Test(dataProvider = "rowCount") @@ -790,8 +790,8 @@ public void testRCBinaryProjectedColumnsPageSource(int rowCount) .withWriteColumns(writeColumns) .withReadColumns(readColumns) .withRowsCount(rowCount) - .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) - .isReadableByPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); + .withFileWriterFactory(new RcFileFileWriterFactory(HDFS_ENVIRONMENT, TESTING_TYPE_MANAGER, new NodeVersion("test"), HIVE_STORAGE_TIME_ZONE, STATS)) + .isReadableByPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig())); } @Test @@ -808,12 +808,12 @@ public void testFailForLongVarcharPartitionColumn() assertThatFileFormat(RCTEXT) .withColumns(columns) - .isFailingForPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig()), expectedErrorCode, expectedMessage) + .isFailingForPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig()), expectedErrorCode, expectedMessage) .isFailingForRecordCursor(createGenericHiveRecordCursorProvider(HDFS_ENVIRONMENT), expectedErrorCode, expectedMessage); assertThatFileFormat(RCBINARY) .withColumns(columns) - .isFailingForPageSource(new RcFilePageSourceFactory(TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig()), expectedErrorCode, expectedMessage) + .isFailingForPageSource(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, STATS, new HiveConfig()), expectedErrorCode, expectedMessage) .isFailingForRecordCursor(createGenericHiveRecordCursorProvider(HDFS_ENVIRONMENT), expectedErrorCode, expectedMessage); assertThatFileFormat(ORC) @@ -949,7 +949,7 @@ private ConnectorPageSource createPageSourceFromCursorProvider( splitProperties, TupleDomain.all(), columnHandles, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, Optional.empty(), Optional.empty(), false, @@ -1027,7 +1027,7 @@ private void testPageSourceFactory( splitProperties, TupleDomain.all(), columnHandles, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, Optional.empty(), Optional.empty(), false, @@ -1111,7 +1111,7 @@ private void generateProjectedColumns(List childColumns, ImmutableLi ImmutableList.of(childColumn.getObjectInspector())); HiveType hiveType = (HiveType.valueOf(childColumn.getObjectInspector().getTypeName())); - Type trinoType = hiveType.getType(TYPE_MANAGER); + Type trinoType = hiveType.getType(TESTING_TYPE_MANAGER); List list = new ArrayList<>(); list.add(childColumn.getWriteValue()); diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHivePageSink.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHivePageSink.java index 588b93042811..ef9f4d94aa30 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHivePageSink.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHivePageSink.java @@ -66,7 +66,6 @@ import static io.trino.plugin.hive.HiveCompressionCodec.NONE; import static io.trino.plugin.hive.HiveTestUtils.HDFS_ENVIRONMENT; import static io.trino.plugin.hive.HiveTestUtils.PAGE_SORTER; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHiveFileWriterFactories; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHivePageSourceFactories; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHiveRecordCursorProviders; @@ -86,6 +85,7 @@ import static io.trino.spi.type.IntegerType.INTEGER; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; import static io.trino.testing.assertions.Assert.assertEquals; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Math.round; import static java.lang.String.format; import static java.util.stream.Collectors.toList; @@ -146,7 +146,7 @@ private static long writeTestFile(HiveConfig config, HiveMetastore metastore, St List columnTypes = columns.stream() .map(LineItemColumn::getType) .map(TestHivePageSink::getHiveType) - .map(hiveType -> hiveType.getType(TYPE_MANAGER)) + .map(hiveType -> hiveType.getType(TESTING_TYPE_MANAGER)) .collect(toList()); PageBuilder pageBuilder = new PageBuilder(columnTypes); @@ -247,7 +247,7 @@ private static ConnectorPageSource createPageSource(HiveTransactionHandle transa SplitWeight.standard()); ConnectorTableHandle table = new HiveTableHandle(SCHEMA_NAME, TABLE_NAME, ImmutableMap.of(), ImmutableList.of(), ImmutableList.of(), Optional.empty()); HivePageSourceProvider provider = new HivePageSourceProvider( - TYPE_MANAGER, + TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, config, getDefaultHivePageSourceFactories(HDFS_ENVIRONMENT, config), @@ -285,7 +285,7 @@ private static ConnectorPageSink createPageSink(HiveTransactionHandle transactio PAGE_SORTER, metastore, new GroupByHashPageIndexerFactory(new JoinCompiler(typeOperators), blockTypeOperators), - TYPE_MANAGER, + TESTING_TYPE_MANAGER, config, new HiveLocationService(HDFS_ENVIRONMENT), partitionUpdateCodec, @@ -303,7 +303,7 @@ private static List getColumnHandles() for (int i = 0; i < columns.size(); i++) { LineItemColumn column = columns.get(i); HiveType hiveType = getHiveType(column.getType()); - handles.add(createBaseColumn(column.getColumnName(), i, hiveType, hiveType.getType(TYPE_MANAGER), REGULAR, Optional.empty())); + handles.add(createBaseColumn(column.getColumnName(), i, hiveType, hiveType.getType(TESTING_TYPE_MANAGER), REGULAR, Optional.empty())); } return handles.build(); } diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveReaderProjectionsUtil.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveReaderProjectionsUtil.java index bb6f74a7b8e6..05f61dc1a062 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveReaderProjectionsUtil.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestHiveReaderProjectionsUtil.java @@ -19,21 +19,18 @@ import io.trino.spi.type.RowFieldName; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import java.util.List; import java.util.Map; import java.util.Optional; import static com.google.common.base.Preconditions.checkArgument; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.hive.HiveColumnHandle.ColumnType.REGULAR; import static io.trino.plugin.hive.HiveColumnHandle.createBaseColumn; import static io.trino.plugin.hive.HiveTestUtils.rowType; import static io.trino.plugin.hive.HiveType.toHiveType; import static io.trino.spi.type.BigintType.BIGINT; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; public class TestHiveReaderProjectionsUtil { @@ -47,8 +44,6 @@ private TestHiveReaderProjectionsUtil() {} new NamedTypeSignature(Optional.of(new RowFieldName("f_row_0")), ROWTYPE_OF_PRIMITIVES.getTypeSignature()), new NamedTypeSignature(Optional.of(new RowFieldName("f_bigint_0")), BIGINT.getTypeSignature()))); - public static final TypeManager TYPE_MANAGER = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - public static Map createTestFullColumns(List names, Map types) { checkArgument(names.size() == types.size()); @@ -77,7 +72,7 @@ public static HiveColumnHandle createProjectedColumnHandle(HiveColumnHandle colu List names = baseHiveType.getHiveDereferenceNames(indices); HiveType hiveType = baseHiveType.getHiveTypeForDereferences(indices).get(); - HiveColumnProjectionInfo columnProjection = new HiveColumnProjectionInfo(indices, names, hiveType, hiveType.getType(TYPE_MANAGER)); + HiveColumnProjectionInfo columnProjection = new HiveColumnProjectionInfo(indices, names, hiveType, hiveType.getType(TESTING_TYPE_MANAGER)); return new HiveColumnHandle( column.getBaseColumnName(), diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestNodeLocalDynamicSplitPruning.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestNodeLocalDynamicSplitPruning.java index 4f2d350fa528..3a2b7820e66c 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestNodeLocalDynamicSplitPruning.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestNodeLocalDynamicSplitPruning.java @@ -46,12 +46,12 @@ import static io.trino.plugin.hive.HiveColumnHandle.ColumnType.PARTITION_KEY; import static io.trino.plugin.hive.HiveColumnHandle.ColumnType.REGULAR; import static io.trino.plugin.hive.HiveTestUtils.HDFS_ENVIRONMENT; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHivePageSourceFactories; import static io.trino.plugin.hive.HiveTestUtils.getDefaultHiveRecordCursorProviders; import static io.trino.plugin.hive.HiveType.HIVE_INT; import static io.trino.plugin.hive.util.HiveBucketing.BucketingVersion.BUCKETING_V1; import static io.trino.spi.type.IntegerType.INTEGER; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.util.concurrent.CompletableFuture.completedFuture; import static org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.FILE_INPUT_FORMAT; import static org.apache.hadoop.hive.serde.serdeConstants.SERIALIZATION_LIB; @@ -68,7 +68,7 @@ public class TestNodeLocalDynamicSplitPruning BUCKET_COLUMN.getName(), 0, BUCKET_COLUMN.getType(), - BUCKET_COLUMN.getType().getType(TYPE_MANAGER), + BUCKET_COLUMN.getType().getType(TESTING_TYPE_MANAGER), Optional.empty(), REGULAR, Optional.empty()); @@ -76,7 +76,7 @@ public class TestNodeLocalDynamicSplitPruning PARTITION_COLUMN.getName(), 0, PARTITION_COLUMN.getType(), - PARTITION_COLUMN.getType().getType(TYPE_MANAGER), + PARTITION_COLUMN.getType().getType(TESTING_TYPE_MANAGER), Optional.empty(), PARTITION_KEY, Optional.empty()); @@ -157,7 +157,7 @@ private static ConnectorPageSource createTestingPageSource(HiveTransactionHandle Optional.empty()); HivePageSourceProvider provider = new HivePageSourceProvider( - TYPE_MANAGER, + TESTING_TYPE_MANAGER, HDFS_ENVIRONMENT, hiveConfig, getDefaultHivePageSourceFactories(HDFS_ENVIRONMENT, hiveConfig), diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestOrcPageSourceMemoryTracking.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestOrcPageSourceMemoryTracking.java index 9092d93a8098..ae7e40536516 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestOrcPageSourceMemoryTracking.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/TestOrcPageSourceMemoryTracking.java @@ -105,13 +105,13 @@ import static io.trino.plugin.hive.HivePageSourceProvider.ColumnMapping.buildColumnMappings; import static io.trino.plugin.hive.HiveTestUtils.HDFS_ENVIRONMENT; import static io.trino.plugin.hive.HiveTestUtils.SESSION; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.acid.AcidTransaction.NO_ACID_TRANSACTION; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; import static io.trino.sql.relational.Expressions.field; import static io.trino.testing.TestingHandles.TEST_TABLE_HANDLE; import static io.trino.testing.TestingSession.testSessionBuilder; import static io.trino.testing.TestingTaskContext.createTaskContext; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.util.Objects.requireNonNull; import static java.util.concurrent.Executors.newCachedThreadPool; @@ -528,7 +528,7 @@ public TestPreparer(String tempFilePath, List testColumns, int numRo ObjectInspector inspector = testColumn.getObjectInspector(); HiveType hiveType = HiveType.valueOf(inspector.getTypeName()); - Type type = hiveType.getType(TYPE_MANAGER); + Type type = hiveType.getType(TESTING_TYPE_MANAGER); columnsBuilder.add(createBaseColumn(testColumn.getName(), columnIndex, hiveType, type, testColumn.isPartitionKey() ? PARTITION_KEY : REGULAR, Optional.empty())); typesBuilder.add(type); @@ -577,7 +577,7 @@ public ConnectorPageSource newPageSource(FileFormatDataSourceStats stats, Connec schema, TupleDomain.all(), columns, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, Optional.empty(), Optional.empty(), false, diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/AbstractFileFormat.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/AbstractFileFormat.java index 1b51d4b22669..1f3731169ed8 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/AbstractFileFormat.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/AbstractFileFormat.java @@ -56,9 +56,9 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static io.trino.plugin.hive.HiveColumnHandle.ColumnType.REGULAR; import static io.trino.plugin.hive.HiveColumnHandle.createBaseColumn; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveType.toHiveType; import static io.trino.plugin.hive.acid.AcidTransaction.NO_ACID_TRANSACTION; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.join; import static java.util.stream.Collectors.joining; import static org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.FILE_INPUT_FORMAT; @@ -124,7 +124,7 @@ public ConnectorPageSource createGenericReader( List schemaColumnTypes) { HivePageSourceProvider factory = new HivePageSourceProvider( - TYPE_MANAGER, + TESTING_TYPE_MANAGER, hdfsEnvironment, new HiveConfig(), getHivePageSourceFactory(hdfsEnvironment).map(ImmutableSet::of).orElse(ImmutableSet.of()), @@ -193,7 +193,7 @@ static ConnectorPageSource createPageSource( createSchema(format, columnNames, columnTypes), readColumns, TupleDomain.all(), - TYPE_MANAGER, + TESTING_TYPE_MANAGER, false); checkState(recordCursorWithProjections.isPresent(), "readerPageSourceWithProjections is not present"); diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java index e5e6100120c0..66817fae6af9 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/BenchmarkProjectionPushdownHive.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import io.trino.hadoop.HadoopNative; -import io.trino.metadata.Metadata; import io.trino.plugin.hive.HiveColumnHandle; import io.trino.plugin.hive.HiveCompressionCodec; import io.trino.plugin.hive.HiveType; @@ -57,13 +56,13 @@ import static com.google.common.io.MoreFiles.deleteRecursively; import static com.google.common.io.RecursiveDeleteOption.ALLOW_INSECURE; import static io.trino.jmh.Benchmarks.benchmark; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.hive.HiveTestUtils.HDFS_ENVIRONMENT; import static io.trino.plugin.hive.HiveTestUtils.SESSION; import static io.trino.plugin.hive.HiveType.toHiveType; import static io.trino.plugin.hive.TestHiveReaderProjectionsUtil.createProjectedColumnHandle; import static io.trino.plugin.hive.benchmark.BenchmarkFileFormat.TRINO_ORC; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.nio.file.Files.createTempDirectory; @@ -141,8 +140,7 @@ public void setup() throws IOException { fileFormat = benchmarkFileFormat.getFormat(); - Metadata metadata = createTestMetadataManager(); - Type columnType = metadata.fromSqlType(columnTypeString); + Type columnType = TESTING_TYPE_MANAGER.fromSqlType(columnTypeString); checkState(columnType instanceof RowType, "expected column to have RowType"); if (STRUCT.equals(writeStrategy)) { diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/StandardFileFormats.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/StandardFileFormats.java index 951ad8326895..e06ae51f0a78 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/StandardFileFormats.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/benchmark/StandardFileFormats.java @@ -55,11 +55,11 @@ import java.util.Optional; import static io.trino.orc.OrcWriteValidation.OrcWriteValidationMode.BOTH; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.createGenericHiveRecordCursorProvider; import static io.trino.plugin.hive.benchmark.AbstractFileFormat.createSchema; import static io.trino.plugin.hive.metastore.StorageFormat.fromHiveStorageFormat; import static io.trino.plugin.hive.util.CompressionConfigUtil.configureCompression; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.joda.time.DateTimeZone.UTC; public final class StandardFileFormats @@ -77,7 +77,7 @@ public HiveStorageFormat getFormat() @Override public Optional getHivePageSourceFactory(HdfsEnvironment hdfsEnvironment) { - return Optional.of(new RcFilePageSourceFactory(TYPE_MANAGER, hdfsEnvironment, new FileFormatDataSourceStats(), new HiveConfig().setRcfileTimeZone("UTC"))); + return Optional.of(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, hdfsEnvironment, new FileFormatDataSourceStats(), new HiveConfig().setRcfileTimeZone("UTC"))); } @Override @@ -108,7 +108,7 @@ public HiveStorageFormat getFormat() @Override public Optional getHivePageSourceFactory(HdfsEnvironment hdfsEnvironment) { - return Optional.of(new RcFilePageSourceFactory(TYPE_MANAGER, hdfsEnvironment, new FileFormatDataSourceStats(), new HiveConfig().setRcfileTimeZone("UTC"))); + return Optional.of(new RcFilePageSourceFactory(TESTING_TYPE_MANAGER, hdfsEnvironment, new FileFormatDataSourceStats(), new HiveConfig().setRcfileTimeZone("UTC"))); } @Override @@ -416,7 +416,7 @@ public RecordFormatWriter( createSchema(format, columnNames, columnTypes), format.getEstimatedWriterSystemMemoryUsage(), config, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, UTC, session); } diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/optimizer/TestConnectorPushdownRulesWithHive.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/optimizer/TestConnectorPushdownRulesWithHive.java index 53dfef52c098..603534c14ca3 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/optimizer/TestConnectorPushdownRulesWithHive.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/optimizer/TestConnectorPushdownRulesWithHive.java @@ -44,7 +44,6 @@ import io.trino.spi.security.PrincipalType; import io.trino.spi.type.RowType; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.iterative.rule.PruneTableScanColumns; import io.trino.sql.planner.iterative.rule.PushPredicateIntoTableScan; @@ -137,9 +136,9 @@ public void testProjectionPushdown() { String tableName = "projection_test"; PushProjectionIntoTableScan pushProjectionIntoTableScan = new PushProjectionIntoTableScan( - tester().getMetadata(), + tester().getPlannerContext(), tester().getTypeAnalyzer(), - new ScalarStatsCalculator(tester().getMetadata(), tester().getTypeAnalyzer())); + new ScalarStatsCalculator(tester().getPlannerContext(), tester().getTypeAnalyzer())); tester().getQueryRunner().execute(format( "CREATE TABLE %s (struct_of_int) AS " + @@ -224,7 +223,7 @@ public void testPredicatePushdown() String tableName = "predicate_test"; tester().getQueryRunner().execute(format("CREATE TABLE %s (a, b) AS SELECT 5, 6", tableName)); - PushPredicateIntoTableScan pushPredicateIntoTableScan = new PushPredicateIntoTableScan(tester().getMetadata(), new TypeOperators(), tester().getTypeAnalyzer()); + PushPredicateIntoTableScan pushPredicateIntoTableScan = new PushPredicateIntoTableScan(tester().getPlannerContext(), tester().getTypeAnalyzer()); HiveTableHandle hiveTable = new HiveTableHandle(SCHEMA_NAME, tableName, ImmutableMap.of(), ImmutableList.of(), ImmutableList.of(), Optional.empty()); TableHandle table = new TableHandle(new CatalogName(HIVE_CATALOG_NAME), hiveTable, new HiveTransactionHandle(), Optional.empty()); @@ -297,9 +296,9 @@ public void testPushdownWithDuplicateExpressions() tableName)); PushProjectionIntoTableScan pushProjectionIntoTableScan = new PushProjectionIntoTableScan( - tester().getMetadata(), + tester().getPlannerContext(), tester().getTypeAnalyzer(), - new ScalarStatsCalculator(tester().getMetadata(), tester().getTypeAnalyzer())); + new ScalarStatsCalculator(tester().getPlannerContext(), tester().getTypeAnalyzer())); HiveTableHandle hiveTable = new HiveTableHandle(SCHEMA_NAME, tableName, ImmutableMap.of(), ImmutableList.of(), ImmutableList.of(), Optional.empty()); TableHandle table = new TableHandle(new CatalogName(HIVE_CATALOG_NAME), hiveTable, new HiveTransactionHandle(), Optional.empty()); diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/orc/TestOrcPredicates.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/orc/TestOrcPredicates.java index 027750155baa..c9f08de90892 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/orc/TestOrcPredicates.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/orc/TestOrcPredicates.java @@ -51,11 +51,11 @@ import static io.trino.plugin.hive.HivePageSourceProvider.ColumnMapping.buildColumnMappings; import static io.trino.plugin.hive.HiveStorageFormat.ORC; import static io.trino.plugin.hive.HiveTestUtils.HDFS_ENVIRONMENT; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveTestUtils.getHiveSession; import static io.trino.plugin.hive.acid.AcidTransaction.NO_ACID_TRANSACTION; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.testing.StructuralTestUtil.rowBlockOf; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static java.util.stream.Collectors.toList; import static org.apache.hadoop.hive.metastore.api.hive_metastoreConstants.FILE_INPUT_FORMAT; @@ -99,7 +99,7 @@ private void testOrcPredicates(ConnectorSession session) file.delete(); try { // Write data - OrcFileWriterFactory writerFactory = new OrcFileWriterFactory(HDFS_ENVIRONMENT, TYPE_MANAGER, new NodeVersion("test"), STATS, new OrcWriterOptions()); + OrcFileWriterFactory writerFactory = new OrcFileWriterFactory(HDFS_ENVIRONMENT, TESTING_TYPE_MANAGER, new NodeVersion("test"), STATS, new OrcWriterOptions()); FileSplit split = createTestFileTrino(file.getAbsolutePath(), ORC, HiveCompressionCodec.NONE, columnsToWrite, session, NUM_ROWS, writerFactory); TupleDomain testingPredicate; @@ -229,7 +229,7 @@ private ConnectorPageSource createPageSource( splitProperties, predicate, columnHandles, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, Optional.empty(), Optional.empty(), false, diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3select/TestIonSqlQueryBuilder.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3select/TestIonSqlQueryBuilder.java index 89cd241120a2..8ba2e688d265 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3select/TestIonSqlQueryBuilder.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/s3select/TestIonSqlQueryBuilder.java @@ -23,15 +23,12 @@ import io.trino.spi.predicate.TupleDomain; import io.trino.spi.type.DecimalType; import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import io.trino.util.DateTimeUtils; import org.testng.annotations.Test; import java.util.List; import java.util.Optional; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.hive.HiveColumnHandle.ColumnType.REGULAR; import static io.trino.plugin.hive.HiveColumnHandle.createBaseColumn; import static io.trino.plugin.hive.HiveTestUtils.longDecimal; @@ -49,16 +46,15 @@ import static io.trino.spi.type.IntegerType.INTEGER; import static io.trino.spi.type.TimestampType.TIMESTAMP_MILLIS; import static io.trino.spi.type.VarcharType.VARCHAR; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; public class TestIonSqlQueryBuilder { - private final TypeManager typeManager = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - @Test public void testBuildSQL() { - IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(typeManager); + IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(TESTING_TYPE_MANAGER); List columns = ImmutableList.of( createBaseColumn("n_nationkey", 0, HIVE_INT, INTEGER, REGULAR, Optional.empty()), createBaseColumn("n_name", 1, HIVE_STRING, VARCHAR, REGULAR, Optional.empty()), @@ -75,14 +71,14 @@ public void testBuildSQL() @Test public void testEmptyColumns() { - IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(typeManager); + IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(TESTING_TYPE_MANAGER); assertEquals("SELECT ' ' FROM S3Object s", queryBuilder.buildSql(ImmutableList.of(), TupleDomain.all())); } @Test public void testDecimalColumns() { - TypeManager typeManager = this.typeManager; + TypeManager typeManager = TESTING_TYPE_MANAGER; IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(typeManager); List columns = ImmutableList.of( createBaseColumn("quantity", 0, HiveType.valueOf("decimal(20,0)"), DecimalType.createDecimalType(), REGULAR, Optional.empty()), @@ -103,7 +99,7 @@ public void testDecimalColumns() @Test public void testDateColumn() { - IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(typeManager); + IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(TESTING_TYPE_MANAGER); List columns = ImmutableList.of( createBaseColumn("t1", 0, HIVE_TIMESTAMP, TIMESTAMP_MILLIS, REGULAR, Optional.empty()), createBaseColumn("t2", 1, HIVE_DATE, DATE, REGULAR, Optional.empty())); @@ -116,7 +112,7 @@ public void testDateColumn() @Test public void testNotPushDoublePredicates() { - IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(typeManager); + IonSqlQueryBuilder queryBuilder = new IonSqlQueryBuilder(TESTING_TYPE_MANAGER); List columns = ImmutableList.of( createBaseColumn("quantity", 0, HIVE_INT, INTEGER, REGULAR, Optional.empty()), createBaseColumn("extendedprice", 1, HIVE_DOUBLE, DOUBLE, REGULAR, Optional.empty()), diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveBucketing.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveBucketing.java index 1f2be18f8f3c..13d070bf0e11 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveBucketing.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveBucketing.java @@ -55,12 +55,12 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.Lists.newArrayList; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.util.HiveBucketing.BucketingVersion.BUCKETING_V1; import static io.trino.plugin.hive.util.HiveBucketing.BucketingVersion.BUCKETING_V2; import static io.trino.plugin.hive.util.HiveBucketing.getHiveBuckets; import static io.trino.spi.type.TimestampType.createTimestampType; import static io.trino.spi.type.TypeUtils.writeNativeValue; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.Double.longBitsToDouble; import static java.lang.Float.intBitsToFloat; import static java.util.Arrays.asList; @@ -244,7 +244,7 @@ private static void assertBucketsEqual(List hiveTypeStrings, List trinoTypes = hiveTypes.stream() - .map(type -> type.getType(TYPE_MANAGER)) + .map(type -> type.getType(TESTING_TYPE_MANAGER)) .collect(toImmutableList()); ImmutableList.Builder> values = ImmutableList.builder(); @@ -317,7 +317,7 @@ private static int computeTrino(BucketingVersion bucketingVersion, List Object[] nativeContainerValues = new Object[hiveValues.size()]; for (int i = 0; i < hiveTypeStrings.size(); i++) { Object hiveValue = hiveValues.get(i); - Type type = hiveTypes.get(i).getType(TYPE_MANAGER); + Type type = hiveTypes.get(i).getType(TESTING_TYPE_MANAGER); BlockBuilder blockBuilder = type.createBlockBuilder(null, 3); // prepend 2 nulls to make sure position is respected when HiveBucketing function diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveTypeTranslator.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveTypeTranslator.java index 3f85eed9e7c0..ef1a13a8cac4 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveTypeTranslator.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestHiveTypeTranslator.java @@ -27,7 +27,6 @@ import java.util.Map; import static io.airlift.testing.Assertions.assertContains; -import static io.trino.plugin.hive.HiveTestUtils.TYPE_MANAGER; import static io.trino.plugin.hive.HiveType.toHiveType; import static io.trino.spi.StandardErrorCode.NOT_SUPPORTED; import static io.trino.spi.type.BigintType.BIGINT; @@ -44,6 +43,7 @@ import static io.trino.spi.type.VarbinaryType.VARBINARY; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.spi.type.VarcharType.createVarcharType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; @@ -62,7 +62,7 @@ public class TestHiveTypeTranslator .put(createDecimalType(5, 3), HiveType.valueOf("decimal(5,3)")) .put(VARBINARY, HiveType.HIVE_BINARY) .put(new ArrayType(TIMESTAMP_MILLIS), HiveType.valueOf("array")) - .put(TYPE_MANAGER.getType(mapType(BOOLEAN.getTypeSignature(), VARBINARY.getTypeSignature())), HiveType.valueOf("map")) + .put(TESTING_TYPE_MANAGER.getType(mapType(BOOLEAN.getTypeSignature(), VARBINARY.getTypeSignature())), HiveType.valueOf("map")) .put(RowType.from(List.of(field("col0", INTEGER), field("col1", VARBINARY))), HiveType.valueOf("struct")) .build(); diff --git a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestSerDeUtils.java b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestSerDeUtils.java index 57f1ecc0d6ae..b3a4a2aa0cc9 100644 --- a/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestSerDeUtils.java +++ b/plugin/trino-hive/src/test/java/io/trino/plugin/hive/util/TestSerDeUtils.java @@ -24,6 +24,7 @@ import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.block.BlockEncodingSerde; +import io.trino.spi.block.TestingBlockEncodingSerde; import io.trino.spi.type.ArrayType; import io.trino.spi.type.RowType; import org.apache.hadoop.hive.common.type.Date; @@ -42,7 +43,6 @@ import java.util.TreeMap; import static io.airlift.slice.Slices.utf8Slice; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.hive.HiveTestUtils.mapType; import static io.trino.plugin.hive.util.SerDeUtils.getBlockObject; import static io.trino.plugin.hive.util.SerDeUtils.serializeObject; @@ -73,7 +73,7 @@ @SuppressWarnings("PackageVisibleField") public class TestSerDeUtils { - private final BlockEncodingSerde blockEncodingSerde = createTestMetadataManager().getBlockEncodingSerde(); + private final BlockEncodingSerde blockEncodingSerde = new TestingBlockEncodingSerde(); private static class ListHolder { diff --git a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergColumnHandle.java b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergColumnHandle.java index 9311ea6ee507..01088be73cba 100644 --- a/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergColumnHandle.java +++ b/plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergColumnHandle.java @@ -26,12 +26,12 @@ import java.util.Optional; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.iceberg.ColumnIdentity.TypeCategory.ARRAY; import static io.trino.plugin.iceberg.ColumnIdentity.TypeCategory.PRIMITIVE; import static io.trino.plugin.iceberg.ColumnIdentity.TypeCategory.STRUCT; import static io.trino.plugin.iceberg.ColumnIdentity.primitiveColumnIdentity; import static io.trino.spi.type.BigintType.BIGINT; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; public class TestIcebergColumnHandle @@ -76,7 +76,7 @@ public void testRoundTrip() private void testRoundTrip(IcebergColumnHandle expected) { ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); - objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(createTestMetadataManager()))); + objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(TESTING_TYPE_MANAGER))); JsonCodec codec = new JsonCodecFactory(objectMapperProvider).jsonCodec(IcebergColumnHandle.class); String json = codec.toJson(expected); diff --git a/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/KafkaQueryRunner.java b/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/KafkaQueryRunner.java index b77fce96b783..21fcc4ec0c33 100644 --- a/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/KafkaQueryRunner.java +++ b/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/KafkaQueryRunner.java @@ -21,7 +21,6 @@ import io.airlift.log.Logger; import io.airlift.log.Logging; import io.trino.decoder.DecoderModule; -import io.trino.metadata.Metadata; import io.trino.plugin.kafka.encoder.EncoderModule; import io.trino.plugin.kafka.schema.ContentSchemaReader; import io.trino.plugin.kafka.schema.MapBasedTableDescriptionSupplier; @@ -30,6 +29,7 @@ import io.trino.plugin.kafka.util.CodecSupplier; import io.trino.plugin.tpch.TpchPlugin; import io.trino.spi.connector.SchemaTableName; +import io.trino.spi.type.TypeManager; import io.trino.testing.DistributedQueryRunner; import io.trino.testing.kafka.TestingKafka; import io.trino.tpch.TpchTable; @@ -100,7 +100,7 @@ public void preInit(DistributedQueryRunner queryRunner) { queryRunner.installPlugin(new TpchPlugin()); queryRunner.createCatalog("tpch", "tpch"); - Map tpchTopicDescriptions = createTpchTopicDescriptions(queryRunner.getCoordinator().getMetadata(), tables); + Map tpchTopicDescriptions = createTpchTopicDescriptions(queryRunner.getCoordinator().getTypeManager(), tables); List tableNames = new ArrayList<>(); tableNames.add(new SchemaTableName("read_test", "all_datatypes_json")); @@ -109,7 +109,7 @@ public void preInit(DistributedQueryRunner queryRunner) tableNames.add(new SchemaTableName("write_test", "all_datatypes_raw")); tableNames.add(new SchemaTableName("write_test", "all_datatypes_json")); - JsonCodec topicDescriptionJsonCodec = new CodecSupplier<>(KafkaTopicDescription.class, queryRunner.getMetadata()).get(); + JsonCodec topicDescriptionJsonCodec = new CodecSupplier<>(KafkaTopicDescription.class, queryRunner.getCoordinator().getTypeManager()).get(); ImmutableMap.Builder testTopicDescriptions = ImmutableMap.builder(); for (SchemaTableName tableName : tableNames) { @@ -184,10 +184,10 @@ private static String kafkaTopicName(TpchTable table) return TPCH_SCHEMA + "." + table.getTableName().toLowerCase(ENGLISH); } - private static Map createTpchTopicDescriptions(Metadata metadata, Iterable> tables) + private static Map createTpchTopicDescriptions(TypeManager typeManager, Iterable> tables) throws Exception { - JsonCodec topicDescriptionJsonCodec = new CodecSupplier<>(KafkaTopicDescription.class, metadata).get(); + JsonCodec topicDescriptionJsonCodec = new CodecSupplier<>(KafkaTopicDescription.class, typeManager).get(); ImmutableMap.Builder topicDescriptions = ImmutableMap.builder(); for (TpchTable table : tables) { diff --git a/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/util/CodecSupplier.java b/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/util/CodecSupplier.java index 4840cef6cb33..1d102ff29b11 100644 --- a/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/util/CodecSupplier.java +++ b/plugin/trino-kafka/src/test/java/io/trino/plugin/kafka/util/CodecSupplier.java @@ -17,9 +17,9 @@ import io.airlift.json.JsonCodec; import io.airlift.json.JsonCodecFactory; import io.airlift.json.ObjectMapperProvider; -import io.trino.metadata.Metadata; import io.trino.plugin.base.TypeDeserializer; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import java.util.function.Supplier; @@ -31,11 +31,11 @@ public final class CodecSupplier private final JsonCodecFactory codecFactory; private final Class clazz; - public CodecSupplier(Class clazz, Metadata metadata) + public CodecSupplier(Class clazz, TypeManager typeManager) { - requireNonNull(metadata, "metadata is null"); + requireNonNull(typeManager, "typeManager is null"); ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); - objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(metadata::getType))); + objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(typeManager::getType))); this.codecFactory = new JsonCodecFactory(objectMapperProvider); this.clazz = requireNonNull(clazz, "clazz is null"); } diff --git a/plugin/trino-ml/pom.xml b/plugin/trino-ml/pom.xml index 2743b9cd6173..e0692cf8b3ae 100644 --- a/plugin/trino-ml/pom.xml +++ b/plugin/trino-ml/pom.xml @@ -83,6 +83,12 @@ + + io.trino + trino-client + test + + io.trino trino-main diff --git a/plugin/trino-ml/src/test/java/io/trino/plugin/ml/TestLearnAggregations.java b/plugin/trino-ml/src/test/java/io/trino/plugin/ml/TestLearnAggregations.java index 3bc846b540f4..fe4bbecdddf5 100644 --- a/plugin/trino-ml/src/test/java/io/trino/plugin/ml/TestLearnAggregations.java +++ b/plugin/trino-ml/src/test/java/io/trino/plugin/ml/TestLearnAggregations.java @@ -15,9 +15,15 @@ import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; +import io.trino.FeaturesConfig; import io.trino.RowPageBuilder; +import io.trino.client.NodeVersion; +import io.trino.metadata.BlockEncodingManager; +import io.trino.metadata.DisabledSystemSecurityMetadata; +import io.trino.metadata.InternalBlockEncodingSerde; import io.trino.metadata.MetadataManager; import io.trino.metadata.TestingFunctionResolution; +import io.trino.metadata.TypeRegistry; import io.trino.operator.aggregation.Aggregator; import io.trino.operator.aggregation.TestingAggregationFunction; import io.trino.plugin.ml.type.ClassifierParametricType; @@ -27,8 +33,11 @@ import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeSignatureParameter; +import io.trino.spi.type.TypeOperators; import io.trino.sql.tree.QualifiedName; +import io.trino.transaction.TransactionManager; +import io.trino.type.BlockTypeOperators; +import io.trino.type.InternalTypeManager; import org.testng.annotations.Test; import java.util.OptionalInt; @@ -38,23 +47,40 @@ import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.TypeSignature.mapType; +import static io.trino.spi.type.TypeSignatureParameter.typeParameter; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.sql.analyzer.TypeSignatureProvider.fromTypeSignatures; import static io.trino.sql.planner.plan.AggregationNode.Step.SINGLE; import static io.trino.testing.StructuralTestUtil.mapBlockOf; +import static io.trino.transaction.InMemoryTransactionManager.createTestTransactionManager; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; public class TestLearnAggregations { - private static final TestingFunctionResolution FUNCTION_RESOLUTION = new TestingFunctionResolution(); - private static final MetadataManager METADATA = (MetadataManager) FUNCTION_RESOLUTION.getMetadata(); + private static final TestingFunctionResolution FUNCTION_RESOLUTION; static { - METADATA.addParametricType(new ClassifierParametricType()); - METADATA.addType(ModelType.MODEL); - METADATA.addType(RegressorType.REGRESSOR); - METADATA.addFunctions(extractFunctions(new MLPlugin().getFunctions())); + TransactionManager transactionManager = createTestTransactionManager(); + TypeOperators typeOperators = new TypeOperators(); + TypeRegistry typeRegistry = new TypeRegistry(typeOperators, new FeaturesConfig()); + InternalTypeManager typeManager = new InternalTypeManager(typeRegistry); + MetadataManager metadata = new MetadataManager( + new FeaturesConfig(), + new DisabledSystemSecurityMetadata(), + transactionManager, + typeOperators, + new BlockTypeOperators(typeOperators), + typeManager, + new InternalBlockEncodingSerde(new BlockEncodingManager(), typeManager), + NodeVersion.UNKNOWN); + + typeRegistry.addParametricType(new ClassifierParametricType()); + typeRegistry.addType(ModelType.MODEL); + typeRegistry.addType(RegressorType.REGRESSOR); + metadata.addFunctions(extractFunctions(new MLPlugin().getFunctions())); + FUNCTION_RESOLUTION = new TestingFunctionResolution(transactionManager, metadata); } @Test @@ -89,7 +115,7 @@ private static void assertLearnClassifier(Aggregator aggregator) private static Page getPage() { - Type mapType = METADATA.getParameterizedType("map", ImmutableList.of(TypeSignatureParameter.typeParameter(BIGINT.getTypeSignature()), TypeSignatureParameter.typeParameter(DOUBLE.getTypeSignature()))); + Type mapType = TESTING_TYPE_MANAGER.getParameterizedType("map", ImmutableList.of(typeParameter(BIGINT.getTypeSignature()), typeParameter(DOUBLE.getTypeSignature()))); int datapoints = 100; RowPageBuilder builder = RowPageBuilder.rowPageBuilder(BIGINT, mapType, VARCHAR); Random rand = new Random(0); diff --git a/plugin/trino-mysql/src/test/java/io/trino/plugin/mysql/TestMySqlClient.java b/plugin/trino-mysql/src/test/java/io/trino/plugin/mysql/TestMySqlClient.java index acec96d289cf..36e44cc72a6f 100644 --- a/plugin/trino-mysql/src/test/java/io/trino/plugin/mysql/TestMySqlClient.java +++ b/plugin/trino-mysql/src/test/java/io/trino/plugin/mysql/TestMySqlClient.java @@ -24,9 +24,6 @@ import io.trino.spi.connector.ColumnHandle; import io.trino.spi.expression.ConnectorExpression; import io.trino.spi.expression.Variable; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.testng.annotations.Test; import java.sql.Types; @@ -34,19 +31,17 @@ import java.util.Map; import java.util.Optional; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.testing.TestingConnectorSession.SESSION; import static io.trino.testing.assertions.Assert.assertEquals; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertTrue; public class TestMySqlClient { - private static final TypeManager TYPE_MANAGER = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - private static final JdbcColumnHandle BIGINT_COLUMN = JdbcColumnHandle.builder() .setColumnName("c_bigint") @@ -66,7 +61,7 @@ public class TestMySqlClient session -> { throw new UnsupportedOperationException(); }, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, new DefaultIdentifierMapping()); @Test diff --git a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlClient.java b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlClient.java index aa41a46fc7a5..41e9a940112c 100644 --- a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlClient.java +++ b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlClient.java @@ -24,9 +24,6 @@ import io.trino.spi.connector.ColumnHandle; import io.trino.spi.expression.ConnectorExpression; import io.trino.spi.expression.Variable; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.testng.annotations.Test; import java.sql.Types; @@ -34,19 +31,17 @@ import java.util.Map; import java.util.Optional; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.BooleanType.BOOLEAN; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.testing.TestingConnectorSession.SESSION; import static io.trino.testing.assertions.Assert.assertEquals; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertTrue; public class TestPostgreSqlClient { - private static final TypeManager TYPE_MANAGER = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - private static final JdbcColumnHandle BIGINT_COLUMN = JdbcColumnHandle.builder() .setColumnName("c_bigint") @@ -65,7 +60,7 @@ public class TestPostgreSqlClient new BaseJdbcConfig(), new PostgreSqlConfig(), session -> { throw new UnsupportedOperationException(); }, - TYPE_MANAGER, + TESTING_TYPE_MANAGER, new DefaultIdentifierMapping()); @Test diff --git a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlTypeMapping.java b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlTypeMapping.java index 3899a6c1d9ec..09dcaa7f3cf8 100644 --- a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlTypeMapping.java +++ b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlTypeMapping.java @@ -1747,7 +1747,7 @@ private DataType> hstoreDataType() { return dataType( "hstore", - getQueryRunner().getMetadata().getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())), + getQueryRunner().getTypeManager().getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())), TestPostgreSqlTypeMapping::hstoreLiteral); } @@ -1763,7 +1763,7 @@ private DataType> varcharMapDataType() { return dataType( "hstore", - getQueryRunner().getMetadata().getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())), + getQueryRunner().getTypeManager().getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())), value -> { List formatted = value.entrySet().stream() .flatMap(entry -> Stream.of(entry.getKey(), entry.getValue())) diff --git a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/MetadataUtil.java b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/MetadataUtil.java index b125b5cc40a2..9c169f420870 100644 --- a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/MetadataUtil.java +++ b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/MetadataUtil.java @@ -19,24 +19,20 @@ import io.airlift.json.JsonCodec; import io.airlift.json.JsonCodecFactory; import io.airlift.json.ObjectMapperProvider; -import io.trino.metadata.Metadata; import io.trino.spi.type.MapType; import io.trino.spi.type.StandardTypes; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import java.util.Map; import static com.google.common.base.Preconditions.checkArgument; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.prometheus.PrometheusClient.TIMESTAMP_COLUMN_TYPE; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.spi.type.DoubleType.DOUBLE; import static io.trino.spi.type.TypeSignature.mapType; import static io.trino.spi.type.VarcharType.VARCHAR; import static io.trino.spi.type.VarcharType.createUnboundedVarcharType; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.util.Locale.ENGLISH; public final class MetadataUtil @@ -47,9 +43,7 @@ private MetadataUtil() {} public static final JsonCodec COLUMN_CODEC; public static final JsonCodec> METRIC_CODEC; - private static final Metadata METADATA = createTestMetadataManager(); - private static final TypeManager TYPE_MANAGER = new InternalTypeManager(METADATA, new TypeOperators()); - static final MapType varcharMapType = (MapType) TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())); + static final MapType varcharMapType = (MapType) TESTING_TYPE_MANAGER.getType(mapType(VARCHAR.getTypeSignature(), VARCHAR.getTypeSignature())); static { ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); diff --git a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/PrometheusQueryRunner.java b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/PrometheusQueryRunner.java index 2d7003a326ae..7477e3f81830 100644 --- a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/PrometheusQueryRunner.java +++ b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/PrometheusQueryRunner.java @@ -18,26 +18,19 @@ import io.airlift.log.Logging; import io.airlift.units.Duration; import io.trino.Session; -import io.trino.metadata.Metadata; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; import io.trino.testing.DistributedQueryRunner; -import io.trino.type.InternalTypeManager; import java.util.Map; import static io.airlift.testing.Closeables.closeAllSuppress; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.prometheus.MetadataUtil.METRIC_CODEC; import static io.trino.testing.TestingSession.testSessionBuilder; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.SECONDS; public final class PrometheusQueryRunner { - private static final Metadata METADATA = createTestMetadataManager(); - private static final TypeManager TYPE_MANAGER = new InternalTypeManager(METADATA, new TypeOperators()); - private PrometheusQueryRunner() {} public static DistributedQueryRunner createPrometheusQueryRunner(PrometheusServer server) @@ -75,7 +68,7 @@ public static PrometheusClient createPrometheusClient(PrometheusServer server) config.setMaxQueryRangeDuration(new Duration(21, DAYS)); config.setCacheDuration(new Duration(30, SECONDS)); config.setReadTimeout(new Duration(10, SECONDS)); - return new PrometheusClient(config, METRIC_CODEC, TYPE_MANAGER); + return new PrometheusClient(config, METRIC_CODEC, TESTING_TYPE_MANAGER); } public static void main(String[] args) diff --git a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSet.java b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSet.java index f7bdcfe7cbb6..bb3064c42b7e 100644 --- a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSet.java +++ b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSet.java @@ -19,9 +19,6 @@ import io.trino.spi.connector.RecordCursor; import io.trino.spi.connector.RecordSet; import io.trino.spi.type.DoubleType; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -31,12 +28,12 @@ import java.util.ArrayList; import java.util.List; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.prometheus.MetadataUtil.METRIC_CODEC; import static io.trino.plugin.prometheus.MetadataUtil.varcharMapType; import static io.trino.plugin.prometheus.PrometheusClient.TIMESTAMP_COLUMN_TYPE; import static io.trino.plugin.prometheus.PrometheusRecordCursor.getBlockFromMap; import static io.trino.plugin.prometheus.PrometheusRecordCursor.getMapFromBlock; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.time.Instant.ofEpochMilli; import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; @@ -44,8 +41,6 @@ public class TestPrometheusRecordSet { - private static final TypeManager TYPE_MANAGER = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - private PrometheusHttpServer prometheusHttpServer; private URI dataUri; @@ -53,7 +48,7 @@ public class TestPrometheusRecordSet public void testCursorSimple() { RecordSet recordSet = new PrometheusRecordSet( - new PrometheusClient(new PrometheusConnectorConfig(), METRIC_CODEC, TYPE_MANAGER), + new PrometheusClient(new PrometheusConnectorConfig(), METRIC_CODEC, TESTING_TYPE_MANAGER), new PrometheusSplit(dataUri), ImmutableList.of( new PrometheusColumnHandle("labels", varcharMapType, 0), diff --git a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSetProvider.java b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSetProvider.java index ed97413c4787..3a4fa462d8e0 100644 --- a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSetProvider.java +++ b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusRecordSetProvider.java @@ -20,9 +20,6 @@ import io.trino.spi.connector.RecordCursor; import io.trino.spi.connector.RecordSet; import io.trino.spi.type.DoubleType; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -32,20 +29,18 @@ import java.util.LinkedHashMap; import java.util.Map; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.prometheus.MetadataUtil.METRIC_CODEC; import static io.trino.plugin.prometheus.MetadataUtil.varcharMapType; import static io.trino.plugin.prometheus.PrometheusClient.TIMESTAMP_COLUMN_TYPE; import static io.trino.plugin.prometheus.PrometheusRecordCursor.getMapFromBlock; import static io.trino.testing.TestingConnectorSession.SESSION; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.time.Instant.ofEpochMilli; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; public class TestPrometheusRecordSetProvider { - private static final TypeManager TYPE_MANAGER = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); - private PrometheusHttpServer prometheusHttpServer; private URI dataUri; private PrometheusClient client; @@ -55,7 +50,7 @@ public void setUp() { prometheusHttpServer = new PrometheusHttpServer(); dataUri = prometheusHttpServer.resolve("/prometheus-data/up_matrix_response.json"); - client = new PrometheusClient(new PrometheusConnectorConfig(), METRIC_CODEC, TYPE_MANAGER); + client = new PrometheusClient(new PrometheusConnectorConfig(), METRIC_CODEC, TESTING_TYPE_MANAGER); } @AfterClass(alwaysRun = true) diff --git a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusSplit.java b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusSplit.java index 415afd9623fb..92a88691fe20 100644 --- a/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusSplit.java +++ b/plugin/trino-prometheus/src/test/java/io/trino/plugin/prometheus/TestPrometheusSplit.java @@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import io.airlift.json.JsonCodec; -import io.trino.metadata.Metadata; import io.trino.spi.HostAddress; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ConnectorSplit; @@ -27,9 +26,6 @@ import io.trino.spi.predicate.Range; import io.trino.spi.predicate.TupleDomain; import io.trino.spi.predicate.ValueSet; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.apache.http.NameValuePair; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -49,7 +45,6 @@ import java.util.stream.Collectors; import static io.airlift.json.JsonCodec.jsonCodec; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.prometheus.MetadataUtil.METRIC_CODEC; import static io.trino.plugin.prometheus.PrometheusClient.TIMESTAMP_COLUMN_TYPE; import static io.trino.plugin.prometheus.PrometheusClock.fixedClockAt; @@ -58,6 +53,7 @@ import static io.trino.spi.connector.NotPartitionedPartitionHandle.NOT_PARTITIONED; import static io.trino.spi.type.DateTimeEncoding.packDateTimeWithZone; import static io.trino.spi.type.TimeZoneKey.UTC_KEY; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.time.Instant.ofEpochMilli; import static java.time.ZoneOffset.UTC; import static java.util.concurrent.TimeUnit.DAYS; @@ -72,8 +68,6 @@ public class TestPrometheusSplit { private PrometheusHttpServer prometheusHttpServer; private final PrometheusSplit split = new PrometheusSplit(URI.create("http://127.0.0.1/test.file")); - private static final Metadata METADATA = createTestMetadataManager(); - private static final TypeManager TYPE_MANAGER = new InternalTypeManager(METADATA, new TypeOperators()); private static final int NUMBER_MORE_THAN_EXPECTED_NUMBER_SPLITS = 100; @BeforeClass @@ -124,7 +118,7 @@ public void testQueryWithTableNameNeedingURLEncodeInSplits() { Instant now = LocalDateTime.of(2019, 10, 2, 7, 26, 56, 0).toInstant(UTC); PrometheusConnectorConfig config = getCommonConfig(prometheusHttpServer.resolve("/prometheus-data/prom-metrics-non-standard-name.json")); - PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TYPE_MANAGER); + PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TESTING_TYPE_MANAGER); PrometheusTable table = client.getTable("default", "up now"); PrometheusSplitManager splitManager = new PrometheusSplitManager(client, fixedClockAt(now), config); ConnectorSplitSource splits = splitManager.getSplits( @@ -150,7 +144,7 @@ public void testQueryDividedIntoSplitsFirstSplitHasRightTime() { Instant now = LocalDateTime.of(2019, 10, 2, 7, 26, 56, 0).toInstant(UTC); PrometheusConnectorConfig config = getCommonConfig(prometheusHttpServer.resolve("/prometheus-data/prometheus-metrics.json")); - PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TYPE_MANAGER); + PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TESTING_TYPE_MANAGER); PrometheusTable table = client.getTable("default", "up"); PrometheusSplitManager splitManager = new PrometheusSplitManager(client, fixedClockAt(now), config); ConnectorSplitSource splits = splitManager.getSplits( @@ -176,7 +170,7 @@ public void testQueryDividedIntoSplitsLastSplitHasRightTime() { Instant now = LocalDateTime.of(2019, 10, 2, 7, 26, 56, 0).toInstant(UTC); PrometheusConnectorConfig config = getCommonConfig(prometheusHttpServer.resolve("/prometheus-data/prometheus-metrics.json")); - PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TYPE_MANAGER); + PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TESTING_TYPE_MANAGER); PrometheusTable table = client.getTable("default", "up"); PrometheusSplitManager splitManager = new PrometheusSplitManager(client, fixedClockAt(now), config); ConnectorSplitSource splitsMaybe = splitManager.getSplits( @@ -201,7 +195,7 @@ public void testQueryDividedIntoSplitsShouldHaveCorrectSpacingBetweenTimes() { Instant now = LocalDateTime.of(2019, 10, 2, 7, 26, 56, 0).toInstant(UTC); PrometheusConnectorConfig config = getCommonConfig(prometheusHttpServer.resolve("/prometheus-data/prometheus-metrics.json")); - PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TYPE_MANAGER); + PrometheusClient client = new PrometheusClient(config, METRIC_CODEC, TESTING_TYPE_MANAGER); PrometheusTable table = client.getTable("default", "up"); PrometheusSplitManager splitManager = new PrometheusSplitManager(client, fixedClockAt(now), config); ConnectorSplitSource splits = splitManager.getSplits( diff --git a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/DatabaseTesting.java b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/DatabaseTesting.java index d28ce3483f86..1ce2b73256de 100644 --- a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/DatabaseTesting.java +++ b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/DatabaseTesting.java @@ -15,15 +15,12 @@ import io.trino.plugin.raptor.legacy.metadata.Distribution; import io.trino.plugin.raptor.legacy.metadata.TableColumn; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; -import io.trino.type.InternalTypeManager; import org.jdbi.v3.core.Jdbi; import org.jdbi.v3.sqlobject.SqlObjectPlugin; import java.util.concurrent.ThreadLocalRandom; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; public final class DatabaseTesting { @@ -31,10 +28,9 @@ private DatabaseTesting() {} public static Jdbi createTestingJdbi() { - TypeManager typeManager = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); return Jdbi.create("jdbc:h2:mem:test" + System.nanoTime() + ThreadLocalRandom.current().nextLong()) .installPlugin(new SqlObjectPlugin()) - .registerRowMapper(new TableColumn.Mapper(typeManager)) - .registerRowMapper(new Distribution.Mapper(typeManager)); + .registerRowMapper(new TableColumn.Mapper(TESTING_TYPE_MANAGER)) + .registerRowMapper(new Distribution.Mapper(TESTING_TYPE_MANAGER)); } } diff --git a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/TestRaptorConnector.java b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/TestRaptorConnector.java index 5928907522a8..15aeba8fe62e 100644 --- a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/TestRaptorConnector.java +++ b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/TestRaptorConnector.java @@ -40,12 +40,9 @@ import io.trino.spi.type.SqlDate; import io.trino.spi.type.SqlTimestamp; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeManager; -import io.trino.spi.type.TypeOperators; import io.trino.testing.MaterializedResult; import io.trino.testing.TestingConnectorSession; import io.trino.testing.TestingNodeManager; -import io.trino.type.InternalTypeManager; import org.jdbi.v3.core.Handle; import org.jdbi.v3.core.Jdbi; import org.testng.annotations.AfterMethod; @@ -58,7 +55,6 @@ import static com.google.common.io.MoreFiles.deleteRecursively; import static com.google.common.io.RecursiveDeleteOption.ALLOW_INSECURE; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.operator.scalar.timestamp.VarcharToTimestampCast.castToShortTimestamp; import static io.trino.plugin.raptor.legacy.DatabaseTesting.createTestingJdbi; import static io.trino.plugin.raptor.legacy.RaptorTableProperties.TEMPORAL_COLUMN_PROPERTY; @@ -70,6 +66,7 @@ import static io.trino.spi.type.DateType.DATE; import static io.trino.spi.type.TimestampType.TIMESTAMP_MILLIS; import static io.trino.testing.TestingConnectorSession.SESSION; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.DateTimeUtils.parseDate; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; @@ -86,7 +83,6 @@ public class TestRaptorConnector @BeforeMethod public void setup() { - TypeManager typeManager = new InternalTypeManager(createTestMetadataManager(), new TypeOperators()); Jdbi dbi = createTestingJdbi(); dummyHandle = dbi.open(); metadataDao = dbi.onDemand(MetadataDao.class); @@ -110,7 +106,7 @@ public void setup() config), new RaptorNodePartitioningProvider(nodeSupplier), new RaptorSessionProperties(config), - new RaptorTableProperties(typeManager), + new RaptorTableProperties(TESTING_TYPE_MANAGER), ImmutableSet.of(), Optional.empty(), dbi); diff --git a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestOrcFileRewriter.java b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestOrcFileRewriter.java index 954a4509fce4..ca0df5d0d755 100644 --- a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestOrcFileRewriter.java +++ b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestOrcFileRewriter.java @@ -42,7 +42,6 @@ import static io.airlift.json.JsonCodec.jsonCodec; import static io.airlift.slice.Slices.utf8Slice; import static io.trino.RowPagesBuilder.rowPagesBuilder; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.raptor.legacy.storage.OrcTestingUtil.createReader; import static io.trino.plugin.raptor.legacy.storage.OrcTestingUtil.fileOrcDataSource; import static io.trino.spi.type.BigintType.BIGINT; @@ -54,6 +53,7 @@ import static io.trino.testing.StructuralTestUtil.arrayBlocksEqual; import static io.trino.testing.StructuralTestUtil.mapBlockOf; import static io.trino.testing.StructuralTestUtil.mapBlocksEqual; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.nio.file.Files.readAllBytes; import static java.util.UUID.randomUUID; import static org.testng.Assert.assertEquals; @@ -87,7 +87,7 @@ public void testRewrite() { ArrayType arrayType = new ArrayType(BIGINT); ArrayType arrayOfArrayType = new ArrayType(arrayType); - Type mapType = createTestMetadataManager().getParameterizedType(StandardTypes.MAP, ImmutableList.of( + Type mapType = TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(createVarcharType(5).getTypeSignature()), TypeSignatureParameter.typeParameter(BOOLEAN.getTypeSignature()))); List columnIds = ImmutableList.of(3L, 7L, 9L, 10L, 11L, 12L); diff --git a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestRaptorStorageManager.java b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestRaptorStorageManager.java index a1edc04b0b90..578494421cc7 100644 --- a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestRaptorStorageManager.java +++ b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestRaptorStorageManager.java @@ -42,10 +42,8 @@ import io.trino.spi.type.SqlTimestamp; import io.trino.spi.type.SqlVarbinary; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; import io.trino.testing.MaterializedResult; import io.trino.testing.TestingNodeManager; -import io.trino.type.InternalTypeManager; import org.jdbi.v3.core.Handle; import org.jdbi.v3.core.Jdbi; import org.joda.time.DateTime; @@ -78,7 +76,6 @@ import static io.airlift.slice.Slices.wrappedBuffer; import static io.airlift.units.DataSize.Unit.MEGABYTE; import static io.trino.RowPagesBuilder.rowPagesBuilder; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.raptor.legacy.DatabaseTesting.createTestingJdbi; import static io.trino.plugin.raptor.legacy.metadata.SchemaDaoUtil.createTablesWithRetry; import static io.trino.plugin.raptor.legacy.metadata.TestDatabaseShardManager.createShardManager; @@ -97,6 +94,7 @@ import static io.trino.testing.MaterializedResult.resultBuilder; import static io.trino.testing.TestingConnectorSession.SESSION; import static io.trino.testing.assertions.Assert.assertEquals; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static java.lang.String.format; import static org.joda.time.DateTimeZone.UTC; import static org.testng.Assert.assertFalse; @@ -616,7 +614,7 @@ public static RaptorStorageManager createRaptorStorageManager( new BackupManager(backupStore, storageService, 1), recoveryManager, shardRecorder, - new InternalTypeManager(createTestMetadataManager(), new TypeOperators()), + TESTING_TYPE_MANAGER, CONNECTOR_ID, DELETION_THREADS, SHARD_RECOVERY_TIMEOUT, diff --git a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestShardWriter.java b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestShardWriter.java index 5aa133b8c493..13f6b20207b8 100644 --- a/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestShardWriter.java +++ b/plugin/trino-raptor-legacy/src/test/java/io/trino/plugin/raptor/legacy/storage/TestShardWriter.java @@ -40,7 +40,6 @@ import static io.airlift.json.JsonCodec.jsonCodec; import static io.airlift.slice.Slices.utf8Slice; import static io.airlift.slice.Slices.wrappedBuffer; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; import static io.trino.plugin.raptor.legacy.storage.OrcTestingUtil.createReader; import static io.trino.plugin.raptor.legacy.storage.OrcTestingUtil.fileOrcDataSource; import static io.trino.plugin.raptor.legacy.storage.OrcTestingUtil.octets; @@ -53,6 +52,7 @@ import static io.trino.testing.StructuralTestUtil.arrayBlocksEqual; import static io.trino.testing.StructuralTestUtil.mapBlockOf; import static io.trino.testing.StructuralTestUtil.mapBlocksEqual; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; @@ -84,7 +84,7 @@ public void testWriter() List columnIds = ImmutableList.of(1L, 2L, 4L, 6L, 7L, 8L, 9L, 10L); ArrayType arrayType = new ArrayType(BIGINT); ArrayType arrayOfArrayType = new ArrayType(arrayType); - Type mapType = createTestMetadataManager().getParameterizedType(StandardTypes.MAP, ImmutableList.of( + Type mapType = TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(createVarcharType(10).getTypeSignature()), TypeSignatureParameter.typeParameter(BOOLEAN.getTypeSignature()))); List columnTypes = ImmutableList.of(BIGINT, createVarcharType(10), VARBINARY, DOUBLE, BOOLEAN, arrayType, mapType, arrayOfArrayType); diff --git a/plugin/trino-redis/src/test/java/io/trino/plugin/redis/RedisQueryRunner.java b/plugin/trino-redis/src/test/java/io/trino/plugin/redis/RedisQueryRunner.java index ec388375a749..dd183de2ff74 100644 --- a/plugin/trino-redis/src/test/java/io/trino/plugin/redis/RedisQueryRunner.java +++ b/plugin/trino-redis/src/test/java/io/trino/plugin/redis/RedisQueryRunner.java @@ -19,13 +19,13 @@ import io.airlift.log.Logger; import io.airlift.log.Logging; import io.trino.Session; -import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; import io.trino.plugin.redis.util.CodecSupplier; import io.trino.plugin.redis.util.RedisServer; import io.trino.plugin.redis.util.RedisTestUtils; import io.trino.plugin.tpch.TpchPlugin; import io.trino.spi.connector.SchemaTableName; +import io.trino.spi.type.TypeManager; import io.trino.testing.DistributedQueryRunner; import io.trino.testing.TestingTrinoClient; import io.trino.tpch.TpchTable; @@ -70,7 +70,7 @@ public static DistributedQueryRunner createRedisQueryRunner( queryRunner.installPlugin(new TpchPlugin()); queryRunner.createCatalog("tpch", "tpch"); - Map tableDescriptions = createTpchTableDescriptions(queryRunner.getCoordinator().getMetadata(), tables, dataFormat); + Map tableDescriptions = createTpchTableDescriptions(queryRunner.getCoordinator().getTypeManager(), tables, dataFormat); installRedisPlugin(redisServer, queryRunner, tableDescriptions); @@ -109,10 +109,10 @@ private static String redisTableName(TpchTable table) return TPCH_SCHEMA + ":" + table.getTableName().toLowerCase(ENGLISH); } - private static Map createTpchTableDescriptions(Metadata metadata, Iterable> tables, String dataFormat) + private static Map createTpchTableDescriptions(TypeManager typeManager, Iterable> tables, String dataFormat) throws Exception { - JsonCodec tableDescriptionJsonCodec = new CodecSupplier<>(RedisTableDescription.class, metadata).get(); + JsonCodec tableDescriptionJsonCodec = new CodecSupplier<>(RedisTableDescription.class, typeManager).get(); ImmutableMap.Builder tableDescriptions = ImmutableMap.builder(); for (TpchTable table : tables) { diff --git a/plugin/trino-redis/src/test/java/io/trino/plugin/redis/util/CodecSupplier.java b/plugin/trino-redis/src/test/java/io/trino/plugin/redis/util/CodecSupplier.java index 16bf8133a288..e304e149c181 100644 --- a/plugin/trino-redis/src/test/java/io/trino/plugin/redis/util/CodecSupplier.java +++ b/plugin/trino-redis/src/test/java/io/trino/plugin/redis/util/CodecSupplier.java @@ -17,9 +17,9 @@ import io.airlift.json.JsonCodec; import io.airlift.json.JsonCodecFactory; import io.airlift.json.ObjectMapperProvider; -import io.trino.metadata.Metadata; import io.trino.plugin.base.TypeDeserializer; import io.trino.spi.type.Type; +import io.trino.spi.type.TypeManager; import java.util.function.Supplier; @@ -31,11 +31,11 @@ public final class CodecSupplier private final JsonCodecFactory codecFactory; private final Class clazz; - public CodecSupplier(Class clazz, Metadata metadata) + public CodecSupplier(Class clazz, TypeManager typeManager) { - requireNonNull(metadata, "metadata is null"); + requireNonNull(typeManager, "typeManager is null"); ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); - objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(metadata::getType))); + objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(typeManager::getType))); this.codecFactory = new JsonCodecFactory(objectMapperProvider); this.clazz = requireNonNull(clazz, "clazz is null"); } diff --git a/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/TestThriftProjectionPushdown.java b/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/TestThriftProjectionPushdown.java index 8d6121d93446..d8799b9bd3b4 100644 --- a/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/TestThriftProjectionPushdown.java +++ b/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/TestThriftProjectionPushdown.java @@ -129,9 +129,9 @@ public void cleanup() public void testDoesNotFire() { PushProjectionIntoTableScan pushProjectionIntoTableScan = new PushProjectionIntoTableScan( - tester().getMetadata(), + tester().getPlannerContext(), tester().getTypeAnalyzer(), - new ScalarStatsCalculator(tester().getMetadata(), tester().getTypeAnalyzer())); + new ScalarStatsCalculator(tester().getPlannerContext(), tester().getTypeAnalyzer())); String columnName = "orderstatus"; ColumnHandle columnHandle = new ThriftColumnHandle(columnName, VARCHAR, "", false); @@ -165,9 +165,9 @@ public void testDoesNotFire() public void testProjectionPushdown() { PushProjectionIntoTableScan pushProjectionIntoTableScan = new PushProjectionIntoTableScan( - tester().getMetadata(), + tester().getPlannerContext(), tester().getTypeAnalyzer(), - new ScalarStatsCalculator(tester().getMetadata(), tester().getTypeAnalyzer())); + new ScalarStatsCalculator(tester().getPlannerContext(), tester().getTypeAnalyzer())); TableHandle inputTableHandle = NATION_TABLE; String columnName = "orderstatus"; diff --git a/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/ThriftQueryRunner.java b/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/ThriftQueryRunner.java index 19d58053970b..deca15f882d8 100644 --- a/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/ThriftQueryRunner.java +++ b/plugin/trino-thrift/src/test/java/io/trino/plugin/thrift/integration/ThriftQueryRunner.java @@ -31,6 +31,7 @@ import io.trino.execution.FailureInjector.InjectedFailureType; import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; +import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.SqlFunction; import io.trino.plugin.thrift.ThriftPlugin; import io.trino.plugin.thrift.server.ThriftIndexedTpchService; @@ -38,9 +39,10 @@ import io.trino.server.testing.TestingTrinoServer; import io.trino.spi.ErrorType; import io.trino.spi.Plugin; +import io.trino.spi.type.TypeManager; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; -import io.trino.sql.analyzer.AnalyzerFactory; +import io.trino.sql.analyzer.QueryExplainer; import io.trino.sql.planner.NodePartitioningManager; import io.trino.testing.DistributedQueryRunner; import io.trino.testing.MaterializedResult; @@ -215,9 +217,21 @@ public Metadata getMetadata() } @Override - public AnalyzerFactory getAnalyzerFactory() + public TypeManager getTypeManager() { - return source.getAnalyzerFactory(); + return source.getTypeManager(); + } + + @Override + public QueryExplainer getQueryExplainer() + { + return source.getQueryExplainer(); + } + + @Override + public SessionPropertyManager getSessionPropertyManager() + { + return source.getSessionPropertyManager(); } @Override diff --git a/testing/trino-benchmark/src/main/java/io/trino/benchmark/AbstractOperatorBenchmark.java b/testing/trino-benchmark/src/main/java/io/trino/benchmark/AbstractOperatorBenchmark.java index 3f7471839328..ea2dff1f9266 100644 --- a/testing/trino-benchmark/src/main/java/io/trino/benchmark/AbstractOperatorBenchmark.java +++ b/testing/trino-benchmark/src/main/java/io/trino/benchmark/AbstractOperatorBenchmark.java @@ -56,7 +56,6 @@ import io.trino.sql.gen.PageFunctionCompiler; import io.trino.sql.planner.Symbol; import io.trino.sql.planner.SymbolAllocator; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.TypeProvider; import io.trino.sql.planner.optimizations.HashGenerationOptimizer; import io.trino.sql.planner.plan.PlanNodeId; @@ -89,6 +88,7 @@ import static io.trino.spi.connector.NotPartitionedPartitionHandle.NOT_PARTITIONED; import static io.trino.spi.type.BigintType.BIGINT; import static io.trino.sql.analyzer.TypeSignatureProvider.fromTypes; +import static io.trino.sql.planner.TypeAnalyzer.createTestingTypeAnalyzer; import static io.trino.sql.relational.SqlToRowExpressionTranslator.translate; import static io.trino.testing.TestingSession.testSessionBuilder; import static java.lang.String.format; @@ -245,7 +245,7 @@ protected final OperatorFactory createHashProjectOperator(int operatorId, PlanNo ImmutableList.copyOf(symbolTypes.keySet())); verify(hashExpression.isPresent()); - Map, Type> expressionTypes = new TypeAnalyzer(localQueryRunner.getSqlParser(), localQueryRunner.getMetadata()) + Map, Type> expressionTypes = createTestingTypeAnalyzer(localQueryRunner.getPlannerContext()) .getTypes(session, TypeProvider.copyOf(symbolTypes), hashExpression.get()); RowExpression translated = translate(hashExpression.get(), expressionTypes, symbolToInputMapping.build(), localQueryRunner.getMetadata(), session, false); diff --git a/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestQueryFramework.java b/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestQueryFramework.java index d01f47fe935c..0c17008e2010 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestQueryFramework.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestQueryFramework.java @@ -14,25 +14,14 @@ package io.trino.testing; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.MoreCollectors; import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.airlift.units.Duration; import io.trino.FeaturesConfig; import io.trino.FeaturesConfig.JoinDistributionType; import io.trino.Session; -import io.trino.cost.CostCalculator; -import io.trino.cost.CostCalculatorUsingExchanges; -import io.trino.cost.CostCalculatorWithEstimatedExchanges; -import io.trino.cost.CostComparator; -import io.trino.cost.ScalarStatsCalculator; -import io.trino.cost.TaskCountEstimator; -import io.trino.execution.QueryManagerConfig; -import io.trino.execution.QueryPreparer; import io.trino.execution.QueryStats; -import io.trino.execution.TaskManagerConfig; import io.trino.execution.warnings.WarningCollector; -import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; import io.trino.metadata.TableHandle; import io.trino.metadata.TableMetadata; @@ -40,29 +29,15 @@ import io.trino.server.DynamicFilterService.DynamicFiltersStats; import io.trino.spi.QueryId; import io.trino.spi.type.Type; -import io.trino.spi.type.TypeOperators; -import io.trino.sql.analyzer.AnalyzerFactory; import io.trino.sql.analyzer.QueryExplainer; -import io.trino.sql.analyzer.QueryExplainerFactory; import io.trino.sql.parser.SqlParser; import io.trino.sql.planner.Plan; -import io.trino.sql.planner.PlanFragmenter; -import io.trino.sql.planner.PlanOptimizers; -import io.trino.sql.planner.PlanOptimizersFactory; -import io.trino.sql.planner.RuleStatsRecorder; -import io.trino.sql.planner.TypeAnalyzer; import io.trino.sql.planner.optimizations.PlanNodeSearcher; import io.trino.sql.planner.plan.FilterNode; import io.trino.sql.planner.plan.PlanNodeId; import io.trino.sql.planner.plan.ProjectNode; import io.trino.sql.planner.plan.TableScanNode; import io.trino.sql.query.QueryAssertions.QueryAssert; -import io.trino.sql.rewrite.DescribeInputRewrite; -import io.trino.sql.rewrite.DescribeOutputRewrite; -import io.trino.sql.rewrite.ExplainRewrite; -import io.trino.sql.rewrite.ShowQueriesRewrite; -import io.trino.sql.rewrite.ShowStatsRewrite; -import io.trino.sql.rewrite.StatementRewrite; import io.trino.sql.tree.ExplainType; import io.trino.testing.TestingAccessControlManager.TestingPrivilege; import io.trino.transaction.TransactionBuilder; @@ -445,7 +420,7 @@ protected String formatSqlText(String sql) //TODO: should WarningCollector be added? protected String getExplainPlan(String query, ExplainType.Type planType) { - QueryExplainer explainer = getQueryExplainer(); + QueryExplainer explainer = queryRunner.getQueryExplainer(); return newTransaction() .singleStatement() .execute(getSession(), session -> { @@ -455,7 +430,7 @@ protected String getExplainPlan(String query, ExplainType.Type planType) protected String getGraphvizExplainPlan(String query, ExplainType.Type planType) { - QueryExplainer explainer = getQueryExplainer(); + QueryExplainer explainer = queryRunner.getQueryExplainer(); return newTransaction() .singleStatement() .execute(queryRunner.getDefaultSession(), session -> { @@ -463,53 +438,6 @@ protected String getGraphvizExplainPlan(String query, ExplainType.Type planType) }); } - private QueryExplainer getQueryExplainer() - { - Metadata metadata = queryRunner.getMetadata(); - FeaturesConfig featuresConfig = new FeaturesConfig().setOptimizeHashGeneration(true); - boolean forceSingleNode = queryRunner.getNodeCount() == 1; - TaskCountEstimator taskCountEstimator = new TaskCountEstimator(queryRunner::getNodeCount); - CostCalculator costCalculator = new CostCalculatorUsingExchanges(taskCountEstimator); - TypeOperators typeOperators = new TypeOperators(); - TypeAnalyzer typeAnalyzer = new TypeAnalyzer(sqlParser, metadata); - PlanOptimizersFactory planOptimizersFactory = new PlanOptimizers( - metadata, - typeOperators, - typeAnalyzer, - new TaskManagerConfig(), - forceSingleNode, - queryRunner.getSplitManager(), - queryRunner.getPageSourceManager(), - queryRunner.getStatsCalculator(), - new ScalarStatsCalculator(metadata, typeAnalyzer), - costCalculator, - new CostCalculatorWithEstimatedExchanges(costCalculator, taskCountEstimator), - new CostComparator(featuresConfig), - taskCountEstimator, - queryRunner.getNodePartitioningManager(), - new RuleStatsRecorder()); - QueryExplainerFactory queryExplainerFactory = new QueryExplainerFactory( - planOptimizersFactory, - new PlanFragmenter(metadata, queryRunner.getNodePartitioningManager(), new QueryManagerConfig()), - metadata, - typeOperators, - sqlParser, - queryRunner.getStatsCalculator(), - costCalculator); - AnalyzerFactory analyzerFactory = new AnalyzerFactory( - metadata, - sqlParser, - queryRunner.getAccessControl(), - queryRunner.getGroupProvider(), - new StatementRewrite(ImmutableSet.of( - new DescribeInputRewrite(sqlParser), - new DescribeOutputRewrite(sqlParser), - new ShowQueriesRewrite(metadata, sqlParser, queryRunner.getAccessControl()), - new ShowStatsRewrite(queryExplainerFactory, queryRunner.getStatsCalculator()), - new ExplainRewrite(queryExplainerFactory, new QueryPreparer(sqlParser))))); - return queryExplainerFactory.createQueryExplainer(analyzerFactory); - } - protected static void skipTestUnless(boolean requirement) { if (!requirement) { diff --git a/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java b/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java index 092014bb05b2..3f174cb0728d 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/AbstractTestingTrinoClient.java @@ -218,7 +218,7 @@ protected List getTypes(List columns) { return columns.stream() .map(Column::getType) - .map(trinoServer.getMetadata()::fromSqlType) + .map(trinoServer.getTypeManager()::fromSqlType) .collect(toImmutableList()); } } diff --git a/testing/trino-testing/src/main/java/io/trino/testing/DistributedQueryRunner.java b/testing/trino-testing/src/main/java/io/trino/testing/DistributedQueryRunner.java index 5949b2458563..f56800848f12 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/DistributedQueryRunner.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/DistributedQueryRunner.java @@ -32,6 +32,7 @@ import io.trino.metadata.InternalNode; import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; +import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.SqlFunction; import io.trino.server.BasicQueryInfo; import io.trino.server.SessionPropertyDefaults; @@ -41,9 +42,10 @@ import io.trino.spi.QueryId; import io.trino.spi.eventlistener.EventListener; import io.trino.spi.security.SystemAccessControl; +import io.trino.spi.type.TypeManager; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; -import io.trino.sql.analyzer.AnalyzerFactory; +import io.trino.sql.analyzer.QueryExplainer; import io.trino.sql.planner.NodePartitioningManager; import io.trino.sql.planner.Plan; import io.trino.transaction.TransactionManager; @@ -187,7 +189,7 @@ private DistributedQueryRunner( } // copy session using property manager in coordinator - defaultSession = defaultSession.toSessionRepresentation().toSession(coordinator.getMetadata().getSessionPropertyManager(), defaultSession.getIdentity().getExtraCredentials()); + defaultSession = defaultSession.toSessionRepresentation().toSession(coordinator.getSessionPropertyManager(), defaultSession.getIdentity().getExtraCredentials()); this.trinoClient = closer.register(new TestingTrinoClient(coordinator, defaultSession)); waitForAllNodesGloballyVisible(); @@ -327,9 +329,21 @@ public Metadata getMetadata() } @Override - public AnalyzerFactory getAnalyzerFactory() + public TypeManager getTypeManager() { - return coordinator.getAnalyzerFactory(); + return coordinator.getTypeManager(); + } + + @Override + public QueryExplainer getQueryExplainer() + { + return coordinator.getQueryExplainer(); + } + + @Override + public SessionPropertyManager getSessionPropertyManager() + { + return coordinator.getSessionPropertyManager(); } @Override diff --git a/testing/trino-testing/src/main/java/io/trino/testing/StandaloneQueryRunner.java b/testing/trino-testing/src/main/java/io/trino/testing/StandaloneQueryRunner.java index 95f1573830de..26ccba2c512b 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/StandaloneQueryRunner.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/StandaloneQueryRunner.java @@ -22,13 +22,15 @@ import io.trino.metadata.InternalNode; import io.trino.metadata.Metadata; import io.trino.metadata.QualifiedObjectName; +import io.trino.metadata.SessionPropertyManager; import io.trino.metadata.SqlFunction; import io.trino.server.testing.TestingTrinoServer; import io.trino.spi.ErrorType; import io.trino.spi.Plugin; +import io.trino.spi.type.TypeManager; import io.trino.split.PageSourceManager; import io.trino.split.SplitManager; -import io.trino.sql.analyzer.AnalyzerFactory; +import io.trino.sql.analyzer.QueryExplainer; import io.trino.sql.planner.NodePartitioningManager; import io.trino.transaction.TransactionManager; import org.intellij.lang.annotations.Language; @@ -127,9 +129,21 @@ public Metadata getMetadata() } @Override - public AnalyzerFactory getAnalyzerFactory() + public TypeManager getTypeManager() { - return server.getAnalyzerFactory(); + return server.getTypeManager(); + } + + @Override + public QueryExplainer getQueryExplainer() + { + return server.getQueryExplainer(); + } + + @Override + public SessionPropertyManager getSessionPropertyManager() + { + return server.getSessionPropertyManager(); } @Override diff --git a/testing/trino-testing/src/main/java/io/trino/testing/StructuralTestUtil.java b/testing/trino-testing/src/main/java/io/trino/testing/StructuralTestUtil.java index 1d4c7e8479f9..610ae5fbafe4 100644 --- a/testing/trino-testing/src/main/java/io/trino/testing/StructuralTestUtil.java +++ b/testing/trino-testing/src/main/java/io/trino/testing/StructuralTestUtil.java @@ -15,7 +15,6 @@ import com.google.common.collect.ImmutableList; import io.airlift.slice.Slice; -import io.trino.metadata.Metadata; import io.trino.spi.block.Block; import io.trino.spi.block.BlockBuilder; import io.trino.spi.type.DecimalType; @@ -32,12 +31,11 @@ import java.util.List; import static com.google.common.base.Preconditions.checkArgument; -import static io.trino.metadata.MetadataManager.createTestMetadataManager; +import static io.trino.type.InternalTypeManager.TESTING_TYPE_MANAGER; import static io.trino.util.StructuralTestUtil.appendToBlockBuilder; public final class StructuralTestUtil { - private static final Metadata METADATA = createTestMetadataManager(); private static final BlockTypeOperators TYPE_OPERATORS_CACHE = new BlockTypeOperators(); private StructuralTestUtil() {} @@ -155,7 +153,7 @@ public static Block decimalMapBlockOf(DecimalType type, BigDecimal decimal) public static MapType mapType(Type keyType, Type valueType) { - return (MapType) METADATA.getParameterizedType(StandardTypes.MAP, ImmutableList.of( + return (MapType) TESTING_TYPE_MANAGER.getParameterizedType(StandardTypes.MAP, ImmutableList.of( TypeSignatureParameter.typeParameter(keyType.getTypeSignature()), TypeSignatureParameter.typeParameter(valueType.getTypeSignature()))); } diff --git a/testing/trino-tests/src/test/java/io/trino/tests/AbstractTestEngineOnlyQueries.java b/testing/trino-tests/src/test/java/io/trino/tests/AbstractTestEngineOnlyQueries.java index d87dcfbbc4c9..af51ace248c3 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/AbstractTestEngineOnlyQueries.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/AbstractTestEngineOnlyQueries.java @@ -5284,7 +5284,7 @@ public void testShowSession() .put("connector_string", "bar string") .put("connector_long", "11") .build()), - getQueryRunner().getMetadata().getSessionPropertyManager(), + getQueryRunner().getSessionPropertyManager(), getSession().getPreparedStatements(), getSession().getProtocolHeaders()); MaterializedResult result = computeActual(session, "SHOW SESSION"); diff --git a/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java b/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java index d80d609bee85..54c5da8fce9b 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/TestDistributedEngineOnlyQueries.java @@ -67,7 +67,7 @@ private static void addTestingCatalog(TestingTrinoServer server) Catalog bogusTestingCatalog = createBogusTestingCatalog(TESTING_CATALOG); server.getCatalogManager().registerCatalog(bogusTestingCatalog); - SessionPropertyManager sessionPropertyManager = server.getMetadata().getSessionPropertyManager(); + SessionPropertyManager sessionPropertyManager = server.getSessionPropertyManager(); sessionPropertyManager.addSystemSessionProperties(TEST_SYSTEM_PROPERTIES); sessionPropertyManager.addConnectorSessionProperties(bogusTestingCatalog.getConnectorCatalogName(), TEST_CATALOG_PROPERTIES); } diff --git a/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java b/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java index e1e3339d965a..320673e9559b 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/TestLocalEngineOnlyQueries.java @@ -30,9 +30,9 @@ protected QueryRunner createQueryRunner() LocalQueryRunner queryRunner = TestLocalQueries.createLocalQueryRunner(); try { // for testing session properties - queryRunner.getMetadata().getSessionPropertyManager().addSystemSessionProperties(TEST_SYSTEM_PROPERTIES); + queryRunner.getSessionPropertyManager().addSystemSessionProperties(TEST_SYSTEM_PROPERTIES); queryRunner.getCatalogManager().registerCatalog(createBogusTestingCatalog(TESTING_CATALOG)); - queryRunner.getMetadata().getSessionPropertyManager().addConnectorSessionProperties(new CatalogName(TESTING_CATALOG), TEST_CATALOG_PROPERTIES); + queryRunner.getSessionPropertyManager().addConnectorSessionProperties(new CatalogName(TESTING_CATALOG), TEST_CATALOG_PROPERTIES); } catch (RuntimeException e) { throw closeAllSuppress(e, queryRunner); diff --git a/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java b/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java index 1cf57bdd8e34..73641c1a0fd8 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/TestProcedureCall.java @@ -61,7 +61,7 @@ public void setUp() // register procedures in the bogus testing catalog addTestingCatalog(getDistributedQueryRunner()); - ProcedureRegistry procedureRegistry = coordinator.getMetadata().getProcedureRegistry(); + ProcedureRegistry procedureRegistry = coordinator.getProcedureRegistry(); TestingProcedures procedures = new TestingProcedures(coordinator.getProcedureTester()); procedureRegistry.addProcedures( new CatalogName(TESTING_CATALOG), diff --git a/testing/trino-tests/src/test/java/io/trino/tests/tpch/TestTpchConnectorTest.java b/testing/trino-tests/src/test/java/io/trino/tests/tpch/TestTpchConnectorTest.java index 3f92ea07e9cf..3937febc03af 100644 --- a/testing/trino-tests/src/test/java/io/trino/tests/tpch/TestTpchConnectorTest.java +++ b/testing/trino-tests/src/test/java/io/trino/tests/tpch/TestTpchConnectorTest.java @@ -111,7 +111,7 @@ public void testIoExplain() scanEstimate); ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider(); - objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(getQueryRunner().getMetadata()))); + objectMapperProvider.setJsonDeserializers(ImmutableMap.of(Type.class, new TypeDeserializer(getQueryRunner().getTypeManager()))); JsonCodec codec = new JsonCodecFactory(objectMapperProvider).jsonCodec(IoPlanPrinter.IoPlan.class); assertEquals(