From 24e63828be54ef69f0c490281afbc73d4b551896 Mon Sep 17 00:00:00 2001 From: Yuya Ebihara Date: Wed, 8 Jan 2025 13:57:33 +0900 Subject: [PATCH] Fix correctness issue when writing deletion vectors in Delta Lake --- .../io/trino/plugin/deltalake/DeltaLakeMergeSink.java | 3 ++- .../io/trino/plugin/deltalake/TestDeltaLakeBasic.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMergeSink.java b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMergeSink.java index 329039d98e22..77fe730578ca 100644 --- a/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMergeSink.java +++ b/plugin/trino-delta-lake/src/main/java/io/trino/plugin/deltalake/DeltaLakeMergeSink.java @@ -408,6 +408,7 @@ private Slice writeDeletionVector( { String tablePath = rootTableLocation.toString(); String sourceRelativePath = relativePath(tablePath, sourcePath); + DeletionVectorEntry oldDeletionVector = deletionVectors.get(sourceRelativePath); DeletionVectorEntry deletionVectorEntry; try { @@ -426,7 +427,7 @@ private Slice writeDeletionVector( deletion.partitionValues, readStatistics(parquetMetadata, dataColumns, rowCount), Optional.of(deletionVectorEntry)); - DeltaLakeMergeResult result = new DeltaLakeMergeResult(deletion.partitionValues, Optional.of(sourceRelativePath), Optional.empty(), Optional.of(newFileInfo)); + DeltaLakeMergeResult result = new DeltaLakeMergeResult(deletion.partitionValues, Optional.of(sourceRelativePath), Optional.ofNullable(oldDeletionVector), Optional.of(newFileInfo)); return utf8Slice(mergeResultJsonCodec.toJson(result)); } catch (Throwable e) { diff --git a/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/TestDeltaLakeBasic.java b/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/TestDeltaLakeBasic.java index 617514e09f41..43134702c831 100644 --- a/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/TestDeltaLakeBasic.java +++ b/plugin/trino-delta-lake/src/test/java/io/trino/plugin/deltalake/TestDeltaLakeBasic.java @@ -1392,6 +1392,16 @@ public void testDeletionVectorsRandomPrefix() assertUpdate("DROP TABLE " + tableName); } + @Test + void testDeletionVectorsRepeat() + { + try (TestTable table = newTrinoTable("test_dv", "(x int) WITH (deletion_vectors_enabled = true)", List.of("1", "2", "3"))) { + assertUpdate("DELETE FROM " + table.getName() + " WHERE x = 1", 1); + assertUpdate("DELETE FROM " + table.getName() + " WHERE x = 2", 1); + assertThat(query("SELECT * FROM " + table.getName())).matches("VALUES 3"); + } + } + @Test public void testUnsupportedVacuumDeletionVectors() throws Exception