diff --git a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMetadata.java b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMetadata.java index 495775171b11..64729659439f 100644 --- a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMetadata.java +++ b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMetadata.java @@ -452,12 +452,13 @@ public ConnectorTableMetadata getTableMetadata(ConnectorSession session, Connect String location = metastore.getTableLocation(tableHandle.getSchemaTableName(), session); Map columnComments = getColumnComments(tableHandle.getMetadataEntry()); Map columnsNullability = getColumnsNullability(tableHandle.getMetadataEntry()); + Map columnGenerations = getGeneratedColumnExpressions(tableHandle.getMetadataEntry()); List constraints = ImmutableList.builder() .addAll(getCheckConstraints(tableHandle.getMetadataEntry()).values()) .addAll(getColumnInvariants(tableHandle.getMetadataEntry()).values()) // The internal logic for column invariants in Delta Lake is same as check constraints .build(); List columns = getColumns(tableHandle.getMetadataEntry()).stream() - .map(column -> getColumnMetadata(column, columnComments.get(column.getName()), columnsNullability.getOrDefault(column.getName(), true))) + .map(column -> getColumnMetadata(column, columnComments.get(column.getName()), columnsNullability.getOrDefault(column.getName(), true), columnGenerations.get(column.getName()))) .collect(toImmutableList()); ImmutableMap.Builder properties = ImmutableMap.builder() @@ -507,7 +508,8 @@ public ColumnMetadata getColumnMetadata(ConnectorSession session, ConnectorTable return getColumnMetadata( column, getColumnComments(table.getMetadataEntry()).get(column.getName()), - getColumnsNullability(table.getMetadataEntry()).getOrDefault(column.getName(), true)); + getColumnsNullability(table.getMetadataEntry()).getOrDefault(column.getName(), true), + getGeneratedColumnExpressions(table.getMetadataEntry()).get(column.getName())); } /** @@ -566,8 +568,9 @@ public Iterator streamTableColumns(ConnectorSession sessio return metastore.getMetadata(metastore.getSnapshot(table, session), session).stream().map(metadata -> { Map columnComments = getColumnComments(metadata); Map columnsNullability = getColumnsNullability(metadata); + Map columnGenerations = getGeneratedColumnExpressions(metadata); List columnMetadata = getColumns(metadata).stream() - .map(column -> getColumnMetadata(column, columnComments.get(column.getName()), columnsNullability.getOrDefault(column.getName(), true))) + .map(column -> getColumnMetadata(column, columnComments.get(column.getName()), columnsNullability.getOrDefault(column.getName(), true), columnGenerations.get(column.getName()))) .collect(toImmutableList()); return TableColumnsMetadata.forTable(table, columnMetadata); }); @@ -2567,7 +2570,7 @@ private List getCommitInfoEntries(SchemaTableName table, Connec } } - private static ColumnMetadata getColumnMetadata(DeltaLakeColumnHandle column, @Nullable String comment, boolean nullability) + private static ColumnMetadata getColumnMetadata(DeltaLakeColumnHandle column, @Nullable String comment, boolean nullability, @Nullable String generation) { return ColumnMetadata.builder() .setName(column.getName()) @@ -2575,6 +2578,7 @@ private static ColumnMetadata getColumnMetadata(DeltaLakeColumnHandle column, @N .setHidden(column.getColumnType() == SYNTHESIZED) .setComment(Optional.ofNullable(comment)) .setNullable(nullability) + .setExtraInfo(generation == null ? Optional.empty() : Optional.of("generated: " + generation)) .build(); } diff --git a/testing/trino-product-tests/src/main/java/io/trino/tests/product/deltalake/TestDeltaLakeAlterTableCompatibility.java b/testing/trino-product-tests/src/main/java/io/trino/tests/product/deltalake/TestDeltaLakeAlterTableCompatibility.java index 6eb8f415c12e..1be64e27831b 100644 --- a/testing/trino-product-tests/src/main/java/io/trino/tests/product/deltalake/TestDeltaLakeAlterTableCompatibility.java +++ b/testing/trino-product-tests/src/main/java/io/trino/tests/product/deltalake/TestDeltaLakeAlterTableCompatibility.java @@ -368,6 +368,13 @@ public void testTrinoAlterTablePreservesGeneratedColumn() onDelta().executeQuery("INSERT INTO default." + tableName + " (a, c) VALUES (1, 3)"); assertThat(onTrino().executeQuery("SELECT * FROM delta.default." + tableName)) .containsOnly(row(1, 2, 3)); + + assertThat(onTrino().executeQuery("SELECT column_name, extra_info FROM delta.information_schema.columns WHERE table_schema = 'default' AND table_name = '" + tableName + "'")) + .containsOnly(row("a", null), row("b", "generated: a * 2"), row("c", null)); + assertThat(onTrino().executeQuery("DESCRIBE delta.default." + tableName).project(1, 3)) + .containsOnly(row("a", ""), row("b", "generated: a * 2"), row("c", "")); + assertThat(onTrino().executeQuery("SHOW COLUMNS FROM delta.default." + tableName).project(1, 3)) + .containsOnly(row("a", ""), row("b", "generated: a * 2"), row("c", "")); } finally { dropDeltaTableWithRetry("default." + tableName);