Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,6 @@ public interface Metadata

Optional<SystemTable> getSystemTable(Session session, QualifiedObjectName tableName);

Optional<TableHandle> getTableHandleForStatisticsCollection(Session session, QualifiedObjectName tableName, Map<String, Object> analyzeProperties);

Optional<TableExecuteHandle> getTableHandleForExecute(
Session session,
TableHandle tableHandle,
Expand Down Expand Up @@ -273,7 +271,7 @@ Optional<TableExecuteHandle> getTableHandleForExecute(
/**
* Describe statistics that must be collected during a statistics collection
*/
TableStatisticsMetadata getStatisticsCollectionMetadata(Session session, String catalogName, ConnectorTableMetadata tableMetadata);
AnalyzeMetadata getStatisticsCollectionMetadata(Session session, TableHandle tableHandle, Map<String, Object> analyzeProperties);

/**
* Begin statistics collection
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import io.trino.spi.connector.CatalogSchemaTableName;
import io.trino.spi.connector.ColumnHandle;
import io.trino.spi.connector.ColumnMetadata;
import io.trino.spi.connector.ConnectorAnalyzeMetadata;
import io.trino.spi.connector.ConnectorCapabilities;
import io.trino.spi.connector.ConnectorInsertTableHandle;
import io.trino.spi.connector.ConnectorMaterializedViewDefinition;
Expand Down Expand Up @@ -286,28 +287,6 @@ public Optional<TableHandle> getTableHandle(Session session, QualifiedObjectName
});
}

@Override
public Optional<TableHandle> getTableHandleForStatisticsCollection(Session session, QualifiedObjectName table, Map<String, Object> analyzeProperties)
{
requireNonNull(table, "table is null");

Optional<CatalogMetadata> catalog = getOptionalCatalogMetadata(session, table.getCatalogName());
if (catalog.isPresent()) {
CatalogMetadata catalogMetadata = catalog.get();
CatalogName catalogName = catalogMetadata.getConnectorId(session, table);
ConnectorMetadata metadata = catalogMetadata.getMetadataFor(session, catalogName);

ConnectorTableHandle tableHandle = metadata.getTableHandleForStatisticsCollection(session.toConnectorSession(catalogName), table.asSchemaTableName(), analyzeProperties);
if (tableHandle != null) {
return Optional.of(new TableHandle(
catalogName,
tableHandle,
catalogMetadata.getTransactionHandleFor(catalogName)));
}
}
return Optional.empty();
}

@Override
public Optional<TableExecuteHandle> getTableHandleForExecute(Session session, TableHandle tableHandle, String procedure, Map<String, Object> executeProperties)
{
Expand Down Expand Up @@ -791,12 +770,14 @@ public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(Session s
}

@Override
public TableStatisticsMetadata getStatisticsCollectionMetadata(Session session, String catalogName, ConnectorTableMetadata tableMetadata)
public AnalyzeMetadata getStatisticsCollectionMetadata(Session session, TableHandle tableHandle, Map<String, Object> analyzeProperties)
{
CatalogName catalogName = tableHandle.getCatalogName();
CatalogMetadata catalogMetadata = getCatalogMetadataForWrite(session, catalogName);
ConnectorMetadata metadata = catalogMetadata.getMetadata(session);
CatalogName catalog = catalogMetadata.getCatalogName();
return metadata.getStatisticsCollectionMetadata(session.toConnectorSession(catalog), tableMetadata);

ConnectorAnalyzeMetadata analyze = metadata.getStatisticsCollectionMetadata(session.toConnectorSession(catalogName), tableHandle.getConnectorHandle(), analyzeProperties);
return new AnalyzeMetadata(analyze.getStatisticsMetadata(), new TableHandle(catalogName, analyze.getTableHandle(), tableHandle.getTransaction()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.google.common.collect.Multiset;
import com.google.common.collect.Streams;
import io.trino.connector.CatalogName;
import io.trino.metadata.AnalyzeMetadata;
import io.trino.metadata.QualifiedObjectName;
import io.trino.metadata.ResolvedFunction;
import io.trino.metadata.TableExecuteHandle;
Expand Down Expand Up @@ -217,7 +218,7 @@ public class Analysis
private Optional<Insert> insert = Optional.empty();
private Optional<RefreshMaterializedViewAnalysis> refreshMaterializedView = Optional.empty();
private Optional<QualifiedObjectName> delegatedRefreshMaterializedView = Optional.empty();
private Optional<TableHandle> analyzeTarget = Optional.empty();
private Optional<AnalyzeMetadata> analyzeMetadata = Optional.empty();
private Optional<List<ColumnSchema>> updatedColumns = Optional.empty();

private final QueryType queryType;
Expand Down Expand Up @@ -728,14 +729,14 @@ public ColumnHandle getColumn(Field field)
return columns.get(field);
}

public Optional<TableHandle> getAnalyzeTarget()
public Optional<AnalyzeMetadata> getAnalyzeMetadata()
{
return analyzeTarget;
return analyzeMetadata;
}

public void setAnalyzeTarget(TableHandle analyzeTarget)
public void setAnalyzeMetadata(AnalyzeMetadata analyzeMetadata)
{
this.analyzeTarget = Optional.of(analyzeTarget);
this.analyzeMetadata = Optional.of(analyzeMetadata);
}

public void setCreate(Create create)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -784,11 +784,13 @@ protected Scope visitAnalyze(Analyze node, Optional<Scope> scope)
analysis.setUpdateType("ANALYZE");
analysis.setUpdateTarget(tableName, Optional.empty(), Optional.empty());

// verify the target table exists and it's not a view
if (metadata.isView(session, tableName)) {
Comment thread
electrum marked this conversation as resolved.
Outdated
throw semanticException(NOT_SUPPORTED, node, "Analyzing views is not supported");
}

TableHandle tableHandle = metadata.getTableHandle(session, tableName)
.orElseThrow(() -> semanticException(TABLE_NOT_FOUND, node, "Table '%s' does not exist", tableName));

validateProperties(node.getProperties(), scope);
CatalogName catalogName = getRequiredCatalogHandle(metadata, session, node, tableName.getCatalogName());

Expand All @@ -800,8 +802,8 @@ protected Scope visitAnalyze(Analyze node, Optional<Scope> scope)
accessControl,
analysis.getParameters(),
true);
TableHandle tableHandle = metadata.getTableHandleForStatisticsCollection(session, tableName, analyzeProperties)
.orElseThrow(() -> semanticException(TABLE_NOT_FOUND, node, "Table '%s' does not exist", tableName));

analysis.setAnalyzeMetadata(metadata.getStatisticsCollectionMetadata(session, tableHandle, analyzeProperties));

// user must have read and insert permission in order to analyze stats of a table
analysis.addTableColumnReferences(
Expand All @@ -817,7 +819,6 @@ protected Scope visitAnalyze(Analyze node, Optional<Scope> scope)
throw new AccessDeniedException(format("Cannot ANALYZE (missing insert privilege) table %s", tableName));
}

analysis.setAnalyzeTarget(tableHandle);
return createAndAssignScope(node, scope, Field.newUnqualified("rows", BIGINT));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import io.trino.cost.StatsCalculator;
import io.trino.cost.StatsProvider;
import io.trino.execution.warnings.WarningCollector;
import io.trino.metadata.AnalyzeMetadata;
import io.trino.metadata.Metadata;
import io.trino.metadata.QualifiedObjectName;
import io.trino.metadata.ResolvedFunction;
Expand Down Expand Up @@ -336,7 +337,9 @@ private RelationPlan createExplainAnalyzePlan(Analysis analysis, ExplainAnalyze

private RelationPlan createAnalyzePlan(Analysis analysis, Analyze analyzeStatement)
{
TableHandle targetTable = analysis.getAnalyzeTarget().orElseThrow();
AnalyzeMetadata analyzeMetadata = analysis.getAnalyzeMetadata().orElseThrow();
TableHandle targetTable = analyzeMetadata.getTableHandle();
TableStatisticsMetadata tableStatisticsMetadata = analyzeMetadata.getStatisticsMetadata();

// Plan table scan
Map<String, ColumnHandle> columnHandles = metadata.getColumnHandles(session, targetTable);
Expand All @@ -351,11 +354,6 @@ private RelationPlan createAnalyzePlan(Analysis analysis, Analyze analyzeStateme
columnNameToSymbol.put(column.getName(), symbol);
}

TableStatisticsMetadata tableStatisticsMetadata = metadata.getStatisticsCollectionMetadata(
session,
targetTable.getCatalogName().getCatalogName(),
tableMetadata.getMetadata());

TableStatisticAggregation tableStatisticAggregation = statisticsAggregationPlanner.createStatisticsAggregation(tableStatisticsMetadata, columnNameToSymbol.buildOrThrow());
StatisticAggregations statisticAggregations = tableStatisticAggregation.getAggregations();
List<Symbol> groupingSymbols = statisticAggregations.getGroupingSymbols();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import io.trino.spi.TrinoException;
import io.trino.spi.connector.ColumnHandle;
import io.trino.spi.connector.ColumnMetadata;
import io.trino.spi.connector.ConnectorAnalyzeMetadata;
import io.trino.spi.connector.ConnectorInsertTableHandle;
import io.trino.spi.connector.ConnectorMaterializedViewDefinition;
import io.trino.spi.connector.ConnectorMetadata;
Expand All @@ -42,6 +43,7 @@
import io.trino.spi.security.Privilege;
import io.trino.spi.security.TrinoPrincipal;
import io.trino.spi.statistics.ComputedStatistics;
import io.trino.spi.statistics.TableStatisticsMetadata;
import io.trino.spi.type.Type;

import java.util.ArrayList;
Expand Down Expand Up @@ -92,12 +94,6 @@ public ConnectorTableHandle getTableHandle(ConnectorSession session, SchemaTable
return new TestingTableHandle(tableName);
}

@Override
public ConnectorTableHandle getTableHandleForStatisticsCollection(ConnectorSession session, SchemaTableName tableName, Map<String, Object> analyzeProperties)
{
return getTableHandle(session, tableName);
}

@Override
public ConnectorTableMetadata getTableMetadata(ConnectorSession session, ConnectorTableHandle tableHandle)
{
Expand Down Expand Up @@ -136,6 +132,12 @@ public Map<SchemaTableName, List<ColumnMetadata>> listTableColumns(ConnectorSess
return tableColumns.buildOrThrow();
}

@Override
public ConnectorAnalyzeMetadata getStatisticsCollectionMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, Map<String, Object> analyzeProperties)
{
return new ConnectorAnalyzeMetadata(tableHandle, TableStatisticsMetadata.empty());
}

@Override
public ColumnMetadata getColumnMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnHandle columnHandle)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,6 @@ public Optional<TableHandle> getTableHandle(Session session, QualifiedObjectName
throw new UnsupportedOperationException();
}

@Override
public Optional<TableHandle> getTableHandleForStatisticsCollection(Session session, QualifiedObjectName tableName, Map<String, Object> analyzeProperties)
{
throw new UnsupportedOperationException();
}

@Override
public Optional<TableExecuteHandle> getTableHandleForExecute(Session session, TableHandle tableHandle, String procedureName, Map<String, Object> executeProperties)
{
Expand Down Expand Up @@ -349,7 +343,7 @@ public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(Session s
}

@Override
public TableStatisticsMetadata getStatisticsCollectionMetadata(Session session, String catalogName, ConnectorTableMetadata tableMetadata)
public AnalyzeMetadata getStatisticsCollectionMetadata(Session session, TableHandle tableHandle, Map<String, Object> analyzeProperties)
{
throw new UnsupportedOperationException();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,6 @@ public Optional<SystemTable> getSystemTable(Session session, QualifiedObjectName
return delegate.getSystemTable(session, tableName);
}

@Override
public Optional<TableHandle> getTableHandleForStatisticsCollection(Session session, QualifiedObjectName tableName, Map<String, Object> analyzeProperties)
{
return delegate.getTableHandleForStatisticsCollection(session, tableName, analyzeProperties);
}

@Override
public Optional<TableExecuteHandle> getTableHandleForExecute(Session session, TableHandle tableHandle, String procedureName, Map<String, Object> executeProperties)
{
Expand Down Expand Up @@ -356,9 +350,9 @@ public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(Session s
}

@Override
public TableStatisticsMetadata getStatisticsCollectionMetadata(Session session, String catalogName, ConnectorTableMetadata tableMetadata)
public AnalyzeMetadata getStatisticsCollectionMetadata(Session session, TableHandle tableHandle, Map<String, Object> analyzeProperties)
{
return delegate.getStatisticsCollectionMetadata(session, catalogName, tableMetadata);
return delegate.getStatisticsCollectionMetadata(session, tableHandle, analyzeProperties);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* 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.spi.connector;

import io.trino.spi.statistics.TableStatisticsMetadata;

import static java.util.Objects.requireNonNull;

public class ConnectorAnalyzeMetadata
{
private final ConnectorTableHandle tableHandle;
private final TableStatisticsMetadata statisticsMetadata;

public ConnectorAnalyzeMetadata(ConnectorTableHandle tableHandle, TableStatisticsMetadata statisticsMetadata)
{
this.statisticsMetadata = requireNonNull(statisticsMetadata, "statisticsMetadata is null");
this.tableHandle = requireNonNull(tableHandle, "tableHandle is null");
}

public ConnectorTableHandle getTableHandle()
{
return tableHandle;
}

public TableStatisticsMetadata getStatisticsMetadata()
{
return statisticsMetadata;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,10 @@ default ConnectorTableHandle getTableHandle(ConnectorSession session, SchemaTabl
/**
* Returns a table handle for the specified table name, or null if the connector does not contain the table.
* The returned table handle can contain information in analyzeProperties.
*
* @deprecated use {@link #getStatisticsCollectionMetadata(ConnectorSession, ConnectorTableHandle, Map)}
*/
@Deprecated
@Nullable
default ConnectorTableHandle getTableHandleForStatisticsCollection(ConnectorSession session, SchemaTableName tableName, Map<String, Object> analyzeProperties)
{
Expand Down Expand Up @@ -437,12 +440,26 @@ default TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(Connecto

/**
* Describe statistics that must be collected during a statistics collection
*
* @deprecated use {@link #getStatisticsCollectionMetadata(ConnectorSession, ConnectorTableHandle, Map)}
*/
@Deprecated
default TableStatisticsMetadata getStatisticsCollectionMetadata(ConnectorSession session, ConnectorTableMetadata tableMetadata)
{
throw new TrinoException(GENERIC_INTERNAL_ERROR, "ConnectorMetadata getTableHandleForStatisticsCollection() is implemented without getStatisticsCollectionMetadata()");
}

/**
* Describe statistics that must be collected during a statistics collection
*/
default ConnectorAnalyzeMetadata getStatisticsCollectionMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, Map<String, Object> analyzeProperties)
{
SchemaTableName tableName = getTableMetadata(session, tableHandle).getTable();
ConnectorTableHandle analyzeHandle = getTableHandleForStatisticsCollection(session, tableName, analyzeProperties);
TableStatisticsMetadata statisticsMetadata = getStatisticsCollectionMetadata(session, getTableMetadata(session, analyzeHandle));
return new ConnectorAnalyzeMetadata(analyzeHandle, statisticsMetadata);
}

/**
* Begin statistics collection
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import io.trino.spi.connector.CatalogSchemaTableName;
import io.trino.spi.connector.ColumnHandle;
import io.trino.spi.connector.ColumnMetadata;
import io.trino.spi.connector.ConnectorAnalyzeMetadata;
import io.trino.spi.connector.ConnectorInsertTableHandle;
import io.trino.spi.connector.ConnectorMaterializedViewDefinition;
import io.trino.spi.connector.ConnectorMetadata;
Expand Down Expand Up @@ -144,6 +145,14 @@ public TableStatisticsMetadata getStatisticsCollectionMetadata(ConnectorSession
}
}

@Override
public ConnectorAnalyzeMetadata getStatisticsCollectionMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, Map<String, Object> analyzeProperties)
{
try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(classLoader)) {
return delegate.getStatisticsCollectionMetadata(session, tableHandle, analyzeProperties);
}
}

@Override
public ConnectorTableHandle beginStatisticsCollection(ConnectorSession session, ConnectorTableHandle tableHandle)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import io.trino.spi.TrinoException;
import io.trino.spi.connector.ColumnHandle;
import io.trino.spi.connector.ColumnMetadata;
import io.trino.spi.connector.ConnectorAnalyzeMetadata;
import io.trino.spi.connector.ConnectorInsertTableHandle;
import io.trino.spi.connector.ConnectorMetadata;
import io.trino.spi.connector.ConnectorOutputMetadata;
Expand Down Expand Up @@ -104,15 +105,9 @@ public ConnectorTableHandle getTableHandle(ConnectorSession session, SchemaTable
}

@Override
public ConnectorTableHandle getTableHandleForStatisticsCollection(ConnectorSession session, SchemaTableName tableName, Map<String, Object> analyzeProperties)
public ConnectorAnalyzeMetadata getStatisticsCollectionMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, Map<String, Object> analyzeProperties)
{
return getTableHandle(session, tableName);
}

@Override
public TableStatisticsMetadata getStatisticsCollectionMetadata(ConnectorSession session, ConnectorTableMetadata tableMetadata)
{
return TableStatisticsMetadata.empty();
return new ConnectorAnalyzeMetadata(tableHandle, TableStatisticsMetadata.empty());
}

@Override
Expand Down
Loading