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 @@ -13,7 +13,6 @@
*/
package io.trino.connector.system;

import com.google.common.collect.ImmutableMap;
import io.trino.connector.CatalogName;
import io.trino.spi.connector.ConnectorSession;
import io.trino.spi.connector.ConnectorTableMetadata;
Expand All @@ -27,13 +26,13 @@
import io.trino.transaction.TransactionId;
import io.trino.transaction.TransactionManager;

import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;

import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static io.trino.metadata.MetadataUtil.TableMetadataBuilder.tableMetadataBuilder;
import static io.trino.spi.connector.SystemTable.Distribution.SINGLE_COORDINATOR;
import static io.trino.spi.type.VarcharType.createUnboundedVarcharType;
Expand All @@ -44,9 +43,9 @@ abstract class AbstractPropertiesSystemTable
{
private final ConnectorTableMetadata tableMetadata;
private final TransactionManager transactionManager;
private final Supplier<Map<CatalogName, Map<String, PropertyMetadata<?>>>> propertySupplier;
private final Function<CatalogName, Collection<PropertyMetadata<?>>> catalogProperties;

protected AbstractPropertiesSystemTable(String tableName, TransactionManager transactionManager, Supplier<Map<CatalogName, Map<String, PropertyMetadata<?>>>> propertySupplier)
protected AbstractPropertiesSystemTable(String tableName, TransactionManager transactionManager, Function<CatalogName, Collection<PropertyMetadata<?>>> catalogProperties)
{
this.tableMetadata = tableMetadataBuilder(new SchemaTableName("metadata", tableName))
.column("catalog_name", createUnboundedVarcharType())
Expand All @@ -56,7 +55,7 @@ protected AbstractPropertiesSystemTable(String tableName, TransactionManager tra
.column("description", createUnboundedVarcharType())
.build();
this.transactionManager = requireNonNull(transactionManager, "transactionManager is null");
this.propertySupplier = requireNonNull(propertySupplier, "propertySupplier is null");
this.catalogProperties = requireNonNull(catalogProperties, "catalogProperties is null");
}

@Override
Expand All @@ -77,23 +76,22 @@ public final RecordCursor cursor(ConnectorTransactionHandle transactionHandle, C
TransactionId transactionId = ((GlobalSystemTransactionHandle) transactionHandle).getTransactionId();

InMemoryRecordSet.Builder table = InMemoryRecordSet.builder(tableMetadata);
Map<CatalogName, Map<String, PropertyMetadata<?>>> connectorProperties = propertySupplier.get();
Map<String, CatalogName> catalogNames = transactionManager.getCatalogs(transactionId).entrySet()
.stream()
.collect(Collectors.toMap(
Entry::getKey,
entry -> entry.getValue().getConnectorCatalogName()));
for (Entry<String, CatalogName> entry : new TreeMap<>(catalogNames).entrySet()) {
String catalog = entry.getKey();
Map<String, PropertyMetadata<?>> properties = new TreeMap<>(connectorProperties.getOrDefault(entry.getValue(), ImmutableMap.of()));
for (PropertyMetadata<?> propertyMetadata : properties.values()) {
table.addRow(
catalog,
propertyMetadata.getName(),
firstNonNull(propertyMetadata.getDefaultValue(), "").toString(),
propertyMetadata.getSqlType().toString(),
propertyMetadata.getDescription());
}

List<CatalogName> catalogNames = transactionManager.getCatalogs(transactionId).keySet().stream()
.sorted()
.map(CatalogName::new)
.collect(toImmutableList());

for (CatalogName catalogName : catalogNames) {
catalogProperties.apply(catalogName).stream()
.sorted(Comparator.comparing(PropertyMetadata::getName))
.forEach(propertyMetadata ->
table.addRow(
catalogName.toString(),
propertyMetadata.getName(),
firstNonNull(propertyMetadata.getDefaultValue(), "").toString(),
propertyMetadata.getSqlType().toString(),
propertyMetadata.getDescription()));
}
return table.build().cursor();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,12 @@ public ListenableFuture<Void> execute(
}
Map<String, Object> columnProperties = columnPropertyManager.getProperties(
catalogName,
tableName.getCatalogName(),
element.getProperties(),
session,
plannerContext,
accessControl,
parameterExtractor(statement, parameters));
parameterExtractor(statement, parameters),
true);

ColumnMetadata column = ColumnMetadata.builder()
.setName(element.getName().getValue())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,12 @@ public ListenableFuture<Void> execute(

Map<String, Object> properties = materializedViewPropertyManager.getProperties(
catalogName,
name.getCatalogName(),
statement.getProperties(),
session,
plannerContext,
accessControl,
parameterLookup);
parameterLookup,
true);

MaterializedViewDefinition definition = new MaterializedViewDefinition(
sql,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,12 @@ static ListenableFuture<Void> internalExecute(

Map<String, Object> properties = schemaPropertyManager.getProperties(
catalogName,
schema.getCatalogName(),
statement.getProperties(),
session,
plannerContext,
accessControl,
parameterExtractor(statement, parameters));
parameterExtractor(statement, parameters),
true);

TrinoPrincipal principal = getCreatePrincipal(statement, session, plannerContext.getMetadata(), catalogName.getCatalogName());
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,12 +164,12 @@ ListenableFuture<Void> internalExecute(CreateTable statement, Session session, L
}
Map<String, Object> columnProperties = columnPropertyManager.getProperties(
catalogName,
tableName.getCatalogName(),
column.getProperties(),
session,
plannerContext,
accessControl,
parameterLookup);
parameterLookup,
true);

columns.put(name, ColumnMetadata.builder()
.setName(name)
Expand Down Expand Up @@ -245,12 +245,12 @@ else if (element instanceof LikeClause) {
}
Map<String, Object> properties = tablePropertyManager.getProperties(
catalogName,
tableName.getCatalogName(),
statement.getProperties(),
session,
plannerContext,
accessControl,
parameterLookup);
parameterLookup,
true);

if (!disableSetPropertiesSecurityCheckForCreateDdl) {
accessControl.checkCanCreateTable(session.toSecurityContext(), tableName, properties);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import io.trino.Session;
import io.trino.execution.warnings.WarningCollector;
import io.trino.metadata.MaterializedViewPropertyManager;
import io.trino.metadata.Properties;
import io.trino.metadata.QualifiedObjectName;
import io.trino.metadata.TableHandle;
import io.trino.metadata.TablePropertyManager;
Expand All @@ -29,8 +28,13 @@
import javax.inject.Inject;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;

import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.common.util.concurrent.Futures.immediateVoidFuture;
import static io.trino.metadata.MetadataUtil.createQualifiedObjectName;
import static io.trino.metadata.MetadataUtil.getRequiredCatalogHandle;
Expand Down Expand Up @@ -77,25 +81,25 @@ public ListenableFuture<Void> execute(
QualifiedObjectName objectName = createQualifiedObjectName(session, statement, statement.getName());

if (statement.getType() == TABLE) {
Properties properties = tablePropertyManager.getOnlySpecifiedProperties(
Map<String, Optional<Object>> properties = tablePropertyManager.getNullableProperties(
getRequiredCatalogHandle(plannerContext.getMetadata(), session, statement, objectName.getCatalogName()),
objectName.getCatalogName(),
statement.getProperties(),
session,
plannerContext,
accessControl,
parameterExtractor(statement, parameters));
parameterExtractor(statement, parameters),
false);
setTableProperties(statement, objectName, session, properties);
}
else if (statement.getType() == MATERIALIZED_VIEW) {
Properties properties = materializedViewPropertyManager.getOnlySpecifiedProperties(
Map<String, Optional<Object>> properties = materializedViewPropertyManager.getNullableProperties(
getRequiredCatalogHandle(plannerContext.getMetadata(), session, statement, objectName.getCatalogName()),
objectName.getCatalogName(),
statement.getProperties(),
session,
plannerContext,
accessControl,
parameterExtractor(statement, parameters));
parameterExtractor(statement, parameters),
false);
setMaterializedViewProperties(statement, objectName, session, properties);
}
else {
Expand All @@ -105,7 +109,7 @@ else if (statement.getType() == MATERIALIZED_VIEW) {
return immediateVoidFuture();
}

private void setTableProperties(SetProperties statement, QualifiedObjectName tableName, Session session, Properties properties)
private void setTableProperties(SetProperties statement, QualifiedObjectName tableName, Session session, Map<String, Optional<Object>> properties)
{
if (plannerContext.getMetadata().isMaterializedView(session, tableName)) {
throw semanticException(NOT_SUPPORTED, statement, "Cannot set properties to a materialized view in ALTER TABLE");
Expand All @@ -120,16 +124,16 @@ private void setTableProperties(SetProperties statement, QualifiedObjectName tab
throw semanticException(TABLE_NOT_FOUND, statement, "Table does not exist: %s", tableName);
}

accessControl.checkCanSetTableProperties(session.toSecurityContext(), tableName, properties.getNonNullProperties(), properties.getNullPropertyNames());
accessControl.checkCanSetTableProperties(session.toSecurityContext(), tableName, getNonNullProperties(properties), getNullProperties(properties));

plannerContext.getMetadata().setTableProperties(session, tableHandle.get(), properties.getNonNullProperties(), properties.getNullPropertyNames());
plannerContext.getMetadata().setTableProperties(session, tableHandle.get(), getNonNullProperties(properties), getNullProperties(properties));
}

private void setMaterializedViewProperties(
SetProperties statement,
QualifiedObjectName materializedViewName,
Session session,
Properties properties)
Map<String, Optional<Object>> properties)
{
if (plannerContext.getMetadata().getMaterializedView(session, materializedViewName).isEmpty()) {
String exceptionMessage = format("Materialized View '%s' does not exist", materializedViewName);
Expand All @@ -141,7 +145,22 @@ else if (plannerContext.getMetadata().getTableHandle(session, materializedViewNa
}
throw semanticException(TABLE_NOT_FOUND, statement, exceptionMessage);
}
accessControl.checkCanSetMaterializedViewProperties(session.toSecurityContext(), materializedViewName, properties.getNonNullProperties(), properties.getNullPropertyNames());
plannerContext.getMetadata().setMaterializedViewProperties(session, materializedViewName, properties.getNonNullProperties(), properties.getNullPropertyNames());
accessControl.checkCanSetMaterializedViewProperties(session.toSecurityContext(), materializedViewName, getNonNullProperties(properties), getNullProperties(properties));
plannerContext.getMetadata().setMaterializedViewProperties(session, materializedViewName, getNonNullProperties(properties), getNullProperties(properties));
}

private static Map<String, Object> getNonNullProperties(Map<String, Optional<Object>> propertyValues)
{
return propertyValues.entrySet().stream()
.filter(entry -> entry.getValue().isPresent())
.collect(toImmutableMap(Entry::getKey, entry -> entry.getValue().orElseThrow()));
}

private static Set<String> getNullProperties(Map<String, Optional<Object>> propertyValues)
{
return propertyValues.entrySet().stream()
.filter(entry -> entry.getValue().isEmpty())
.map(Entry::getKey)
.collect(toImmutableSet());
}
}
Loading