Skip to content

Commit b6013e0

Browse files
committed
Fix column level lineage miss when use unnest
1 parent 39da6f4 commit b6013e0

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

core/trino-main/src/main/java/io/trino/sql/analyzer/StatementAnalyzer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,6 +1656,7 @@ else if (expressionType instanceof MapType mapType) {
16561656

16571657
outputFields.addAll(expressionOutputs);
16581658
mappings.put(NodeRef.of(expression), expressionOutputs);
1659+
expressionOutputs.forEach(field -> analysis.addSourceColumns(field, analysis.getExpressionSourceColumns(expression)));
16591660
}
16601661

16611662
Optional<Field> ordinalityField = Optional.empty();

testing/trino-tests/src/test/java/io/trino/execution/TestEventListenerBasic.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import io.trino.spi.eventlistener.TableInfo;
5252
import io.trino.spi.metrics.Metrics;
5353
import io.trino.spi.security.ViewExpression;
54+
import io.trino.spi.type.ArrayType;
5455
import io.trino.spi.type.Type;
5556
import io.trino.spi.type.TypeManager;
5657
import io.trino.spi.type.TypeSignature;
@@ -156,7 +157,9 @@ public Iterable<ConnectorFactory> getConnectorFactories()
156157
}
157158
return ImmutableList.of(
158159
new ColumnMetadata("test_varchar", createVarcharType(15)),
159-
new ColumnMetadata("test_bigint", BIGINT));
160+
new ColumnMetadata("test_bigint", BIGINT),
161+
new ColumnMetadata("test_varchar_array", new ArrayType(createVarcharType(15))),
162+
new ColumnMetadata("test_bigint_array", new ArrayType(BIGINT)));
160163
})
161164
.withGetTableHandle((session, schemaTableName) -> {
162165
if (!schemaTableName.getTableName().startsWith("create")) {
@@ -761,7 +764,7 @@ public void testReferencedTablesWithColumnMask()
761764
throws Exception
762765
{
763766
QueryEvents queryEvents = runQueryAndWaitForEvents(
764-
"CREATE TABLE mock.default.create_table_with_referring_mask AS SELECT * FROM mock.default.test_table_with_column_mask"
767+
"CREATE TABLE mock.default.create_table_with_referring_mask AS SELECT test_varchar, test_bigint FROM mock.default.test_table_with_column_mask"
765768
).getQueryEvents();
766769

767770
QueryCompletedEvent event = queryEvents.getQueryCompletedEvent();
@@ -1372,7 +1375,9 @@ public void testCreateTableLike()
13721375
.containsExactly(
13731376
new OutputColumnMetadata("test_column", BIGINT_TYPE, ImmutableSet.of()),
13741377
new OutputColumnMetadata("test_varchar", VARCHAR_TYPE, ImmutableSet.of()),
1375-
new OutputColumnMetadata("test_bigint", BIGINT_TYPE, ImmutableSet.of()));
1378+
new OutputColumnMetadata("test_bigint", BIGINT_TYPE, ImmutableSet.of()),
1379+
new OutputColumnMetadata("test_varchar_array", "array(varchar(15))", ImmutableSet.of()),
1380+
new OutputColumnMetadata("test_bigint_array", "array(bigint)", ImmutableSet.of()));
13761381
}
13771382

13781383
@Test
@@ -1419,6 +1424,41 @@ private void testOutputColumnsForSetOperations(String setOperator)
14191424
new ColumnDetail("tpch", "sf1", "orders", "custkey"))));
14201425
}
14211426

1427+
@Test
1428+
public void testOutputColumnsWithUnnestQueries()
1429+
throws Exception
1430+
{
1431+
// test unnest with one array column
1432+
assertLineage(
1433+
"SELECT test_varchar_unnest AS test_varchar, test_bigint AS test_bigint FROM mock.default.tests_table_unnest CROSS JOIN UNNEST(test_varchar_array) AS t(test_varchar_unnest)",
1434+
ImmutableSet.of("mock.default.tests_table_unnest"),
1435+
new OutputColumnMetadata("test_varchar", VARCHAR_TYPE, ImmutableSet.of(new ColumnDetail("mock", "default", "tests_table_unnest", "test_varchar_array"))),
1436+
new OutputColumnMetadata("test_bigint", BIGINT_TYPE, ImmutableSet.of(new ColumnDetail("mock", "default", "tests_table_unnest", "test_bigint"))));
1437+
// test unnest with one array column and with ordinality
1438+
assertLineage(
1439+
"SELECT test_varchar_unnest AS test_varchar, row_number_unnest AS test_bigint FROM mock.default.tests_table_unnest CROSS JOIN UNNEST(test_varchar_array) WITH ORDINALITY AS t(test_varchar_unnest, row_number_unnest)",
1440+
ImmutableSet.of("mock.default.tests_table_unnest"),
1441+
new OutputColumnMetadata("test_varchar", VARCHAR_TYPE, ImmutableSet.of(new ColumnDetail("mock", "default", "tests_table_unnest", "test_varchar_array"))),
1442+
new OutputColumnMetadata("test_bigint", BIGINT_TYPE, ImmutableSet.of()));
1443+
// test unnest with two array column
1444+
assertLineage(
1445+
"SELECT test_varchar_unnest AS test_varchar, test_bigint_unnest AS test_bigint FROM mock.default.tests_table_unnest CROSS JOIN UNNEST(test_varchar_array, test_bigint_array) AS t(test_varchar_unnest, test_bigint_unnest)",
1446+
ImmutableSet.of("mock.default.tests_table_unnest"),
1447+
new OutputColumnMetadata("test_varchar", VARCHAR_TYPE, ImmutableSet.of(new ColumnDetail("mock", "default", "tests_table_unnest", "test_varchar_array"))),
1448+
new OutputColumnMetadata("test_bigint", BIGINT_TYPE, ImmutableSet.of(new ColumnDetail("mock", "default", "tests_table_unnest", "test_bigint_array"))));
1449+
// test unnest with two array column and with ordinality
1450+
assertLineage(
1451+
"SELECT test_varchar_unnest AS test_varchar, row_number_unnest AS test_bigint FROM mock.default.tests_table_unnest CROSS JOIN UNNEST(test_varchar_array, test_bigint_array) WITH ORDINALITY AS t(test_varchar_unnest, test_bigint_unnest, row_number_unnest)",
1452+
ImmutableSet.of("mock.default.tests_table_unnest"),
1453+
new OutputColumnMetadata("test_varchar", VARCHAR_TYPE, ImmutableSet.of(new ColumnDetail("mock", "default", "tests_table_unnest", "test_varchar_array"))),
1454+
new OutputColumnMetadata("test_bigint", BIGINT_TYPE, ImmutableSet.of()));
1455+
assertLineage(
1456+
"SELECT CAST(test_bigint_unnest AS varchar(15)) AS test_varchar, row_number_unnest AS test_bigint FROM mock.default.tests_table_unnest CROSS JOIN UNNEST(test_varchar_array, test_bigint_array) WITH ORDINALITY AS t(test_varchar_unnest, test_bigint_unnest, row_number_unnest)",
1457+
ImmutableSet.of("mock.default.tests_table_unnest"),
1458+
new OutputColumnMetadata("test_varchar", VARCHAR_TYPE, ImmutableSet.of(new ColumnDetail("mock", "default", "tests_table_unnest", "test_bigint_array"))),
1459+
new OutputColumnMetadata("test_bigint", BIGINT_TYPE, ImmutableSet.of()));
1460+
}
1461+
14221462
@Test
14231463
public void testTableStats()
14241464
throws Exception

0 commit comments

Comments
 (0)