Skip to content

Commit f1a73d3

Browse files
committed
Collect NDV stats on all columns when replacing Iceberg tables
1 parent 14cfe8a commit f1a73d3

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2834,12 +2834,16 @@ public void dropNotNullConstraint(ConnectorSession session, ConnectorTableHandle
28342834
}
28352835

28362836
@Override
2837-
public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(ConnectorSession session, ConnectorTableMetadata tableMetadata)
2837+
public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(ConnectorSession session, ConnectorTableMetadata tableMetadata, boolean tableReplace)
28382838
{
28392839
if (!isExtendedStatisticsEnabled(session) || !isCollectExtendedStatisticsOnWrite(session)) {
28402840
return TableStatisticsMetadata.empty();
28412841
}
28422842

2843+
if (tableReplace) {
2844+
return getStatisticsCollectionMetadata(tableMetadata, Optional.empty(), availableColumnNames -> {});
2845+
}
2846+
28432847
ConnectorTableHandle tableHandle = getTableHandle(session, tableMetadata.getTable(), Optional.empty(), Optional.empty());
28442848
if (tableHandle == null) {
28452849
// Assume new table (CTAS), collect NDV stats on all columns
@@ -2874,6 +2878,12 @@ public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(Connector
28742878
return getStatisticsCollectionMetadata(tableMetadata, Optional.of(columnsWithExtendedStatistics), availableColumnNames -> {});
28752879
}
28762880

2881+
@Override
2882+
public TableStatisticsMetadata getStatisticsCollectionMetadataForWrite(ConnectorSession session, ConnectorTableMetadata tableMetadata)
2883+
{
2884+
throw new UnsupportedOperationException("This variant of getStatisticsCollectionMetadataForWrite is unsupported");
2885+
}
2886+
28772887
@Override
28782888
public ConnectorAnalyzeMetadata getStatisticsCollectionMetadata(ConnectorSession session, ConnectorTableHandle tableHandle, Map<String, Object> analyzeProperties)
28792889
{

plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/TestIcebergStatistics.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.trino.Session;
1919
import io.trino.testing.AbstractTestQueryFramework;
2020
import io.trino.testing.QueryRunner;
21+
import io.trino.testing.sql.TestTable;
2122
import org.junit.jupiter.api.Test;
2223
import org.junit.jupiter.params.ParameterizedTest;
2324
import org.junit.jupiter.params.provider.MethodSource;
@@ -972,6 +973,31 @@ public void testShowStatsAsOf()
972973
assertUpdate("DROP TABLE show_stats_as_of");
973974
}
974975

976+
@Test
977+
public void testShowStatsReplaceTable()
978+
{
979+
try (TestTable table = newTrinoTable("show_stats_after_replace_table_", "AS SELECT 1 a, 2 b")) {
980+
assertThat(query("SHOW STATS FOR " + table.getName()))
981+
.skippingTypesCheck()
982+
.matches("""
983+
VALUES
984+
('a', null, 1e0, 0e0, NULL, '1', '1'),
985+
('b', null, 1e0, 0e0, NULL, '2', '2'),
986+
(NULL, NULL, NULL, NULL, 1e0, NULL, NULL)
987+
""");
988+
989+
assertUpdate("CREATE OR REPLACE TABLE " + table.getName() + " AS SELECT 3 x, 4 y", 1);
990+
assertThat(query("SHOW STATS FOR " + table.getName()))
991+
.skippingTypesCheck()
992+
.matches("""
993+
VALUES
994+
('x', null, 1e0, 0e0, NULL, '3', '3'),
995+
('y', null, 1e0, 0e0, NULL, '4', '4'),
996+
(NULL, NULL, NULL, NULL, 1e0, NULL, NULL)
997+
""");
998+
}
999+
}
1000+
9751001
@Test
9761002
public void testShowStatsAfterExpiration()
9771003
{

0 commit comments

Comments
 (0)